Line data Source code
1 : // EnergyPlus, Copyright (c) 1996-2025, The Board of Trustees of the University of Illinois,
2 : // The Regents of the University of California, through Lawrence Berkeley National Laboratory
3 : // (subject to receipt of any required approvals from the U.S. Dept. of Energy), Oak Ridge
4 : // National Laboratory, managed by UT-Battelle, Alliance for Sustainable Energy, LLC, and other
5 : // contributors. All rights reserved.
6 : //
7 : // NOTICE: This Software was developed under funding from the U.S. Department of Energy and the
8 : // U.S. Government consequently retains certain rights. As such, the U.S. Government has been
9 : // granted for itself and others acting on its behalf a paid-up, nonexclusive, irrevocable,
10 : // worldwide license in the Software to reproduce, distribute copies to the public, prepare
11 : // derivative works, and perform publicly and display publicly, and to permit others to do so.
12 : //
13 : // Redistribution and use in source and binary forms, with or without modification, are permitted
14 : // provided that the following conditions are met:
15 : //
16 : // (1) Redistributions of source code must retain the above copyright notice, this list of
17 : // conditions and the following disclaimer.
18 : //
19 : // (2) Redistributions in binary form must reproduce the above copyright notice, this list of
20 : // conditions and the following disclaimer in the documentation and/or other materials
21 : // provided with the distribution.
22 : //
23 : // (3) Neither the name of the University of California, Lawrence Berkeley National Laboratory,
24 : // the University of Illinois, U.S. Dept. of Energy nor the names of its contributors may be
25 : // used to endorse or promote products derived from this software without specific prior
26 : // written permission.
27 : //
28 : // (4) Use of EnergyPlus(TM) Name. If Licensee (i) distributes the software in stand-alone form
29 : // without changes from the version obtained under this License, or (ii) Licensee makes a
30 : // reference solely to the software portion of its product, Licensee must refer to the
31 : // software as "EnergyPlus version X" software, where "X" is the version number Licensee
32 : // obtained under this License and may not use a different name for the software. Except as
33 : // specifically required in this Section (4), Licensee shall not use in a company name, a
34 : // product name, in advertising, publicity, or other promotional activities any name, trade
35 : // name, trademark, logo, or other designation of "EnergyPlus", "E+", "e+" or confusingly
36 : // similar designation, without the U.S. Department of Energy's prior written consent.
37 : //
38 : // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
39 : // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
40 : // AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
41 : // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
42 : // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
43 : // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
44 : // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
45 : // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
46 : // POSSIBILITY OF SUCH DAMAGE.
47 :
48 : // C++ Headers
49 :
50 : // ObjexxFCL Headers
51 : #include <ObjexxFCL/Array.functions.hh>
52 :
53 : // EnergyPlus Headers
54 : #include <EnergyPlus/Autosizing/Base.hh>
55 : #include <EnergyPlus/BranchNodeConnections.hh>
56 : #include <EnergyPlus/CurveManager.hh>
57 : #include <EnergyPlus/DXCoils.hh>
58 : #include <EnergyPlus/Data/EnergyPlusData.hh>
59 : #include <EnergyPlus/DataAirSystems.hh>
60 : #include <EnergyPlus/DataContaminantBalance.hh>
61 : #include <EnergyPlus/DataEnvironment.hh>
62 : #include <EnergyPlus/DataHVACGlobals.hh>
63 : #include <EnergyPlus/DataHeatBalance.hh>
64 : #include <EnergyPlus/DataSizing.hh>
65 : #include <EnergyPlus/DataWater.hh>
66 : #include <EnergyPlus/EMSManager.hh>
67 : #include <EnergyPlus/Fans.hh>
68 : #include <EnergyPlus/FluidProperties.hh>
69 : #include <EnergyPlus/General.hh>
70 : #include <EnergyPlus/GeneralRoutines.hh>
71 : #include <EnergyPlus/GlobalNames.hh>
72 : #include <EnergyPlus/InputProcessing/InputProcessor.hh>
73 : #include <EnergyPlus/NodeInputManager.hh>
74 : #include <EnergyPlus/OutAirNodeManager.hh>
75 : #include <EnergyPlus/OutputProcessor.hh>
76 : #include <EnergyPlus/OutputReportPredefined.hh>
77 : #include <EnergyPlus/PlantUtilities.hh>
78 : #include <EnergyPlus/Psychrometrics.hh>
79 : #include <EnergyPlus/ReportCoilSelection.hh>
80 : #include <EnergyPlus/ScheduleManager.hh>
81 : #include <EnergyPlus/UnitarySystem.hh>
82 : #include <EnergyPlus/VariableSpeedCoils.hh>
83 : #include <EnergyPlus/WaterManager.hh>
84 :
85 : namespace EnergyPlus {
86 :
87 : namespace VariableSpeedCoils {
88 :
89 : Real64 constexpr RatedInletAirTemp = 26.6667; // 26.6667C or 80F
90 : Real64 constexpr RatedInletWetBulbTemp = 19.4444; // 19.44 or 67F, cooling mode
91 : Real64 constexpr RatedInletAirHumRat = 0.0111847; // Humidity ratio corresponding to 80F dry bulb/67F wet bulb
92 : Real64 constexpr RatedInletWaterTemp = 29.4444; // 85 F cooling mode
93 : Real64 constexpr RatedAmbAirTemp = 35.0; // 95 F cooling mode
94 : Real64 constexpr RatedInletAirTempHeat = 21.1111; // 21.11C or 70F, heating mode
95 : Real64 constexpr RatedInletWaterTempHeat = 21.1111; // 21.11C or 70F, heating mode
96 : Real64 constexpr RatedAmbAirTempHeat = 8.3333; // 8.33 or 47F, heating mode
97 : Real64 constexpr RatedAmbAirWBHeat = 6.1111; // 8.33 or 43F, heating mode, rated wet bulb temperature
98 : // Water Systems
99 : int constexpr CondensateDiscarded = 1001; // default mode where water is "lost"
100 : int constexpr CondensateToTank = 1002; // collect coil condensate from air and store in water storage tank
101 :
102 : int constexpr WaterSupplyFromMains = 101;
103 : int constexpr WaterSupplyFromTank = 102;
104 :
105 : // Defrost strategy (heat pump only)
106 : int constexpr ReverseCycle = 1; // uses reverse cycle defrost strategy
107 : int constexpr Resistive = 2; // uses electric resistance heater for defrost
108 : // Defrost control (heat pump only)
109 : int constexpr Timed = 1; // defrost cycle is timed
110 : int constexpr OnDemand = 2; // defrost cycle occurs only when required
111 :
112 67677 : void SimVariableSpeedCoils(EnergyPlusData &state,
113 : std::string_view CompName, // Coil Name
114 : int &CompIndex, // Index for Component name
115 : HVAC::FanOp const fanOp, // Continuous fan OR cycling compressor
116 : HVAC::CompressorOp const compressorOp, // compressor on/off. 0 = off; 1= on
117 : Real64 const PartLoadFrac,
118 : int const SpeedNum, // compressor speed number
119 : Real64 const SpeedRatio, // compressor speed ratio
120 : Real64 const SensLoad, // Sensible demand load [W]
121 : Real64 const LatentLoad, // Latent demand load [W]
122 : const Real64 OnOffAirFlowRatio // ratio of comp on to comp off air flow rate
123 : )
124 : {
125 :
126 : // AUTHOR Bo Shen, ORNL
127 : // DATE WRITTEN March 2012
128 : // MODIFIED Bo Shen, 12/2014, add variable-speed HPWH
129 :
130 : // PURPOSE OF THIS SUBROUTINE:
131 : // This subroutine manages variable-speed Water to Air Heat Pump component simulation.
132 :
133 : // SUBROUTINE LOCAL VARIABLE DECLARATIONS:
134 : int DXCoilNum; // The WatertoAirHP that you are currently loading input into
135 : int SpeedCal; // variable for error proof speed input
136 :
137 : // Obtains and Allocates WatertoAirHP related parameters from input file
138 67677 : if (state.dataVariableSpeedCoils->GetCoilsInputFlag) { // First time subroutine has been entered
139 0 : GetVarSpeedCoilInput(state);
140 0 : state.dataVariableSpeedCoils->GetCoilsInputFlag = false;
141 : }
142 :
143 67677 : if (CompIndex == 0) {
144 3 : DXCoilNum = Util::FindItemInList(CompName, state.dataVariableSpeedCoils->VarSpeedCoil);
145 3 : if (DXCoilNum == 0) {
146 0 : ShowFatalError(state, format("WaterToAirHPVSWEquationFit not found={}", CompName));
147 : }
148 3 : CompIndex = DXCoilNum;
149 : } else {
150 67674 : DXCoilNum = CompIndex;
151 67674 : if (DXCoilNum > state.dataVariableSpeedCoils->NumVarSpeedCoils || DXCoilNum < 1) {
152 0 : ShowFatalError(state,
153 0 : format("SimVariableSpeedCoils: Invalid CompIndex passed={}, Number of Water to Air HPs={}, WaterToAir HP name={}",
154 : DXCoilNum,
155 0 : state.dataVariableSpeedCoils->NumVarSpeedCoils,
156 : CompName));
157 : }
158 67674 : if (!CompName.empty() && CompName != state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name) {
159 0 : ShowFatalError(
160 : state,
161 0 : format("SimVariableSpeedCoils: Invalid CompIndex passed={}, WaterToAir HP name={}, stored WaterToAir HP Name for that index={}",
162 : DXCoilNum,
163 : CompName,
164 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
165 : }
166 : }
167 :
168 : // ERROR PROOF
169 67677 : if (SpeedNum < 1) {
170 37143 : SpeedCal = 1;
171 : } else {
172 30534 : SpeedCal = SpeedNum;
173 : }
174 :
175 101717 : if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit) ||
176 34040 : (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed)) {
177 : // Cooling mode
178 34010 : InitVarSpeedCoil(state, DXCoilNum, SensLoad, LatentLoad, fanOp, OnOffAirFlowRatio, SpeedRatio, SpeedCal);
179 34010 : CalcVarSpeedCoilCooling(
180 : state, DXCoilNum, fanOp, SensLoad, LatentLoad, compressorOp, PartLoadFrac, OnOffAirFlowRatio, SpeedRatio, SpeedCal);
181 34010 : UpdateVarSpeedCoil(state, DXCoilNum);
182 33698 : } else if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit) ||
183 31 : (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed)) {
184 : // Heating mode
185 33667 : InitVarSpeedCoil(state, DXCoilNum, SensLoad, LatentLoad, fanOp, OnOffAirFlowRatio, SpeedRatio, SpeedCal);
186 33667 : CalcVarSpeedCoilHeating(state, DXCoilNum, fanOp, SensLoad, compressorOp, PartLoadFrac, OnOffAirFlowRatio, SpeedRatio, SpeedCal);
187 33667 : UpdateVarSpeedCoil(state, DXCoilNum);
188 0 : } else if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed) {
189 : // Heating mode
190 0 : InitVarSpeedCoil(state, DXCoilNum, SensLoad, LatentLoad, fanOp, OnOffAirFlowRatio, SpeedRatio, SpeedCal);
191 0 : CalcVarSpeedHPWH(state, DXCoilNum, PartLoadFrac, SpeedRatio, SpeedNum, fanOp);
192 0 : UpdateVarSpeedCoil(state, DXCoilNum);
193 : } else {
194 0 : ShowFatalError(state, "SimVariableSpeedCoils: WatertoAir heatpump not in either HEATING or COOLING mode");
195 : }
196 :
197 : // two additional output variables
198 67677 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SpeedNumReport = SpeedCal;
199 67677 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SpeedRatioReport = SpeedRatio;
200 67677 : }
201 :
202 49 : void GetVarSpeedCoilInput(EnergyPlusData &state)
203 : {
204 :
205 : // SUBROUTINE INFORMATION:
206 : // AUTHOR Bo Shen
207 : // DATE WRITTEN March, 2012
208 : // MODIFIED Bo Shen, 12/2014, add variable-speed HPWH
209 :
210 : // PURPOSE OF THIS SUBROUTINE:
211 : // Obtains input data for HPs and stores it in HP data structures
212 :
213 : // METHODOLOGY EMPLOYED:
214 : // Uses "Get" routines to read in data.
215 :
216 : // SUBROUTINE PARAMETER DEFINITIONS:
217 : static constexpr std::string_view RoutineName("GetVarSpeedCoilInput: "); // include trailing blank space
218 : static constexpr std::string_view routineName = "GetVarSpeedCoilInput";
219 :
220 : // SUBROUTINE LOCAL VARIABLE DECLARATIONS:
221 : int NumAlphas; // Number of variables in String format
222 : int NumNums; // Number of variables in Numeric format
223 : int NumParams; // Total number of input fields
224 49 : int MaxNums(0); // Maximum number of numeric input fields
225 49 : int MaxAlphas(0); // Maximum number of alpha input fields
226 : int IOStat;
227 : int AlfaFieldIncre; // increment number of Alfa field
228 49 : bool ErrorsFound(false); // If errors detected in input
229 : Real64 CurveVal; // Used to verify modifier curves equal 1 at rated conditions
230 : Real64 WHInletAirTemp; // Used to pass proper inlet air temp to HPWH DX coil performance curves
231 : Real64 WHInletWaterTemp; // Used to pass proper inlet water temp to HPWH DX coil performance curves
232 49 : std::string CurrentModuleObject; // for ease in getting objects
233 49 : Array1D_string AlphArray; // Alpha input items for object
234 49 : Array1D_string cAlphaFields; // Alpha field names
235 49 : Array1D_string cNumericFields; // Numeric field names
236 49 : Array1D<Real64> NumArray; // Numeric input items for object
237 49 : Array1D_bool lAlphaBlanks; // Logical array, alpha field input BLANK = .TRUE.
238 49 : Array1D_bool lNumericBlanks; // Logical array, numeric field input BLANK = .TRUE.
239 :
240 : int NumCool =
241 49 : state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "COIL:COOLING:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT");
242 : int NumHeat =
243 49 : state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "COIL:HEATING:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT");
244 49 : int NumCoolAS = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "COIL:COOLING:DX:VARIABLESPEED");
245 49 : int NumHeatAS = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "COIL:HEATING:DX:VARIABLESPEED");
246 : int NumHPWHAirToWater =
247 49 : state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "COIL:WATERHEATING:AIRTOWATERHEATPUMP:VARIABLESPEED");
248 49 : state.dataVariableSpeedCoils->NumVarSpeedCoils = NumCool + NumHeat + NumCoolAS + NumHeatAS + NumHPWHAirToWater;
249 49 : int DXCoilNum = 0;
250 :
251 49 : if (state.dataVariableSpeedCoils->NumVarSpeedCoils <= 0) {
252 0 : ShowSevereError(state, "No Equipment found in GetVarSpeedCoilInput");
253 0 : ErrorsFound = true;
254 : }
255 :
256 : // Allocate Arrays
257 49 : if (state.dataVariableSpeedCoils->NumVarSpeedCoils > 0) {
258 49 : state.dataVariableSpeedCoils->VarSpeedCoil.allocate(state.dataVariableSpeedCoils->NumVarSpeedCoils);
259 49 : state.dataHeatBal->HeatReclaimVS_Coil.allocate(state.dataVariableSpeedCoils->NumVarSpeedCoils);
260 : }
261 :
262 49 : state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(
263 : state, "COIL:COOLING:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT", NumParams, NumAlphas, NumNums);
264 49 : MaxNums = max(MaxNums, NumNums);
265 49 : MaxAlphas = max(MaxAlphas, NumAlphas);
266 49 : state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(
267 : state, "COIL:HEATING:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT", NumParams, NumAlphas, NumNums);
268 49 : MaxNums = max(MaxNums, NumNums);
269 49 : MaxAlphas = max(MaxAlphas, NumAlphas);
270 :
271 49 : state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(state, "COIL:COOLING:DX:VARIABLESPEED", NumParams, NumAlphas, NumNums);
272 49 : MaxNums = max(MaxNums, NumNums);
273 49 : MaxAlphas = max(MaxAlphas, NumAlphas);
274 49 : state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(state, "COIL:HEATING:DX:VARIABLESPEED", NumParams, NumAlphas, NumNums);
275 49 : MaxNums = max(MaxNums, NumNums);
276 49 : MaxAlphas = max(MaxAlphas, NumAlphas);
277 :
278 : // variable speed air-source HPWH
279 49 : state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(
280 : state, "COIL:WATERHEATING:AIRTOWATERHEATPUMP:VARIABLESPEED", NumParams, NumAlphas, NumNums);
281 49 : MaxNums = max(MaxNums, NumNums);
282 49 : MaxAlphas = max(MaxAlphas, NumAlphas);
283 :
284 49 : AlphArray.allocate(MaxAlphas);
285 49 : cAlphaFields.allocate(MaxAlphas);
286 49 : lAlphaBlanks.dimension(MaxAlphas, true);
287 49 : cNumericFields.allocate(MaxNums);
288 49 : lNumericBlanks.dimension(MaxNums, true);
289 49 : NumArray.dimension(MaxNums, 0.0);
290 :
291 : // Get the data for cooling coil, WATER SOURCE
292 49 : CurrentModuleObject = "Coil:Cooling:WaterToAirHeatPump:VariableSpeedEquationFit"; // for reporting
293 :
294 54 : for (int CoilCounter = 1; CoilCounter <= NumCool; ++CoilCounter) {
295 :
296 5 : ++DXCoilNum;
297 5 : AlfaFieldIncre = 1;
298 :
299 5 : state.dataInputProcessing->inputProcessor->getObjectItem(state,
300 : CurrentModuleObject,
301 : CoilCounter,
302 : AlphArray,
303 : NumAlphas,
304 : NumArray,
305 : NumNums,
306 : IOStat,
307 : lNumericBlanks,
308 : lAlphaBlanks,
309 : cAlphaFields,
310 : cNumericFields);
311 :
312 : // ErrorsFound will be set to True if problem was found, left untouched otherwise
313 5 : GlobalNames::VerifyUniqueCoilName(state, CurrentModuleObject, AlphArray(1), ErrorsFound, CurrentModuleObject + " Name");
314 :
315 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).bIsDesuperheater = false;
316 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name = AlphArray(1);
317 5 : state.dataHeatBal->HeatReclaimVS_Coil(DXCoilNum).Name = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name;
318 5 : state.dataHeatBal->HeatReclaimVS_Coil(DXCoilNum).SourceType = CurrentModuleObject;
319 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CoolHeatType = "COOLING";
320 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType = HVAC::Coil_CoolingWaterToAirHPVSEquationFit;
321 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VarSpeedCoilType =
322 10 : HVAC::cAllCoilTypes(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType);
323 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds = int(NumArray(1));
324 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel = int(NumArray(2));
325 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedCapCoolTotal = NumArray(3);
326 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedAirVolFlowRate = NumArray(4);
327 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedWaterVolFlowRate = NumArray(5);
328 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Twet_Rated = NumArray(6);
329 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Gamma_Rated = NumArray(7);
330 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxONOFFCyclesperHour = NumArray(8);
331 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).LatentCapacityTimeConstant = NumArray(9);
332 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FanDelayTime = NumArray(10);
333 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HOTGASREHEATFLG = int(NumArray(11));
334 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserType = DataHeatBalance::RefrigCondenserType::Water;
335 :
336 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterInletNodeNum =
337 10 : GetOnlySingleNode(state,
338 5 : AlphArray(2),
339 : ErrorsFound,
340 : DataLoopNode::ConnectionObjectType::CoilCoolingWaterToAirHeatPumpVariableSpeedEquationFit,
341 5 : AlphArray(1),
342 : DataLoopNode::NodeFluidType::Water,
343 : DataLoopNode::ConnectionType::Inlet,
344 : NodeInputManager::CompFluidStream::Secondary,
345 : DataLoopNode::ObjectIsNotParent);
346 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterOutletNodeNum =
347 10 : GetOnlySingleNode(state,
348 5 : AlphArray(3),
349 : ErrorsFound,
350 : DataLoopNode::ConnectionObjectType::CoilCoolingWaterToAirHeatPumpVariableSpeedEquationFit,
351 5 : AlphArray(1),
352 : DataLoopNode::NodeFluidType::Water,
353 : DataLoopNode::ConnectionType::Outlet,
354 : NodeInputManager::CompFluidStream::Secondary,
355 : DataLoopNode::ObjectIsNotParent);
356 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirInletNodeNum =
357 10 : GetOnlySingleNode(state,
358 5 : AlphArray(4),
359 : ErrorsFound,
360 : DataLoopNode::ConnectionObjectType::CoilCoolingWaterToAirHeatPumpVariableSpeedEquationFit,
361 5 : AlphArray(1),
362 : DataLoopNode::NodeFluidType::Air,
363 : DataLoopNode::ConnectionType::Inlet,
364 : NodeInputManager::CompFluidStream::Primary,
365 : DataLoopNode::ObjectIsNotParent);
366 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirOutletNodeNum =
367 15 : GetOnlySingleNode(state,
368 5 : AlphArray(5),
369 : ErrorsFound,
370 : DataLoopNode::ConnectionObjectType::CoilCoolingWaterToAirHeatPumpVariableSpeedEquationFit,
371 5 : AlphArray(1),
372 : DataLoopNode::NodeFluidType::Air,
373 : DataLoopNode::ConnectionType::Outlet,
374 : NodeInputManager::CompFluidStream::Primary,
375 : DataLoopNode::ObjectIsNotParent);
376 :
377 10 : BranchNodeConnections::TestCompSet(state, CurrentModuleObject, AlphArray(1), AlphArray(2), AlphArray(3), "Water Nodes");
378 5 : BranchNodeConnections::TestCompSet(state, CurrentModuleObject, AlphArray(1), AlphArray(4), AlphArray(5), "Air Nodes");
379 :
380 : // If (VarSpeedCoil(DXCoilNum)%NumOfSpeeds .LT. 2) Then
381 5 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds < 1) {
382 0 : ShowSevereError(
383 : state,
384 0 : format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
385 0 : ShowContinueError(state, format("...{} must be >= 1. entered number is {:.0T}", cNumericFields(1), NumArray(1)));
386 0 : ErrorsFound = true;
387 : }
388 :
389 5 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel >
390 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds) {
391 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel =
392 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds;
393 : }
394 :
395 5 : if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel >
396 10 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds) ||
397 5 : (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel <= 0)) {
398 0 : ShowSevereError(
399 : state,
400 0 : format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
401 0 : ShowContinueError(state, format("...{} must be valid speed level entered number is {:.0T}", cNumericFields(2), NumArray(2)));
402 0 : ErrorsFound = true;
403 : }
404 :
405 : // part load curve
406 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR = Curve::GetCurveIndex(state, AlphArray(6)); // convert curve name to number
407 5 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR == 0) {
408 0 : if (lAlphaBlanks(6)) {
409 0 : ShowSevereError(
410 : state,
411 0 : format("{}{}=\"{}\", missing", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
412 0 : ShowContinueError(state, format("...required {} is blank.", cAlphaFields(6)));
413 : } else {
414 0 : ShowSevereError(
415 : state,
416 0 : format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
417 0 : ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(6), AlphArray(6)));
418 : }
419 0 : ErrorsFound = true;
420 : } else {
421 5 : CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR, 1.0);
422 5 : if (CurveVal > 1.10 || CurveVal < 0.90) {
423 0 : ShowWarningError(state,
424 0 : format("{}{}=\"{}\", curve values",
425 : RoutineName,
426 : CurrentModuleObject,
427 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
428 0 : ShowContinueError(state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(6)));
429 0 : ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
430 : }
431 : }
432 :
433 45 : for (int I = 1; I <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds; ++I) {
434 40 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I) = NumArray(12 + (I - 1) * 6);
435 40 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedSHR(I) = NumArray(13 + (I - 1) * 6);
436 40 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(I) = NumArray(14 + (I - 1) * 6);
437 40 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(I) = NumArray(15 + (I - 1) * 6);
438 40 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowRate(I) = NumArray(16 + (I - 1) * 6);
439 40 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeatFrac(I) = NumArray(17 + (I - 1) * 6);
440 :
441 40 : AlfaFieldIncre = 7 + (I - 1) * 7;
442 40 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I) =
443 40 : Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
444 40 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I) == 0) {
445 0 : if (lAlphaBlanks(AlfaFieldIncre)) {
446 0 : ShowSevereError(state,
447 0 : format("{}{}=\"{}\", missing",
448 : RoutineName,
449 : CurrentModuleObject,
450 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
451 0 : ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
452 : } else {
453 0 : ShowSevereError(state,
454 0 : format("{}{}=\"{}\", invalid",
455 : RoutineName,
456 : CurrentModuleObject,
457 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
458 0 : ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
459 : }
460 0 : ErrorsFound = true;
461 : } else {
462 : // Verify Curve Object, only legal type is BiQuadratic
463 120 : ErrorsFound |= Curve::CheckCurveDims(state,
464 40 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I), // Curve index
465 : {2}, // Valid dimensions
466 : RoutineName, // Routine name
467 : CurrentModuleObject, // Object Type
468 40 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
469 40 : cAlphaFields(AlfaFieldIncre)); // Field Name
470 :
471 40 : if (!ErrorsFound) {
472 80 : CurveVal = Curve::CurveValue(
473 40 : state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I), RatedInletWetBulbTemp, RatedInletWaterTemp);
474 40 : if (CurveVal > 1.10 || CurveVal < 0.90) {
475 0 : ShowWarningError(state,
476 0 : format("{}{}=\"{}\", curve values",
477 : RoutineName,
478 : CurrentModuleObject,
479 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
480 0 : ShowContinueError(
481 0 : state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
482 0 : ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
483 : }
484 : }
485 : }
486 :
487 40 : AlfaFieldIncre = 8 + (I - 1) * 7;
488 40 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I) =
489 40 : Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
490 40 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I) == 0) {
491 0 : if (lAlphaBlanks(AlfaFieldIncre)) {
492 0 : ShowSevereError(state,
493 0 : format("{}{}=\"{}\", missing",
494 : RoutineName,
495 : CurrentModuleObject,
496 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
497 0 : ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
498 : } else {
499 0 : ShowSevereError(state,
500 0 : format("{}{}=\"{}\", invalid",
501 : RoutineName,
502 : CurrentModuleObject,
503 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
504 0 : ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
505 : }
506 0 : ErrorsFound = true;
507 : } else {
508 : // Verify Curve Object, only legal type is Quadratic
509 120 : ErrorsFound |= Curve::CheckCurveDims(state,
510 40 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I), // Curve index
511 : {1}, // Valid dimensions
512 : RoutineName, // Routine name
513 : CurrentModuleObject, // Object Type
514 40 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
515 40 : cAlphaFields(AlfaFieldIncre)); // Field Name
516 :
517 40 : if (!ErrorsFound) {
518 40 : CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I), 1.0);
519 40 : if (CurveVal > 1.10 || CurveVal < 0.90) {
520 0 : ShowWarningError(state,
521 0 : format("{}{}=\"{}\", curve values",
522 : RoutineName,
523 : CurrentModuleObject,
524 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
525 0 : ShowContinueError(
526 0 : state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
527 0 : ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
528 : }
529 : }
530 : }
531 :
532 40 : AlfaFieldIncre = 9 + (I - 1) * 7;
533 40 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(I) =
534 40 : Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
535 40 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(I) == 0) {
536 0 : if (lAlphaBlanks(AlfaFieldIncre)) {
537 0 : ShowSevereError(state,
538 0 : format("{}{}=\"{}\", missing",
539 : RoutineName,
540 : CurrentModuleObject,
541 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
542 0 : ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
543 : } else {
544 0 : ShowSevereError(state,
545 0 : format("{}{}=\"{}\", invalid",
546 : RoutineName,
547 : CurrentModuleObject,
548 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
549 0 : ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
550 : }
551 0 : ErrorsFound = true;
552 : } else {
553 : // Verify Curve Object, only legal type is Quadratic
554 120 : ErrorsFound |= Curve::CheckCurveDims(state,
555 40 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(I), // Curve index
556 : {1}, // Valid dimensions
557 : RoutineName, // Routine name
558 : CurrentModuleObject, // Object Type
559 40 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
560 40 : cAlphaFields(AlfaFieldIncre)); // Field Name
561 :
562 40 : if (!ErrorsFound) {
563 40 : CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(I), 1.0);
564 40 : if (CurveVal > 1.10 || CurveVal < 0.90) {
565 0 : ShowWarningError(state,
566 0 : format("{}{}=\"{}\", curve values",
567 : RoutineName,
568 : CurrentModuleObject,
569 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
570 0 : ShowContinueError(
571 0 : state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
572 0 : ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
573 : }
574 : }
575 : }
576 :
577 40 : AlfaFieldIncre = 10 + (I - 1) * 7;
578 40 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I) =
579 40 : Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
580 40 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I) == 0) {
581 0 : if (lAlphaBlanks(AlfaFieldIncre)) {
582 0 : ShowSevereError(state,
583 0 : format("{}{}=\"{}\", missing",
584 : RoutineName,
585 : CurrentModuleObject,
586 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
587 0 : ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
588 : } else {
589 0 : ShowSevereError(state,
590 0 : format("{}{}=\"{}\", invalid",
591 : RoutineName,
592 : CurrentModuleObject,
593 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
594 0 : ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
595 : }
596 0 : ErrorsFound = true;
597 : } else {
598 : // Verify Curve Object, only legal type is BiQuadratic
599 120 : ErrorsFound |= Curve::CheckCurveDims(state,
600 40 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I), // Curve index
601 : {2}, // Valid dimensions
602 : RoutineName, // Routine name
603 : CurrentModuleObject, // Object Type
604 40 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
605 40 : cAlphaFields(AlfaFieldIncre)); // Field Name
606 :
607 40 : if (!ErrorsFound) {
608 80 : CurveVal = Curve::CurveValue(
609 40 : state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I), RatedInletWetBulbTemp, RatedInletWaterTemp);
610 40 : if (CurveVal > 1.10 || CurveVal < 0.90) {
611 0 : ShowWarningError(state,
612 0 : format("{}{}=\"{}\", curve values",
613 : RoutineName,
614 : CurrentModuleObject,
615 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
616 0 : ShowContinueError(
617 0 : state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
618 0 : ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
619 : }
620 : }
621 : }
622 :
623 40 : AlfaFieldIncre = 11 + (I - 1) * 7;
624 40 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I) =
625 40 : Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
626 40 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I) == 0) {
627 0 : if (lAlphaBlanks(AlfaFieldIncre)) {
628 0 : ShowSevereError(state,
629 0 : format("{}{}=\"{}\", missing",
630 : RoutineName,
631 : CurrentModuleObject,
632 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
633 0 : ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
634 : } else {
635 0 : ShowSevereError(state,
636 0 : format("{}{}=\"{}\", invalid",
637 : RoutineName,
638 : CurrentModuleObject,
639 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
640 0 : ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
641 : }
642 0 : ErrorsFound = true;
643 : } else {
644 : // Verify Curve Object, only legal type is Quadratic
645 120 : ErrorsFound |= Curve::CheckCurveDims(state,
646 40 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I), // Curve index
647 : {1}, // Valid dimensions
648 : RoutineName, // Routine name
649 : CurrentModuleObject, // Object Type
650 40 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
651 40 : cAlphaFields(AlfaFieldIncre)); // Field Name
652 :
653 40 : if (!ErrorsFound) {
654 40 : CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I), 1.0);
655 40 : if (CurveVal > 1.10 || CurveVal < 0.90) {
656 0 : ShowWarningError(state,
657 0 : format("{}{}=\"{}\", curve values",
658 : RoutineName,
659 : CurrentModuleObject,
660 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
661 0 : ShowContinueError(
662 0 : state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
663 0 : ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
664 : }
665 : }
666 : }
667 :
668 40 : AlfaFieldIncre = 12 + (I - 1) * 7;
669 40 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(I) =
670 40 : Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
671 40 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(I) == 0) {
672 0 : if (lAlphaBlanks(AlfaFieldIncre)) {
673 0 : ShowSevereError(state,
674 0 : format("{}{}=\"{}\", missing",
675 : RoutineName,
676 : CurrentModuleObject,
677 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
678 0 : ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
679 : } else {
680 0 : ShowSevereError(state,
681 0 : format("{}{}=\"{}\", invalid",
682 : RoutineName,
683 : CurrentModuleObject,
684 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
685 0 : ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
686 : }
687 0 : ErrorsFound = true;
688 : } else {
689 : // Verify Curve Object, only legal type is Quadratic
690 120 : ErrorsFound |= Curve::CheckCurveDims(state,
691 40 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(I), // Curve index
692 : {1}, // Valid dimensions
693 : RoutineName, // Routine name
694 : CurrentModuleObject, // Object Type
695 40 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
696 40 : cAlphaFields(AlfaFieldIncre)); // Field Name
697 :
698 40 : if (!ErrorsFound) {
699 40 : CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(I), 1.0);
700 40 : if (CurveVal > 1.10 || CurveVal < 0.90) {
701 0 : ShowWarningError(state,
702 0 : format("{}{}=\"{}\", curve values",
703 : RoutineName,
704 : CurrentModuleObject,
705 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
706 0 : ShowContinueError(
707 0 : state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
708 0 : ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
709 : }
710 : }
711 : }
712 :
713 40 : AlfaFieldIncre = 13 + (I - 1) * 7;
714 : // Read waste heat modifier curve name
715 40 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(I) =
716 40 : Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
717 40 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(I) == 0) {
718 0 : if (lAlphaBlanks(AlfaFieldIncre)) {
719 0 : ShowSevereError(state,
720 0 : format("{}{}=\"{}\", missing",
721 : RoutineName,
722 : CurrentModuleObject,
723 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
724 0 : ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
725 : } else {
726 0 : ShowSevereError(state,
727 0 : format("{}{}=\"{}\", invalid",
728 : RoutineName,
729 : CurrentModuleObject,
730 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
731 0 : ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
732 : }
733 0 : ErrorsFound = true;
734 : } else {
735 : // Verify Curve Object, only legal types are BiQuadratic
736 120 : ErrorsFound |= Curve::CheckCurveDims(state,
737 40 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(I), // Curve index
738 : {2}, // Valid dimensions
739 : RoutineName, // Routine name
740 : CurrentModuleObject, // Object Type
741 40 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
742 40 : cAlphaFields(AlfaFieldIncre)); // Field Name
743 :
744 40 : if (!ErrorsFound) {
745 80 : CurveVal = Curve::CurveValue(
746 40 : state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(I), RatedInletWaterTemp, RatedInletAirTemp);
747 40 : if (CurveVal > 1.10 || CurveVal < 0.90) {
748 0 : ShowWarningError(state,
749 0 : format("{}{}=\"{}\", curve values",
750 : RoutineName,
751 : CurrentModuleObject,
752 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
753 0 : ShowContinueError(
754 0 : state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
755 0 : ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
756 : }
757 : }
758 : }
759 : }
760 :
761 45 : for (int I = 1; I <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds; ++I) {
762 40 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedPercentTotCap(I) =
763 40 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I) /
764 80 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(
765 40 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
766 40 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowPerRatedTotCap(I) =
767 40 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(I) /
768 40 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I);
769 40 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowPerRatedTotCap(I) =
770 40 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowRate(I) /
771 40 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I);
772 : }
773 :
774 : // CurrentModuleObject = "Coil:Cooling:WaterToAirHeatPump:VariableSpeedEquationFit"
775 10 : SetupOutputVariable(state,
776 : "Cooling Coil Electricity Energy",
777 : Constant::Units::J,
778 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Energy,
779 : OutputProcessor::TimeStepType::System,
780 : OutputProcessor::StoreType::Sum,
781 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
782 : Constant::eResource::Electricity,
783 : OutputProcessor::Group::HVAC,
784 : OutputProcessor::EndUseCat::Cooling);
785 10 : SetupOutputVariable(state,
786 : "Cooling Coil Total Cooling Energy",
787 : Constant::Units::J,
788 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLoadTotal,
789 : OutputProcessor::TimeStepType::System,
790 : OutputProcessor::StoreType::Sum,
791 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
792 : Constant::eResource::EnergyTransfer,
793 : OutputProcessor::Group::HVAC,
794 : OutputProcessor::EndUseCat::CoolingCoils);
795 10 : SetupOutputVariable(state,
796 : "Cooling Coil Sensible Cooling Energy",
797 : Constant::Units::J,
798 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySensible,
799 : OutputProcessor::TimeStepType::System,
800 : OutputProcessor::StoreType::Sum,
801 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
802 10 : SetupOutputVariable(state,
803 : "Cooling Coil Latent Cooling Energy",
804 : Constant::Units::J,
805 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLatent,
806 : OutputProcessor::TimeStepType::System,
807 : OutputProcessor::StoreType::Sum,
808 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
809 10 : SetupOutputVariable(state,
810 : "Cooling Coil Source Side Heat Transfer Energy",
811 : Constant::Units::J,
812 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySource,
813 : OutputProcessor::TimeStepType::System,
814 : OutputProcessor::StoreType::Sum,
815 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
816 : Constant::eResource::PlantLoopCoolingDemand,
817 : OutputProcessor::Group::HVAC,
818 : OutputProcessor::EndUseCat::CoolingCoils);
819 :
820 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedCapCoolSens =
821 : DataSizing::AutoSize; // always auto-sized, to be determined in the sizing calculation
822 : }
823 :
824 : //-------------------------AIR SOURCE, COOLING---BEGIN
825 : // Get the data for cooling coil, AIR SOURCE
826 49 : CurrentModuleObject = "Coil:Cooling:DX:VariableSpeed"; // for reporting
827 :
828 87 : for (int CoilCounter = 1; CoilCounter <= NumCoolAS; ++CoilCounter) {
829 :
830 38 : ++DXCoilNum;
831 38 : AlfaFieldIncre = 1;
832 :
833 38 : state.dataInputProcessing->inputProcessor->getObjectItem(state,
834 : CurrentModuleObject,
835 : CoilCounter,
836 : AlphArray,
837 : NumAlphas,
838 : NumArray,
839 : NumNums,
840 : IOStat,
841 : lNumericBlanks,
842 : lAlphaBlanks,
843 : cAlphaFields,
844 : cNumericFields);
845 :
846 38 : ErrorObjectHeader eoh{routineName, CurrentModuleObject, AlphArray(1)};
847 :
848 : // ErrorsFound will be set to True if problem was found, left untouched otherwise
849 38 : GlobalNames::VerifyUniqueCoilName(state, CurrentModuleObject, AlphArray(1), ErrorsFound, CurrentModuleObject + " Name");
850 :
851 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).bIsDesuperheater = false;
852 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name = AlphArray(1);
853 : // Initialize DataHeatBalance heat reclaim variable name for use by heat reclaim coils
854 38 : state.dataHeatBal->HeatReclaimVS_Coil(DXCoilNum).Name = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name;
855 38 : state.dataHeatBal->HeatReclaimVS_Coil(DXCoilNum).SourceType = CurrentModuleObject;
856 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CoolHeatType = "COOLING";
857 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType = HVAC::Coil_CoolingAirToAirVariableSpeed;
858 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VarSpeedCoilType = HVAC::cAllCoilTypes(HVAC::Coil_CoolingAirToAirVariableSpeed);
859 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds = int(NumArray(1));
860 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel = int(NumArray(2));
861 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedCapCoolTotal = NumArray(3);
862 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedAirVolFlowRate = NumArray(4);
863 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Twet_Rated = NumArray(5);
864 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Gamma_Rated = NumArray(6);
865 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxONOFFCyclesperHour = NumArray(7);
866 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).LatentCapacityTimeConstant = NumArray(8);
867 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FanDelayTime = NumArray(9);
868 :
869 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirInletNodeNum =
870 76 : GetOnlySingleNode(state,
871 38 : AlphArray(2),
872 : ErrorsFound,
873 : DataLoopNode::ConnectionObjectType::CoilCoolingDXVariableSpeed,
874 38 : AlphArray(1),
875 : DataLoopNode::NodeFluidType::Air,
876 : DataLoopNode::ConnectionType::Inlet,
877 : NodeInputManager::CompFluidStream::Primary,
878 : DataLoopNode::ObjectIsNotParent);
879 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirOutletNodeNum =
880 114 : GetOnlySingleNode(state,
881 38 : AlphArray(3),
882 : ErrorsFound,
883 : DataLoopNode::ConnectionObjectType::CoilCoolingDXVariableSpeed,
884 38 : AlphArray(1),
885 : DataLoopNode::NodeFluidType::Air,
886 : DataLoopNode::ConnectionType::Outlet,
887 : NodeInputManager::CompFluidStream::Primary,
888 : DataLoopNode::ObjectIsNotParent);
889 :
890 38 : BranchNodeConnections::TestCompSet(state, CurrentModuleObject, AlphArray(1), AlphArray(2), AlphArray(3), "Air Nodes");
891 :
892 38 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds < 1) {
893 0 : ShowSevereError(
894 : state,
895 0 : format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
896 0 : ShowContinueError(state, format("...{} must be >= 1. entered number is {:.0T}", cNumericFields(1), NumArray(1)));
897 0 : ErrorsFound = true;
898 : }
899 :
900 38 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel >
901 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds) {
902 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel =
903 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds;
904 : }
905 :
906 38 : if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel >
907 76 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds) ||
908 38 : (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel <= 0)) {
909 0 : ShowSevereError(
910 : state,
911 0 : format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
912 0 : ShowContinueError(state, format("...{} must be valid speed level entered number is {:.0T}", cNumericFields(2), NumArray(2)));
913 0 : ErrorsFound = true;
914 : }
915 :
916 : // part load curve
917 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR = Curve::GetCurveIndex(state, AlphArray(4)); // convert curve name to number
918 38 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR == 0) {
919 0 : if (lAlphaBlanks(4)) {
920 0 : ShowSevereError(
921 : state,
922 0 : format("{}{}=\"{}\", missing", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
923 0 : ShowContinueError(state, format("...required {} is blank.", cAlphaFields(6)));
924 : } else {
925 0 : ShowSevereError(
926 : state,
927 0 : format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
928 0 : ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(4), AlphArray(4)));
929 : }
930 0 : ErrorsFound = true;
931 : } else {
932 38 : CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR, 1.0);
933 38 : if (CurveVal > 1.10 || CurveVal < 0.90) {
934 0 : ShowWarningError(state,
935 0 : format("{}{}=\"{}\", curve values",
936 : RoutineName,
937 : CurrentModuleObject,
938 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
939 0 : ShowContinueError(state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(4)));
940 0 : ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
941 : }
942 : }
943 :
944 : // outdoor condenser node
945 38 : if (lAlphaBlanks(5)) {
946 34 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum = 0;
947 : } else {
948 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum =
949 8 : GetOnlySingleNode(state,
950 4 : AlphArray(5),
951 : ErrorsFound,
952 : DataLoopNode::ConnectionObjectType::CoilCoolingDXVariableSpeed,
953 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
954 : DataLoopNode::NodeFluidType::Air,
955 : DataLoopNode::ConnectionType::OutsideAirReference,
956 : NodeInputManager::CompFluidStream::Primary,
957 : DataLoopNode::ObjectIsNotParent);
958 :
959 4 : if (!OutAirNodeManager::CheckOutAirNodeNumber(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum)) {
960 4 : ShowWarningError(state,
961 4 : format("{}{}=\"{}\", may be invalid",
962 : RoutineName,
963 : CurrentModuleObject,
964 2 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
965 4 : ShowContinueError(state,
966 4 : format("{}=\"{}\", node does not appear in an OutdoorAir:NodeList or as an OutdoorAir:Node.",
967 : cAlphaFields(10),
968 : AlphArray(5)));
969 6 : ShowContinueError(
970 : state, "This node needs to be included in an air system or the coil model will not be valid, and the simulation continues");
971 : }
972 : }
973 :
974 38 : if ((Util::SameString(AlphArray(6), "AirCooled")) || lAlphaBlanks(6)) {
975 37 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserType = DataHeatBalance::RefrigCondenserType::Air;
976 1 : } else if (Util::SameString(AlphArray(6), "EvaporativelyCooled")) {
977 1 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserType = DataHeatBalance::RefrigCondenserType::Evap;
978 1 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).ReportEvapCondVars = true;
979 : } else {
980 0 : ShowSevereError(
981 : state,
982 0 : format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
983 0 : ShowContinueError(state, format("...{}=\"{}\":", cAlphaFields(6), AlphArray(6)));
984 0 : ShowContinueError(state, "...must be AirCooled or EvaporativelyCooled.");
985 0 : ErrorsFound = true;
986 : }
987 :
988 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondPumpElecNomPower = NumArray(10);
989 :
990 38 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondPumpElecNomPower != DataSizing::AutoSize) {
991 37 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondPumpElecNomPower < 0.0) {
992 0 : ShowSevereError(
993 : state,
994 0 : format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
995 0 : ShowContinueError(state, format("...{} cannot be < 0.0.", cNumericFields(10)));
996 0 : ShowContinueError(state, format("...entered value=[{:.2T}].", NumArray(10)));
997 0 : ErrorsFound = true;
998 : }
999 : }
1000 :
1001 : // Set crankcase heater capacity
1002 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacity = NumArray(11);
1003 38 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacity < 0.0) {
1004 0 : ShowSevereError(
1005 : state,
1006 0 : format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1007 0 : ShowContinueError(state, format("...{} cannot be < 0.0.", cNumericFields(11)));
1008 0 : ShowContinueError(state, format("...entered value=[{:.2T}].", NumArray(11)));
1009 0 : ErrorsFound = true;
1010 : }
1011 :
1012 : // Set crankcase heater cutout temperature
1013 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxOATCrankcaseHeater = NumArray(12);
1014 :
1015 : // Set crankcase heater cutout temperature
1016 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MinOATCompressor = NumArray(13);
1017 :
1018 : // A7; \field Crankcase Heater Capacity Function of Outdoor Temperature Curve Name
1019 38 : if (!lAlphaBlanks(7)) {
1020 2 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex = Curve::GetCurveIndex(state, AlphArray(7));
1021 2 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex == 0) { // can't find the curve
1022 0 : ShowSevereError(state,
1023 0 : format("{} = {}: {} not found = {}",
1024 : CurrentModuleObject,
1025 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
1026 : cAlphaFields(7),
1027 : AlphArray(7)));
1028 0 : ErrorsFound = true;
1029 : } else {
1030 2 : ErrorsFound |=
1031 8 : Curve::CheckCurveDims(state,
1032 2 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex, // Curve index
1033 : {1}, // Valid dimensions
1034 : RoutineName, // Routine name
1035 : CurrentModuleObject, // Object Type
1036 2 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
1037 2 : cAlphaFields(7)); // Field Name
1038 : }
1039 : }
1040 :
1041 : // Get Water System tank connections
1042 : // A8, \field Name of Water Storage Tank for Supply
1043 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterSupplyName = AlphArray(8);
1044 38 : if (lAlphaBlanks(8)) {
1045 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterSupplyMode = WaterSupplyFromMains;
1046 : } else {
1047 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterSupplyMode = WaterSupplyFromTank;
1048 0 : WaterManager::SetupTankDemandComponent(state,
1049 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
1050 : CurrentModuleObject,
1051 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterSupplyName,
1052 : ErrorsFound,
1053 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterSupTankID,
1054 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterTankDemandARRID);
1055 : }
1056 :
1057 : // A9; \field Name of Water Storage Tank for Condensate Collection
1058 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondensateCollectName = AlphArray(9);
1059 38 : if (lAlphaBlanks(9)) {
1060 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondensateCollectMode = CondensateDiscarded;
1061 : } else {
1062 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondensateCollectMode = CondensateToTank;
1063 0 : WaterManager::SetupTankSupplyComponent(state,
1064 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
1065 : CurrentModuleObject,
1066 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondensateCollectName,
1067 : ErrorsFound,
1068 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondensateTankID,
1069 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondensateTankSupplyARRID);
1070 : }
1071 :
1072 : // Basin heater power as a function of temperature must be greater than or equal to 0
1073 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterPowerFTempDiff = NumArray(14);
1074 38 : if (NumArray(14) < 0.0) {
1075 0 : ShowSevereError(
1076 : state,
1077 0 : format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1078 0 : ShowContinueError(state, format("...{} must be >= 0.0.", cNumericFields(14)));
1079 0 : ShowContinueError(state, format("...entered value=[{:.2T}].", NumArray(14)));
1080 0 : ErrorsFound = true;
1081 : }
1082 :
1083 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterSetPointTemp = NumArray(15);
1084 38 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterPowerFTempDiff > 0.0) {
1085 0 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterSetPointTemp < 2.0) {
1086 0 : ShowWarningError(state,
1087 0 : format("{}{}=\"{}\", freeze possible",
1088 : RoutineName,
1089 : CurrentModuleObject,
1090 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1091 0 : ShowContinueError(state, format("...{} is < 2 {{C}}. Freezing could occur.", cNumericFields(15)));
1092 0 : ShowContinueError(state, format("...entered value=[{:.2T}].", NumArray(15)));
1093 : }
1094 : }
1095 :
1096 38 : if (lAlphaBlanks(10)) {
1097 : // Should this be ScheduleAlwaysOff?
1098 0 : } else if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).basinHeaterSched = Sched::GetSchedule(state, AlphArray(10))) ==
1099 : nullptr) {
1100 0 : ShowWarningItemNotFound(
1101 0 : state, eoh, cAlphaFields(10), AlphArray(10), "Basin heater will be available to operate throughout the simulation.");
1102 : }
1103 :
1104 234 : for (int I = 1; I <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds; ++I) {
1105 196 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I) = NumArray(16 + (I - 1) * 8);
1106 196 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedSHR(I) = NumArray(17 + (I - 1) * 8);
1107 196 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(I) = NumArray(18 + (I - 1) * 8);
1108 196 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(I) = NumArray(19 + (I - 1) * 8);
1109 196 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedEvaporatorFanPowerPerVolumeFlowRate2017(I) = NumArray(20 + (I - 1) * 8);
1110 196 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedEvaporatorFanPowerPerVolumeFlowRate2023(I) = NumArray(21 + (I - 1) * 8);
1111 196 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondAirFlow(I) = NumArray(22 + (I - 1) * 8);
1112 196 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondEffect(I) = NumArray(23 + (I - 1) * 8);
1113 392 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondEffect(I) < 0.0 ||
1114 196 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondEffect(I) > 1.0) {
1115 0 : ShowSevereError(
1116 : state,
1117 0 : format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1118 0 : ShowContinueError(state, format("...{} cannot be < 0.0 or > 1.0.", cNumericFields(23 + (I - 1) * 8)));
1119 0 : ShowContinueError(state, format("...entered value=[{:.2T}].", NumArray(23 + (I - 1) * 8)));
1120 0 : ErrorsFound = true;
1121 : }
1122 :
1123 196 : AlfaFieldIncre = 11 + (I - 1) * 4;
1124 196 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I) =
1125 196 : Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
1126 196 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I) == 0) {
1127 0 : if (lAlphaBlanks(AlfaFieldIncre)) {
1128 0 : ShowSevereError(state,
1129 0 : format("{}{}=\"{}\", missing",
1130 : RoutineName,
1131 : CurrentModuleObject,
1132 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1133 0 : ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
1134 : } else {
1135 0 : ShowSevereError(state,
1136 0 : format("{}{}=\"{}\", invalid",
1137 : RoutineName,
1138 : CurrentModuleObject,
1139 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1140 0 : ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
1141 : }
1142 0 : ErrorsFound = true;
1143 : } else {
1144 : // Verify Curve Object, only legal type is BiQuadratic
1145 588 : ErrorsFound |= Curve::CheckCurveDims(state,
1146 196 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I), // Curve index
1147 : {2}, // Valid dimensions
1148 : RoutineName, // Routine name
1149 : CurrentModuleObject, // Object Type
1150 196 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
1151 196 : cAlphaFields(AlfaFieldIncre)); // Field Name
1152 :
1153 196 : if (!ErrorsFound) {
1154 392 : CurveVal = Curve::CurveValue(
1155 196 : state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I), RatedInletWetBulbTemp, RatedAmbAirTemp);
1156 196 : if (CurveVal > 1.10 || CurveVal < 0.90) {
1157 4 : ShowWarningError(state,
1158 4 : format("{}{}=\"{}\", curve values",
1159 : RoutineName,
1160 : CurrentModuleObject,
1161 2 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1162 4 : ShowContinueError(
1163 4 : state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
1164 2 : ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
1165 : }
1166 : }
1167 : }
1168 :
1169 196 : AlfaFieldIncre = 12 + (I - 1) * 4;
1170 196 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I) =
1171 196 : Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
1172 196 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I) == 0) {
1173 0 : if (lAlphaBlanks(AlfaFieldIncre)) {
1174 0 : ShowSevereError(state,
1175 0 : format("{}{}=\"{}\", missing",
1176 : RoutineName,
1177 : CurrentModuleObject,
1178 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1179 0 : ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
1180 : } else {
1181 0 : ShowSevereError(state,
1182 0 : format("{}{}=\"{}\", invalid",
1183 : RoutineName,
1184 : CurrentModuleObject,
1185 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1186 0 : ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
1187 : }
1188 0 : ErrorsFound = true;
1189 : } else {
1190 : // Verify Curve Object, only legal type is Quadratic
1191 588 : ErrorsFound |= Curve::CheckCurveDims(state,
1192 196 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I), // Curve index
1193 : {1}, // Valid dimensions
1194 : RoutineName, // Routine name
1195 : CurrentModuleObject, // Object Type
1196 196 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
1197 196 : cAlphaFields(AlfaFieldIncre)); // Field Name
1198 :
1199 196 : if (!ErrorsFound) {
1200 196 : CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I), 1.0);
1201 196 : if (CurveVal > 1.10 || CurveVal < 0.90) {
1202 0 : ShowWarningError(state,
1203 0 : format("{}{}=\"{}\", curve values",
1204 : RoutineName,
1205 : CurrentModuleObject,
1206 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1207 0 : ShowContinueError(
1208 0 : state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
1209 0 : ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
1210 : }
1211 : }
1212 : }
1213 :
1214 196 : AlfaFieldIncre = 13 + (I - 1) * 4;
1215 196 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I) =
1216 196 : Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
1217 196 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I) == 0) {
1218 0 : if (lAlphaBlanks(AlfaFieldIncre)) {
1219 0 : ShowSevereError(state,
1220 0 : format("{}{}=\"{}\", missing",
1221 : RoutineName,
1222 : CurrentModuleObject,
1223 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1224 0 : ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
1225 : } else {
1226 0 : ShowSevereError(state,
1227 0 : format("{}{}=\"{}\", invalid",
1228 : RoutineName,
1229 : CurrentModuleObject,
1230 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1231 0 : ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
1232 : }
1233 0 : ErrorsFound = true;
1234 : } else {
1235 : // Verify Curve Object, only legal type is BiQuadratic
1236 588 : ErrorsFound |= Curve::CheckCurveDims(state,
1237 196 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I), // Curve index
1238 : {2}, // Valid dimensions
1239 : RoutineName, // Routine name
1240 : CurrentModuleObject, // Object Type
1241 196 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
1242 196 : cAlphaFields(AlfaFieldIncre)); // Field Name
1243 :
1244 196 : if (!ErrorsFound) {
1245 392 : CurveVal = Curve::CurveValue(
1246 196 : state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I), RatedInletWetBulbTemp, RatedAmbAirTemp);
1247 196 : if (CurveVal > 1.10 || CurveVal < 0.90) {
1248 4 : ShowWarningError(state,
1249 4 : format("{}{}=\"{}\", curve values",
1250 : RoutineName,
1251 : CurrentModuleObject,
1252 2 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1253 4 : ShowContinueError(
1254 4 : state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
1255 2 : ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
1256 : }
1257 : }
1258 : }
1259 :
1260 196 : AlfaFieldIncre = 14 + (I - 1) * 4;
1261 196 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I) =
1262 196 : Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
1263 196 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I) == 0) {
1264 0 : if (lAlphaBlanks(AlfaFieldIncre)) {
1265 0 : ShowSevereError(state,
1266 0 : format("{}{}=\"{}\", missing",
1267 : RoutineName,
1268 : CurrentModuleObject,
1269 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1270 0 : ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
1271 : } else {
1272 0 : ShowSevereError(state,
1273 0 : format("{}{}=\"{}\", invalid",
1274 : RoutineName,
1275 : CurrentModuleObject,
1276 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1277 0 : ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
1278 : }
1279 0 : ErrorsFound = true;
1280 : } else {
1281 : // Verify Curve Object, only legal type is Quadratic
1282 588 : ErrorsFound |= Curve::CheckCurveDims(state,
1283 196 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I), // Curve index
1284 : {1}, // Valid dimensions
1285 : RoutineName, // Routine name
1286 : CurrentModuleObject, // Object Type
1287 196 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
1288 196 : cAlphaFields(AlfaFieldIncre)); // Field Name
1289 :
1290 196 : if (!ErrorsFound) {
1291 196 : CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I), 1.0);
1292 196 : if (CurveVal > 1.10 || CurveVal < 0.90) {
1293 0 : ShowWarningError(state,
1294 0 : format("{}{}=\"{}\", curve values",
1295 : RoutineName,
1296 : CurrentModuleObject,
1297 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1298 0 : ShowContinueError(
1299 0 : state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
1300 0 : ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
1301 : }
1302 : }
1303 : }
1304 : }
1305 :
1306 234 : for (int I = 1; I <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds; ++I) {
1307 196 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedPercentTotCap(I) =
1308 196 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I) /
1309 392 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(
1310 196 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
1311 196 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowPerRatedTotCap(I) =
1312 196 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(I) /
1313 196 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I);
1314 196 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedEvapCondVolFlowPerRatedTotCap(I) =
1315 196 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondAirFlow(I) /
1316 196 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I);
1317 : }
1318 :
1319 : // CurrentModuleObject = "Coil:Cooling:DX:VariableSpeed"
1320 76 : SetupOutputVariable(state,
1321 : "Cooling Coil Electricity Energy",
1322 : Constant::Units::J,
1323 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Energy,
1324 : OutputProcessor::TimeStepType::System,
1325 : OutputProcessor::StoreType::Sum,
1326 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
1327 : Constant::eResource::Electricity,
1328 : OutputProcessor::Group::HVAC,
1329 : OutputProcessor::EndUseCat::Cooling);
1330 76 : SetupOutputVariable(state,
1331 : "Cooling Coil Total Cooling Energy",
1332 : Constant::Units::J,
1333 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLoadTotal,
1334 : OutputProcessor::TimeStepType::System,
1335 : OutputProcessor::StoreType::Sum,
1336 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
1337 : Constant::eResource::EnergyTransfer,
1338 : OutputProcessor::Group::HVAC,
1339 : OutputProcessor::EndUseCat::CoolingCoils);
1340 76 : SetupOutputVariable(state,
1341 : "Cooling Coil Sensible Cooling Energy",
1342 : Constant::Units::J,
1343 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySensible,
1344 : OutputProcessor::TimeStepType::System,
1345 : OutputProcessor::StoreType::Sum,
1346 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
1347 76 : SetupOutputVariable(state,
1348 : "Cooling Coil Latent Cooling Energy",
1349 : Constant::Units::J,
1350 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLatent,
1351 : OutputProcessor::TimeStepType::System,
1352 : OutputProcessor::StoreType::Sum,
1353 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
1354 76 : SetupOutputVariable(state,
1355 : "Cooling Coil Source Side Heat Transfer Energy",
1356 : Constant::Units::J,
1357 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySource,
1358 : OutputProcessor::TimeStepType::System,
1359 : OutputProcessor::StoreType::Sum,
1360 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
1361 :
1362 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedCapCoolSens =
1363 : DataSizing::AutoSize; // always auto-sized, to be determined in the sizing calculation
1364 : }
1365 :
1366 : //-------------------------AIR SOURCE COOLING---END
1367 :
1368 : // Get the data for heating coil, WATER SOURCE
1369 49 : CurrentModuleObject = "Coil:Heating:WaterToAirHeatPump:VariableSpeedEquationFit";
1370 :
1371 53 : for (int CoilCounter = 1; CoilCounter <= NumHeat; ++CoilCounter) {
1372 :
1373 4 : ++DXCoilNum;
1374 :
1375 4 : state.dataInputProcessing->inputProcessor->getObjectItem(state,
1376 : CurrentModuleObject,
1377 : CoilCounter,
1378 : AlphArray,
1379 : NumAlphas,
1380 : NumArray,
1381 : NumNums,
1382 : IOStat,
1383 : lNumericBlanks,
1384 : lAlphaBlanks,
1385 : cAlphaFields,
1386 : cNumericFields);
1387 : // ErrorsFound will be set to True if problem was found, left untouched otherwise
1388 4 : GlobalNames::VerifyUniqueCoilName(state, CurrentModuleObject, AlphArray(1), ErrorsFound, CurrentModuleObject + " Name");
1389 :
1390 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).bIsDesuperheater = false;
1391 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name = AlphArray(1);
1392 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CoolHeatType = "HEATING";
1393 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType = HVAC::Coil_HeatingWaterToAirHPVSEquationFit; // fix coil type
1394 :
1395 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VarSpeedCoilType =
1396 8 : HVAC::cAllCoilTypes(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType);
1397 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds = int(NumArray(1));
1398 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel = int(NumArray(2));
1399 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedCapHeat = NumArray(3);
1400 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedAirVolFlowRate = NumArray(4);
1401 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedWaterVolFlowRate = NumArray(5);
1402 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserType = DataHeatBalance::RefrigCondenserType::Water;
1403 :
1404 : // Previously set by parent objects, but not user-definable
1405 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxONOFFCyclesperHour = 4;
1406 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).LatentCapacityTimeConstant = 0.;
1407 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FanDelayTime = 0.;
1408 :
1409 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterInletNodeNum =
1410 8 : GetOnlySingleNode(state,
1411 4 : AlphArray(2),
1412 : ErrorsFound,
1413 : DataLoopNode::ConnectionObjectType::CoilHeatingWaterToAirHeatPumpVariableSpeedEquationFit,
1414 4 : AlphArray(1),
1415 : DataLoopNode::NodeFluidType::Water,
1416 : DataLoopNode::ConnectionType::Inlet,
1417 : NodeInputManager::CompFluidStream::Secondary,
1418 : DataLoopNode::ObjectIsNotParent);
1419 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterOutletNodeNum =
1420 8 : GetOnlySingleNode(state,
1421 4 : AlphArray(3),
1422 : ErrorsFound,
1423 : DataLoopNode::ConnectionObjectType::CoilHeatingWaterToAirHeatPumpVariableSpeedEquationFit,
1424 4 : AlphArray(1),
1425 : DataLoopNode::NodeFluidType::Water,
1426 : DataLoopNode::ConnectionType::Outlet,
1427 : NodeInputManager::CompFluidStream::Secondary,
1428 : DataLoopNode::ObjectIsNotParent);
1429 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirInletNodeNum =
1430 8 : GetOnlySingleNode(state,
1431 4 : AlphArray(4),
1432 : ErrorsFound,
1433 : DataLoopNode::ConnectionObjectType::CoilHeatingWaterToAirHeatPumpVariableSpeedEquationFit,
1434 4 : AlphArray(1),
1435 : DataLoopNode::NodeFluidType::Air,
1436 : DataLoopNode::ConnectionType::Inlet,
1437 : NodeInputManager::CompFluidStream::Primary,
1438 : DataLoopNode::ObjectIsNotParent);
1439 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirOutletNodeNum =
1440 12 : GetOnlySingleNode(state,
1441 4 : AlphArray(5),
1442 : ErrorsFound,
1443 : DataLoopNode::ConnectionObjectType::CoilHeatingWaterToAirHeatPumpVariableSpeedEquationFit,
1444 4 : AlphArray(1),
1445 : DataLoopNode::NodeFluidType::Air,
1446 : DataLoopNode::ConnectionType::Outlet,
1447 : NodeInputManager::CompFluidStream::Primary,
1448 : DataLoopNode::ObjectIsNotParent);
1449 :
1450 8 : BranchNodeConnections::TestCompSet(state, CurrentModuleObject, AlphArray(1), AlphArray(2), AlphArray(3), "Water Nodes");
1451 4 : BranchNodeConnections::TestCompSet(state, CurrentModuleObject, AlphArray(1), AlphArray(4), AlphArray(5), "Air Nodes");
1452 :
1453 : // If (VarSpeedCoil(DXCoilNum)%NumOfSpeeds .LT. 2) Then
1454 4 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds < 1) {
1455 0 : ShowSevereError(
1456 : state,
1457 0 : format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1458 0 : ShowContinueError(state, format("...{} must be >= 1. entered number is {:.0T}", cNumericFields(1), NumArray(1)));
1459 0 : ErrorsFound = true;
1460 : }
1461 :
1462 4 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel >
1463 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds) {
1464 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel =
1465 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds;
1466 : }
1467 :
1468 4 : if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel >
1469 8 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds) ||
1470 4 : (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel <= 0)) {
1471 0 : ShowSevereError(
1472 : state,
1473 0 : format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1474 0 : ShowContinueError(state, format("...{} must be valid speed level entered number is {:.0T}", cNumericFields(2), NumArray(2)));
1475 0 : ErrorsFound = true;
1476 : }
1477 :
1478 : // part load curve
1479 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR = Curve::GetCurveIndex(state, AlphArray(6)); // convert curve name to number
1480 4 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR == 0) {
1481 0 : if (lAlphaBlanks(6)) {
1482 0 : ShowSevereError(
1483 : state,
1484 0 : format("{}{}=\"{}\", missing", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1485 0 : ShowContinueError(state, format("...required {} is blank.", cAlphaFields(6)));
1486 : } else {
1487 0 : ShowSevereError(
1488 : state,
1489 0 : format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1490 0 : ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(6), AlphArray(6)));
1491 : }
1492 0 : ErrorsFound = true;
1493 : } else {
1494 4 : CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR, 1.0);
1495 4 : if (CurveVal > 1.10 || CurveVal < 0.90) {
1496 0 : ShowWarningError(state,
1497 0 : format("{}{}=\"{}\", curve values",
1498 : RoutineName,
1499 : CurrentModuleObject,
1500 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1501 0 : ShowContinueError(state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(6)));
1502 0 : ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
1503 : }
1504 : }
1505 :
1506 42 : for (int I = 1; I <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds; ++I) {
1507 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I) = NumArray(6 + (I - 1) * 5);
1508 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(I) = NumArray(7 + (I - 1) * 5);
1509 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(I) = NumArray(8 + (I - 1) * 5);
1510 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowRate(I) = NumArray(9 + (I - 1) * 5);
1511 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeatFrac(I) = NumArray(10 + (I - 1) * 5);
1512 :
1513 38 : AlfaFieldIncre = 7 + (I - 1) * 7;
1514 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I) =
1515 38 : Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
1516 38 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I) == 0) {
1517 0 : if (lAlphaBlanks(AlfaFieldIncre)) {
1518 0 : ShowSevereError(state,
1519 0 : format("{}{}=\"{}\", missing",
1520 : RoutineName,
1521 : CurrentModuleObject,
1522 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1523 0 : ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
1524 : } else {
1525 0 : ShowSevereError(state,
1526 0 : format("{}{}=\"{}\", invalid",
1527 : RoutineName,
1528 : CurrentModuleObject,
1529 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1530 0 : ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
1531 : }
1532 0 : ErrorsFound = true;
1533 : } else {
1534 : // Verify Curve Object, only legal type is BiQuadratic
1535 114 : ErrorsFound |= Curve::CheckCurveDims(state,
1536 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I), // Curve index
1537 : {2}, // Valid dimensions
1538 : RoutineName, // Routine name
1539 : CurrentModuleObject, // Object Type
1540 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
1541 38 : cAlphaFields(AlfaFieldIncre)); // Field Name
1542 :
1543 38 : if (!ErrorsFound) {
1544 76 : CurveVal = Curve::CurveValue(state,
1545 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I),
1546 : RatedInletAirTempHeat,
1547 : RatedInletWaterTempHeat);
1548 38 : if (CurveVal > 1.10 || CurveVal < 0.90) {
1549 0 : ShowWarningError(state,
1550 0 : format("{}{}=\"{}\", curve values",
1551 : RoutineName,
1552 : CurrentModuleObject,
1553 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1554 0 : ShowContinueError(
1555 0 : state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
1556 0 : ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
1557 : }
1558 : }
1559 : }
1560 :
1561 38 : AlfaFieldIncre = 8 + (I - 1) * 7;
1562 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I) =
1563 38 : Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
1564 38 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I) == 0) {
1565 0 : if (lAlphaBlanks(AlfaFieldIncre)) {
1566 0 : ShowSevereError(state,
1567 0 : format("{}{}=\"{}\", missing",
1568 : RoutineName,
1569 : CurrentModuleObject,
1570 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1571 0 : ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
1572 : } else {
1573 0 : ShowSevereError(state,
1574 0 : format("{}{}=\"{}\", invalid",
1575 : RoutineName,
1576 : CurrentModuleObject,
1577 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1578 0 : ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
1579 : }
1580 0 : ErrorsFound = true;
1581 : } else {
1582 : // Verify Curve Object, only legal type is Quadratic
1583 114 : ErrorsFound |= Curve::CheckCurveDims(state,
1584 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I), // Curve index
1585 : {1}, // Valid dimensions
1586 : RoutineName, // Routine name
1587 : CurrentModuleObject, // Object Type
1588 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
1589 38 : cAlphaFields(AlfaFieldIncre)); // Field Name
1590 :
1591 38 : if (!ErrorsFound) {
1592 38 : CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I), 1.0);
1593 38 : if (CurveVal > 1.10 || CurveVal < 0.90) {
1594 0 : ShowWarningError(state,
1595 0 : format("{}{}=\"{}\", curve values",
1596 : RoutineName,
1597 : CurrentModuleObject,
1598 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1599 0 : ShowContinueError(
1600 0 : state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
1601 0 : ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
1602 : }
1603 : }
1604 : }
1605 :
1606 38 : AlfaFieldIncre = 9 + (I - 1) * 7;
1607 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(I) =
1608 38 : Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
1609 38 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(I) == 0) {
1610 0 : if (lAlphaBlanks(AlfaFieldIncre)) {
1611 0 : ShowSevereError(state,
1612 0 : format("{}{}=\"{}\", missing",
1613 : RoutineName,
1614 : CurrentModuleObject,
1615 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1616 0 : ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
1617 : } else {
1618 0 : ShowSevereError(state,
1619 0 : format("{}{}=\"{}\", invalid",
1620 : RoutineName,
1621 : CurrentModuleObject,
1622 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1623 0 : ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
1624 : }
1625 0 : ErrorsFound = true;
1626 : } else {
1627 : // Verify Curve Object, only legal type is Quadratic
1628 114 : ErrorsFound |= Curve::CheckCurveDims(state,
1629 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(I), // Curve index
1630 : {1}, // Valid dimensions
1631 : RoutineName, // Routine name
1632 : CurrentModuleObject, // Object Type
1633 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
1634 38 : cAlphaFields(AlfaFieldIncre)); // Field Name
1635 :
1636 38 : if (!ErrorsFound) {
1637 38 : CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(I), 1.0);
1638 38 : if (CurveVal > 1.10 || CurveVal < 0.90) {
1639 0 : ShowWarningError(state,
1640 0 : format("{}{}=\"{}\", curve values",
1641 : RoutineName,
1642 : CurrentModuleObject,
1643 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1644 0 : ShowContinueError(
1645 0 : state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
1646 0 : ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
1647 : }
1648 : }
1649 : }
1650 :
1651 38 : AlfaFieldIncre = 10 + (I - 1) * 7;
1652 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I) =
1653 38 : Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
1654 38 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I) == 0) {
1655 0 : if (lAlphaBlanks(AlfaFieldIncre)) {
1656 0 : ShowSevereError(state,
1657 0 : format("{}{}=\"{}\", missing",
1658 : RoutineName,
1659 : CurrentModuleObject,
1660 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1661 0 : ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
1662 : } else {
1663 0 : ShowSevereError(state,
1664 0 : format("{}{}=\"{}\", invalid",
1665 : RoutineName,
1666 : CurrentModuleObject,
1667 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1668 0 : ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
1669 : }
1670 0 : ErrorsFound = true;
1671 : } else {
1672 : // Verify Curve Object, only legal type is BiQuadratic
1673 114 : ErrorsFound |= Curve::CheckCurveDims(state,
1674 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I), // Curve index
1675 : {2}, // Valid dimensions
1676 : RoutineName, // Routine name
1677 : CurrentModuleObject, // Object Type
1678 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
1679 38 : cAlphaFields(AlfaFieldIncre)); // Field Name
1680 :
1681 38 : if (!ErrorsFound) {
1682 76 : CurveVal = Curve::CurveValue(state,
1683 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I),
1684 : RatedInletAirTempHeat,
1685 : RatedInletWaterTempHeat);
1686 38 : if (CurveVal > 1.10 || CurveVal < 0.90) {
1687 0 : ShowWarningError(state,
1688 0 : format("{}{}=\"{}\", curve values",
1689 : RoutineName,
1690 : CurrentModuleObject,
1691 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1692 0 : ShowContinueError(
1693 0 : state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
1694 0 : ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
1695 : }
1696 : }
1697 : }
1698 :
1699 38 : AlfaFieldIncre = 11 + (I - 1) * 7;
1700 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I) =
1701 38 : Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
1702 38 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I) == 0) {
1703 0 : if (lAlphaBlanks(AlfaFieldIncre)) {
1704 0 : ShowSevereError(state,
1705 0 : format("{}{}=\"{}\", missing",
1706 : RoutineName,
1707 : CurrentModuleObject,
1708 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1709 0 : ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
1710 : } else {
1711 0 : ShowSevereError(state,
1712 0 : format("{}{}=\"{}\", invalid",
1713 : RoutineName,
1714 : CurrentModuleObject,
1715 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1716 0 : ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
1717 : }
1718 0 : ErrorsFound = true;
1719 : } else {
1720 : // Verify Curve Object, only legal type is Quadratic
1721 114 : ErrorsFound |= Curve::CheckCurveDims(state,
1722 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I), // Curve index
1723 : {1}, // Valid dimensions
1724 : RoutineName, // Routine name
1725 : CurrentModuleObject, // Object Type
1726 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
1727 38 : cAlphaFields(AlfaFieldIncre)); // Field Name
1728 :
1729 38 : if (!ErrorsFound) {
1730 38 : CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I), 1.0);
1731 38 : if (CurveVal > 1.10 || CurveVal < 0.90) {
1732 0 : ShowWarningError(state,
1733 0 : format("{}{}=\"{}\", curve values",
1734 : RoutineName,
1735 : CurrentModuleObject,
1736 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1737 0 : ShowContinueError(
1738 0 : state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
1739 0 : ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
1740 : }
1741 : }
1742 : }
1743 :
1744 38 : AlfaFieldIncre = 12 + (I - 1) * 7;
1745 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(I) =
1746 38 : Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
1747 38 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(I) == 0) {
1748 0 : if (lAlphaBlanks(AlfaFieldIncre)) {
1749 0 : ShowSevereError(state,
1750 0 : format("{}{}=\"{}\", missing",
1751 : RoutineName,
1752 : CurrentModuleObject,
1753 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1754 0 : ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
1755 : } else {
1756 0 : ShowSevereError(state,
1757 0 : format("{}{}=\"{}\", invalid",
1758 : RoutineName,
1759 : CurrentModuleObject,
1760 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1761 0 : ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
1762 : }
1763 0 : ErrorsFound = true;
1764 : } else {
1765 : // Verify Curve Object, only legal type is Quadratic
1766 114 : ErrorsFound |= Curve::CheckCurveDims(state,
1767 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(I), // Curve index
1768 : {1}, // Valid dimensions
1769 : RoutineName, // Routine name
1770 : CurrentModuleObject, // Object Type
1771 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
1772 38 : cAlphaFields(AlfaFieldIncre)); // Field Name
1773 :
1774 38 : if (!ErrorsFound) {
1775 38 : CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(I), 1.0);
1776 38 : if (CurveVal > 1.10 || CurveVal < 0.90) {
1777 0 : ShowWarningError(state,
1778 0 : format("{}{}=\"{}\", curve values",
1779 : RoutineName,
1780 : CurrentModuleObject,
1781 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1782 0 : ShowContinueError(
1783 0 : state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
1784 0 : ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
1785 : }
1786 : }
1787 : }
1788 :
1789 38 : AlfaFieldIncre = 13 + (I - 1) * 7;
1790 : // Read waste heat modifier curve name
1791 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(I) =
1792 38 : Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
1793 38 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(I) == 0) {
1794 0 : if (lAlphaBlanks(AlfaFieldIncre)) {
1795 0 : ShowSevereError(state,
1796 0 : format("{}{}=\"{}\", missing",
1797 : RoutineName,
1798 : CurrentModuleObject,
1799 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1800 0 : ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
1801 : } else {
1802 0 : ShowSevereError(state,
1803 0 : format("{}{}=\"{}\", invalid",
1804 : RoutineName,
1805 : CurrentModuleObject,
1806 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1807 0 : ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
1808 : }
1809 0 : ErrorsFound = true;
1810 : } else {
1811 : // Verify Curve Object, only legal types are BiQuadratic
1812 114 : ErrorsFound |= Curve::CheckCurveDims(state,
1813 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(I), // Curve index
1814 : {2}, // Valid dimensions
1815 : RoutineName, // Routine name
1816 : CurrentModuleObject, // Object Type
1817 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
1818 38 : cAlphaFields(AlfaFieldIncre)); // Field Name
1819 :
1820 38 : if (!ErrorsFound) {
1821 76 : CurveVal = Curve::CurveValue(state,
1822 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(I),
1823 : RatedInletAirTempHeat,
1824 : RatedInletWaterTempHeat);
1825 38 : if (CurveVal > 1.10 || CurveVal < 0.90) {
1826 0 : ShowWarningError(state,
1827 0 : format("{}{}=\"{}\", curve values",
1828 : RoutineName,
1829 : CurrentModuleObject,
1830 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1831 0 : ShowContinueError(
1832 0 : state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
1833 0 : ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
1834 : }
1835 : }
1836 : }
1837 : }
1838 :
1839 42 : for (int I = 1; I <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds; ++I) {
1840 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedPercentTotCap(I) =
1841 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I) /
1842 76 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(
1843 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
1844 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowPerRatedTotCap(I) =
1845 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(I) /
1846 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I);
1847 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowPerRatedTotCap(I) =
1848 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowRate(I) /
1849 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I);
1850 : }
1851 :
1852 : // CurrentModuleObject = "Coil:Heating:WaterToAirHeatPump:VariableSpeedEquationFit"
1853 8 : SetupOutputVariable(state,
1854 : "Heating Coil Electricity Energy",
1855 : Constant::Units::J,
1856 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Energy,
1857 : OutputProcessor::TimeStepType::System,
1858 : OutputProcessor::StoreType::Sum,
1859 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
1860 : Constant::eResource::Electricity,
1861 : OutputProcessor::Group::HVAC,
1862 : OutputProcessor::EndUseCat::Heating);
1863 8 : SetupOutputVariable(state,
1864 : "Heating Coil Heating Energy",
1865 : Constant::Units::J,
1866 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLoadTotal,
1867 : OutputProcessor::TimeStepType::System,
1868 : OutputProcessor::StoreType::Sum,
1869 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
1870 : Constant::eResource::EnergyTransfer,
1871 : OutputProcessor::Group::HVAC,
1872 : OutputProcessor::EndUseCat::HeatingCoils);
1873 8 : SetupOutputVariable(state,
1874 : "Heating Coil Source Side Heat Transfer Energy",
1875 : Constant::Units::J,
1876 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySource,
1877 : OutputProcessor::TimeStepType::System,
1878 : OutputProcessor::StoreType::Sum,
1879 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
1880 : Constant::eResource::PlantLoopHeatingDemand,
1881 : OutputProcessor::Group::HVAC,
1882 : OutputProcessor::EndUseCat::HeatingCoils);
1883 :
1884 : // create predefined report entries
1885 8 : OutputReportPredefined::PreDefTableEntry(
1886 4 : state, state.dataOutRptPredefined->pdchHeatCoilType, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, CurrentModuleObject);
1887 8 : OutputReportPredefined::PreDefTableEntry(state,
1888 4 : state.dataOutRptPredefined->pdchHeatCoilNomCap,
1889 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
1890 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedCapHeat);
1891 8 : OutputReportPredefined::PreDefTableEntry(state,
1892 4 : state.dataOutRptPredefined->pdchHeatCoilNomEff,
1893 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
1894 8 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(
1895 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel));
1896 : }
1897 :
1898 : //-------------------------AIR SOURCE, HEATING---BEGIN
1899 : // Get the data for heating coil, AIR SOURCE
1900 49 : CurrentModuleObject = "COIL:HEATING:DX:VARIABLESPEED";
1901 :
1902 62 : for (int CoilCounter = 1; CoilCounter <= NumHeatAS; ++CoilCounter) {
1903 :
1904 13 : ++DXCoilNum;
1905 :
1906 13 : state.dataInputProcessing->inputProcessor->getObjectItem(state,
1907 : CurrentModuleObject,
1908 : CoilCounter,
1909 : AlphArray,
1910 : NumAlphas,
1911 : NumArray,
1912 : NumNums,
1913 : IOStat,
1914 : lNumericBlanks,
1915 : lAlphaBlanks,
1916 : cAlphaFields,
1917 : cNumericFields);
1918 : // ErrorsFound will be set to True if problem was found, left untouched otherwise
1919 13 : GlobalNames::VerifyUniqueCoilName(state, CurrentModuleObject, AlphArray(1), ErrorsFound, CurrentModuleObject + " Name");
1920 :
1921 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).bIsDesuperheater = false;
1922 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name = AlphArray(1);
1923 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CoolHeatType = "HEATING";
1924 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType = HVAC::Coil_HeatingAirToAirVariableSpeed;
1925 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VarSpeedCoilType = HVAC::cAllCoilTypes(HVAC::Coil_HeatingAirToAirVariableSpeed);
1926 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds = int(NumArray(1));
1927 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel = int(NumArray(2));
1928 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedCapHeat = NumArray(3);
1929 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedAirVolFlowRate = NumArray(4);
1930 :
1931 : // Previously set by parent objects, but not user-definable
1932 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxONOFFCyclesperHour = 4;
1933 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).LatentCapacityTimeConstant = 0.;
1934 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FanDelayTime = 0.;
1935 :
1936 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirInletNodeNum =
1937 26 : GetOnlySingleNode(state,
1938 13 : AlphArray(2),
1939 : ErrorsFound,
1940 : DataLoopNode::ConnectionObjectType::CoilHeatingDXVariableSpeed,
1941 13 : AlphArray(1),
1942 : DataLoopNode::NodeFluidType::Air,
1943 : DataLoopNode::ConnectionType::Inlet,
1944 : NodeInputManager::CompFluidStream::Primary,
1945 : DataLoopNode::ObjectIsNotParent);
1946 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirOutletNodeNum =
1947 39 : GetOnlySingleNode(state,
1948 13 : AlphArray(3),
1949 : ErrorsFound,
1950 : DataLoopNode::ConnectionObjectType::CoilHeatingDXVariableSpeed,
1951 13 : AlphArray(1),
1952 : DataLoopNode::NodeFluidType::Air,
1953 : DataLoopNode::ConnectionType::Outlet,
1954 : NodeInputManager::CompFluidStream::Primary,
1955 : DataLoopNode::ObjectIsNotParent);
1956 :
1957 13 : BranchNodeConnections::TestCompSet(state, CurrentModuleObject, AlphArray(1), AlphArray(2), AlphArray(3), "Air Nodes");
1958 :
1959 13 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds < 1) {
1960 0 : ShowSevereError(
1961 : state,
1962 0 : format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1963 0 : ShowContinueError(state, format("...{} must be >= 1. entered number is {:.0T}", cNumericFields(1), NumArray(1)));
1964 0 : ErrorsFound = true;
1965 : }
1966 :
1967 13 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel >
1968 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds) {
1969 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel =
1970 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds;
1971 : }
1972 :
1973 13 : if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel >
1974 26 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds) ||
1975 13 : (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel <= 0)) {
1976 0 : ShowSevereError(
1977 : state,
1978 0 : format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1979 0 : ShowContinueError(state, format("...{} must be valid speed level entered number is {:.0T}", cNumericFields(2), NumArray(2)));
1980 0 : ErrorsFound = true;
1981 : }
1982 :
1983 : // part load curve
1984 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR = Curve::GetCurveIndex(state, AlphArray(4)); // convert curve name to number
1985 13 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR == 0) {
1986 0 : if (lAlphaBlanks(4)) {
1987 0 : ShowSevereError(
1988 : state,
1989 0 : format("{}{}=\"{}\", missing", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1990 0 : ShowContinueError(state, format("...required {} is blank.", cAlphaFields(4)));
1991 : } else {
1992 0 : ShowSevereError(
1993 : state,
1994 0 : format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
1995 0 : ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(4), AlphArray(4)));
1996 : }
1997 0 : ErrorsFound = true;
1998 : } else {
1999 13 : CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR, 1.0);
2000 13 : if (CurveVal > 1.10 || CurveVal < 0.90) {
2001 4 : ShowWarningError(state,
2002 4 : format("{}{}=\"{}\", curve values",
2003 : RoutineName,
2004 : CurrentModuleObject,
2005 2 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2006 2 : ShowContinueError(state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(4)));
2007 2 : ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
2008 : }
2009 : }
2010 :
2011 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostEIRFT =
2012 13 : Curve::GetCurveIndex(state, AlphArray(5)); // convert curve name to number
2013 :
2014 13 : if (!lAlphaBlanks(6)) {
2015 2 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex = Curve::GetCurveIndex(state, AlphArray(6));
2016 :
2017 2 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex == 0) { // can't find the curve
2018 0 : ShowSevereError(state,
2019 0 : format("{} = {}: {} not found = {}",
2020 : CurrentModuleObject,
2021 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
2022 : cAlphaFields(6),
2023 : AlphArray(6)));
2024 0 : ErrorsFound = true;
2025 : } else {
2026 2 : ErrorsFound |=
2027 8 : Curve::CheckCurveDims(state,
2028 2 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex, // Curve index
2029 : {1}, // Valid dimensions
2030 : RoutineName, // Routine name
2031 : CurrentModuleObject, // Object Type
2032 2 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
2033 2 : cAlphaFields(6)); // Field Name
2034 : }
2035 : }
2036 :
2037 13 : if (Util::SameString(AlphArray(7), "ReverseCycle")) {
2038 0 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostEIRFT == 0) {
2039 0 : if (lAlphaBlanks(5)) {
2040 0 : ShowSevereError(state,
2041 0 : format("{}{}=\"{}\", missing",
2042 : RoutineName,
2043 : CurrentModuleObject,
2044 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2045 0 : ShowContinueError(state, format("...required {} is blank.", cAlphaFields(5)));
2046 0 : ShowContinueError(state, format("...field is required because {} is \"ReverseCycle\".", cAlphaFields(7)));
2047 : } else {
2048 0 : ShowSevereError(state,
2049 0 : format("{}{}=\"{}\", invalid",
2050 : RoutineName,
2051 : CurrentModuleObject,
2052 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2053 0 : ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(5), AlphArray(5)));
2054 : }
2055 0 : ErrorsFound = true;
2056 : } else {
2057 : // Verify Curve Object, only legal type is BiQuadratic
2058 0 : ErrorsFound |= Curve::CheckCurveDims(state,
2059 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostEIRFT, // Curve index
2060 : {2}, // Valid dimensions
2061 : RoutineName, // Routine name
2062 : CurrentModuleObject, // Object Type
2063 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
2064 0 : cAlphaFields(AlfaFieldIncre)); // Field Name
2065 : }
2066 : }
2067 :
2068 13 : if (Util::SameString(AlphArray(7), "ReverseCycle")) state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostStrategy = ReverseCycle;
2069 13 : if (Util::SameString(AlphArray(7), "Resistive")) state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostStrategy = Resistive;
2070 13 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostStrategy == 0) {
2071 0 : ShowSevereError(
2072 : state,
2073 0 : format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2074 0 : ShowContinueError(state, format("...illegal {}=\"{}\".", cAlphaFields(7), AlphArray(7)));
2075 0 : ShowContinueError(state, "...valid values for this field are ReverseCycle or Resistive.");
2076 0 : ErrorsFound = true;
2077 : }
2078 :
2079 13 : if (Util::SameString(AlphArray(8), "Timed")) state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostControl = Timed;
2080 13 : if (Util::SameString(AlphArray(8), "OnDemand")) state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostControl = OnDemand;
2081 13 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostControl == 0) {
2082 0 : ShowSevereError(
2083 : state,
2084 0 : format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2085 0 : ShowContinueError(state, format("...illegal {}=\"{}\".", cAlphaFields(8), AlphArray(8)));
2086 0 : ShowContinueError(state, "...valid values for this field are Timed or OnDemand.");
2087 0 : ErrorsFound = true;
2088 : }
2089 :
2090 : // Set minimum OAT for heat pump compressor operation
2091 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MinOATCompressor = NumArray(5);
2092 :
2093 : // reserved for HSPF calculation
2094 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OATempCompressorOn = NumArray(6);
2095 :
2096 : // Set maximum outdoor temp for defrost to occur
2097 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxOATDefrost = NumArray(7);
2098 :
2099 : // Set crankcase heater capacity
2100 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacity = NumArray(8);
2101 13 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacity < 0.0) {
2102 0 : ShowSevereError(
2103 : state,
2104 0 : format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2105 0 : ShowContinueError(state, format("...{} cannot be < 0.0.", cNumericFields(9)));
2106 0 : ShowContinueError(state, format("...entered value=[{:.2T}].", NumArray(9)));
2107 0 : ErrorsFound = true;
2108 : }
2109 :
2110 : // Set crankcase heater cutout temperature
2111 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxOATCrankcaseHeater = NumArray(9);
2112 :
2113 : // Set defrost time period
2114 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostTime = NumArray(10);
2115 13 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostTime == 0.0 &&
2116 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostControl == 1) {
2117 0 : ShowWarningError(
2118 0 : state, format("{}{}=\"{}\", ", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2119 0 : ShowContinueError(state, format("...{} = 0.0 for defrost control = TIMED.", cNumericFields(5)));
2120 : }
2121 :
2122 : // Set defrost capacity (for resistive defrost)
2123 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostCapacity = NumArray(11);
2124 13 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostCapacity == 0.0 &&
2125 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostStrategy == 2) {
2126 0 : ShowWarningError(
2127 0 : state, format("{}{}=\"{}\", ", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2128 0 : ShowContinueError(state, format("...{} = 0.0 for defrost strategy = RESISTIVE.", cNumericFields(6)));
2129 : }
2130 :
2131 133 : for (int I = 1; I <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds; ++I) {
2132 120 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I) = NumArray(12 + (I - 1) * 5);
2133 120 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(I) = NumArray(13 + (I - 1) * 5);
2134 120 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(I) = NumArray(14 + (I - 1) * 5);
2135 120 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedEvaporatorFanPowerPerVolumeFlowRate2017(I) = NumArray(15 + (I - 1) * 5);
2136 120 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedEvaporatorFanPowerPerVolumeFlowRate2023(I) = NumArray(16 + (I - 1) * 5);
2137 :
2138 120 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I) < 1.e-10) {
2139 0 : ShowSevereError(state,
2140 0 : format("{}{}=\"{}\", invalid value",
2141 : RoutineName,
2142 : CurrentModuleObject,
2143 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2144 0 : ShowContinueError(state,
2145 0 : format("...too small {}=[{:.2R}].",
2146 0 : cNumericFields(12 + (I - 1) * 3),
2147 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I)));
2148 0 : ErrorsFound = true;
2149 : }
2150 :
2151 120 : AlfaFieldIncre = 9 + (I - 1) * 4;
2152 120 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I) =
2153 120 : Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
2154 120 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I) == 0) {
2155 0 : if (lAlphaBlanks(AlfaFieldIncre)) {
2156 0 : ShowSevereError(state,
2157 0 : format("{}{}=\"{}\", missing",
2158 : RoutineName,
2159 : CurrentModuleObject,
2160 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2161 0 : ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
2162 : } else {
2163 0 : ShowSevereError(state,
2164 0 : format("{}{}=\"{}\", invalid",
2165 : RoutineName,
2166 : CurrentModuleObject,
2167 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2168 0 : ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
2169 : }
2170 0 : ErrorsFound = true;
2171 : } else {
2172 : // Verify Curve Object, only legal type is BiQuadratic
2173 360 : ErrorsFound |= Curve::CheckCurveDims(state,
2174 120 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I), // Curve index
2175 : {2}, // Valid dimensions
2176 : RoutineName, // Routine name
2177 : CurrentModuleObject, // Object Type
2178 120 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
2179 120 : cAlphaFields(AlfaFieldIncre)); // Field Name
2180 :
2181 120 : if (!ErrorsFound) {
2182 240 : CurveVal = Curve::CurveValue(
2183 120 : state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I), RatedInletAirTempHeat, RatedAmbAirTempHeat);
2184 120 : if (CurveVal > 1.10 || CurveVal < 0.90) {
2185 60 : ShowWarningError(state,
2186 60 : format("{}{}=\"{}\", curve values",
2187 : RoutineName,
2188 : CurrentModuleObject,
2189 30 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2190 60 : ShowContinueError(
2191 60 : state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
2192 30 : ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
2193 : }
2194 : }
2195 : }
2196 :
2197 120 : AlfaFieldIncre = 10 + (I - 1) * 4;
2198 120 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I) =
2199 120 : Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
2200 120 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I) == 0) {
2201 0 : if (lAlphaBlanks(AlfaFieldIncre)) {
2202 0 : ShowSevereError(state,
2203 0 : format("{}{}=\"{}\", missing",
2204 : RoutineName,
2205 : CurrentModuleObject,
2206 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2207 0 : ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
2208 : } else {
2209 0 : ShowSevereError(state,
2210 0 : format("{}{}=\"{}\", invalid",
2211 : RoutineName,
2212 : CurrentModuleObject,
2213 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2214 0 : ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
2215 : }
2216 0 : ErrorsFound = true;
2217 : } else {
2218 : // Verify Curve Object, only legal type is Quadratic
2219 360 : ErrorsFound |= Curve::CheckCurveDims(state,
2220 120 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I), // Curve index
2221 : {1}, // Valid dimensions
2222 : RoutineName, // Routine name
2223 : CurrentModuleObject, // Object Type
2224 120 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
2225 120 : cAlphaFields(AlfaFieldIncre)); // Field Name
2226 :
2227 120 : if (!ErrorsFound) {
2228 120 : CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I), 1.0);
2229 120 : if (CurveVal > 1.10 || CurveVal < 0.90) {
2230 0 : ShowWarningError(state,
2231 0 : format("{}{}=\"{}\", curve values",
2232 : RoutineName,
2233 : CurrentModuleObject,
2234 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2235 0 : ShowContinueError(
2236 0 : state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
2237 0 : ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
2238 : }
2239 : }
2240 : }
2241 :
2242 120 : AlfaFieldIncre = 11 + (I - 1) * 4;
2243 120 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I) =
2244 120 : Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
2245 120 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I) == 0) {
2246 0 : if (lAlphaBlanks(AlfaFieldIncre)) {
2247 0 : ShowSevereError(state,
2248 0 : format("{}{}=\"{}\", missing",
2249 : RoutineName,
2250 : CurrentModuleObject,
2251 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2252 0 : ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
2253 : } else {
2254 0 : ShowSevereError(state,
2255 0 : format("{}{}=\"{}\", invalid",
2256 : RoutineName,
2257 : CurrentModuleObject,
2258 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2259 0 : ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
2260 : }
2261 0 : ErrorsFound = true;
2262 : } else {
2263 : // Verify Curve Object, only legal type is BiQuadratic
2264 360 : ErrorsFound |= Curve::CheckCurveDims(state,
2265 120 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I), // Curve index
2266 : {2}, // Valid dimensions
2267 : RoutineName, // Routine name
2268 : CurrentModuleObject, // Object Type
2269 120 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
2270 120 : cAlphaFields(AlfaFieldIncre)); // Field Name
2271 :
2272 120 : if (!ErrorsFound) {
2273 240 : CurveVal = Curve::CurveValue(
2274 120 : state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I), RatedInletAirTempHeat, RatedAmbAirTempHeat);
2275 120 : if (CurveVal > 1.10 || CurveVal < 0.90) {
2276 60 : ShowWarningError(state,
2277 60 : format("{}{}=\"{}\", curve values",
2278 : RoutineName,
2279 : CurrentModuleObject,
2280 30 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2281 60 : ShowContinueError(
2282 60 : state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
2283 30 : ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
2284 : }
2285 : }
2286 : }
2287 :
2288 120 : AlfaFieldIncre = 12 + (I - 1) * 4;
2289 120 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I) =
2290 120 : Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
2291 120 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I) == 0) {
2292 0 : if (lAlphaBlanks(AlfaFieldIncre)) {
2293 0 : ShowSevereError(state,
2294 0 : format("{}{}=\"{}\", missing",
2295 : RoutineName,
2296 : CurrentModuleObject,
2297 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2298 0 : ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
2299 : } else {
2300 0 : ShowSevereError(state,
2301 0 : format("{}{}=\"{}\", invalid",
2302 : RoutineName,
2303 : CurrentModuleObject,
2304 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2305 0 : ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
2306 : }
2307 0 : ErrorsFound = true;
2308 : } else {
2309 : // Verify Curve Object, only legal type is Quadratic
2310 360 : ErrorsFound |= Curve::CheckCurveDims(state,
2311 120 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I), // Curve index
2312 : {1}, // Valid dimensions
2313 : RoutineName, // Routine name
2314 : CurrentModuleObject, // Object Type
2315 120 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
2316 120 : cAlphaFields(AlfaFieldIncre)); // Field Name
2317 :
2318 120 : if (!ErrorsFound) {
2319 120 : CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I), 1.0);
2320 120 : if (CurveVal > 1.10 || CurveVal < 0.90) {
2321 0 : ShowWarningError(state,
2322 0 : format("{}{}=\"{}\", curve values",
2323 : RoutineName,
2324 : CurrentModuleObject,
2325 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2326 0 : ShowContinueError(
2327 0 : state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
2328 0 : ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
2329 : }
2330 : }
2331 : }
2332 : }
2333 :
2334 13 : if (ErrorsFound) continue;
2335 :
2336 133 : for (int I = 1; I <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds; ++I) {
2337 120 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedPercentTotCap(I) =
2338 120 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I) /
2339 240 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(
2340 120 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
2341 120 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowPerRatedTotCap(I) =
2342 120 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(I) /
2343 120 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I);
2344 : }
2345 :
2346 : // CurrentModuleObject = "Coil:Heating:DX:Variablespeed "
2347 26 : SetupOutputVariable(state,
2348 : "Heating Coil Electricity Energy",
2349 : Constant::Units::J,
2350 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Energy,
2351 : OutputProcessor::TimeStepType::System,
2352 : OutputProcessor::StoreType::Sum,
2353 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
2354 : Constant::eResource::Electricity,
2355 : OutputProcessor::Group::HVAC,
2356 : OutputProcessor::EndUseCat::Heating);
2357 26 : SetupOutputVariable(state,
2358 : "Heating Coil Heating Energy",
2359 : Constant::Units::J,
2360 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLoadTotal,
2361 : OutputProcessor::TimeStepType::System,
2362 : OutputProcessor::StoreType::Sum,
2363 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
2364 : Constant::eResource::EnergyTransfer,
2365 : OutputProcessor::Group::HVAC,
2366 : OutputProcessor::EndUseCat::HeatingCoils);
2367 26 : SetupOutputVariable(state,
2368 : "Heating Coil Source Side Heat Transfer Energy",
2369 : Constant::Units::J,
2370 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySource,
2371 : OutputProcessor::TimeStepType::System,
2372 : OutputProcessor::StoreType::Sum,
2373 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
2374 :
2375 : // create predefined report entries
2376 26 : OutputReportPredefined::PreDefTableEntry(
2377 13 : state, state.dataOutRptPredefined->pdchHeatCoilType, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, CurrentModuleObject);
2378 26 : OutputReportPredefined::PreDefTableEntry(state,
2379 13 : state.dataOutRptPredefined->pdchHeatCoilNomCap,
2380 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
2381 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedCapHeat);
2382 26 : OutputReportPredefined::PreDefTableEntry(state,
2383 13 : state.dataOutRptPredefined->pdchHeatCoilNomEff,
2384 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
2385 26 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(
2386 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel));
2387 : }
2388 :
2389 : //-------------------------AIR SOURCE HEATING---END
2390 :
2391 : //------------------------VARIABLE-SPEED AIR SOURCE HPWH---BEGIN
2392 49 : CurrentModuleObject = "COIL:WATERHEATING:AIRTOWATERHEATPUMP:VARIABLESPEED"; // for reporting
2393 :
2394 56 : for (int CoilCounter = 1; CoilCounter <= NumHPWHAirToWater; ++CoilCounter) {
2395 :
2396 7 : ++DXCoilNum;
2397 :
2398 7 : state.dataInputProcessing->inputProcessor->getObjectItem(state,
2399 : CurrentModuleObject,
2400 : CoilCounter,
2401 : AlphArray,
2402 : NumAlphas,
2403 : NumArray,
2404 : NumNums,
2405 : IOStat,
2406 : lNumericBlanks,
2407 : lAlphaBlanks,
2408 : cAlphaFields,
2409 : cNumericFields);
2410 : // ErrorsFound will be set to True if problem was found, left untouched otherwise
2411 7 : GlobalNames::VerifyUniqueCoilName(state, CurrentModuleObject, AlphArray(1), ErrorsFound, CurrentModuleObject + " Name");
2412 :
2413 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).bIsDesuperheater = false;
2414 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserType = DataHeatBalance::RefrigCondenserType::WaterHeater;
2415 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CoolHeatType = "WATERHEATING";
2416 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType = HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed;
2417 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VarSpeedCoilType =
2418 14 : HVAC::cAllCoilTypes(HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed);
2419 :
2420 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name = AlphArray(1);
2421 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds = int(NumArray(1));
2422 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel = int(NumArray(2));
2423 :
2424 7 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds < 1) {
2425 0 : ShowSevereError(
2426 : state,
2427 0 : format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2428 0 : ShowContinueError(state, format("...{} must be >= 1. entered number is {:.0T}", cNumericFields(1), NumArray(1)));
2429 0 : ErrorsFound = true;
2430 : }
2431 :
2432 7 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel >
2433 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds) {
2434 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel =
2435 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds;
2436 : }
2437 :
2438 7 : if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel >
2439 14 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds) ||
2440 7 : (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel <= 0)) {
2441 0 : ShowSevereError(
2442 : state,
2443 0 : format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2444 0 : ShowContinueError(state, format("...{} must be valid speed level entered number is {:.0T}", cNumericFields(2), NumArray(2)));
2445 0 : ErrorsFound = true;
2446 : }
2447 :
2448 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedCapWH = NumArray(3);
2449 7 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedCapWH <= 0.0) {
2450 0 : ShowSevereError(
2451 : state,
2452 0 : format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2453 0 : ShowContinueError(state, format("...{} must be > 0.0, entered value=[{:.2T}].", cNumericFields(3), NumArray(3)));
2454 0 : ErrorsFound = true;
2455 : }
2456 :
2457 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WHRatedInletDBTemp = NumArray(4);
2458 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WHRatedInletWBTemp = NumArray(5);
2459 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WHRatedInletWaterTemp = NumArray(6);
2460 :
2461 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedAirVolFlowRate = NumArray(7);
2462 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedWaterVolFlowRate = NumArray(8);
2463 :
2464 7 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedAirVolFlowRate != Constant::AutoCalculate) {
2465 5 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedAirVolFlowRate <= 0.0) {
2466 0 : ShowSevereError(
2467 : state,
2468 0 : format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2469 0 : ShowContinueError(state, format("...{} must be > 0.0. entered value=[{:.3T}].", cNumericFields(7), NumArray(7)));
2470 0 : ErrorsFound = true;
2471 : }
2472 : }
2473 :
2474 7 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedWaterVolFlowRate != Constant::AutoCalculate) {
2475 5 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedWaterVolFlowRate <= 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(8), NumArray(8)));
2480 0 : ErrorsFound = true;
2481 : }
2482 : }
2483 :
2484 7 : if (Util::SameString(AlphArray(2), "Yes") || Util::SameString(AlphArray(2), "No")) {
2485 : // initialized to TRUE on allocate
2486 7 : if (Util::SameString(AlphArray(2), "No"))
2487 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FanPowerIncludedInCOP = false;
2488 : else
2489 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FanPowerIncludedInCOP = true;
2490 : } else {
2491 0 : ShowSevereError(
2492 : state,
2493 0 : format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2494 0 : ShowContinueError(state, format(",,,invalid choice for {}. Entered choice = {}", cAlphaFields(2), AlphArray(2)));
2495 0 : ShowContinueError(state, "Valid choices are Yes or No.");
2496 0 : ErrorsFound = true;
2497 : }
2498 :
2499 7 : if (Util::SameString(AlphArray(3), "Yes") || Util::SameString(AlphArray(3), "No")) {
2500 : // initialized to FALSE on allocate
2501 7 : if (Util::SameString(AlphArray(3), "Yes"))
2502 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondPumpPowerInCOP = true;
2503 : else
2504 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondPumpPowerInCOP = false;
2505 : } else {
2506 0 : ShowSevereError(
2507 : state,
2508 0 : format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2509 0 : ShowContinueError(state, format(",,,invalid choice for {}. Entered choice = {}", cAlphaFields(3), AlphArray(3)));
2510 0 : ShowContinueError(state, "Valid choices are Yes or No.");
2511 0 : ErrorsFound = true;
2512 : }
2513 :
2514 7 : if (Util::SameString(AlphArray(4), "Yes") || Util::SameString(AlphArray(4), "No")) {
2515 : // initialized to FALSE on allocate
2516 7 : if (Util::SameString(AlphArray(4), "Yes"))
2517 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondPumpHeatInCapacity = true;
2518 : else
2519 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondPumpHeatInCapacity = false;
2520 : } else {
2521 0 : ShowSevereError(
2522 : state,
2523 0 : format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2524 0 : ShowContinueError(state, format(",,,invalid choice for {}. Entered choice = {}", cAlphaFields(4), AlphArray(4)));
2525 0 : ShowContinueError(state, "Valid choices are Yes or No.");
2526 0 : ErrorsFound = true;
2527 : }
2528 :
2529 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpFracToWater = NumArray(9);
2530 14 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpFracToWater <= 0.0 ||
2531 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpFracToWater > 1.0) {
2532 0 : ShowSevereError(
2533 : state,
2534 0 : format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2535 0 : ShowContinueError(state, format("...{} must be >= 0 and <= 1. entered value=[{:.3T}].", cNumericFields(10), NumArray(9)));
2536 0 : ErrorsFound = true;
2537 : }
2538 :
2539 7 : if (!state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondPumpHeatInCapacity) {
2540 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpFracToWater = 0.0;
2541 : }
2542 :
2543 : // Air nodes
2544 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirInletNodeNum =
2545 14 : GetOnlySingleNode(state,
2546 7 : AlphArray(5),
2547 : ErrorsFound,
2548 : DataLoopNode::ConnectionObjectType::CoilWaterHeatingAirToWaterHeatPumpVariableSpeed,
2549 7 : AlphArray(1),
2550 : DataLoopNode::NodeFluidType::Air,
2551 : DataLoopNode::ConnectionType::Inlet,
2552 : NodeInputManager::CompFluidStream::Primary,
2553 : DataLoopNode::ObjectIsNotParent);
2554 :
2555 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirOutletNodeNum =
2556 21 : GetOnlySingleNode(state,
2557 7 : AlphArray(6),
2558 : ErrorsFound,
2559 : DataLoopNode::ConnectionObjectType::CoilWaterHeatingAirToWaterHeatPumpVariableSpeed,
2560 7 : AlphArray(1),
2561 : DataLoopNode::NodeFluidType::Air,
2562 : DataLoopNode::ConnectionType::Outlet,
2563 : NodeInputManager::CompFluidStream::Primary,
2564 : DataLoopNode::ObjectIsNotParent);
2565 :
2566 7 : BranchNodeConnections::TestCompSet(state, CurrentModuleObject, AlphArray(1), AlphArray(5), AlphArray(6), "Air Nodes");
2567 :
2568 : // Check if the air inlet node is OA node, to justify whether the coil is placed in zone or not
2569 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).IsDXCoilInZone =
2570 7 : !OutAirNodeManager::CheckOutAirNodeNumber(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirInletNodeNum);
2571 :
2572 : // Water nodes
2573 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterInletNodeNum =
2574 14 : GetOnlySingleNode(state,
2575 7 : AlphArray(7),
2576 : ErrorsFound,
2577 : DataLoopNode::ConnectionObjectType::CoilWaterHeatingAirToWaterHeatPumpVariableSpeed,
2578 7 : AlphArray(1),
2579 : DataLoopNode::NodeFluidType::Water,
2580 : DataLoopNode::ConnectionType::Inlet,
2581 : NodeInputManager::CompFluidStream::Secondary,
2582 : DataLoopNode::ObjectIsNotParent);
2583 :
2584 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterOutletNodeNum =
2585 21 : GetOnlySingleNode(state,
2586 7 : AlphArray(8),
2587 : ErrorsFound,
2588 : DataLoopNode::ConnectionObjectType::CoilWaterHeatingAirToWaterHeatPumpVariableSpeed,
2589 7 : AlphArray(1),
2590 : DataLoopNode::NodeFluidType::Water,
2591 : DataLoopNode::ConnectionType::Outlet,
2592 : NodeInputManager::CompFluidStream::Secondary,
2593 : DataLoopNode::ObjectIsNotParent);
2594 :
2595 7 : BranchNodeConnections::TestCompSet(state, CurrentModuleObject, AlphArray(1), AlphArray(7), AlphArray(8), "Water Nodes");
2596 :
2597 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacity = NumArray(10);
2598 7 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacity < 0.0) {
2599 0 : ShowSevereError(
2600 : state,
2601 0 : format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2602 0 : ShowContinueError(state, format("...{} must be >= 0.0 entered value=[{:.1T}].", cNumericFields(10), NumArray(10)));
2603 0 : ErrorsFound = true;
2604 : }
2605 :
2606 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxOATCrankcaseHeater = NumArray(11);
2607 7 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxOATCrankcaseHeater < 0.0) {
2608 0 : ShowSevereError(
2609 : state,
2610 0 : format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2611 0 : ShowContinueError(state, format("...{} must be >= 0 {{C}}. entered value=[{:.1T}].", cNumericFields(11), NumArray(11)));
2612 0 : ErrorsFound = true;
2613 : }
2614 :
2615 7 : if (!lAlphaBlanks(9)) {
2616 2 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex = Curve::GetCurveIndex(state, AlphArray(9));
2617 2 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex == 0) { // can't find the curve
2618 0 : ShowSevereError(state,
2619 0 : format("{} = {}: {} not found = {}",
2620 : CurrentModuleObject,
2621 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
2622 : cAlphaFields(9),
2623 : AlphArray(9)));
2624 0 : ErrorsFound = true;
2625 : } else {
2626 2 : ErrorsFound |=
2627 8 : Curve::CheckCurveDims(state,
2628 2 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex, // Curve index
2629 : {1}, // Valid dimensions
2630 : RoutineName, // Routine name
2631 : CurrentModuleObject, // Object Type
2632 2 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
2633 2 : cAlphaFields(9)); // Field Name
2634 : }
2635 : }
2636 :
2637 7 : if (Util::SameString(AlphArray(10), "DryBulbTemperature")) {
2638 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirTemperatureType = HVAC::OATType::DryBulb;
2639 7 : } else if (Util::SameString(AlphArray(10), "WetBulbTemperature")) {
2640 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirTemperatureType = HVAC::OATType::WetBulb;
2641 : } else {
2642 : // wrong temperature type selection
2643 0 : ShowSevereError(
2644 : state,
2645 0 : format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2646 0 : ShowContinueError(state, format("...{} must be DryBulbTemperature or WetBulbTemperature.", cAlphaFields(10)));
2647 0 : ShowContinueError(state, format("...entered value=\"{}\".", AlphArray(10)));
2648 0 : ErrorsFound = true;
2649 : }
2650 :
2651 : // set rated inlet air temperature for curve object verification
2652 7 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirTemperatureType == HVAC::OATType::WetBulb) {
2653 7 : WHInletAirTemp = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WHRatedInletWBTemp;
2654 : } else {
2655 0 : WHInletAirTemp = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WHRatedInletDBTemp;
2656 : }
2657 : // set rated water temperature for curve object verification
2658 7 : WHInletWaterTemp = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WHRatedInletWaterTemp;
2659 :
2660 : // part load curve
2661 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR =
2662 7 : Curve::GetCurveIndex(state, AlphArray(11)); // convert curve name to number
2663 7 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR == 0) {
2664 0 : if (lAlphaBlanks(11)) {
2665 0 : ShowSevereError(
2666 : state,
2667 0 : format("{}{}=\"{}\", missing", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2668 0 : ShowContinueError(state, format("...required {} is blank.", cAlphaFields(11)));
2669 : } else {
2670 0 : ShowSevereError(
2671 : state,
2672 0 : format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2673 0 : ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(11), AlphArray(11)));
2674 : }
2675 0 : ErrorsFound = true;
2676 : } else {
2677 7 : CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR, 1.0);
2678 7 : if (CurveVal > 1.10 || CurveVal < 0.90) {
2679 4 : ShowWarningError(state,
2680 4 : format("{}{}=\"{}\", curve values",
2681 : RoutineName,
2682 : CurrentModuleObject,
2683 2 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2684 2 : ShowContinueError(state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(11)));
2685 2 : ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
2686 : }
2687 : }
2688 :
2689 77 : for (int I = 1; I <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds; ++I) {
2690 70 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I) = NumArray(12 + (I - 1) * 6);
2691 70 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(I) = NumArray(13 + (I - 1) * 6);
2692 70 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedSHR(I) = NumArray(14 + (I - 1) * 6);
2693 70 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(I) = NumArray(15 + (I - 1) * 6);
2694 70 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowRate(I) = NumArray(16 + (I - 1) * 6);
2695 70 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWHPumpPower(I) = NumArray(17 + (I - 1) * 6);
2696 :
2697 70 : AlfaFieldIncre = 12 + (I - 1) * 6;
2698 70 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I) =
2699 70 : Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
2700 70 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I) == 0) {
2701 0 : if (lAlphaBlanks(AlfaFieldIncre)) {
2702 0 : ShowSevereError(state,
2703 0 : format("{}{}=\"{}\", missing",
2704 : RoutineName,
2705 : CurrentModuleObject,
2706 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2707 0 : ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
2708 : } else {
2709 0 : ShowSevereError(state,
2710 0 : format("{}{}=\"{}\", invalid",
2711 : RoutineName,
2712 : CurrentModuleObject,
2713 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2714 0 : ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
2715 : }
2716 0 : ErrorsFound = true;
2717 : } else {
2718 : // Verify Curve Object, only legal type is BiQuadratic
2719 210 : ErrorsFound |= Curve::CheckCurveDims(state,
2720 70 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I), // Curve index
2721 : {2}, // Valid dimensions
2722 : RoutineName, // Routine name
2723 : CurrentModuleObject, // Object Type
2724 70 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
2725 70 : cAlphaFields(AlfaFieldIncre)); // Field Name
2726 :
2727 70 : if (!ErrorsFound) {
2728 140 : CurveVal = Curve::CurveValue(
2729 70 : state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I), WHInletAirTemp, WHInletWaterTemp);
2730 70 : if (CurveVal > 1.10 || CurveVal < 0.90) {
2731 40 : ShowWarningError(state,
2732 40 : format("{}{}=\"{}\", curve values",
2733 : RoutineName,
2734 : CurrentModuleObject,
2735 20 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2736 40 : ShowContinueError(
2737 40 : state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
2738 20 : ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
2739 : }
2740 : }
2741 : }
2742 :
2743 70 : AlfaFieldIncre = 13 + (I - 1) * 6;
2744 70 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I) =
2745 70 : Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
2746 70 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I) == 0) {
2747 0 : if (lAlphaBlanks(AlfaFieldIncre)) {
2748 0 : ShowSevereError(state,
2749 0 : format("{}{}=\"{}\", missing",
2750 : RoutineName,
2751 : CurrentModuleObject,
2752 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2753 0 : ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
2754 : } else {
2755 0 : ShowSevereError(state,
2756 0 : format("{}{}=\"{}\", invalid",
2757 : RoutineName,
2758 : CurrentModuleObject,
2759 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2760 0 : ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
2761 : }
2762 0 : ErrorsFound = true;
2763 : } else {
2764 : // Verify Curve Object, only legal type is Quadratic
2765 210 : ErrorsFound |= Curve::CheckCurveDims(state,
2766 70 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I), // Curve index
2767 : {1}, // Valid dimensions
2768 : RoutineName, // Routine name
2769 : CurrentModuleObject, // Object Type
2770 70 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
2771 70 : cAlphaFields(AlfaFieldIncre)); // Field Name
2772 :
2773 70 : if (!ErrorsFound) {
2774 70 : CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I), 1.0);
2775 70 : if (CurveVal > 1.10 || CurveVal < 0.90) {
2776 0 : ShowWarningError(state,
2777 0 : format("{}{}=\"{}\", curve values",
2778 : RoutineName,
2779 : CurrentModuleObject,
2780 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2781 0 : ShowContinueError(
2782 0 : state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
2783 0 : ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
2784 : }
2785 : }
2786 : }
2787 :
2788 70 : AlfaFieldIncre = 14 + (I - 1) * 6;
2789 70 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(I) =
2790 70 : Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
2791 70 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(I) == 0) {
2792 0 : if (lAlphaBlanks(AlfaFieldIncre)) {
2793 0 : ShowSevereError(state,
2794 0 : format("{}{}=\"{}\", missing",
2795 : RoutineName,
2796 : CurrentModuleObject,
2797 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2798 0 : ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
2799 : } else {
2800 0 : ShowSevereError(state,
2801 0 : format("{}{}=\"{}\", invalid",
2802 : RoutineName,
2803 : CurrentModuleObject,
2804 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2805 0 : ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
2806 : }
2807 0 : ErrorsFound = true;
2808 : } else {
2809 : // Verify Curve Object, only legal type is Quadratic
2810 210 : ErrorsFound |= Curve::CheckCurveDims(state,
2811 70 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(I), // Curve index
2812 : {1}, // Valid dimensions
2813 : RoutineName, // Routine name
2814 : CurrentModuleObject, // Object Type
2815 70 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
2816 70 : cAlphaFields(AlfaFieldIncre)); // Field Name
2817 :
2818 70 : if (!ErrorsFound) {
2819 70 : CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(I), 1.0);
2820 70 : if (CurveVal > 1.10 || CurveVal < 0.90) {
2821 0 : ShowWarningError(state,
2822 0 : format("{}{}=\"{}\", curve values",
2823 : RoutineName,
2824 : CurrentModuleObject,
2825 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2826 0 : ShowContinueError(
2827 0 : state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
2828 0 : ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
2829 : }
2830 : }
2831 : }
2832 :
2833 70 : AlfaFieldIncre = 15 + (I - 1) * 6;
2834 70 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I) =
2835 70 : Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
2836 70 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I) == 0) {
2837 0 : if (lAlphaBlanks(AlfaFieldIncre)) {
2838 0 : ShowSevereError(state,
2839 0 : format("{}{}=\"{}\", missing",
2840 : RoutineName,
2841 : CurrentModuleObject,
2842 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2843 0 : ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
2844 : } else {
2845 0 : ShowSevereError(state,
2846 0 : format("{}{}=\"{}\", invalid",
2847 : RoutineName,
2848 : CurrentModuleObject,
2849 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2850 0 : ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
2851 : }
2852 0 : ErrorsFound = true;
2853 : } else {
2854 : // Verify Curve Object, only legal type is BiQuadratic
2855 210 : ErrorsFound |= Curve::CheckCurveDims(state,
2856 70 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I), // Curve index
2857 : {2}, // Valid dimensions
2858 : RoutineName, // Routine name
2859 : CurrentModuleObject, // Object Type
2860 70 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
2861 70 : cAlphaFields(AlfaFieldIncre)); // Field Name
2862 :
2863 70 : if (!ErrorsFound) {
2864 140 : CurveVal = Curve::CurveValue(
2865 70 : state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I), WHInletAirTemp, WHInletWaterTemp);
2866 70 : if (CurveVal > 1.10 || CurveVal < 0.90) {
2867 40 : ShowWarningError(state,
2868 40 : format("{}{}=\"{}\", curve values",
2869 : RoutineName,
2870 : CurrentModuleObject,
2871 20 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2872 40 : ShowContinueError(
2873 40 : state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
2874 20 : ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
2875 : }
2876 : }
2877 : }
2878 :
2879 70 : AlfaFieldIncre = 16 + (I - 1) * 6;
2880 70 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I) =
2881 70 : Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
2882 70 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I) == 0) {
2883 0 : if (lAlphaBlanks(AlfaFieldIncre)) {
2884 0 : ShowSevereError(state,
2885 0 : format("{}{}=\"{}\", missing",
2886 : RoutineName,
2887 : CurrentModuleObject,
2888 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2889 0 : ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
2890 : } else {
2891 0 : ShowSevereError(state,
2892 0 : format("{}{}=\"{}\", invalid",
2893 : RoutineName,
2894 : CurrentModuleObject,
2895 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2896 0 : ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
2897 : }
2898 0 : ErrorsFound = true;
2899 : } else {
2900 : // Verify Curve Object, only legal type is Quadratic
2901 210 : ErrorsFound |= Curve::CheckCurveDims(state,
2902 70 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I), // Curve index
2903 : {1}, // Valid dimensions
2904 : RoutineName, // Routine name
2905 : CurrentModuleObject, // Object Type
2906 70 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
2907 70 : cAlphaFields(AlfaFieldIncre)); // Field Name
2908 :
2909 70 : if (!ErrorsFound) {
2910 70 : CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I), 1.0);
2911 70 : if (CurveVal > 1.10 || CurveVal < 0.90) {
2912 0 : ShowWarningError(state,
2913 0 : format("{}{}=\"{}\", curve values",
2914 : RoutineName,
2915 : CurrentModuleObject,
2916 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2917 0 : ShowContinueError(
2918 0 : state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
2919 0 : ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
2920 : }
2921 : }
2922 : }
2923 :
2924 70 : AlfaFieldIncre = 17 + (I - 1) * 6;
2925 70 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(I) =
2926 70 : Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
2927 70 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(I) == 0) {
2928 0 : if (lAlphaBlanks(AlfaFieldIncre)) {
2929 0 : ShowSevereError(state,
2930 0 : format("{}{}=\"{}\", missing",
2931 : RoutineName,
2932 : CurrentModuleObject,
2933 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2934 0 : ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
2935 : } else {
2936 0 : ShowSevereError(state,
2937 0 : format("{}{}=\"{}\", invalid",
2938 : RoutineName,
2939 : CurrentModuleObject,
2940 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2941 0 : ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
2942 : }
2943 0 : ErrorsFound = true;
2944 : } else {
2945 : // Verify Curve Object, only legal type is Quadratic
2946 210 : ErrorsFound |= Curve::CheckCurveDims(state,
2947 70 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(I), // Curve index
2948 : {1}, // Valid dimensions
2949 : RoutineName, // Routine name
2950 : CurrentModuleObject, // Object Type
2951 70 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
2952 70 : cAlphaFields(AlfaFieldIncre)); // Field Name
2953 :
2954 70 : if (!ErrorsFound) {
2955 70 : CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(I), 1.0);
2956 70 : if (CurveVal > 1.10 || CurveVal < 0.90) {
2957 0 : ShowWarningError(state,
2958 0 : format("{}{}=\"{}\", curve values",
2959 : RoutineName,
2960 : CurrentModuleObject,
2961 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
2962 0 : ShowContinueError(
2963 0 : state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
2964 0 : ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
2965 : }
2966 : }
2967 : }
2968 : }
2969 :
2970 : // get scale values
2971 77 : for (int I = 1; I <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds; ++I) {
2972 70 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedPercentTotCap(I) =
2973 70 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I) /
2974 140 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(
2975 70 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
2976 70 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowPerRatedTotCap(I) =
2977 70 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(I) /
2978 70 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I);
2979 70 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowPerRatedTotCap(I) =
2980 70 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowRate(I) /
2981 70 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I);
2982 70 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWHPumpPowerPerRatedTotCap(I) =
2983 70 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWHPumpPower(I) /
2984 70 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I);
2985 : }
2986 :
2987 : // CurrentModuleObject = "Coil:Waterheating:Airtowaterheatpump:Variablespeed"
2988 14 : SetupOutputVariable(state,
2989 : "Cooling Coil Electricity Energy",
2990 : Constant::Units::J,
2991 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Energy,
2992 : OutputProcessor::TimeStepType::System,
2993 : OutputProcessor::StoreType::Sum,
2994 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
2995 : Constant::eResource::Electricity,
2996 : OutputProcessor::Group::HVAC,
2997 : OutputProcessor::EndUseCat::Heating);
2998 14 : SetupOutputVariable(state,
2999 : "Cooling Coil Sensible Cooling Energy",
3000 : Constant::Units::J,
3001 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySensible,
3002 : OutputProcessor::TimeStepType::System,
3003 : OutputProcessor::StoreType::Sum,
3004 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3005 14 : SetupOutputVariable(state,
3006 : "Cooling Coil Latent Cooling Energy",
3007 : Constant::Units::J,
3008 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLatent,
3009 : OutputProcessor::TimeStepType::System,
3010 : OutputProcessor::StoreType::Sum,
3011 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3012 14 : SetupOutputVariable(state,
3013 : "Cooling Coil Water Side Heat Transfer Energy",
3014 : Constant::Units::J,
3015 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySource,
3016 : OutputProcessor::TimeStepType::System,
3017 : OutputProcessor::StoreType::Sum,
3018 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
3019 : Constant::eResource::PlantLoopHeatingDemand,
3020 : OutputProcessor::Group::HVAC,
3021 : OutputProcessor::EndUseCat::HeatingCoils);
3022 :
3023 7 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).IsDXCoilInZone) {
3024 14 : SetupOutputVariable(state,
3025 : "Cooling Coil Cooling Energy",
3026 : Constant::Units::J,
3027 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLoadTotal,
3028 : OutputProcessor::TimeStepType::System,
3029 : OutputProcessor::StoreType::Sum,
3030 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
3031 : Constant::eResource::EnergyTransfer,
3032 : OutputProcessor::Group::HVAC,
3033 : OutputProcessor::EndUseCat::CoolingCoils);
3034 : } else {
3035 0 : SetupOutputVariable(state,
3036 : "Cooling Coil Cooling Energy",
3037 : Constant::Units::J,
3038 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLoadTotal,
3039 : OutputProcessor::TimeStepType::System,
3040 : OutputProcessor::StoreType::Sum,
3041 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3042 : }
3043 :
3044 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedCapCoolSens =
3045 : DataSizing::AutoSize; // always auto-sized, to be determined in the sizing calculation
3046 : }
3047 : //---------------------------VARIABLE-SPEED AIR SOURCE HPWH END --------------
3048 :
3049 49 : AlphArray.deallocate();
3050 49 : cAlphaFields.deallocate();
3051 49 : lAlphaBlanks.deallocate();
3052 49 : cNumericFields.deallocate();
3053 49 : lNumericBlanks.deallocate();
3054 49 : NumArray.deallocate();
3055 :
3056 49 : if (ErrorsFound) {
3057 0 : ShowFatalError(state, format("{}Errors found getting input. Program terminates.", RoutineName));
3058 : }
3059 :
3060 116 : for (DXCoilNum = 1; DXCoilNum <= state.dataVariableSpeedCoils->NumVarSpeedCoils; ++DXCoilNum) {
3061 96 : if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) ||
3062 29 : (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed)) {
3063 : // Setup Report variables for the Heat Pump
3064 :
3065 : // cooling and heating coils separately
3066 51 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
3067 : // air source cooling coils
3068 76 : SetupOutputVariable(state,
3069 : "Cooling Coil Air Mass Flow Rate",
3070 : Constant::Units::kg_s,
3071 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate,
3072 : OutputProcessor::TimeStepType::System,
3073 : OutputProcessor::StoreType::Average,
3074 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3075 76 : SetupOutputVariable(state,
3076 : "Cooling Coil Air Inlet Temperature",
3077 : Constant::Units::C,
3078 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp,
3079 : OutputProcessor::TimeStepType::System,
3080 : OutputProcessor::StoreType::Average,
3081 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3082 76 : SetupOutputVariable(state,
3083 : "Cooling Coil Air Inlet Humidity Ratio",
3084 : Constant::Units::kgWater_kgDryAir,
3085 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat,
3086 : OutputProcessor::TimeStepType::System,
3087 : OutputProcessor::StoreType::Average,
3088 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3089 76 : SetupOutputVariable(state,
3090 : "Cooling Coil Latent Cooling Rate",
3091 : Constant::Units::W,
3092 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLatent,
3093 : OutputProcessor::TimeStepType::System,
3094 : OutputProcessor::StoreType::Average,
3095 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3096 76 : SetupOutputVariable(state,
3097 : "Cooling Coil Air Outlet Temperature",
3098 : Constant::Units::C,
3099 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp,
3100 : OutputProcessor::TimeStepType::System,
3101 : OutputProcessor::StoreType::Average,
3102 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3103 76 : SetupOutputVariable(state,
3104 : "Cooling Coil Air Outlet Humidity Ratio",
3105 : Constant::Units::kgWater_kgDryAir,
3106 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat,
3107 : OutputProcessor::TimeStepType::System,
3108 : OutputProcessor::StoreType::Average,
3109 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3110 76 : SetupOutputVariable(state,
3111 : "Cooling Coil Sensible Cooling Rate",
3112 : Constant::Units::W,
3113 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible,
3114 : OutputProcessor::TimeStepType::System,
3115 : OutputProcessor::StoreType::Average,
3116 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3117 76 : SetupOutputVariable(state,
3118 : "Cooling Coil Total Cooling Rate",
3119 : Constant::Units::W,
3120 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal,
3121 : OutputProcessor::TimeStepType::System,
3122 : OutputProcessor::StoreType::Average,
3123 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3124 76 : SetupOutputVariable(state,
3125 : "Cooling Coil Part Load Ratio",
3126 : Constant::Units::None,
3127 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio,
3128 : OutputProcessor::TimeStepType::System,
3129 : OutputProcessor::StoreType::Average,
3130 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3131 76 : SetupOutputVariable(state,
3132 : "Cooling Coil Electricity Rate",
3133 : Constant::Units::W,
3134 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Power,
3135 : OutputProcessor::TimeStepType::System,
3136 : OutputProcessor::StoreType::Average,
3137 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3138 76 : SetupOutputVariable(state,
3139 : "Cooling Coil Runtime Fraction",
3140 : Constant::Units::None,
3141 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac,
3142 : OutputProcessor::TimeStepType::System,
3143 : OutputProcessor::StoreType::Average,
3144 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3145 76 : SetupOutputVariable(state,
3146 : "Cooling Coil Source Side Heat Transfer Rate",
3147 : Constant::Units::W,
3148 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSource,
3149 : OutputProcessor::TimeStepType::System,
3150 : OutputProcessor::StoreType::Average,
3151 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3152 76 : SetupOutputVariable(state,
3153 : "Cooling Coil Upper Speed Level",
3154 : Constant::Units::None,
3155 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SpeedNumReport,
3156 : OutputProcessor::TimeStepType::System,
3157 : OutputProcessor::StoreType::Average,
3158 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3159 76 : SetupOutputVariable(state,
3160 : "Cooling Coil Neighboring Speed Levels Ratio",
3161 : Constant::Units::None,
3162 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SpeedRatioReport,
3163 : OutputProcessor::TimeStepType::System,
3164 : OutputProcessor::StoreType::Average,
3165 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3166 :
3167 38 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondensateCollectMode == CondensateToTank) {
3168 0 : SetupOutputVariable(state,
3169 : "Cooling Coil Condensate Volume Flow Rate",
3170 : Constant::Units::m3_s,
3171 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondensateVdot,
3172 : OutputProcessor::TimeStepType::System,
3173 : OutputProcessor::StoreType::Average,
3174 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3175 0 : SetupOutputVariable(state,
3176 : "Cooling Coil Condensate Volume",
3177 : Constant::Units::m3,
3178 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondensateVol,
3179 : OutputProcessor::TimeStepType::System,
3180 : OutputProcessor::StoreType::Sum,
3181 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
3182 : Constant::eResource::OnSiteWater,
3183 : OutputProcessor::Group::HVAC,
3184 : OutputProcessor::EndUseCat::Condensate);
3185 : }
3186 :
3187 38 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).ReportEvapCondVars) {
3188 2 : SetupOutputVariable(state,
3189 : "Cooling Coil Condenser Inlet Temperature",
3190 : Constant::Units::C,
3191 1 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondInletTemp,
3192 : OutputProcessor::TimeStepType::System,
3193 : OutputProcessor::StoreType::Average,
3194 1 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3195 2 : SetupOutputVariable(state,
3196 : "Cooling Coil Evaporative Condenser Water Volume",
3197 : Constant::Units::m3,
3198 1 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterConsump,
3199 : OutputProcessor::TimeStepType::System,
3200 : OutputProcessor::StoreType::Sum,
3201 1 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
3202 : Constant::eResource::Water,
3203 : OutputProcessor::Group::HVAC,
3204 : OutputProcessor::EndUseCat::Cooling);
3205 2 : SetupOutputVariable(state,
3206 : "Cooling Coil Evaporative Condenser Mains Water Volume",
3207 : Constant::Units::m3,
3208 1 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterConsump,
3209 : OutputProcessor::TimeStepType::System,
3210 : OutputProcessor::StoreType::Sum,
3211 1 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
3212 : Constant::eResource::MainsWater,
3213 : OutputProcessor::Group::HVAC,
3214 : OutputProcessor::EndUseCat::Cooling);
3215 2 : SetupOutputVariable(state,
3216 : "Cooling Coil Evaporative Condenser Pump Electricity Rate",
3217 : Constant::Units::W,
3218 1 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondPumpElecPower,
3219 : OutputProcessor::TimeStepType::System,
3220 : OutputProcessor::StoreType::Average,
3221 1 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3222 2 : SetupOutputVariable(state,
3223 : "Cooling Coil Evaporative Condenser Pump Electricity Energy",
3224 : Constant::Units::J,
3225 1 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondPumpElecConsumption,
3226 : OutputProcessor::TimeStepType::System,
3227 : OutputProcessor::StoreType::Sum,
3228 1 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
3229 : Constant::eResource::Electricity,
3230 : OutputProcessor::Group::HVAC,
3231 : OutputProcessor::EndUseCat::Cooling);
3232 1 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterPowerFTempDiff > 0.0) {
3233 0 : SetupOutputVariable(state,
3234 : "Cooling Coil Basin Heater Electricity Rate",
3235 : Constant::Units::W,
3236 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterPower,
3237 : OutputProcessor::TimeStepType::System,
3238 : OutputProcessor::StoreType::Average,
3239 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3240 0 : SetupOutputVariable(state,
3241 : "Cooling Coil Basin Heater Electricity Energy",
3242 : Constant::Units::J,
3243 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterConsumption,
3244 : OutputProcessor::TimeStepType::System,
3245 : OutputProcessor::StoreType::Sum,
3246 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
3247 : Constant::eResource::Electricity,
3248 : OutputProcessor::Group::HVAC,
3249 : OutputProcessor::EndUseCat::Cooling);
3250 : }
3251 : }
3252 :
3253 76 : SetupOutputVariable(state,
3254 : "Cooling Coil Crankcase Heater Electricity Rate",
3255 : Constant::Units::W,
3256 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterPower,
3257 : OutputProcessor::TimeStepType::System,
3258 : OutputProcessor::StoreType::Average,
3259 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3260 76 : SetupOutputVariable(state,
3261 : "Cooling Coil Crankcase Heater Electricity Energy",
3262 : Constant::Units::J,
3263 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterConsumption,
3264 : OutputProcessor::TimeStepType::System,
3265 : OutputProcessor::StoreType::Sum,
3266 38 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
3267 : Constant::eResource::Electricity,
3268 : OutputProcessor::Group::HVAC,
3269 : OutputProcessor::EndUseCat::Cooling);
3270 : } else {
3271 : // air source heating coils
3272 26 : SetupOutputVariable(state,
3273 : "Heating Coil Air Mass Flow Rate",
3274 : Constant::Units::kg_s,
3275 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate,
3276 : OutputProcessor::TimeStepType::System,
3277 : OutputProcessor::StoreType::Average,
3278 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3279 26 : SetupOutputVariable(state,
3280 : "Heating Coil Air Inlet Temperature",
3281 : Constant::Units::C,
3282 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp,
3283 : OutputProcessor::TimeStepType::System,
3284 : OutputProcessor::StoreType::Average,
3285 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3286 26 : SetupOutputVariable(state,
3287 : "Heating Coil Air Inlet Humidity Ratio",
3288 : Constant::Units::kgWater_kgDryAir,
3289 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat,
3290 : OutputProcessor::TimeStepType::System,
3291 : OutputProcessor::StoreType::Average,
3292 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3293 26 : SetupOutputVariable(state,
3294 : "Heating Coil Air Outlet Temperature",
3295 : Constant::Units::C,
3296 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp,
3297 : OutputProcessor::TimeStepType::System,
3298 : OutputProcessor::StoreType::Average,
3299 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3300 26 : SetupOutputVariable(state,
3301 : "Heating Coil Air Outlet Humidity Ratio",
3302 : Constant::Units::kgWater_kgDryAir,
3303 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat,
3304 : OutputProcessor::TimeStepType::System,
3305 : OutputProcessor::StoreType::Average,
3306 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3307 26 : SetupOutputVariable(state,
3308 : "Heating Coil Sensible Heating Rate",
3309 : Constant::Units::W,
3310 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible,
3311 : OutputProcessor::TimeStepType::System,
3312 : OutputProcessor::StoreType::Average,
3313 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3314 26 : SetupOutputVariable(state,
3315 : "Heating Coil Heating Rate",
3316 : Constant::Units::W,
3317 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal,
3318 : OutputProcessor::TimeStepType::System,
3319 : OutputProcessor::StoreType::Average,
3320 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3321 26 : SetupOutputVariable(state,
3322 : "Heating Coil Part Load Ratio",
3323 : Constant::Units::None,
3324 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio,
3325 : OutputProcessor::TimeStepType::System,
3326 : OutputProcessor::StoreType::Average,
3327 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3328 26 : SetupOutputVariable(state,
3329 : "Heating Coil Electricity Rate",
3330 : Constant::Units::W,
3331 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Power,
3332 : OutputProcessor::TimeStepType::System,
3333 : OutputProcessor::StoreType::Average,
3334 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3335 26 : SetupOutputVariable(state,
3336 : "Heating Coil Runtime Fraction",
3337 : Constant::Units::None,
3338 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac,
3339 : OutputProcessor::TimeStepType::System,
3340 : OutputProcessor::StoreType::Average,
3341 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3342 :
3343 26 : SetupOutputVariable(state,
3344 : "Heating Coil Source Side Heat Transfer Rate",
3345 : Constant::Units::W,
3346 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSource,
3347 : OutputProcessor::TimeStepType::System,
3348 : OutputProcessor::StoreType::Average,
3349 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3350 26 : SetupOutputVariable(state,
3351 : "Heating Coil Upper Speed Level",
3352 : Constant::Units::None,
3353 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SpeedNumReport,
3354 : OutputProcessor::TimeStepType::System,
3355 : OutputProcessor::StoreType::Average,
3356 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3357 26 : SetupOutputVariable(state,
3358 : "Heating Coil Neighboring Speed Levels Ratio",
3359 : Constant::Units::None,
3360 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SpeedRatioReport,
3361 : OutputProcessor::TimeStepType::System,
3362 : OutputProcessor::StoreType::Average,
3363 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3364 :
3365 26 : SetupOutputVariable(state,
3366 : "Heating Coil Defrost Electricity Rate",
3367 : Constant::Units::W,
3368 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostPower,
3369 : OutputProcessor::TimeStepType::System,
3370 : OutputProcessor::StoreType::Average,
3371 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3372 26 : SetupOutputVariable(state,
3373 : "Heating Coil Defrost Electricity Energy",
3374 : Constant::Units::J,
3375 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostConsumption,
3376 : OutputProcessor::TimeStepType::System,
3377 : OutputProcessor::StoreType::Sum,
3378 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
3379 : Constant::eResource::Electricity,
3380 : OutputProcessor::Group::HVAC,
3381 : OutputProcessor::EndUseCat::Heating);
3382 26 : SetupOutputVariable(state,
3383 : "Heating Coil Crankcase Heater Electricity Rate",
3384 : Constant::Units::W,
3385 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterPower,
3386 : OutputProcessor::TimeStepType::System,
3387 : OutputProcessor::StoreType::Average,
3388 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3389 26 : SetupOutputVariable(state,
3390 : "Heating Coil Crankcase Heater Electricity Energy",
3391 : Constant::Units::J,
3392 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterConsumption,
3393 : OutputProcessor::TimeStepType::System,
3394 : OutputProcessor::StoreType::Sum,
3395 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
3396 : Constant::eResource::Electricity,
3397 : OutputProcessor::Group::HVAC,
3398 : OutputProcessor::EndUseCat::Heating);
3399 :
3400 13 : if (state.dataGlobal->AnyEnergyManagementSystemInModel) {
3401 0 : SetupEMSActuator(state,
3402 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VarSpeedCoilType,
3403 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
3404 : "Frost Heating Capacity Multiplier",
3405 : "[]",
3406 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingCapacityMultiplierEMSOverrideOn,
3407 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingCapacityMultiplierEMSOverrideValue);
3408 :
3409 0 : SetupEMSActuator(state,
3410 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VarSpeedCoilType,
3411 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
3412 : "Frost Heating Input Power Multiplier",
3413 : "[]",
3414 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingInputPowerMultiplierEMSOverrideOn,
3415 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingInputPowerMultiplierEMSOverrideValue);
3416 : }
3417 : }
3418 : } else {
3419 :
3420 16 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType ==
3421 : HVAC::Coil_CoolingWaterToAirHPVSEquationFit) { // fix coil type
3422 : // cooling WAHP coil
3423 : // Setup Report variables for water source Heat Pump
3424 10 : SetupOutputVariable(state,
3425 : "Cooling Coil Electricity Rate",
3426 : Constant::Units::W,
3427 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Power,
3428 : OutputProcessor::TimeStepType::System,
3429 : OutputProcessor::StoreType::Average,
3430 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3431 10 : SetupOutputVariable(state,
3432 : "Cooling Coil Total Cooling Rate",
3433 : Constant::Units::W,
3434 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal,
3435 : OutputProcessor::TimeStepType::System,
3436 : OutputProcessor::StoreType::Average,
3437 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3438 10 : SetupOutputVariable(state,
3439 : "Cooling Coil Sensible Cooling Rate",
3440 : Constant::Units::W,
3441 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible,
3442 : OutputProcessor::TimeStepType::System,
3443 : OutputProcessor::StoreType::Average,
3444 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3445 10 : SetupOutputVariable(state,
3446 : "Cooling Coil Latent Cooling Rate",
3447 : Constant::Units::W,
3448 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLatent,
3449 : OutputProcessor::TimeStepType::System,
3450 : OutputProcessor::StoreType::Average,
3451 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3452 10 : SetupOutputVariable(state,
3453 : "Cooling Coil Source Side Heat Transfer Rate",
3454 : Constant::Units::W,
3455 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSource,
3456 : OutputProcessor::TimeStepType::System,
3457 : OutputProcessor::StoreType::Average,
3458 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3459 10 : SetupOutputVariable(state,
3460 : "Cooling Coil Part Load Ratio",
3461 : Constant::Units::None,
3462 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio,
3463 : OutputProcessor::TimeStepType::System,
3464 : OutputProcessor::StoreType::Average,
3465 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3466 10 : SetupOutputVariable(state,
3467 : "Cooling Coil Runtime Fraction",
3468 : Constant::Units::None,
3469 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac,
3470 : OutputProcessor::TimeStepType::System,
3471 : OutputProcessor::StoreType::Average,
3472 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3473 :
3474 10 : SetupOutputVariable(state,
3475 : "Cooling Coil Air Mass Flow Rate",
3476 : Constant::Units::kg_s,
3477 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate,
3478 : OutputProcessor::TimeStepType::System,
3479 : OutputProcessor::StoreType::Average,
3480 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3481 10 : SetupOutputVariable(state,
3482 : "Cooling Coil Air Inlet Temperature",
3483 : Constant::Units::C,
3484 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp,
3485 : OutputProcessor::TimeStepType::System,
3486 : OutputProcessor::StoreType::Average,
3487 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3488 10 : SetupOutputVariable(state,
3489 : "Cooling Coil Air Inlet Humidity Ratio",
3490 : Constant::Units::kgWater_kgDryAir,
3491 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat,
3492 : OutputProcessor::TimeStepType::System,
3493 : OutputProcessor::StoreType::Average,
3494 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3495 10 : SetupOutputVariable(state,
3496 : "Cooling Coil Air Outlet Temperature",
3497 : Constant::Units::C,
3498 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp,
3499 : OutputProcessor::TimeStepType::System,
3500 : OutputProcessor::StoreType::Average,
3501 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3502 10 : SetupOutputVariable(state,
3503 : "Cooling Coil Air Outlet Humidity Ratio",
3504 : Constant::Units::kgWater_kgDryAir,
3505 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat,
3506 : OutputProcessor::TimeStepType::System,
3507 : OutputProcessor::StoreType::Average,
3508 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3509 10 : SetupOutputVariable(state,
3510 : "Cooling Coil Source Side Mass Flow Rate",
3511 : Constant::Units::kg_s,
3512 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate,
3513 : OutputProcessor::TimeStepType::System,
3514 : OutputProcessor::StoreType::Average,
3515 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3516 10 : SetupOutputVariable(state,
3517 : "Cooling Coil Source Side Inlet Temperature",
3518 : Constant::Units::C,
3519 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp,
3520 : OutputProcessor::TimeStepType::System,
3521 : OutputProcessor::StoreType::Average,
3522 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3523 10 : SetupOutputVariable(state,
3524 : "Cooling Coil Source Side Outlet Temperature",
3525 : Constant::Units::C,
3526 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterTemp,
3527 : OutputProcessor::TimeStepType::System,
3528 : OutputProcessor::StoreType::Average,
3529 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3530 :
3531 10 : SetupOutputVariable(state,
3532 : "Cooling Coil Upper Speed Level",
3533 : Constant::Units::None,
3534 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SpeedNumReport,
3535 : OutputProcessor::TimeStepType::System,
3536 : OutputProcessor::StoreType::Average,
3537 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3538 10 : SetupOutputVariable(state,
3539 : "Cooling Coil Neighboring Speed Levels Ratio",
3540 : Constant::Units::None,
3541 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SpeedRatioReport,
3542 : OutputProcessor::TimeStepType::System,
3543 : OutputProcessor::StoreType::Average,
3544 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3545 10 : SetupOutputVariable(state,
3546 : "Cooling Coil Recoverable Heat Transfer Rate",
3547 : Constant::Units::W,
3548 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QWasteHeat,
3549 : OutputProcessor::TimeStepType::System,
3550 : OutputProcessor::StoreType::Average,
3551 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3552 11 : } else if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType ==
3553 : HVAC::Coil_HeatingWaterToAirHPVSEquationFit) { // fix coil type
3554 : // heating WAHP coil
3555 : // Setup Report variables for water source Heat Pump
3556 8 : SetupOutputVariable(state,
3557 : "Heating Coil Electricity Rate",
3558 : Constant::Units::W,
3559 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Power,
3560 : OutputProcessor::TimeStepType::System,
3561 : OutputProcessor::StoreType::Average,
3562 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3563 8 : SetupOutputVariable(state,
3564 : "Heating Coil Heating Rate",
3565 : Constant::Units::W,
3566 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal,
3567 : OutputProcessor::TimeStepType::System,
3568 : OutputProcessor::StoreType::Average,
3569 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3570 8 : SetupOutputVariable(state,
3571 : "Heating Coil Sensible Heating Rate",
3572 : Constant::Units::W,
3573 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible,
3574 : OutputProcessor::TimeStepType::System,
3575 : OutputProcessor::StoreType::Average,
3576 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3577 :
3578 8 : SetupOutputVariable(state,
3579 : "Heating Coil Source Side Heat Transfer Rate",
3580 : Constant::Units::W,
3581 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSource,
3582 : OutputProcessor::TimeStepType::System,
3583 : OutputProcessor::StoreType::Average,
3584 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3585 8 : SetupOutputVariable(state,
3586 : "Heating Coil Part Load Ratio",
3587 : Constant::Units::None,
3588 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio,
3589 : OutputProcessor::TimeStepType::System,
3590 : OutputProcessor::StoreType::Average,
3591 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3592 8 : SetupOutputVariable(state,
3593 : "Heating Coil Runtime Fraction",
3594 : Constant::Units::None,
3595 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac,
3596 : OutputProcessor::TimeStepType::System,
3597 : OutputProcessor::StoreType::Average,
3598 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3599 :
3600 8 : SetupOutputVariable(state,
3601 : "Heating Coil Air Mass Flow Rate",
3602 : Constant::Units::kg_s,
3603 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate,
3604 : OutputProcessor::TimeStepType::System,
3605 : OutputProcessor::StoreType::Average,
3606 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3607 8 : SetupOutputVariable(state,
3608 : "Heating Coil Air Inlet Temperature",
3609 : Constant::Units::C,
3610 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp,
3611 : OutputProcessor::TimeStepType::System,
3612 : OutputProcessor::StoreType::Average,
3613 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3614 8 : SetupOutputVariable(state,
3615 : "Heating Coil Air Inlet Humidity Ratio",
3616 : Constant::Units::kgWater_kgDryAir,
3617 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat,
3618 : OutputProcessor::TimeStepType::System,
3619 : OutputProcessor::StoreType::Average,
3620 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3621 8 : SetupOutputVariable(state,
3622 : "Heating Coil Air Outlet Temperature",
3623 : Constant::Units::C,
3624 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp,
3625 : OutputProcessor::TimeStepType::System,
3626 : OutputProcessor::StoreType::Average,
3627 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3628 8 : SetupOutputVariable(state,
3629 : "Heating Coil Air Outlet Humidity Ratio",
3630 : Constant::Units::kgWater_kgDryAir,
3631 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat,
3632 : OutputProcessor::TimeStepType::System,
3633 : OutputProcessor::StoreType::Average,
3634 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3635 8 : SetupOutputVariable(state,
3636 : "Heating Coil Source Side Mass Flow Rate",
3637 : Constant::Units::kg_s,
3638 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate,
3639 : OutputProcessor::TimeStepType::System,
3640 : OutputProcessor::StoreType::Average,
3641 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3642 8 : SetupOutputVariable(state,
3643 : "Heating Coil Source Side Inlet Temperature",
3644 : Constant::Units::C,
3645 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp,
3646 : OutputProcessor::TimeStepType::System,
3647 : OutputProcessor::StoreType::Average,
3648 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3649 8 : SetupOutputVariable(state,
3650 : "Heating Coil Source Side Outlet Temperature",
3651 : Constant::Units::C,
3652 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterTemp,
3653 : OutputProcessor::TimeStepType::System,
3654 : OutputProcessor::StoreType::Average,
3655 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3656 :
3657 8 : SetupOutputVariable(state,
3658 : "Heating Coil Upper Speed Level",
3659 : Constant::Units::None,
3660 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SpeedNumReport,
3661 : OutputProcessor::TimeStepType::System,
3662 : OutputProcessor::StoreType::Average,
3663 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3664 8 : SetupOutputVariable(state,
3665 : "Heating Coil Neighboring Speed Levels Ratio",
3666 : Constant::Units::None,
3667 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SpeedRatioReport,
3668 : OutputProcessor::TimeStepType::System,
3669 : OutputProcessor::StoreType::Average,
3670 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3671 8 : SetupOutputVariable(state,
3672 : "Heating Coil Recoverable Heat Transfer Rate",
3673 : Constant::Units::W,
3674 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QWasteHeat,
3675 : OutputProcessor::TimeStepType::System,
3676 : OutputProcessor::StoreType::Average,
3677 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3678 7 : } else if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed) {
3679 : // air source water heating coil
3680 14 : SetupOutputVariable(state,
3681 : "Cooling Coil Water Heating Electricity Rate",
3682 : Constant::Units::W,
3683 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Power,
3684 : OutputProcessor::TimeStepType::System,
3685 : OutputProcessor::StoreType::Average,
3686 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3687 14 : SetupOutputVariable(state,
3688 : "Cooling Coil Total Cooling Rate",
3689 : Constant::Units::W,
3690 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal,
3691 : OutputProcessor::TimeStepType::System,
3692 : OutputProcessor::StoreType::Average,
3693 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3694 14 : SetupOutputVariable(state,
3695 : "Cooling Coil Sensible Cooling Rate",
3696 : Constant::Units::W,
3697 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible,
3698 : OutputProcessor::TimeStepType::System,
3699 : OutputProcessor::StoreType::Average,
3700 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3701 14 : SetupOutputVariable(state,
3702 : "Cooling Coil Latent Cooling Rate",
3703 : Constant::Units::W,
3704 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLatent,
3705 : OutputProcessor::TimeStepType::System,
3706 : OutputProcessor::StoreType::Average,
3707 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3708 14 : SetupOutputVariable(state,
3709 : "Cooling Coil Total Water Heating Rate",
3710 : Constant::Units::W,
3711 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).TotalHeatingEnergyRate,
3712 : OutputProcessor::TimeStepType::System,
3713 : OutputProcessor::StoreType::Average,
3714 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3715 14 : SetupOutputVariable(state,
3716 : "Cooling Coil Part Load Ratio",
3717 : Constant::Units::None,
3718 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio,
3719 : OutputProcessor::TimeStepType::System,
3720 : OutputProcessor::StoreType::Average,
3721 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3722 14 : SetupOutputVariable(state,
3723 : "Cooling Coil Runtime Fraction",
3724 : Constant::Units::None,
3725 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac,
3726 : OutputProcessor::TimeStepType::System,
3727 : OutputProcessor::StoreType::Average,
3728 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3729 :
3730 14 : SetupOutputVariable(state,
3731 : "Cooling Coil Air Mass Flow Rate",
3732 : Constant::Units::kg_s,
3733 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate,
3734 : OutputProcessor::TimeStepType::System,
3735 : OutputProcessor::StoreType::Average,
3736 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3737 14 : SetupOutputVariable(state,
3738 : "Cooling Coil Air Inlet Temperature",
3739 : Constant::Units::C,
3740 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp,
3741 : OutputProcessor::TimeStepType::System,
3742 : OutputProcessor::StoreType::Average,
3743 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3744 14 : SetupOutputVariable(state,
3745 : "Cooling Coil Air Inlet Humidity Ratio",
3746 : Constant::Units::kgWater_kgDryAir,
3747 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat,
3748 : OutputProcessor::TimeStepType::System,
3749 : OutputProcessor::StoreType::Average,
3750 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3751 14 : SetupOutputVariable(state,
3752 : "Cooling Coil Air Outlet Temperature",
3753 : Constant::Units::C,
3754 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp,
3755 : OutputProcessor::TimeStepType::System,
3756 : OutputProcessor::StoreType::Average,
3757 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3758 14 : SetupOutputVariable(state,
3759 : "Cooling Coil Air Outlet Humidity Ratio",
3760 : Constant::Units::kgWater_kgDryAir,
3761 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat,
3762 : OutputProcessor::TimeStepType::System,
3763 : OutputProcessor::StoreType::Average,
3764 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3765 14 : SetupOutputVariable(state,
3766 : "Cooling Coil Water Mass Flow Rate",
3767 : Constant::Units::kg_s,
3768 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate,
3769 : OutputProcessor::TimeStepType::System,
3770 : OutputProcessor::StoreType::Average,
3771 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3772 14 : SetupOutputVariable(state,
3773 : "Cooling Coil Water Inlet Temperature",
3774 : Constant::Units::C,
3775 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp,
3776 : OutputProcessor::TimeStepType::System,
3777 : OutputProcessor::StoreType::Average,
3778 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3779 14 : SetupOutputVariable(state,
3780 : "Cooling Coil Water Outlet Temperature",
3781 : Constant::Units::C,
3782 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterTemp,
3783 : OutputProcessor::TimeStepType::System,
3784 : OutputProcessor::StoreType::Average,
3785 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3786 :
3787 14 : SetupOutputVariable(state,
3788 : "Cooling Coil Crankcase Heater Electricity Rate",
3789 : Constant::Units::W,
3790 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterPower,
3791 : OutputProcessor::TimeStepType::System,
3792 : OutputProcessor::StoreType::Average,
3793 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3794 14 : SetupOutputVariable(state,
3795 : "Cooling Coil Crankcase Heater Electricity Energy",
3796 : Constant::Units::J,
3797 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterConsumption,
3798 : OutputProcessor::TimeStepType::System,
3799 : OutputProcessor::StoreType::Sum,
3800 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
3801 : Constant::eResource::Electricity,
3802 : OutputProcessor::Group::HVAC,
3803 : OutputProcessor::EndUseCat::Heating);
3804 :
3805 14 : SetupOutputVariable(state,
3806 : "Cooling Coil Upper Speed Level",
3807 : Constant::Units::None,
3808 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SpeedNumReport,
3809 : OutputProcessor::TimeStepType::System,
3810 : OutputProcessor::StoreType::Average,
3811 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3812 14 : SetupOutputVariable(state,
3813 : "Cooling Coil Neighboring Speed Levels Ratio",
3814 : Constant::Units::None,
3815 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SpeedRatioReport,
3816 : OutputProcessor::TimeStepType::System,
3817 : OutputProcessor::StoreType::Average,
3818 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3819 :
3820 14 : SetupOutputVariable(state,
3821 : "Cooling Coil Water Heating Pump Electricity Rate",
3822 : Constant::Units::W,
3823 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower,
3824 : OutputProcessor::TimeStepType::System,
3825 : OutputProcessor::StoreType::Average,
3826 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
3827 14 : SetupOutputVariable(state,
3828 : "Cooling Coil Water Heating Pump Electricity Energy",
3829 : Constant::Units::J,
3830 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondPumpElecConsumption,
3831 : OutputProcessor::TimeStepType::System,
3832 : OutputProcessor::StoreType::Sum,
3833 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
3834 : Constant::eResource::Electricity,
3835 : OutputProcessor::Group::HVAC,
3836 : OutputProcessor::EndUseCat::Heating);
3837 : }
3838 : }
3839 : }
3840 :
3841 49 : if (ErrorsFound) {
3842 0 : ShowFatalError(
3843 0 : state, format("{}Errors found in getting {} input. Preceding condition(s) causes termination.", RoutineName, CurrentModuleObject));
3844 : }
3845 49 : }
3846 :
3847 : // Beginning Initialization Section of the Module
3848 : //******************************************************************************
3849 :
3850 67679 : void InitVarSpeedCoil(EnergyPlusData &state,
3851 : int const DXCoilNum, // Current DXCoilNum under simulation
3852 : Real64 const SensLoad, // Control zone sensible load[W]
3853 : Real64 const LatentLoad, // Control zone latent load[W]
3854 : HVAC::FanOp const fanOp, // fan operating mode
3855 : [[maybe_unused]] Real64 const OnOffAirFlowRatio, // ratio of compressor on flow to average flow over time step
3856 : Real64 const SpeedRatio, // compressor speed ratio
3857 : int const SpeedNum // compressor speed number
3858 : )
3859 : {
3860 :
3861 : // SUBROUTINE INFORMATION:
3862 : // AUTHOR Bo Shen, based on MODULE WaterToAirHeatPumpSimple:InitSimpleWatertoAirHP
3863 : // DATE WRITTEN March, 2012
3864 : // MODIFIED Bo Shen, 12/2014, add variable-speed HPWH
3865 :
3866 : // PURPOSE OF THIS SUBROUTINE:
3867 : // This subroutine is for initializations of the variable speed Water to Air HP Components.
3868 :
3869 : // METHODOLOGY EMPLOYED:
3870 : // Uses the status flags to trigger initializations.
3871 :
3872 : // SUBROUTINE PARAMETER DEFINITIONS:
3873 : static constexpr std::string_view RoutineNameSimpleWatertoAirHP("InitSimpleWatertoAirHP");
3874 :
3875 : // SUBROUTINE LOCAL VARIABLE DECLARATIONS:
3876 : int WaterInletNode; // Node Number of the Water inlet
3877 : Real64 rho; // local fluid density
3878 : Real64 Cp; // local fluid specific heat
3879 : int SpeedCal; // calculated speed level
3880 : bool ErrorsFound; // TRUE when errors found, air loop initialization error
3881 : Real64 RatedVolFlowPerRatedTotCap; // Rated Air Volume Flow Rate divided by Rated Total Capacity [m3/s-W)
3882 : Real64 RatedHeatPumpIndoorAirTemp; // Indoor dry-bulb temperature to heat pump evaporator at rated conditions [C]
3883 : Real64 RatedHeatPumpIndoorHumRat; // Inlet humidity ratio to heat pump evaporator at rated conditions [kg/kg]
3884 : Real64 WaterFlowScale; // water flow scaling factor match rated flow rate
3885 :
3886 : // SUBROUTINE PARAMETER DEFINITIONS:
3887 : static constexpr std::string_view RoutineName = "InitVarSpeedCoil";
3888 67679 : int AirInletNode = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirInletNodeNum;
3889 :
3890 67679 : if (state.dataVariableSpeedCoils->MyOneTimeFlag) {
3891 : // initialize the environment and sizing flags
3892 16 : state.dataVariableSpeedCoils->MySizeFlag.allocate(state.dataVariableSpeedCoils->NumVarSpeedCoils);
3893 16 : state.dataVariableSpeedCoils->MyEnvrnFlag.allocate(state.dataVariableSpeedCoils->NumVarSpeedCoils);
3894 16 : state.dataVariableSpeedCoils->MyPlantScanFlag.allocate(state.dataVariableSpeedCoils->NumVarSpeedCoils);
3895 16 : state.dataVariableSpeedCoils->MySizeFlag = true;
3896 16 : state.dataVariableSpeedCoils->MyEnvrnFlag = true;
3897 16 : state.dataVariableSpeedCoils->MyPlantScanFlag = true;
3898 16 : state.dataVariableSpeedCoils->MyOneTimeFlag = false;
3899 : }
3900 :
3901 67679 : state.dataHVACGlobal->DXCT = HVAC::DXCoilType::Regular; // hard-code to non-DOAS sizing routine for cfm/ton until .ISHundredPercentDOASDXCoil
3902 : // member from DXcoils.cc is added to VarSpeedCoil object
3903 :
3904 : // variable-speed heat pump water heating, begin
3905 67679 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed &&
3906 0 : state.dataVariableSpeedCoils->MySizeFlag(DXCoilNum)) {
3907 :
3908 0 : ErrorsFound = false;
3909 0 : SizeVarSpeedCoil(state, DXCoilNum, ErrorsFound);
3910 0 : if (ErrorsFound) {
3911 0 : ShowFatalError(state, format("{}: Failed to size variable speed coil.", RoutineName));
3912 : }
3913 :
3914 : // get rated coil bypass factor excluding fan heat
3915 :
3916 0 : state.dataVariableSpeedCoils->MySizeFlag(DXCoilNum) = false;
3917 : }
3918 : // variable-speed heat pump water heating, end
3919 :
3920 : // water source
3921 101721 : if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit) ||
3922 34042 : (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit)) { // fix coil type
3923 67273 : if (state.dataVariableSpeedCoils->MyPlantScanFlag(DXCoilNum) && allocated(state.dataPlnt->PlantLoop)) {
3924 : // switch from coil type numbers in DataHVACGlobals, to coil type numbers in plant.
3925 3 : DataPlant::PlantEquipmentType CoilVSWAHPType(DataPlant::PlantEquipmentType::Invalid);
3926 3 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit) {
3927 2 : CoilVSWAHPType = DataPlant::PlantEquipmentType::CoilVSWAHPCoolingEquationFit;
3928 1 : } else if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit) {
3929 1 : CoilVSWAHPType = DataPlant::PlantEquipmentType::CoilVSWAHPHeatingEquationFit;
3930 : }
3931 3 : ErrorsFound = false;
3932 6 : PlantUtilities::ScanPlantLoopsForObject(state,
3933 3 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
3934 : CoilVSWAHPType,
3935 3 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).plantLoc,
3936 : ErrorsFound,
3937 : _,
3938 : _,
3939 : _,
3940 : _,
3941 : _);
3942 3 : if (ErrorsFound) {
3943 0 : ShowFatalError(state, "InitVarSpeedCoil: Program terminated for previous conditions.");
3944 : }
3945 3 : state.dataVariableSpeedCoils->MyPlantScanFlag(DXCoilNum) = false;
3946 : }
3947 : } else {
3948 406 : state.dataVariableSpeedCoils->MyPlantScanFlag(DXCoilNum) = false;
3949 : }
3950 :
3951 67697 : if (!state.dataGlobal->SysSizingCalc && state.dataVariableSpeedCoils->MySizeFlag(DXCoilNum) &&
3952 18 : !state.dataVariableSpeedCoils->MyPlantScanFlag(DXCoilNum)) {
3953 : // for each furnace, do the sizing once.
3954 18 : ErrorsFound = false;
3955 18 : SizeVarSpeedCoil(state, DXCoilNum, ErrorsFound);
3956 18 : if (ErrorsFound) {
3957 0 : ShowFatalError(state, format("{}: Failed to size variable speed coil.", RoutineName));
3958 : }
3959 :
3960 18 : state.dataVariableSpeedCoils->MySizeFlag(DXCoilNum) = false;
3961 :
3962 : // Multispeed Cooling
3963 34 : if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit) ||
3964 16 : (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed)) {
3965 86 : for (int Mode = 1; Mode <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds; ++Mode) {
3966 74 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedCapCoolTotal <= 0.0) break;
3967 : // Check for zero capacity or zero max flow rate
3968 73 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(Mode) <= 0.0) {
3969 0 : ShowSevereError(state,
3970 0 : format("Sizing: {} {} has zero rated total capacity at speed {}",
3971 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VarSpeedCoilType,
3972 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
3973 : Mode));
3974 0 : ErrorsFound = true;
3975 : }
3976 73 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(Mode) <= 0.0) {
3977 0 : ShowSevereError(state,
3978 0 : format("Sizing: {} {} has zero rated air flow rate at speed {}",
3979 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VarSpeedCoilType,
3980 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
3981 : Mode));
3982 0 : ErrorsFound = true;
3983 : }
3984 73 : if (ErrorsFound) {
3985 0 : ShowFatalError(state, "Preceding condition causes termination.");
3986 : }
3987 : // Check for valid range of (Rated Air Volume Flow Rate / Rated Total Capacity)
3988 73 : RatedVolFlowPerRatedTotCap = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(Mode) /
3989 73 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(Mode);
3990 : }
3991 : // call coil model with everything set at rating point
3992 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp = RatedInletAirTemp;
3993 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat =
3994 13 : Psychrometrics::PsyWFnTdbTwbPb(state, RatedInletAirTemp, RatedInletWetBulbTemp, DataEnvironment::StdPressureSeaLevel);
3995 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirEnthalpy =
3996 13 : Psychrometrics::PsyHFnTdbW(RatedInletAirTemp, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat);
3997 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirPressure = DataEnvironment::StdPressureSeaLevel;
3998 :
3999 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate =
4000 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedAirVolFlowRate *
4001 26 : Psychrometrics::PsyRhoAirFnPbTdbW(state,
4002 : DataEnvironment::StdPressureSeaLevel,
4003 : RatedInletAirTemp,
4004 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat);
4005 : // store environment data fill back in after rating point calc is over
4006 13 : Real64 holdOutDryBulbTemp = state.dataEnvrn->OutDryBulbTemp;
4007 13 : Real64 holdOutHumRat = state.dataEnvrn->OutHumRat;
4008 13 : Real64 holdOutWetBulb = state.dataEnvrn->OutWetBulbTemp;
4009 13 : Real64 holdOutBaroPress = state.dataEnvrn->OutBaroPress;
4010 13 : Real64 ratedOutdoorAirWetBulb = 23.9; // from I/O ref. more precise value?
4011 :
4012 13 : state.dataEnvrn->OutDryBulbTemp = RatedAmbAirTemp;
4013 13 : state.dataEnvrn->OutWetBulbTemp = ratedOutdoorAirWetBulb;
4014 13 : state.dataEnvrn->OutBaroPress = DataEnvironment::StdPressureSeaLevel; // assume rating is for sea level.
4015 26 : state.dataEnvrn->OutHumRat =
4016 13 : Psychrometrics::PsyWFnTdbTwbPb(state, RatedAmbAirTemp, ratedOutdoorAirWetBulb, DataEnvironment::StdPressureSeaLevel, RoutineName);
4017 13 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum > 0) {
4018 0 : state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).Temp = RatedAmbAirTemp;
4019 0 : state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).HumRat =
4020 0 : state.dataEnvrn->OutHumRat;
4021 0 : state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).Press =
4022 : DataEnvironment::StdPressureSeaLevel;
4023 0 : state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).OutAirWetBulb =
4024 : ratedOutdoorAirWetBulb;
4025 : }
4026 13 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType ==
4027 : HVAC::Coil_CoolingWaterToAirHPVSEquationFit) { // need to set water info for WSHP
4028 2 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate =
4029 4 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterMassFlowRate(
4030 2 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
4031 2 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp = RatedInletWaterTemp; // 85 F cooling mode
4032 2 : Real64 CpSource = state.dataPlnt->PlantLoop(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).plantLoc.loopNum)
4033 2 : .glycol->getSpecificHeat(state, state.dataVariableSpeedCoils->SourceSideInletTemp, RoutineName);
4034 2 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterEnthalpy =
4035 2 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp * CpSource;
4036 : }
4037 :
4038 : // calculate coil model at rating point
4039 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = 1.0;
4040 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirMassFlowRate =
4041 26 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirMassFlowRate(
4042 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
4043 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirVolFlowRate =
4044 26 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(
4045 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
4046 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterMassFlowRate =
4047 26 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterMassFlowRate(
4048 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
4049 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterVolFlowRate =
4050 26 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowRate(
4051 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
4052 :
4053 13 : CalcVarSpeedCoilCooling(state,
4054 : DXCoilNum,
4055 : HVAC::FanOp::Continuous,
4056 : SensLoad,
4057 : LatentLoad,
4058 : HVAC::CompressorOp::On,
4059 : 1.0,
4060 : 1.0,
4061 : 1.0,
4062 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
4063 : // coil outlets
4064 13 : Real64 RatedOutletWetBulb(0.0);
4065 39 : RatedOutletWetBulb = Psychrometrics::PsyTwbFnTdbWPb(state,
4066 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp,
4067 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat,
4068 : DataEnvironment::StdPressureSeaLevel,
4069 : RoutineName);
4070 13 : state.dataRptCoilSelection->coilSelectionReportObj->setRatedCoilConditions(
4071 : state,
4072 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
4073 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VarSpeedCoilType,
4074 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal, // this is the report variable
4075 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible, // this is the report variable
4076 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate,
4077 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp,
4078 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat,
4079 : RatedInletWetBulbTemp,
4080 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp,
4081 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat,
4082 : RatedOutletWetBulb,
4083 : RatedAmbAirTemp,
4084 : ratedOutdoorAirWetBulb,
4085 26 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCBF(
4086 13 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds),
4087 : -999.0); // coil effectiveness not define for DX
4088 :
4089 : // now replace the outdoor air conditions set above for one time rating point calc
4090 13 : state.dataEnvrn->OutDryBulbTemp = holdOutDryBulbTemp;
4091 13 : state.dataEnvrn->OutHumRat = holdOutHumRat;
4092 13 : state.dataEnvrn->OutWetBulbTemp = holdOutWetBulb;
4093 13 : state.dataEnvrn->OutBaroPress = holdOutBaroPress;
4094 : }
4095 :
4096 : // Multispeed Heating
4097 35 : if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit) ||
4098 17 : (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed)) {
4099 5 : RatedHeatPumpIndoorAirTemp = 21.11; // 21.11C or 70F
4100 5 : RatedHeatPumpIndoorHumRat = 0.00881; // Humidity ratio corresponding to 70F dry bulb/60F wet bulb
4101 50 : for (int Mode = 1; Mode <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds; ++Mode) {
4102 :
4103 45 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirMassFlowRate(Mode) =
4104 45 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(Mode) *
4105 45 : Psychrometrics::PsyRhoAirFnPbTdbW(
4106 45 : state, state.dataEnvrn->OutBaroPress, RatedHeatPumpIndoorAirTemp, RatedHeatPumpIndoorHumRat, RoutineName);
4107 : // Check for valid range of (Rated Air Volume Flow Rate / Rated Total Capacity)
4108 45 : RatedVolFlowPerRatedTotCap = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(Mode) /
4109 45 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(Mode);
4110 : }
4111 : // call coil model with everthing set at rating point
4112 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp = RatedInletAirTempHeat;
4113 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat =
4114 5 : Psychrometrics::PsyWFnTdbTwbPb(state, RatedInletAirTempHeat, RatedInletWetBulbTemp, DataEnvironment::StdPressureSeaLevel);
4115 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirEnthalpy =
4116 5 : Psychrometrics::PsyHFnTdbW(RatedInletAirTempHeat, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat);
4117 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirPressure = DataEnvironment::StdPressureSeaLevel;
4118 :
4119 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate =
4120 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedAirVolFlowRate *
4121 10 : Psychrometrics::PsyRhoAirFnPbTdbW(state,
4122 : DataEnvironment::StdPressureSeaLevel,
4123 : RatedInletAirTempHeat,
4124 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat);
4125 : // store environment data fill back in after rating point calc is over
4126 5 : Real64 holdOutDryBulbTemp = state.dataEnvrn->OutDryBulbTemp;
4127 5 : Real64 holdOutHumRat = state.dataEnvrn->OutHumRat;
4128 5 : Real64 holdOutWetBulb = state.dataEnvrn->OutWetBulbTemp;
4129 5 : Real64 holdOutBaroPress = state.dataEnvrn->OutBaroPress;
4130 :
4131 5 : state.dataEnvrn->OutDryBulbTemp = RatedAmbAirTempHeat;
4132 5 : state.dataEnvrn->OutWetBulbTemp = RatedAmbAirWBHeat;
4133 5 : state.dataEnvrn->OutBaroPress = DataEnvironment::StdPressureSeaLevel; // assume rating is for sea level.
4134 10 : state.dataEnvrn->OutHumRat =
4135 5 : Psychrometrics::PsyWFnTdbTwbPb(state, RatedAmbAirTempHeat, RatedAmbAirWBHeat, DataEnvironment::StdPressureSeaLevel, RoutineName);
4136 5 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum > 0) {
4137 0 : state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).Temp = RatedAmbAirTempHeat;
4138 0 : state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).HumRat =
4139 0 : state.dataEnvrn->OutHumRat;
4140 0 : state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).Press =
4141 : DataEnvironment::StdPressureSeaLevel;
4142 0 : state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).OutAirWetBulb =
4143 : RatedAmbAirWBHeat;
4144 : }
4145 :
4146 5 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType ==
4147 : HVAC::Coil_HeatingWaterToAirHPVSEquationFit) { // need to set water info for WSHP
4148 1 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate =
4149 2 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterMassFlowRate(
4150 1 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
4151 1 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp = RatedInletWaterTempHeat; // 21.11C or 70F, heating mode
4152 1 : Real64 CpSource = state.dataPlnt->PlantLoop(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).plantLoc.loopNum)
4153 1 : .glycol->getSpecificHeat(state, state.dataVariableSpeedCoils->SourceSideInletTemp, RoutineName);
4154 1 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterEnthalpy =
4155 1 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp * CpSource;
4156 : }
4157 :
4158 : // calculate coil model at rating point
4159 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = 1.0;
4160 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirMassFlowRate =
4161 10 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirMassFlowRate(
4162 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
4163 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirVolFlowRate =
4164 10 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(
4165 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
4166 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterMassFlowRate =
4167 10 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterMassFlowRate(
4168 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
4169 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterVolFlowRate =
4170 10 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowRate(
4171 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
4172 5 : CalcVarSpeedCoilHeating(state,
4173 : DXCoilNum,
4174 : HVAC::FanOp::Continuous,
4175 : SensLoad,
4176 : HVAC::CompressorOp::On,
4177 : 1.0,
4178 : 1.0,
4179 : 1.0,
4180 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
4181 : // coil outlets
4182 5 : Real64 RatedOutletWetBulb(0.0);
4183 15 : RatedOutletWetBulb = Psychrometrics::PsyTwbFnTdbWPb(state,
4184 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp,
4185 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat,
4186 : DataEnvironment::StdPressureSeaLevel,
4187 : RoutineName);
4188 5 : state.dataRptCoilSelection->coilSelectionReportObj->setRatedCoilConditions(
4189 : state,
4190 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
4191 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VarSpeedCoilType,
4192 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal, // this is the report variable
4193 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible, // this is the report variable
4194 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate,
4195 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp,
4196 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat,
4197 : RatedInletWetBulbTemp,
4198 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp,
4199 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat,
4200 : RatedOutletWetBulb,
4201 : RatedAmbAirTempHeat,
4202 : RatedAmbAirWBHeat,
4203 10 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCBF(
4204 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds),
4205 : -999.0); // coil effectiveness not define for DX
4206 :
4207 : // now replace the outdoor air conditions set above for one time rating point calc
4208 5 : state.dataEnvrn->OutDryBulbTemp = holdOutDryBulbTemp;
4209 5 : state.dataEnvrn->OutHumRat = holdOutHumRat;
4210 5 : state.dataEnvrn->OutWetBulbTemp = holdOutWetBulb;
4211 5 : state.dataEnvrn->OutBaroPress = holdOutBaroPress;
4212 : }
4213 :
4214 : // store fan info for coil
4215 18 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SupplyFanIndex > 0) {
4216 5 : state.dataRptCoilSelection->coilSelectionReportObj->setCoilSupplyFanInfo(
4217 : state,
4218 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
4219 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VarSpeedCoilType,
4220 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SupplyFanName,
4221 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).supplyFanType,
4222 5 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SupplyFanIndex);
4223 : }
4224 : }
4225 :
4226 67679 : if (SpeedNum > state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds) {
4227 0 : SpeedCal = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds;
4228 67679 : } else if (SpeedNum < 1) {
4229 0 : SpeedCal = 1;
4230 : } else {
4231 67679 : SpeedCal = SpeedNum;
4232 : }
4233 67679 : if ((SpeedNum <= 1) || (SpeedNum > state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds)) {
4234 42668 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirMassFlowRate =
4235 42668 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirMassFlowRate(SpeedCal);
4236 42668 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirVolFlowRate =
4237 42668 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(SpeedCal);
4238 42668 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterMassFlowRate =
4239 42668 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterMassFlowRate(SpeedCal);
4240 42668 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterVolFlowRate =
4241 42668 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowRate(SpeedCal);
4242 : } else {
4243 25011 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirMassFlowRate =
4244 25011 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirMassFlowRate(SpeedCal) * SpeedRatio +
4245 25011 : (1.0 - SpeedRatio) * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirMassFlowRate(SpeedCal - 1);
4246 25011 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirVolFlowRate =
4247 25011 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(SpeedCal) * SpeedRatio +
4248 25011 : (1.0 - SpeedRatio) * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(SpeedCal - 1);
4249 25011 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterMassFlowRate =
4250 25011 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterMassFlowRate(SpeedCal) * SpeedRatio +
4251 25011 : (1.0 - SpeedRatio) * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterMassFlowRate(SpeedCal - 1);
4252 25011 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterVolFlowRate =
4253 25011 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowRate(SpeedCal) * SpeedRatio +
4254 25011 : (1.0 - SpeedRatio) * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowRate(SpeedCal - 1);
4255 : }
4256 :
4257 : // Do the Begin Environment initializations
4258 67696 : if (state.dataGlobal->BeginEnvrnFlag && state.dataVariableSpeedCoils->MyEnvrnFlag(DXCoilNum) &&
4259 17 : !state.dataVariableSpeedCoils->MyPlantScanFlag(DXCoilNum)) {
4260 : // Do the initializations to start simulation
4261 :
4262 : // Initialize all report variables to a known state at beginning of simulation
4263 17 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirVolFlowRate = 0.0;
4264 17 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp = 0.0;
4265 17 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat = 0.0;
4266 17 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp = 0.0;
4267 17 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat = 0.0;
4268 17 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterVolFlowRate = 0.0;
4269 17 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate = 0.0;
4270 17 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp = 0.0;
4271 17 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterEnthalpy = 0.0;
4272 17 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterEnthalpy = 0.0;
4273 17 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterTemp = 0.0;
4274 17 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Power = 0.0;
4275 17 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal = 0.0;
4276 17 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible = 0.0;
4277 17 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLatent = 0.0;
4278 17 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSource = 0.0;
4279 17 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Energy = 0.0;
4280 17 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLoadTotal = 0.0;
4281 17 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySensible = 0.0;
4282 17 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLatent = 0.0;
4283 17 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySource = 0.0;
4284 17 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).COP = 0.0;
4285 17 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = 0.0;
4286 17 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio = 0.0;
4287 :
4288 30 : if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit) ||
4289 13 : (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit)) {
4290 8 : WaterInletNode = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterInletNodeNum;
4291 :
4292 8 : rho = state.dataPlnt->PlantLoop(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).plantLoc.loopNum)
4293 8 : .glycol->getDensity(state, Constant::CWInitConvTemp, RoutineNameSimpleWatertoAirHP);
4294 8 : Cp = state.dataPlnt->PlantLoop(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).plantLoc.loopNum)
4295 8 : .glycol->getSpecificHeat(state, Constant::CWInitConvTemp, RoutineNameSimpleWatertoAirHP);
4296 :
4297 : // VarSpeedCoil(DXCoilNum)%DesignWaterMassFlowRate= &
4298 : // rho * VarSpeedCoil(DXCoilNum)%RatedWaterVolFlowRate
4299 :
4300 24 : PlantUtilities::InitComponentNodes(state,
4301 : 0.0,
4302 16 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterMassFlowRate(
4303 8 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds),
4304 8 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterInletNodeNum,
4305 8 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterOutletNodeNum);
4306 :
4307 8 : state.dataLoopNodes->Node(WaterInletNode).Temp = 5.0;
4308 8 : state.dataLoopNodes->Node(WaterInletNode).Enthalpy = Cp * state.dataLoopNodes->Node(WaterInletNode).Temp;
4309 8 : state.dataLoopNodes->Node(WaterInletNode).Quality = 0.0;
4310 8 : state.dataLoopNodes->Node(WaterInletNode).Press = 0.0;
4311 8 : state.dataLoopNodes->Node(WaterInletNode).HumRat = 0.0;
4312 :
4313 8 : state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterOutletNodeNum).Temp = 5.0;
4314 8 : state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterOutletNodeNum).Enthalpy =
4315 8 : Cp * state.dataLoopNodes->Node(WaterInletNode).Temp;
4316 8 : state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterOutletNodeNum).Quality = 0.0;
4317 8 : state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterOutletNodeNum).Press = 0.0;
4318 8 : state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterOutletNodeNum).HumRat = 0.0;
4319 : }
4320 :
4321 17 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SimFlag = true;
4322 17 : state.dataHeatBal->HeatReclaimVS_Coil(DXCoilNum).AvailCapacity = 0.0;
4323 :
4324 17 : state.dataVariableSpeedCoils->MyEnvrnFlag(DXCoilNum) = false;
4325 :
4326 : } // End If for the Begin Environment initializations
4327 :
4328 67679 : if (!state.dataGlobal->BeginEnvrnFlag) {
4329 66993 : state.dataVariableSpeedCoils->MyEnvrnFlag(DXCoilNum) = true;
4330 : }
4331 :
4332 : // Do the following initializations (every time step): This should be the info from
4333 : // the previous components outlets or the node data in this section.
4334 : // First set the conditions for the air into the heat pump model
4335 :
4336 : // Set water and air inlet nodes
4337 :
4338 67679 : WaterInletNode = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterInletNodeNum;
4339 :
4340 67679 : if ((SensLoad != 0.0 || LatentLoad != 0.0) && (state.dataLoopNodes->Node(AirInletNode).MassFlowRate > 0.0)) {
4341 28182 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterMassFlowRate(
4342 28182 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel) > 0.0) {
4343 27877 : WaterFlowScale = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedWaterMassFlowRate /
4344 27877 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterMassFlowRate(
4345 27877 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel);
4346 27877 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate =
4347 27877 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterMassFlowRate * WaterFlowScale;
4348 : } else {
4349 305 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate = 0.0;
4350 : }
4351 :
4352 28182 : if (fanOp == HVAC::FanOp::Continuous) {
4353 : // continuous fan, cycling compressor
4354 92 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate = state.dataLoopNodes->Node(AirInletNode).MassFlowRate;
4355 : // VarSpeedCoil(DXCoilNum)%AirMassFlowRate = VarSpeedCoil(DXCoilNum)%DesignAirVolFlowRate* &
4356 : // PsyRhoAirFnPbTdbW(state, OutBaroPress,Node(AirInletNode)%Temp,Node(AirInletNode)%HumRat)
4357 : // If air flow is less than 25% rated flow. Then set air flow to the 25% of rated conditions
4358 92 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate <
4359 92 : 0.25 * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirVolFlowRate *
4360 184 : Psychrometrics::PsyRhoAirFnPbTdbW(state,
4361 92 : state.dataEnvrn->OutBaroPress,
4362 92 : state.dataLoopNodes->Node(AirInletNode).Temp,
4363 92 : state.dataLoopNodes->Node(AirInletNode).HumRat)) {
4364 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate =
4365 0 : 0.25 * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirVolFlowRate *
4366 0 : Psychrometrics::PsyRhoAirFnPbTdbW(state,
4367 0 : state.dataEnvrn->OutBaroPress,
4368 0 : state.dataLoopNodes->Node(AirInletNode).Temp,
4369 0 : state.dataLoopNodes->Node(AirInletNode).HumRat);
4370 : }
4371 : } else { // CYCLIC FAN, NOT CORRECTION, WILL BE PROCESSED IN THE FOLLOWING SUBROUTINES
4372 28090 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate = state.dataLoopNodes->Node(AirInletNode).MassFlowRate;
4373 : }
4374 :
4375 : } else { // heat pump is off
4376 39497 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate = 0.0;
4377 39497 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate = 0.0;
4378 : }
4379 :
4380 101722 : if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit) ||
4381 34043 : (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit)) {
4382 201819 : PlantUtilities::SetComponentFlowRate(state,
4383 67273 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate,
4384 67273 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterInletNodeNum,
4385 67273 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterOutletNodeNum,
4386 67273 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).plantLoc);
4387 :
4388 67273 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp = state.dataLoopNodes->Node(WaterInletNode).Temp;
4389 67273 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterEnthalpy = state.dataLoopNodes->Node(WaterInletNode).Enthalpy;
4390 : } else {
4391 406 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp = 0.0;
4392 406 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterEnthalpy = 0.0;
4393 : }
4394 :
4395 67679 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed) {
4396 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp = state.dataLoopNodes->Node(WaterInletNode).Temp;
4397 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterEnthalpy = state.dataLoopNodes->Node(WaterInletNode).Enthalpy;
4398 : };
4399 :
4400 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp = state.dataLoopNodes->Node(AirInletNode).Temp;
4401 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat = state.dataLoopNodes->Node(AirInletNode).HumRat;
4402 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirEnthalpy = state.dataLoopNodes->Node(AirInletNode).Enthalpy;
4403 :
4404 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirPressure = state.dataEnvrn->OutBaroPress; // temporary
4405 : // Outlet variables
4406 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Power = 0.0;
4407 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal = 0.0;
4408 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible = 0.0;
4409 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLatent = 0.0;
4410 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSource = 0.0;
4411 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QWasteHeat = 0.0;
4412 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Energy = 0.0;
4413 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLoadTotal = 0.0;
4414 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySensible = 0.0;
4415 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLatent = 0.0;
4416 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySource = 0.0;
4417 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).COP = 0.0;
4418 :
4419 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp = 0.0;
4420 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterTemp = 0.0;
4421 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat = 0.0;
4422 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirEnthalpy = 0.0;
4423 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterEnthalpy = 0.0;
4424 :
4425 : // bug fix, must set zeros to the variables below, otherwise can't pass switch DD test
4426 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterConsumption = 0.0;
4427 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterConsump = 0.0;
4428 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterConsumption = 0.0;
4429 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondPumpElecConsumption = 0.0;
4430 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterPower = 0.0;
4431 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostPower = 0.0;
4432 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostConsumption = 0.0;
4433 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondensateVdot = 0.0;
4434 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondensateVol = 0.0;
4435 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QWasteHeat = 0.0;
4436 :
4437 : // clear zeros to HPWH variables
4438 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).ElecWaterHeatingPower =
4439 : 0.0; // Total electric power consumed by compressor and condenser pump [W]
4440 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).ElecWaterHeatingConsumption =
4441 : 0.0; // Total electric consumption by compressor and condenser pump [J]
4442 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).TotalHeatingEnergy = 0.0; // total water heating energy
4443 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).TotalHeatingEnergyRate = 0.0; // total WH energy rate
4444 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower = 0.0; // power power
4445 :
4446 67679 : state.dataVariableSpeedCoils->VSHPWHHeatingCapacity = 0.0; // Used by Heat Pump:Water Heater object as total water heating capacity [W]
4447 67679 : state.dataVariableSpeedCoils->VSHPWHHeatingCOP = 0.0; // Used by Heat Pump:Water Heater object as water heating COP [W/W]
4448 67679 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterTemp = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp;
4449 67679 : state.dataHeatBal->HeatReclaimVS_Coil(DXCoilNum).AvailCapacity = 0.0;
4450 67679 : }
4451 :
4452 18 : void SizeVarSpeedCoil(EnergyPlusData &state, int const DXCoilNum, bool &ErrorsFound)
4453 : {
4454 :
4455 : // SUBROUTINE INFORMATION:
4456 : // AUTHOR Bo Shen, based on WaterToAirHeatPumpSimple:SizeHVACWaterToAir
4457 : // DATE WRITTEN March, 2012
4458 : // MODIFIED August 2013 Daeho Kang, add component sizing table entries
4459 : // MODIFIED Bo Shen, 12/2014, add variable-speed HPWH
4460 :
4461 : // PURPOSE OF THIS SUBROUTINE:
4462 : // This subroutine is for sizing WSHP Components for which nominal capacities
4463 : // and flow rates have not been specified in the input
4464 :
4465 : // METHODOLOGY EMPLOYED:
4466 : // Obtains heating capacities and flow rates from the zone or system sizing arrays.
4467 : // NOTE: For WSHP's we are sizing the heating capacity to be
4468 : // equal to the cooling capacity. Thus the cooling and
4469 : // and heating capacities of a DX heat pump system will be identical. In real life the ARI
4470 : // heating and cooling capacities are close but not identical.
4471 :
4472 : // SUBROUTINE PARAMETER DEFINITIONS:
4473 : static constexpr std::string_view RoutineName("SizeVarSpeedCoil");
4474 : static constexpr std::string_view RoutineNameAlt("SizeHVACWaterToAir");
4475 :
4476 18 : auto &varSpeedCoil = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum);
4477 :
4478 : // SUBROUTINE LOCAL VARIABLE DECLARATIONS:
4479 18 : Real64 rhoair = state.dataEnvrn->StdRhoAir;
4480 18 : Real64 MixTemp = -999.0;
4481 18 : Real64 MixHumRat = -999.0;
4482 18 : Real64 MixEnth = -999.0;
4483 18 : Real64 MixWetBulb = -999.0;
4484 18 : Real64 SupTemp = -999.0;
4485 18 : Real64 SupHumRat = -999.0;
4486 18 : Real64 SupEnth = -999.0;
4487 18 : Real64 OutTemp = -999.0;
4488 18 : Real64 OutAirFrac = -999.0;
4489 18 : Real64 VolFlowRate = -999.0;
4490 18 : Real64 CoolCapAtPeak = -999.0;
4491 18 : Real64 TotCapTempModFac = -999.0;
4492 : int TimeStepNumAtMax;
4493 : int DDNum;
4494 : bool RatedCapCoolTotalAutoSized;
4495 : bool RatedCapCoolSensAutoSized;
4496 : Real64 SystemCapacity;
4497 : Real64 rho;
4498 : Real64 cp;
4499 : int Mode; // speed level
4500 : Real64 rhoW; // water density
4501 : Real64 SHR; // sensible heat transfer ratio
4502 : Real64 RatedAirMassFlowRate; // rated air mass flow rate
4503 : Real64 CBFRated; // bypass factor at the rated condition, considering difference in flow rates
4504 : Real64 RatedInletEnth; // rated inlet air enthalpy
4505 : Real64 QLoadTotal1; // placeholder for calculating SHR
4506 : Real64 QLoadTotal2; // placeholder for calculating SHR
4507 : Real64 QLoadTotal; // placeholder for calculating SHR
4508 : Real64 AirMassFlowRatio; // air mass flow ratio
4509 : Real64 WaterMassFlowRatio; // water mass flow rate
4510 : Real64 RatedSourceTempCool; // rated source temperature, space cooling mode
4511 18 : std::string CurrentObjSubfix; // Object subfix type for printing
4512 : bool HardSizeNoDesRun; // Indicator to hardsize withouth sizing runs
4513 : bool SizingDesRunThisAirSys; // true if a particular air system had a Sizing:System object and system sizing done
4514 : bool SizingDesRunThisZone; // true if a particular zone had a Sizing:Zone object and zone sizing was done
4515 : Real64 HPInletAirHumRat; // Rated inlet air humidity ratio for heat pump water heater [kgWater/kgDryAir]
4516 : Real64 HPWHCoolCapacity; // estimate cooling capacity in HPWH
4517 :
4518 18 : int UpperSpeed = varSpeedCoil.NumOfSpeeds;
4519 18 : int NormSpeed = varSpeedCoil.NormSpedLevel;
4520 18 : int PltSizNum = 0;
4521 18 : bool RatedAirFlowAutoSized = false;
4522 18 : bool RatedWaterFlowAutoSized = false;
4523 18 : bool RatedCapHeatAutoSized = false;
4524 18 : bool IsAutoSize = false;
4525 :
4526 18 : if (state.dataSize->SysSizingRunDone || state.dataSize->ZoneSizingRunDone) {
4527 10 : HardSizeNoDesRun = false;
4528 : } else {
4529 8 : HardSizeNoDesRun = true;
4530 : }
4531 18 : if (state.dataSize->CurSysNum > 0) {
4532 1 : CheckThisAirSystemForSizing(state, state.dataSize->CurSysNum, SizingDesRunThisAirSys);
4533 : } else {
4534 17 : SizingDesRunThisAirSys = false;
4535 : }
4536 18 : if (state.dataSize->CurZoneEqNum > 0) {
4537 12 : CheckThisZoneForSizing(state, state.dataSize->CurZoneEqNum, SizingDesRunThisZone);
4538 : } else {
4539 6 : SizingDesRunThisZone = false;
4540 : }
4541 18 : bool HardSizeNoDesRunAirFlow = false;
4542 18 : Real64 RatedAirVolFlowRateDes = 0.0;
4543 18 : Real64 RatedAirVolFlowRateUser = 0.0;
4544 18 : Real64 RatedCapCoolTotalDes = 0.0;
4545 18 : Real64 RatedCapCoolTotalUser = 0.0;
4546 18 : Real64 RatedCapHeatDes = 0.0;
4547 18 : Real64 RatedCapHeatUser = 0.0;
4548 18 : Real64 RatedWaterVolFlowRateDes = 0.0;
4549 18 : Real64 RatedWaterVolFlowRateUser = 0.0;
4550 18 : Real64 RatedCapCoolSensDes = 0.0;
4551 18 : Real64 EvapCondPumpElecNomPowerDes = 0.0;
4552 18 : Real64 EvapCondPumpElecNomPowerUser = 0.0;
4553 18 : Real64 DefrostCapacityDes = 0.0;
4554 18 : Real64 DefrostCapacityUser = 0.0;
4555 :
4556 18 : if (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit ||
4557 16 : varSpeedCoil.VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit) {
4558 3 : CurrentObjSubfix = ":WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT";
4559 15 : } else if (varSpeedCoil.VSCoilType == HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed) {
4560 0 : CurrentObjSubfix = ":WATERHEATING:AIRTOWATERHEATPUMP:VARIABLESPEED";
4561 : } else {
4562 15 : CurrentObjSubfix = ":DX:VARIABLESPEED";
4563 : }
4564 :
4565 18 : if (varSpeedCoil.VSCoilType == HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed) {
4566 0 : if (varSpeedCoil.RatedAirVolFlowRate == Constant::AutoCalculate) {
4567 0 : varSpeedCoil.RatedAirVolFlowRate =
4568 0 : varSpeedCoil.RatedCapWH * varSpeedCoil.MSRatedAirVolFlowRate(NormSpeed) / varSpeedCoil.MSRatedTotCap(NormSpeed); // 0.00005035;
4569 0 : varSpeedCoil.AirVolFlowAutoSized = true;
4570 : }
4571 0 : state.dataRptCoilSelection->coilSelectionReportObj->setCoilAirFlow(
4572 0 : state, varSpeedCoil.Name, varSpeedCoil.VarSpeedCoilType, varSpeedCoil.RatedAirVolFlowRate, varSpeedCoil.AirVolFlowAutoSized);
4573 :
4574 0 : if (varSpeedCoil.RatedWaterVolFlowRate == Constant::AutoCalculate) {
4575 0 : varSpeedCoil.RatedHPWHCondWaterFlow = varSpeedCoil.RatedCapWH * varSpeedCoil.MSRatedWaterVolFlowRate(NormSpeed) /
4576 0 : varSpeedCoil.MSRatedTotCap(NormSpeed); // 0.00000004487;
4577 0 : varSpeedCoil.RatedWaterVolFlowRate = varSpeedCoil.RatedHPWHCondWaterFlow;
4578 0 : varSpeedCoil.WaterVolFlowAutoSized = true;
4579 : }
4580 0 : state.dataRptCoilSelection->coilSelectionReportObj->setCoilWaterFlowPltSizNum(state,
4581 0 : varSpeedCoil.Name,
4582 0 : varSpeedCoil.VarSpeedCoilType,
4583 : varSpeedCoil.RatedWaterVolFlowRate,
4584 0 : varSpeedCoil.WaterVolFlowAutoSized,
4585 : -999,
4586 : varSpeedCoil.plantLoc.loopNum);
4587 : }
4588 :
4589 18 : if (varSpeedCoil.RatedAirVolFlowRate == DataSizing::AutoSize) {
4590 8 : RatedAirFlowAutoSized = true;
4591 : }
4592 :
4593 18 : if (state.dataSize->CurSysNum > 0) {
4594 1 : if (!RatedAirFlowAutoSized && !SizingDesRunThisAirSys) { // Simulation continue
4595 0 : HardSizeNoDesRunAirFlow = true;
4596 0 : if (varSpeedCoil.RatedAirVolFlowRate > 0.0) {
4597 0 : BaseSizer::reportSizerOutput(state,
4598 0 : format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
4599 : varSpeedCoil.Name,
4600 : "User-Specified Rated Air Flow Rate [m3/s]",
4601 : varSpeedCoil.RatedAirVolFlowRate);
4602 : }
4603 : } else {
4604 1 : CheckSysSizing(state, format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix), varSpeedCoil.Name);
4605 1 : if (state.dataSize->CurOASysNum > 0 && state.dataAirLoop->OutsideAirSys(state.dataSize->CurOASysNum).AirLoopDOASNum > -1) {
4606 : auto const &thisAirloopDOAS =
4607 0 : state.dataAirLoopHVACDOAS->airloopDOAS[state.dataAirLoop->OutsideAirSys(state.dataSize->CurOASysNum).AirLoopDOASNum];
4608 0 : RatedAirVolFlowRateDes = thisAirloopDOAS.SizingMassFlow / state.dataEnvrn->StdRhoAir;
4609 : } else {
4610 1 : if (state.dataSize->FinalSysSizing(state.dataSize->CurSysNum).DesMainVolFlow >= HVAC::SmallAirVolFlow) {
4611 1 : RatedAirVolFlowRateDes = state.dataSize->FinalSysSizing(state.dataSize->CurSysNum).DesMainVolFlow;
4612 : } else {
4613 0 : RatedAirVolFlowRateDes = 0.0;
4614 : }
4615 : }
4616 : }
4617 : }
4618 :
4619 18 : if (state.dataSize->CurZoneEqNum > 0) {
4620 12 : if (!RatedAirFlowAutoSized && !SizingDesRunThisZone) { // Simulation continue
4621 5 : HardSizeNoDesRunAirFlow = true;
4622 5 : if (varSpeedCoil.RatedAirVolFlowRate > 0.0) {
4623 15 : BaseSizer::reportSizerOutput(state,
4624 10 : format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
4625 : varSpeedCoil.Name,
4626 : "User-Specified Rated Air Flow Rate [m3/s]",
4627 : varSpeedCoil.RatedAirVolFlowRate);
4628 : }
4629 : } else {
4630 7 : CheckZoneSizing(state, format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix), varSpeedCoil.Name);
4631 7 : RatedAirVolFlowRateDes = max(state.dataSize->FinalZoneSizing(state.dataSize->CurZoneEqNum).DesCoolVolFlow,
4632 7 : state.dataSize->FinalZoneSizing(state.dataSize->CurZoneEqNum).DesHeatVolFlow);
4633 7 : if (RatedAirVolFlowRateDes < HVAC::SmallAirVolFlow) {
4634 0 : RatedAirVolFlowRateDes = 0.0;
4635 : }
4636 : }
4637 : }
4638 :
4639 18 : if (RatedAirFlowAutoSized) varSpeedCoil.RatedAirVolFlowRate = RatedAirVolFlowRateDes;
4640 :
4641 18 : RatedCapCoolTotalAutoSized = false;
4642 18 : RatedCapCoolSensAutoSized = false;
4643 :
4644 : // size rated total cooling capacity
4645 18 : IsAutoSize = false;
4646 18 : if (varSpeedCoil.RatedCapCoolTotal == DataSizing::AutoSize && (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit ||
4647 9 : varSpeedCoil.VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed)) {
4648 6 : RatedCapCoolTotalAutoSized = true;
4649 : }
4650 18 : if (SizingDesRunThisZone || SizingDesRunThisAirSys) HardSizeNoDesRun = false;
4651 18 : if (state.dataSize->CurSysNum > 0) {
4652 1 : if (!RatedCapCoolTotalAutoSized && !SizingDesRunThisAirSys) { // Simulation continue
4653 0 : HardSizeNoDesRun = true;
4654 0 : if (varSpeedCoil.RatedCapCoolTotal > 0.0) {
4655 0 : BaseSizer::reportSizerOutput(state,
4656 0 : format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
4657 : varSpeedCoil.Name,
4658 : "User-Specified Rated Total Cooling Capacity [W]",
4659 : varSpeedCoil.RatedCapCoolTotal);
4660 : }
4661 : } else {
4662 1 : CheckSysSizing(state, format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix), varSpeedCoil.Name);
4663 1 : if (state.dataSize->CurOASysNum > 0 && state.dataAirLoop->OutsideAirSys(state.dataSize->CurOASysNum).AirLoopDOASNum > -1) {
4664 : auto const &thisAirloopDOAS =
4665 0 : state.dataAirLoopHVACDOAS->airloopDOAS[state.dataAirLoop->OutsideAirSys(state.dataSize->CurOASysNum).AirLoopDOASNum];
4666 0 : VolFlowRate = varSpeedCoil.RatedAirVolFlowRate;
4667 0 : MixTemp = thisAirloopDOAS.SizingCoolOATemp;
4668 0 : SupTemp = thisAirloopDOAS.PrecoolTemp;
4669 0 : MixHumRat = thisAirloopDOAS.SizingCoolOAHumRat;
4670 0 : SupHumRat = thisAirloopDOAS.PrecoolHumRat;
4671 0 : RatedCapCoolTotalDes = VolFlowRate * state.dataEnvrn->StdRhoAir *
4672 0 : (Psychrometrics::PsyHFnTdbW(MixTemp, MixHumRat) - Psychrometrics::PsyHFnTdbW(SupTemp, SupHumRat));
4673 0 : if (varSpeedCoil.MSCCapFTemp(varSpeedCoil.NormSpedLevel) > 0) {
4674 0 : MixWetBulb = Psychrometrics::PsyTwbFnTdbWPb(state, MixTemp, MixHumRat, state.dataEnvrn->StdBaroPress, RoutineName);
4675 0 : if (varSpeedCoil.CondenserType == DataHeatBalance::RefrigCondenserType::Air) {
4676 0 : RatedSourceTempCool = thisAirloopDOAS.SizingCoolOATemp;
4677 : } else {
4678 0 : RatedSourceTempCool = GetVSCoilRatedSourceTemp(state, DXCoilNum);
4679 : }
4680 0 : TotCapTempModFac =
4681 0 : Curve::CurveValue(state, varSpeedCoil.MSCCapFTemp(varSpeedCoil.NormSpedLevel), MixWetBulb, RatedSourceTempCool);
4682 0 : RatedCapCoolTotalDes /= TotCapTempModFac;
4683 : }
4684 : } else {
4685 1 : auto const &finalSysSizing = state.dataSize->FinalSysSizing(state.dataSize->CurSysNum);
4686 1 : VolFlowRate = varSpeedCoil.RatedAirVolFlowRate;
4687 1 : if (VolFlowRate >= HVAC::SmallAirVolFlow) {
4688 1 : if (state.dataSize->CurOASysNum > 0) { // coil is in the OA stream
4689 0 : MixTemp = finalSysSizing.OutTempAtCoolPeak;
4690 0 : MixHumRat = finalSysSizing.OutHumRatAtCoolPeak;
4691 0 : SupTemp = finalSysSizing.PrecoolTemp;
4692 0 : SupHumRat = finalSysSizing.PrecoolHumRat;
4693 : } else { // coil is on the main air loop
4694 1 : SupTemp = finalSysSizing.CoolSupTemp;
4695 1 : SupHumRat = finalSysSizing.CoolSupHumRat;
4696 1 : if (state.dataAirSystemsData->PrimaryAirSystems(state.dataSize->CurSysNum).NumOACoolCoils ==
4697 : 0) { // there is no precooling of the OA stream
4698 1 : MixTemp = finalSysSizing.MixTempAtCoolPeak;
4699 1 : MixHumRat = finalSysSizing.MixHumRatAtCoolPeak;
4700 : } else { // there is precooling of OA stream
4701 0 : if (VolFlowRate > 0.0) {
4702 0 : OutAirFrac = finalSysSizing.DesOutAirVolFlow / VolFlowRate;
4703 : } else {
4704 0 : OutAirFrac = 1.0;
4705 : }
4706 0 : OutAirFrac = min(1.0, max(0.0, OutAirFrac));
4707 0 : MixTemp = OutAirFrac * finalSysSizing.PrecoolTemp + (1.0 - OutAirFrac) * finalSysSizing.RetTempAtCoolPeak;
4708 0 : MixHumRat = OutAirFrac * finalSysSizing.PrecoolHumRat + (1.0 - OutAirFrac) * finalSysSizing.RetHumRatAtCoolPeak;
4709 : }
4710 : }
4711 1 : OutTemp = finalSysSizing.OutTempAtCoolPeak;
4712 1 : MixEnth = Psychrometrics::PsyHFnTdbW(MixTemp, MixHumRat);
4713 1 : SupEnth = Psychrometrics::PsyHFnTdbW(SupTemp, SupHumRat);
4714 :
4715 : // design fan heat will be added to coil load
4716 1 : Real64 FanCoolLoad = DataAirSystems::calcFanDesignHeatGain(state, state.dataSize->DataFanIndex, VolFlowRate);
4717 : // inlet/outlet temp is adjusted after enthalpy is calculcated so fan heat is not double counted
4718 1 : Real64 CpAir = Psychrometrics::PsyCpAirFnW(MixHumRat);
4719 1 : if (state.dataAirSystemsData->PrimaryAirSystems(state.dataSize->CurSysNum).supFanPlace == HVAC::FanPlace::BlowThru) {
4720 0 : MixTemp += FanCoolLoad / (CpAir * rhoair * VolFlowRate);
4721 1 : } else if (state.dataAirSystemsData->PrimaryAirSystems(state.dataSize->CurSysNum).supFanPlace == HVAC::FanPlace::DrawThru) {
4722 0 : SupTemp -= FanCoolLoad / (CpAir * rhoair * VolFlowRate);
4723 : }
4724 1 : MixWetBulb = Psychrometrics::PsyTwbFnTdbWPb(state, MixTemp, MixHumRat, state.dataEnvrn->StdBaroPress, RoutineName);
4725 1 : if (varSpeedCoil.CondenserType == DataHeatBalance::RefrigCondenserType::Air) {
4726 0 : RatedSourceTempCool = OutTemp;
4727 : } else {
4728 1 : RatedSourceTempCool = GetVSCoilRatedSourceTemp(state, DXCoilNum);
4729 : }
4730 1 : TotCapTempModFac =
4731 1 : Curve::CurveValue(state, varSpeedCoil.MSCCapFTemp(varSpeedCoil.NormSpedLevel), MixWetBulb, RatedSourceTempCool);
4732 :
4733 : // The mixed air temp for zone equipment without an OA mixer is 0.
4734 : // This test avoids a negative capacity until a solution can be found.
4735 1 : if (MixEnth > SupEnth) {
4736 1 : CoolCapAtPeak = (rhoair * VolFlowRate * (MixEnth - SupEnth)) + FanCoolLoad;
4737 : } else {
4738 0 : CoolCapAtPeak = (rhoair * VolFlowRate * (48000.0 - SupEnth)) + FanCoolLoad;
4739 : }
4740 1 : CoolCapAtPeak = max(0.0, CoolCapAtPeak);
4741 1 : if (TotCapTempModFac > 0.0) {
4742 1 : RatedCapCoolTotalDes = CoolCapAtPeak / TotCapTempModFac;
4743 : } else {
4744 0 : RatedCapCoolTotalDes = CoolCapAtPeak;
4745 : }
4746 : } else {
4747 0 : RatedCapCoolTotalDes = 0.0;
4748 : }
4749 : }
4750 : }
4751 :
4752 17 : } else if (state.dataSize->CurZoneEqNum > 0) {
4753 12 : if (!RatedCapCoolTotalAutoSized && !SizingDesRunThisZone) { // Simulation continue
4754 5 : HardSizeNoDesRun = true;
4755 5 : if (varSpeedCoil.RatedCapCoolTotal > 0.0) {
4756 9 : BaseSizer::reportSizerOutput(state,
4757 6 : format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
4758 : varSpeedCoil.Name,
4759 : "User-Specified Rated Total Cooling Capacity [W]",
4760 : varSpeedCoil.RatedCapCoolTotal);
4761 : }
4762 : } else {
4763 7 : CheckZoneSizing(state, format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix), varSpeedCoil.Name);
4764 7 : auto const &finalZoneSizing = state.dataSize->FinalZoneSizing(state.dataSize->CurZoneEqNum);
4765 7 : VolFlowRate = varSpeedCoil.RatedAirVolFlowRate;
4766 7 : if (VolFlowRate >= HVAC::SmallAirVolFlow) {
4767 7 : if (state.dataSize->ZoneEqDXCoil) {
4768 4 : if (state.dataSize->ZoneEqSizing(state.dataSize->CurZoneEqNum).OAVolFlow > 0.0) {
4769 0 : MixTemp = finalZoneSizing.DesCoolCoilInTemp;
4770 0 : MixHumRat = finalZoneSizing.DesCoolCoilInHumRat;
4771 : } else {
4772 4 : MixTemp = finalZoneSizing.ZoneTempAtCoolPeak;
4773 4 : MixHumRat = finalZoneSizing.ZoneHumRatAtCoolPeak;
4774 : }
4775 : } else {
4776 3 : MixTemp = finalZoneSizing.DesCoolCoilInTemp;
4777 3 : MixHumRat = finalZoneSizing.DesCoolCoilInHumRat;
4778 : }
4779 7 : SupTemp = finalZoneSizing.CoolDesTemp;
4780 7 : SupHumRat = finalZoneSizing.CoolDesHumRat;
4781 7 : TimeStepNumAtMax = finalZoneSizing.TimeStepNumAtCoolMax;
4782 7 : DDNum = finalZoneSizing.CoolDDNum;
4783 7 : if (DDNum > 0 && TimeStepNumAtMax > 0) {
4784 7 : OutTemp = state.dataSize->DesDayWeath(DDNum).Temp(TimeStepNumAtMax);
4785 : } else {
4786 0 : OutTemp = 0.0;
4787 : }
4788 7 : MixEnth = Psychrometrics::PsyHFnTdbW(MixTemp, MixHumRat);
4789 7 : SupEnth = Psychrometrics::PsyHFnTdbW(SupTemp, SupHumRat);
4790 :
4791 : // design fan heat will be added to coil load
4792 7 : Real64 FanCoolLoad = DataAirSystems::calcFanDesignHeatGain(state, state.dataSize->DataFanIndex, VolFlowRate);
4793 : // inlet/outlet temp is adjusted after enthalpy is calculcated so fan heat is not double counted
4794 7 : Real64 CpAir = Psychrometrics::PsyCpAirFnW(MixHumRat);
4795 :
4796 7 : if (state.dataSize->DataFanPlacement == HVAC::FanPlace::BlowThru) {
4797 7 : MixTemp += FanCoolLoad / (CpAir * rhoair * VolFlowRate);
4798 : } else {
4799 0 : SupTemp -= FanCoolLoad / (CpAir * rhoair * VolFlowRate);
4800 : }
4801 :
4802 7 : MixWetBulb = Psychrometrics::PsyTwbFnTdbWPb(state, MixTemp, MixHumRat, state.dataEnvrn->StdBaroPress, RoutineName);
4803 7 : if (varSpeedCoil.CondenserType == DataHeatBalance::RefrigCondenserType::Air) {
4804 5 : RatedSourceTempCool = OutTemp;
4805 : } else {
4806 2 : RatedSourceTempCool = GetVSCoilRatedSourceTemp(state, DXCoilNum);
4807 : }
4808 7 : TotCapTempModFac =
4809 7 : Curve::CurveValue(state, varSpeedCoil.MSCCapFTemp(varSpeedCoil.NormSpedLevel), MixWetBulb, RatedSourceTempCool);
4810 :
4811 : // The mixed air temp for zone equipment without an OA mixer is 0.
4812 : // This test avoids a negative capacity until a solution can be found.
4813 7 : if (MixEnth > SupEnth) {
4814 7 : CoolCapAtPeak = (rhoair * VolFlowRate * (MixEnth - SupEnth)) + FanCoolLoad;
4815 : } else {
4816 0 : CoolCapAtPeak = (rhoair * VolFlowRate * (48000.0 - SupEnth)) + FanCoolLoad;
4817 : }
4818 7 : CoolCapAtPeak = max(0.0, CoolCapAtPeak);
4819 7 : if (TotCapTempModFac > 0.0) {
4820 7 : RatedCapCoolTotalDes = CoolCapAtPeak / TotCapTempModFac;
4821 : } else {
4822 0 : RatedCapCoolTotalDes = CoolCapAtPeak;
4823 : }
4824 : } else {
4825 0 : RatedCapCoolTotalDes = 0.0;
4826 : }
4827 : }
4828 : }
4829 18 : if (RatedCapCoolTotalDes < HVAC::SmallLoad) {
4830 10 : RatedCapCoolTotalDes = 0.0;
4831 : }
4832 18 : if (!HardSizeNoDesRun) {
4833 8 : if (RatedCapCoolTotalAutoSized) {
4834 6 : varSpeedCoil.RatedCapCoolTotal = RatedCapCoolTotalDes;
4835 18 : BaseSizer::reportSizerOutput(state,
4836 12 : format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
4837 : varSpeedCoil.Name,
4838 : "Design Size Rated Total Cooling Capacity [W]",
4839 : varSpeedCoil.RatedCapCoolTotal);
4840 12 : OutputReportPredefined::PreDefTableEntry(
4841 6 : state, state.dataOutRptPredefined->pdchCoolCoilTotCap, varSpeedCoil.Name, varSpeedCoil.RatedCapCoolTotal);
4842 12 : OutputReportPredefined::PreDefTableEntry(state,
4843 6 : state.dataOutRptPredefined->pdchCoolCoilLatCap,
4844 : varSpeedCoil.Name,
4845 6 : varSpeedCoil.RatedCapCoolTotal - varSpeedCoil.RatedCapCoolSens);
4846 6 : if (varSpeedCoil.RatedCapCoolTotal != 0.0) {
4847 12 : OutputReportPredefined::PreDefTableEntry(state,
4848 6 : state.dataOutRptPredefined->pdchCoolCoilSHR,
4849 : varSpeedCoil.Name,
4850 6 : varSpeedCoil.RatedCapCoolSens / varSpeedCoil.RatedCapCoolTotal);
4851 12 : OutputReportPredefined::PreDefTableEntry(
4852 6 : state, state.dataOutRptPredefined->pdchCoolCoilNomEff, varSpeedCoil.Name, varSpeedCoil.MSRatedCOP(NormSpeed));
4853 : } else {
4854 0 : OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchCoolCoilSHR, varSpeedCoil.Name, 0.0);
4855 0 : OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchCoolCoilNomEff, varSpeedCoil.Name, 0.0);
4856 : }
4857 12 : OutputReportPredefined::addFootNoteSubTable(
4858 : state,
4859 6 : state.dataOutRptPredefined->pdstCoolCoil,
4860 : "Nominal values are gross at rated conditions, i.e., the supply air fan heat and electric power NOT accounted for.");
4861 : } else {
4862 2 : if (varSpeedCoil.RatedCapCoolTotal > 0.0 && RatedCapCoolTotalDes > 0.0) {
4863 0 : RatedCapCoolTotalUser = varSpeedCoil.RatedCapCoolTotal;
4864 0 : BaseSizer::reportSizerOutput(state,
4865 0 : format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
4866 : varSpeedCoil.Name,
4867 : "Design Size Rated Total Cooling Capacity [W]",
4868 : RatedCapCoolTotalDes,
4869 : "User-Specified Rated Total Cooling Capacity [W]",
4870 : RatedCapCoolTotalUser);
4871 0 : if (state.dataGlobal->DisplayExtraWarnings) {
4872 0 : if ((std::abs(RatedCapCoolTotalDes - RatedCapCoolTotalUser) / RatedCapCoolTotalUser) >
4873 0 : state.dataSize->AutoVsHardSizingThreshold) {
4874 0 : ShowMessage(state,
4875 0 : format("SizeVarSpeedCoil: Potential issue with equipment sizing for {} {}",
4876 0 : varSpeedCoil.CoolHeatType,
4877 : CurrentObjSubfix));
4878 0 : ShowContinueError(state, format("Coil Name = {}", varSpeedCoil.Name));
4879 0 : ShowContinueError(state, format("User-Specified Rated Total Cooling Capacity of {:.2R} [W]", RatedCapCoolTotalUser));
4880 0 : ShowContinueError(state,
4881 0 : format("differs from Design Size Rated Total Cooling Capacity of {:.2R} [W]", RatedCapCoolTotalDes));
4882 0 : ShowContinueError(state, "This may, or may not, indicate mismatched component sizes.");
4883 0 : ShowContinueError(state, "Verify that the value entered is intended and is consistent with other components.");
4884 : }
4885 : }
4886 : }
4887 : }
4888 :
4889 8 : state.dataRptCoilSelection->coilSelectionReportObj->setCoilEntAirTemp(
4890 8 : state, varSpeedCoil.Name, varSpeedCoil.VarSpeedCoilType, MixTemp, state.dataSize->CurSysNum, state.dataSize->CurZoneEqNum);
4891 8 : state.dataRptCoilSelection->coilSelectionReportObj->setCoilEntAirHumRat(
4892 8 : state, varSpeedCoil.Name, varSpeedCoil.VarSpeedCoilType, MixHumRat);
4893 8 : state.dataRptCoilSelection->coilSelectionReportObj->setCoilLvgAirTemp(state, varSpeedCoil.Name, varSpeedCoil.VarSpeedCoilType, SupTemp);
4894 8 : state.dataRptCoilSelection->coilSelectionReportObj->setCoilLvgAirHumRat(
4895 8 : state, varSpeedCoil.Name, varSpeedCoil.VarSpeedCoilType, SupHumRat);
4896 8 : state.dataRptCoilSelection->coilSelectionReportObj->setCoilAirFlow(
4897 8 : state, varSpeedCoil.Name, varSpeedCoil.VarSpeedCoilType, varSpeedCoil.RatedAirVolFlowRate, RatedAirFlowAutoSized);
4898 8 : state.dataRptCoilSelection->coilSelectionReportObj->setCoilCoolingCapacity(state,
4899 8 : varSpeedCoil.Name,
4900 8 : varSpeedCoil.VarSpeedCoilType,
4901 : RatedCapCoolTotalDes,
4902 : RatedCapCoolTotalAutoSized,
4903 8 : state.dataSize->CurSysNum,
4904 8 : state.dataSize->CurZoneEqNum,
4905 8 : state.dataSize->CurOASysNum,
4906 : 0.0, // no fan load included in sizing
4907 : TotCapTempModFac,
4908 : -999.0,
4909 : -999.0); // VS model doesn't limit, double check
4910 : }
4911 :
4912 : // Set the global DX cooling coil capacity variable for use by other objects
4913 18 : if (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit ||
4914 16 : varSpeedCoil.VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
4915 13 : state.dataSize->DXCoolCap = varSpeedCoil.RatedCapCoolTotal;
4916 : }
4917 :
4918 : // size rated heating capacity
4919 18 : if (varSpeedCoil.RatedCapHeat == DataSizing::AutoSize && (varSpeedCoil.VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit ||
4920 16 : varSpeedCoil.VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed)) {
4921 4 : RatedCapHeatAutoSized = true;
4922 : }
4923 : // simply set heating capacity equal to the cooling capacity
4924 : // VarSpeedCoil(DXCoilNum)%RatedCapHeat = DXCoolCap
4925 18 : if (varSpeedCoil.VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit ||
4926 17 : varSpeedCoil.VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
4927 5 : if (varSpeedCoil.CompanionCoolingCoilNum > 0) {
4928 1 : RatedCapHeatDes = state.dataVariableSpeedCoils->VarSpeedCoil(varSpeedCoil.CompanionCoolingCoilNum).RatedCapCoolTotal;
4929 1 : varSpeedCoil.RatedCapCoolTotal = RatedCapHeatDes; // AVOID BEING ZERO
4930 : } else {
4931 4 : RatedCapHeatDes = state.dataSize->DXCoolCap; // previous code, can be risky
4932 : }
4933 : // END IF
4934 5 : if (RatedCapHeatAutoSized) {
4935 4 : if (RatedCapHeatDes == DataSizing::AutoSize) {
4936 0 : ShowWarningError(
4937 0 : state, format("COIL:{}:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT \"{}\"", varSpeedCoil.CoolHeatType, varSpeedCoil.Name));
4938 0 : ShowContinueError(state,
4939 0 : format("{}: Heating coil could not be autosized since cooling coil was not previously sized.", RoutineName));
4940 0 : ShowContinueError(state, "... Cooling coil must be upstream of heating coil.");
4941 0 : ShowContinueError(state, "... Manually sizing this heating coil will be required.");
4942 : }
4943 : }
4944 5 : if (RatedCapHeatDes < HVAC::SmallLoad) {
4945 1 : RatedCapHeatDes = 0.0;
4946 : }
4947 5 : state.dataRptCoilSelection->coilSelectionReportObj->setCoilHeatingCapacity(state,
4948 5 : varSpeedCoil.Name,
4949 5 : varSpeedCoil.VarSpeedCoilType,
4950 : RatedCapHeatDes,
4951 : RatedCapHeatAutoSized,
4952 5 : state.dataSize->CurSysNum,
4953 5 : state.dataSize->CurZoneEqNum,
4954 5 : state.dataSize->CurOASysNum,
4955 : 0.0,
4956 : 1.0,
4957 : -999.0,
4958 : -999.0);
4959 : }
4960 18 : if (RatedCapHeatAutoSized) {
4961 4 : varSpeedCoil.RatedCapHeat = RatedCapHeatDes;
4962 12 : BaseSizer::reportSizerOutput(state,
4963 8 : format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
4964 : varSpeedCoil.Name,
4965 : "Design Size Nominal Heating Capacity [W]",
4966 : RatedCapHeatDes);
4967 8 : OutputReportPredefined::PreDefTableEntry(
4968 4 : state, state.dataOutRptPredefined->pdchHeatCoilNomCap, varSpeedCoil.Name, varSpeedCoil.RatedCapHeat);
4969 4 : if (varSpeedCoil.RatedCapHeat != 0.0) {
4970 8 : OutputReportPredefined::PreDefTableEntry(
4971 4 : state, state.dataOutRptPredefined->pdchHeatCoilNomEff, varSpeedCoil.Name, varSpeedCoil.MSRatedCOP(NormSpeed));
4972 : } else {
4973 0 : OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchHeatCoilNomEff, varSpeedCoil.Name, 0.0);
4974 : }
4975 8 : OutputReportPredefined::addFootNoteSubTable(
4976 : state,
4977 4 : state.dataOutRptPredefined->pdstHeatCoil,
4978 : "Nominal values are gross at rated conditions, i.e., the supply air fan heat and electric power NOT accounted for.");
4979 : } else {
4980 14 : if (varSpeedCoil.RatedCapHeat > 0.0 && RatedCapHeatDes > 0.0) {
4981 0 : RatedCapHeatUser = varSpeedCoil.RatedCapHeat;
4982 0 : BaseSizer::reportSizerOutput(state,
4983 0 : format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
4984 : varSpeedCoil.Name,
4985 : "Design Size Nominal Heating Capacity [W]",
4986 : RatedCapHeatDes,
4987 : "User-Specified Nominal Heating Capacity [W]",
4988 : RatedCapHeatUser);
4989 0 : if (state.dataGlobal->DisplayExtraWarnings) {
4990 0 : if ((std::abs(RatedCapHeatDes - RatedCapHeatUser) / RatedCapHeatUser) > state.dataSize->AutoVsHardSizingThreshold) {
4991 0 : ShowMessage(
4992 : state,
4993 0 : format("SizeVarSpeedCoil: Potential issue with equipment sizing for {} {}", varSpeedCoil.CoolHeatType, CurrentObjSubfix));
4994 0 : ShowContinueError(state, format("Coil Name = {}", varSpeedCoil.Name));
4995 0 : ShowContinueError(state, format("User-Specified Rated Total Heating Capacity of {:.2R} [W]", RatedCapHeatUser));
4996 0 : ShowContinueError(state, format("differs from Design Size Rated Total Heating Capacity of {:.2R} [W]", RatedCapHeatDes));
4997 0 : ShowContinueError(state, "This may, or may not, indicate mismatched component sizes.");
4998 0 : ShowContinueError(state, "Verify that the value entered is intended and is consistent with other components.");
4999 : }
5000 : }
5001 : }
5002 : }
5003 :
5004 : // FORCE BACK TO THE RATED AIR FLOW RATE WITH THE SAME RATIO DEFINED BY THE CATALOG DATA
5005 18 : if (!HardSizeNoDesRunAirFlow) {
5006 13 : if ((RatedCapCoolTotalAutoSized) && (RatedAirFlowAutoSized)) {
5007 6 : RatedAirVolFlowRateDes = varSpeedCoil.RatedCapCoolTotal * varSpeedCoil.MSRatedAirVolFlowPerRatedTotCap(NormSpeed);
5008 7 : } else if ((RatedCapHeatAutoSized) && (RatedAirFlowAutoSized)) {
5009 2 : RatedAirVolFlowRateDes = varSpeedCoil.RatedCapHeat * varSpeedCoil.MSRatedAirVolFlowPerRatedTotCap(NormSpeed);
5010 : }
5011 :
5012 : // write the air flow sizing output
5013 13 : if (RatedAirFlowAutoSized) {
5014 8 : varSpeedCoil.RatedAirVolFlowRate = RatedAirVolFlowRateDes;
5015 24 : BaseSizer::reportSizerOutput(state,
5016 16 : format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
5017 : varSpeedCoil.Name,
5018 : "Design Size Rated Air Flow Rate [m3/s]",
5019 : RatedAirVolFlowRateDes);
5020 : } else {
5021 5 : if (varSpeedCoil.RatedAirVolFlowRate > 0.0 && RatedAirVolFlowRateDes > 0.0) {
5022 0 : RatedAirVolFlowRateUser = varSpeedCoil.RatedAirVolFlowRate;
5023 0 : BaseSizer::reportSizerOutput(state,
5024 0 : format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
5025 : varSpeedCoil.Name,
5026 : "Design Size Rated Air Flow Rate [m3/s]",
5027 : RatedAirVolFlowRateDes,
5028 : "User-Specified Rated Air Flow Rate [m3/s]",
5029 : RatedAirVolFlowRateUser);
5030 0 : if (state.dataGlobal->DisplayExtraWarnings) {
5031 0 : if ((std::abs(RatedAirVolFlowRateDes - RatedAirVolFlowRateUser) / RatedAirVolFlowRateUser) >
5032 0 : state.dataSize->AutoVsHardSizingThreshold) {
5033 0 : ShowMessage(state,
5034 0 : format("SizeVarSpeedCoil: Potential issue with equipment sizing for {} {}",
5035 0 : varSpeedCoil.CoolHeatType,
5036 : CurrentObjSubfix));
5037 0 : ShowContinueError(state, format("Coil Name = {}", varSpeedCoil.Name));
5038 0 : ShowContinueError(state, format("User-Specified Rated Air Flow Rate of {:.5R} [m3/s]", RatedAirVolFlowRateUser));
5039 0 : ShowContinueError(state, format("differs from Design Size Rated Air Flow Rate of {:.5R} [m3/s]", RatedAirVolFlowRateDes));
5040 0 : ShowContinueError(state, "This may, or may not, indicate mismatched component sizes.");
5041 0 : ShowContinueError(state, "Verify that the value entered is intended and is consistent with other components.");
5042 : }
5043 : }
5044 : }
5045 : }
5046 13 : state.dataRptCoilSelection->coilSelectionReportObj->setCoilAirFlow(
5047 13 : state, varSpeedCoil.Name, varSpeedCoil.VarSpeedCoilType, RatedAirVolFlowRateDes, RatedAirFlowAutoSized);
5048 : }
5049 :
5050 : // Check that heat pump heating capacity is within 20% of cooling capacity. Check only for heating coil and report both.
5051 18 : if ((varSpeedCoil.VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit ||
5052 17 : varSpeedCoil.VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) &&
5053 5 : varSpeedCoil.CompanionCoolingCoilNum > 0) {
5054 :
5055 1 : if (state.dataVariableSpeedCoils->VarSpeedCoil(varSpeedCoil.CompanionCoolingCoilNum).RatedCapCoolTotal > 0.0) {
5056 :
5057 1 : if (std::abs(state.dataVariableSpeedCoils->VarSpeedCoil(varSpeedCoil.CompanionCoolingCoilNum).RatedCapCoolTotal -
5058 1 : varSpeedCoil.RatedCapHeat) /
5059 1 : state.dataVariableSpeedCoils->VarSpeedCoil(varSpeedCoil.CompanionCoolingCoilNum).RatedCapCoolTotal >
5060 : 0.2) {
5061 :
5062 0 : ShowWarningError(
5063 0 : state, format("COIL:{}:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT \"{}\"", varSpeedCoil.CoolHeatType, varSpeedCoil.Name));
5064 0 : ShowContinueError(state,
5065 0 : format("...used with COIL:{}:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT \"{}\"",
5066 0 : state.dataVariableSpeedCoils->VarSpeedCoil(varSpeedCoil.CompanionCoolingCoilNum).CoolHeatType,
5067 0 : state.dataVariableSpeedCoils->VarSpeedCoil(varSpeedCoil.CompanionCoolingCoilNum).Name));
5068 0 : ShowContinueError(state, "...heating capacity is disproportionate (> 20% different) to total cooling capacity");
5069 0 : ShowContinueError(state, format("...heating capacity = {:.3T} W", varSpeedCoil.RatedCapHeat));
5070 0 : ShowContinueError(state,
5071 0 : format("...cooling capacity = {:.3T} W",
5072 0 : state.dataVariableSpeedCoils->VarSpeedCoil(varSpeedCoil.CompanionCoolingCoilNum).RatedCapCoolTotal));
5073 : }
5074 : }
5075 : }
5076 :
5077 : // ASSIGN CAPACITY
5078 18 : switch (varSpeedCoil.VSCoilType) {
5079 13 : case HVAC::Coil_CoolingWaterToAirHPVSEquationFit:
5080 : case HVAC::Coil_CoolingAirToAirVariableSpeed: {
5081 13 : varSpeedCoil.MSRatedTotCap(UpperSpeed) = varSpeedCoil.RatedCapCoolTotal / varSpeedCoil.MSRatedPercentTotCap(NormSpeed);
5082 13 : } break;
5083 5 : case HVAC::Coil_HeatingWaterToAirHPVSEquationFit:
5084 : case HVAC::Coil_HeatingAirToAirVariableSpeed: {
5085 5 : varSpeedCoil.MSRatedTotCap(UpperSpeed) = varSpeedCoil.RatedCapHeat / varSpeedCoil.MSRatedPercentTotCap(NormSpeed);
5086 5 : } break;
5087 0 : case HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed: {
5088 0 : varSpeedCoil.MSRatedTotCap(UpperSpeed) = varSpeedCoil.RatedCapWH / varSpeedCoil.MSRatedPercentTotCap(NormSpeed);
5089 0 : } break;
5090 : }
5091 :
5092 18 : if (varSpeedCoil.VSCoilType == HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed) {
5093 0 : HPInletAirHumRat = Psychrometrics::PsyWFnTdbTwbPb(
5094 0 : state, varSpeedCoil.WHRatedInletDBTemp, varSpeedCoil.WHRatedInletWBTemp, state.dataEnvrn->StdBaroPress, RoutineName);
5095 :
5096 0 : for (Mode = varSpeedCoil.NumOfSpeeds; Mode >= 1; --Mode) {
5097 0 : varSpeedCoil.MSRatedTotCap(Mode) = varSpeedCoil.MSRatedTotCap(UpperSpeed) * varSpeedCoil.MSRatedPercentTotCap(Mode);
5098 0 : varSpeedCoil.MSRatedAirVolFlowRate(Mode) = varSpeedCoil.MSRatedTotCap(Mode) * varSpeedCoil.MSRatedAirVolFlowPerRatedTotCap(Mode);
5099 0 : varSpeedCoil.MSRatedAirMassFlowRate(Mode) = varSpeedCoil.MSRatedAirVolFlowRate(Mode) * rhoair;
5100 : // EVAPORATIVE PRECOOLING CONDENSER AIR FLOW RATE
5101 0 : varSpeedCoil.EvapCondAirFlow(Mode) = 0.0;
5102 : }
5103 : } else {
5104 : // HPWH, the mass flow rate will be updated by a revised entering air density
5105 :
5106 18 : if (varSpeedCoil.MSHPDesignSpecIndex > -1 && state.dataUnitarySystems->designSpecMSHP.size() > 0) {
5107 3 : if (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit ||
5108 3 : varSpeedCoil.VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
5109 2 : if (state.dataUnitarySystems->designSpecMSHP[varSpeedCoil.MSHPDesignSpecIndex].numOfSpeedCooling != varSpeedCoil.NumOfSpeeds) {
5110 0 : ShowFatalError(state,
5111 0 : format("COIL:{} = {}{} number of speeds not equal to number of speed specified in "
5112 : "UnitarySystemPerformance:Multispeed object.",
5113 0 : varSpeedCoil.CoolHeatType,
5114 : CurrentObjSubfix,
5115 0 : varSpeedCoil.Name));
5116 : } else {
5117 11 : for (Mode = varSpeedCoil.NumOfSpeeds; Mode >= 1; --Mode) {
5118 20 : varSpeedCoil.MSRatedAirVolFlowRate(Mode) =
5119 10 : varSpeedCoil.RatedAirVolFlowRate *
5120 10 : state.dataUnitarySystems->designSpecMSHP[varSpeedCoil.MSHPDesignSpecIndex].coolingVolFlowRatio[Mode - 1];
5121 20 : varSpeedCoil.MSRatedTotCap(Mode) =
5122 10 : varSpeedCoil.MSRatedAirVolFlowRate(Mode) / varSpeedCoil.MSRatedAirVolFlowPerRatedTotCap(Mode);
5123 10 : varSpeedCoil.MSRatedAirMassFlowRate(Mode) = varSpeedCoil.MSRatedAirVolFlowRate(Mode) * rhoair;
5124 : // EVAPORATIVE PRECOOLING CONDENSER AIR FLOW RATE
5125 10 : varSpeedCoil.EvapCondAirFlow(Mode) =
5126 10 : varSpeedCoil.MSRatedTotCap(Mode) * varSpeedCoil.MSRatedEvapCondVolFlowPerRatedTotCap(Mode);
5127 : }
5128 : }
5129 2 : } else if (varSpeedCoil.VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit ||
5130 2 : varSpeedCoil.VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
5131 2 : if (state.dataUnitarySystems->designSpecMSHP[varSpeedCoil.MSHPDesignSpecIndex].numOfSpeedHeating != varSpeedCoil.NumOfSpeeds) {
5132 0 : ShowFatalError(state,
5133 0 : format("COIL:{}{} = \"{}\" number of speeds not equal to number of speed specified in "
5134 : "UnitarySystemPerformance:Multispeed object.",
5135 0 : varSpeedCoil.CoolHeatType,
5136 : CurrentObjSubfix,
5137 0 : varSpeedCoil.Name));
5138 : } else {
5139 22 : for (Mode = varSpeedCoil.NumOfSpeeds; Mode >= 1; --Mode) {
5140 40 : varSpeedCoil.MSRatedAirVolFlowRate(Mode) =
5141 20 : varSpeedCoil.RatedAirVolFlowRate *
5142 20 : state.dataUnitarySystems->designSpecMSHP[varSpeedCoil.MSHPDesignSpecIndex].heatingVolFlowRatio[Mode - 1];
5143 40 : varSpeedCoil.MSRatedTotCap(Mode) =
5144 20 : varSpeedCoil.MSRatedAirVolFlowRate(Mode) / varSpeedCoil.MSRatedAirVolFlowPerRatedTotCap(Mode);
5145 20 : varSpeedCoil.MSRatedAirMassFlowRate(Mode) = varSpeedCoil.MSRatedAirVolFlowRate(Mode) * rhoair;
5146 : // EVAPORATIVE PRECOOLING CONDENSER AIR FLOW RATE
5147 20 : varSpeedCoil.EvapCondAirFlow(Mode) =
5148 20 : varSpeedCoil.MSRatedTotCap(Mode) * varSpeedCoil.MSRatedEvapCondVolFlowPerRatedTotCap(Mode);
5149 : }
5150 : }
5151 : }
5152 : } else {
5153 108 : for (Mode = varSpeedCoil.NumOfSpeeds; Mode >= 1; --Mode) {
5154 93 : varSpeedCoil.MSRatedTotCap(Mode) = varSpeedCoil.MSRatedTotCap(UpperSpeed) * varSpeedCoil.MSRatedPercentTotCap(Mode);
5155 93 : varSpeedCoil.MSRatedAirVolFlowRate(Mode) = varSpeedCoil.MSRatedTotCap(Mode) * varSpeedCoil.MSRatedAirVolFlowPerRatedTotCap(Mode);
5156 93 : varSpeedCoil.MSRatedAirMassFlowRate(Mode) = varSpeedCoil.MSRatedAirVolFlowRate(Mode) * rhoair;
5157 : // EVAPORATIVE PRECOOLING CONDENSER AIR FLOW RATE
5158 93 : varSpeedCoil.EvapCondAirFlow(Mode) = varSpeedCoil.MSRatedTotCap(Mode) * varSpeedCoil.MSRatedEvapCondVolFlowPerRatedTotCap(Mode);
5159 : }
5160 : }
5161 : }
5162 :
5163 : // size rated power
5164 18 : switch (varSpeedCoil.VSCoilType) {
5165 13 : case HVAC::Coil_CoolingWaterToAirHPVSEquationFit:
5166 : case HVAC::Coil_CoolingAirToAirVariableSpeed: {
5167 13 : varSpeedCoil.RatedCOPCool = varSpeedCoil.MSRatedCOP(varSpeedCoil.NormSpedLevel);
5168 13 : varSpeedCoil.RatedPowerCool = varSpeedCoil.RatedCapCoolTotal / varSpeedCoil.RatedCOPCool;
5169 13 : } break;
5170 5 : case HVAC::Coil_HeatingWaterToAirHPVSEquationFit:
5171 : case HVAC::Coil_HeatingAirToAirVariableSpeed: {
5172 5 : varSpeedCoil.RatedCOPHeat = varSpeedCoil.MSRatedCOP(varSpeedCoil.NormSpedLevel);
5173 5 : varSpeedCoil.RatedPowerHeat = varSpeedCoil.RatedCapHeat / varSpeedCoil.RatedCOPHeat;
5174 5 : varSpeedCoil.RatedCapCoolTotal = varSpeedCoil.RatedCapHeat;
5175 5 : } break;
5176 0 : case HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed: {
5177 0 : varSpeedCoil.RatedCOPHeat = varSpeedCoil.MSRatedCOP(varSpeedCoil.NormSpedLevel);
5178 0 : varSpeedCoil.RatedPowerHeat = varSpeedCoil.RatedCapWH / varSpeedCoil.RatedCOPHeat;
5179 0 : varSpeedCoil.RatedCapCoolTotal = varSpeedCoil.RatedCapWH * (1.0 - 1.0 / varSpeedCoil.RatedCOPHeat);
5180 0 : } break;
5181 : }
5182 :
5183 : // Size water volumetric flow rate
5184 18 : if ((varSpeedCoil.RatedWaterVolFlowRate == DataSizing::AutoSize) &&
5185 18 : (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit ||
5186 16 : varSpeedCoil.VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit)) {
5187 3 : RatedWaterFlowAutoSized = true;
5188 : }
5189 :
5190 : // WSHP condenser can be on either a plant loop or condenser loop. Test each to find plant sizing number.
5191 : // first check to see if coil is connected to a plant loop, no warning on this CALL
5192 18 : if (RatedWaterFlowAutoSized) {
5193 3 : if (varSpeedCoil.CondenserType == DataHeatBalance::RefrigCondenserType::Water)
5194 6 : PltSizNum = PlantUtilities::MyPlantSizingIndex(state,
5195 6 : format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
5196 : varSpeedCoil.Name,
5197 : varSpeedCoil.WaterInletNodeNum,
5198 : varSpeedCoil.WaterOutletNodeNum,
5199 : ErrorsFound,
5200 : false);
5201 :
5202 3 : if (PltSizNum > 0) {
5203 3 : rho = state.dataPlnt->PlantLoop(varSpeedCoil.plantLoc.loopNum)
5204 3 : .glycol->getDensity(state, state.dataSize->PlantSizData(PltSizNum).ExitTemp, RoutineNameAlt);
5205 3 : cp = state.dataPlnt->PlantLoop(varSpeedCoil.plantLoc.loopNum)
5206 3 : .glycol->getSpecificHeat(state, state.dataSize->PlantSizData(PltSizNum).ExitTemp, RoutineNameAlt);
5207 :
5208 3 : if (varSpeedCoil.VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit ||
5209 2 : varSpeedCoil.VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
5210 :
5211 1 : RatedWaterVolFlowRateDes = varSpeedCoil.RatedCapHeat / (state.dataSize->PlantSizData(PltSizNum).DeltaT * cp * rho);
5212 :
5213 1 : state.dataRptCoilSelection->coilSelectionReportObj->setCoilLvgWaterTemp(
5214 : state,
5215 1 : varSpeedCoil.Name,
5216 1 : varSpeedCoil.VarSpeedCoilType,
5217 1 : state.dataSize->PlantSizData(PltSizNum).ExitTemp +
5218 1 : state.dataSize->PlantSizData(PltSizNum).DeltaT); // TRACE 3D Plus coil selection report
5219 :
5220 2 : } else if (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit ||
5221 0 : varSpeedCoil.VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
5222 :
5223 : // use companion heating coil capacity to calculate volumetric flow rate
5224 2 : if (varSpeedCoil.CompanionCoolingCoilNum > 0) {
5225 0 : SystemCapacity = state.dataVariableSpeedCoils->VarSpeedCoil(varSpeedCoil.CompanionCoolingCoilNum).RatedCapHeat;
5226 : } else {
5227 2 : SystemCapacity = varSpeedCoil.RatedCapCoolTotal;
5228 : }
5229 :
5230 2 : RatedWaterVolFlowRateDes = SystemCapacity / (state.dataSize->PlantSizData(PltSizNum).DeltaT * cp * rho);
5231 :
5232 2 : state.dataRptCoilSelection->coilSelectionReportObj->setCoilLvgWaterTemp(
5233 : state,
5234 2 : varSpeedCoil.Name,
5235 2 : varSpeedCoil.VarSpeedCoilType,
5236 2 : state.dataSize->PlantSizData(PltSizNum).ExitTemp -
5237 2 : state.dataSize->PlantSizData(PltSizNum).DeltaT); // TRACE 3D Plus coil selection report
5238 : }
5239 :
5240 3 : state.dataRptCoilSelection->coilSelectionReportObj->setCoilEntWaterTemp(
5241 : state,
5242 3 : varSpeedCoil.Name,
5243 3 : varSpeedCoil.VarSpeedCoilType,
5244 3 : state.dataSize->PlantSizData(PltSizNum).ExitTemp); // TRACE 3D Plus coil selection report
5245 :
5246 3 : state.dataRptCoilSelection->coilSelectionReportObj->setCoilWaterDeltaT(
5247 : state,
5248 3 : varSpeedCoil.Name,
5249 3 : varSpeedCoil.VarSpeedCoilType,
5250 3 : state.dataSize->PlantSizData(PltSizNum).DeltaT); // TRACE 3D Plus coil selection report
5251 : } else {
5252 0 : ShowSevereError(state, "Autosizing of water flow requires a loop Sizing:Plant object");
5253 0 : ShowContinueError(state, "Autosizing also requires physical connection to a plant or condenser loop.");
5254 0 : ShowContinueError(state, format("Occurs in COIL:{}{} Object = {}", varSpeedCoil.CoolHeatType, CurrentObjSubfix, varSpeedCoil.Name));
5255 0 : ErrorsFound = true;
5256 : }
5257 :
5258 : // WRITE THE WATER SIZING OUTPUT
5259 : // FORCE BACK TO THE RATED WATER FLOW RATE WITH THE SAME RATIO DEFINED BY THE CATLOG DATA
5260 3 : if (RatedCapCoolTotalAutoSized) {
5261 2 : RatedWaterVolFlowRateDes = varSpeedCoil.RatedCapCoolTotal * varSpeedCoil.MSRatedWaterVolFlowPerRatedTotCap(NormSpeed);
5262 1 : } else if (RatedCapHeatAutoSized) {
5263 1 : RatedWaterVolFlowRateDes = varSpeedCoil.RatedCapHeat * varSpeedCoil.MSRatedWaterVolFlowPerRatedTotCap(NormSpeed);
5264 : }
5265 3 : state.dataRptCoilSelection->coilSelectionReportObj->setCoilWaterFlowNodeNums(state,
5266 3 : varSpeedCoil.Name,
5267 3 : varSpeedCoil.VarSpeedCoilType,
5268 : RatedWaterVolFlowRateDes,
5269 : RatedWaterFlowAutoSized,
5270 : varSpeedCoil.WaterInletNodeNum,
5271 : varSpeedCoil.WaterOutletNodeNum,
5272 : varSpeedCoil.plantLoc.loopNum);
5273 3 : varSpeedCoil.RatedWaterVolFlowRate = RatedWaterVolFlowRateDes;
5274 9 : BaseSizer::reportSizerOutput(state,
5275 6 : format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
5276 : varSpeedCoil.Name,
5277 : "Design Size Rated Water Flow Rate [m3/s]",
5278 : RatedWaterVolFlowRateDes);
5279 : // Ensure water flow rate at lower speed must be lower or
5280 : // equal to the flow rate at higher speed. Otherwise, a severe error is isssued.
5281 30 : for (Mode = 1; Mode <= varSpeedCoil.NumOfSpeeds - 1; ++Mode) {
5282 27 : if (varSpeedCoil.MSRatedWaterVolFlowRate(Mode) > varSpeedCoil.MSRatedWaterVolFlowRate(Mode + 1) * 1.05) {
5283 0 : ShowWarningError(
5284 : state,
5285 0 : format("SizeDXCoil: {} {}, Speed {} Rated Air Flow Rate must be less than or equal to Speed {} Rated Air Flow Rate.",
5286 0 : varSpeedCoil.VarSpeedCoilType,
5287 0 : varSpeedCoil.Name,
5288 : Mode,
5289 0 : Mode + 1));
5290 0 : ShowContinueError(
5291 : state,
5292 0 : format("Instead, {:.2R} > {:.2R}", varSpeedCoil.MSRatedAirVolFlowRate(Mode), varSpeedCoil.MSRatedAirVolFlowRate(Mode + 1)));
5293 0 : ShowFatalError(state, "Preceding conditions cause termination.");
5294 : }
5295 : }
5296 : } else {
5297 15 : if (varSpeedCoil.RatedWaterVolFlowRate > 0.0 && RatedWaterVolFlowRateDes > 0.0) {
5298 0 : RatedWaterVolFlowRateUser = varSpeedCoil.RatedWaterVolFlowRate;
5299 0 : BaseSizer::reportSizerOutput(state,
5300 0 : format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
5301 : varSpeedCoil.Name,
5302 : "Design Size Rated Water Flow Rate [m3/s]",
5303 : RatedWaterVolFlowRateDes,
5304 : "User-Specified Rated Water Flow Rate [m3/s]",
5305 : RatedWaterVolFlowRateUser);
5306 0 : if (state.dataGlobal->DisplayExtraWarnings) {
5307 0 : if ((std::abs(RatedWaterVolFlowRateDes - RatedWaterVolFlowRateUser) / RatedWaterVolFlowRateUser) >
5308 0 : state.dataSize->AutoVsHardSizingThreshold) {
5309 0 : ShowMessage(
5310 : state,
5311 0 : format("SizeVarSpeedCoil: Potential issue with equipment sizing for {} {}", varSpeedCoil.CoolHeatType, CurrentObjSubfix));
5312 0 : ShowContinueError(state, format("Coil Name = {}", varSpeedCoil.Name));
5313 0 : ShowContinueError(state, format("User-Specified Rated Water Flow Rate of {:.5R} [m3/s]", RatedWaterVolFlowRateUser));
5314 0 : ShowContinueError(state, format("differs from Design Size Rated Water Flow Rate of {:.5R} [m3/s]", RatedWaterVolFlowRateDes));
5315 0 : ShowContinueError(state, "This may, or may not, indicate mismatched component sizes.");
5316 0 : ShowContinueError(state, "Verify that the value entered is intended and is consistent with other components.");
5317 : }
5318 : }
5319 : }
5320 : }
5321 :
5322 : // Save component design water volumetric flow rate.
5323 18 : if (varSpeedCoil.RatedWaterVolFlowRate > 0.0 && varSpeedCoil.VSCoilType == HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed) {
5324 0 : PlantUtilities::RegisterPlantCompDesignFlow(state, varSpeedCoil.WaterInletNodeNum, varSpeedCoil.RatedWaterVolFlowRate);
5325 : }
5326 : // Use 1/2 flow since both cooling and heating coil will save flow yet only 1 will operate at a time
5327 18 : else if (varSpeedCoil.RatedWaterVolFlowRate > 0.0) {
5328 3 : PlantUtilities::RegisterPlantCompDesignFlow(state, varSpeedCoil.WaterInletNodeNum, 0.5 * varSpeedCoil.RatedWaterVolFlowRate);
5329 : }
5330 :
5331 18 : RatedSourceTempCool = GetVSCoilRatedSourceTemp(state, DXCoilNum);
5332 18 : if (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit ||
5333 16 : varSpeedCoil.VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit) {
5334 :
5335 3 : if (PltSizNum > 0) {
5336 3 : rhoW = rho;
5337 : } else {
5338 0 : rhoW = state.dataPlnt->PlantLoop(varSpeedCoil.plantLoc.loopNum).glycol->getDensity(state, RatedSourceTempCool, RoutineName);
5339 : }
5340 :
5341 3 : varSpeedCoil.RatedWaterMassFlowRate = varSpeedCoil.RatedWaterVolFlowRate * rhoW;
5342 33 : for (Mode = varSpeedCoil.NumOfSpeeds; Mode >= 1; --Mode) {
5343 30 : varSpeedCoil.MSRatedWaterVolFlowRate(Mode) = varSpeedCoil.MSRatedTotCap(Mode) * varSpeedCoil.MSRatedWaterVolFlowPerRatedTotCap(Mode);
5344 30 : varSpeedCoil.MSRatedWaterMassFlowRate(Mode) = varSpeedCoil.MSRatedWaterVolFlowRate(Mode) * rhoW;
5345 : }
5346 15 : } else if (varSpeedCoil.VSCoilType == HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed) {
5347 0 : rhoW = Psychrometrics::RhoH2O(RatedSourceTempCool);
5348 0 : varSpeedCoil.RatedWaterMassFlowRate = varSpeedCoil.RatedWaterVolFlowRate * rhoW;
5349 0 : for (Mode = varSpeedCoil.NumOfSpeeds; Mode >= 1; --Mode) {
5350 0 : varSpeedCoil.MSRatedWaterVolFlowRate(Mode) = varSpeedCoil.MSRatedTotCap(Mode) * varSpeedCoil.MSRatedWaterVolFlowPerRatedTotCap(Mode);
5351 0 : varSpeedCoil.MSWHPumpPower(Mode) = varSpeedCoil.MSRatedTotCap(Mode) * varSpeedCoil.MSWHPumpPowerPerRatedTotCap(Mode);
5352 0 : varSpeedCoil.MSRatedWaterMassFlowRate(Mode) = varSpeedCoil.MSRatedWaterVolFlowRate(Mode) * rhoW;
5353 : }
5354 : }
5355 :
5356 : // Ensure air flow rate at lower speed must be lower or
5357 : // equal to the flow rate at higher speed. Otherwise, a severe error is issued.
5358 123 : for (Mode = 1; Mode <= varSpeedCoil.NumOfSpeeds - 1; ++Mode) {
5359 105 : if (varSpeedCoil.MSRatedAirVolFlowRate(Mode) > varSpeedCoil.MSRatedAirVolFlowRate(Mode + 1)) {
5360 0 : ShowWarningError(state,
5361 0 : format("SizeDXCoil: {} {}, Speed {} Rated Air Flow Rate must be less than or equal to Speed {} Rated Air Flow Rate.",
5362 0 : varSpeedCoil.VarSpeedCoilType,
5363 0 : varSpeedCoil.Name,
5364 : Mode,
5365 0 : Mode + 1));
5366 0 : ShowContinueError(
5367 : state,
5368 0 : format("Instead, {:.2R} > {:.2R}", varSpeedCoil.MSRatedAirVolFlowRate(Mode), varSpeedCoil.MSRatedAirVolFlowRate(Mode + 1)));
5369 0 : ShowFatalError(state, "Preceding conditions cause termination.");
5370 : }
5371 : }
5372 :
5373 : // Ensure capacity at lower speed must be lower or equal to the capacity at higher speed.
5374 123 : for (Mode = 1; Mode <= varSpeedCoil.NumOfSpeeds - 1; ++Mode) {
5375 105 : if (varSpeedCoil.MSRatedTotCap(Mode) > varSpeedCoil.MSRatedTotCap(Mode + 1)) {
5376 0 : ShowWarningError(state,
5377 0 : format("SizeDXCoil: {} {}, Speed {} Rated Total Cooling Capacity must be less than or equal to Speed {} Rated Total "
5378 : "Cooling Capacity.",
5379 0 : varSpeedCoil.VarSpeedCoilType,
5380 0 : varSpeedCoil.Name,
5381 : Mode,
5382 0 : Mode + 1));
5383 0 : ShowContinueError(state, format("Instead, {:.2R} > {:.2R}", varSpeedCoil.MSRatedTotCap(Mode), varSpeedCoil.MSRatedTotCap(Mode + 1)));
5384 0 : ShowFatalError(state, "Preceding conditions cause termination.");
5385 : }
5386 : }
5387 :
5388 : // convert SHR to rated Bypass factor and effective air side surface area
5389 18 : if (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit ||
5390 16 : varSpeedCoil.VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
5391 91 : for (Mode = 1; Mode <= varSpeedCoil.NumOfSpeeds; ++Mode) {
5392 78 : varSpeedCoil.MSRatedCBF(Mode) = DXCoils::CalcCBF(state,
5393 78 : varSpeedCoil.VarSpeedCoilType,
5394 78 : varSpeedCoil.Name,
5395 : RatedInletAirTemp,
5396 : RatedInletAirHumRat,
5397 78 : varSpeedCoil.MSRatedTotCap(Mode),
5398 78 : varSpeedCoil.MSRatedAirVolFlowRate(Mode),
5399 78 : varSpeedCoil.MSRatedSHR(Mode),
5400 : true);
5401 78 : if (varSpeedCoil.MSRatedCBF(Mode) > 0.0) {
5402 73 : varSpeedCoil.MSEffectiveAo(Mode) = -std::log(varSpeedCoil.MSRatedCBF(Mode)) * varSpeedCoil.MSRatedAirMassFlowRate(Mode);
5403 : } else {
5404 5 : varSpeedCoil.MSEffectiveAo(Mode) = 0.0;
5405 : }
5406 : }
5407 5 : } else if (varSpeedCoil.VSCoilType == HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed) {
5408 0 : state.dataHVACGlobal->HPWHInletDBTemp = varSpeedCoil.WHRatedInletDBTemp;
5409 0 : state.dataHVACGlobal->HPWHInletWBTemp = varSpeedCoil.WHRatedInletWBTemp;
5410 :
5411 0 : for (Mode = 1; Mode <= varSpeedCoil.NumOfSpeeds; ++Mode) {
5412 0 : varSpeedCoil.MSRatedAirMassFlowRate(Mode) = varSpeedCoil.MSRatedAirVolFlowRate(Mode) * rhoair;
5413 : }
5414 :
5415 0 : for (Mode = 1; Mode <= varSpeedCoil.NumOfSpeeds; ++Mode) {
5416 : // get cooling capacity, without fan power, i.e. total coil cooling
5417 0 : if (varSpeedCoil.CondPumpPowerInCOP)
5418 0 : HPWHCoolCapacity = varSpeedCoil.MSRatedTotCap(Mode) * (1.0 - 1.0 / varSpeedCoil.MSRatedCOP(Mode)) +
5419 0 : varSpeedCoil.MSWHPumpPower(Mode) - varSpeedCoil.MSWHPumpPower(Mode) * varSpeedCoil.HPWHCondPumpFracToWater;
5420 : else
5421 0 : HPWHCoolCapacity = varSpeedCoil.MSRatedTotCap(Mode) * (1.0 - 1.0 / varSpeedCoil.MSRatedCOP(Mode)) -
5422 0 : varSpeedCoil.MSWHPumpPower(Mode) * varSpeedCoil.HPWHCondPumpFracToWater;
5423 :
5424 0 : varSpeedCoil.MSRatedCBF(Mode) = DXCoils::CalcCBF(state,
5425 0 : varSpeedCoil.VarSpeedCoilType,
5426 0 : varSpeedCoil.Name,
5427 0 : state.dataHVACGlobal->HPWHInletDBTemp,
5428 : HPInletAirHumRat,
5429 : HPWHCoolCapacity,
5430 0 : varSpeedCoil.MSRatedAirVolFlowRate(Mode),
5431 0 : varSpeedCoil.MSRatedSHR(Mode),
5432 : true);
5433 0 : if (varSpeedCoil.MSRatedCBF(Mode) > 0.0) {
5434 0 : varSpeedCoil.MSEffectiveAo(Mode) = -std::log(varSpeedCoil.MSRatedCBF(Mode)) * varSpeedCoil.MSRatedAirMassFlowRate(Mode);
5435 : } else {
5436 0 : varSpeedCoil.MSEffectiveAo(Mode) = 0.0;
5437 : }
5438 : }
5439 :
5440 : // update VarSpeedCoil(DXCoilNum).RatedCapCoolTotal
5441 0 : Mode = varSpeedCoil.NormSpedLevel;
5442 0 : if (varSpeedCoil.CondPumpPowerInCOP) {
5443 0 : varSpeedCoil.RatedCapCoolTotal = varSpeedCoil.MSRatedTotCap(Mode) * (1.0 - 1.0 / varSpeedCoil.MSRatedCOP(Mode)) +
5444 0 : varSpeedCoil.MSWHPumpPower(Mode) -
5445 0 : varSpeedCoil.MSWHPumpPower(Mode) * varSpeedCoil.HPWHCondPumpFracToWater;
5446 : } else {
5447 0 : varSpeedCoil.RatedCapCoolTotal = varSpeedCoil.MSRatedTotCap(Mode) * (1.0 - 1.0 / varSpeedCoil.MSRatedCOP(Mode)) -
5448 0 : varSpeedCoil.MSWHPumpPower(Mode) * varSpeedCoil.HPWHCondPumpFracToWater;
5449 : }
5450 : }
5451 :
5452 : // size rated sensible cooling capacity
5453 18 : RatedCapCoolSensAutoSized = true; // always do that
5454 :
5455 18 : if (varSpeedCoil.RatedAirVolFlowRate >= HVAC::SmallAirVolFlow && (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit ||
5456 16 : varSpeedCoil.VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed)) {
5457 13 : RatedAirMassFlowRate =
5458 13 : varSpeedCoil.RatedAirVolFlowRate *
5459 13 : Psychrometrics::PsyRhoAirFnPbTdbW(state, state.dataEnvrn->StdBaroPress, RatedInletAirTemp, RatedInletAirHumRat, RoutineName);
5460 13 : RatedInletEnth = Psychrometrics::PsyHFnTdbW(RatedInletAirTemp, RatedInletAirHumRat);
5461 13 : CBFRated = DXCoils::AdjustCBF(varSpeedCoil.MSRatedCBF(NormSpeed), varSpeedCoil.MSRatedAirMassFlowRate(NormSpeed), RatedAirMassFlowRate);
5462 13 : if (CBFRated > 0.999) CBFRated = 0.999;
5463 13 : if (varSpeedCoil.MSRatedAirMassFlowRate(NormSpeed) > 1.0e-10) {
5464 12 : AirMassFlowRatio = RatedAirMassFlowRate / varSpeedCoil.MSRatedAirMassFlowRate(NormSpeed);
5465 : } else {
5466 1 : AirMassFlowRatio = 1.0;
5467 : }
5468 :
5469 13 : if (varSpeedCoil.MSRatedWaterVolFlowRate(NormSpeed) > 1.0e-10) {
5470 2 : WaterMassFlowRatio = varSpeedCoil.RatedWaterVolFlowRate / varSpeedCoil.MSRatedWaterVolFlowRate(NormSpeed);
5471 : } else {
5472 11 : WaterMassFlowRatio = 1.0;
5473 : }
5474 :
5475 13 : Real64 TempInletWetBulb = RatedInletWetBulbTemp;
5476 65 : CalcTotCapSHR_VSWSHP(state,
5477 : RatedInletAirTemp,
5478 : RatedInletAirHumRat,
5479 : RatedInletEnth,
5480 : TempInletWetBulb,
5481 : AirMassFlowRatio,
5482 : WaterMassFlowRatio,
5483 : RatedAirMassFlowRate,
5484 : CBFRated,
5485 13 : varSpeedCoil.MSRatedTotCap(NormSpeed),
5486 13 : varSpeedCoil.MSCCapFTemp(NormSpeed),
5487 13 : varSpeedCoil.MSCCapAirFFlow(NormSpeed),
5488 13 : varSpeedCoil.MSCCapWaterFFlow(NormSpeed),
5489 : 0.0,
5490 : 0,
5491 : 0,
5492 : 0,
5493 : QLoadTotal1,
5494 : QLoadTotal2,
5495 : QLoadTotal,
5496 : SHR,
5497 : RatedSourceTempCool,
5498 13 : state.dataEnvrn->StdBaroPress,
5499 : 0.0,
5500 : 1,
5501 13 : varSpeedCoil.capModFacTotal);
5502 :
5503 13 : RatedCapCoolSensDes = varSpeedCoil.RatedCapCoolTotal * SHR;
5504 18 : } else if (varSpeedCoil.RatedAirVolFlowRate >= HVAC::SmallAirVolFlow &&
5505 5 : varSpeedCoil.VSCoilType == HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed) {
5506 0 : SHR = varSpeedCoil.MSRatedSHR(NormSpeed);
5507 0 : RatedCapCoolSensDes = varSpeedCoil.RatedCapCoolTotal * SHR;
5508 : } else {
5509 5 : RatedCapCoolSensDes = 0.0;
5510 : }
5511 :
5512 18 : if (RatedCapCoolSensDes < HVAC::SmallLoad) {
5513 6 : RatedCapCoolSensDes = 0.0;
5514 : }
5515 :
5516 18 : if (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit ||
5517 16 : varSpeedCoil.VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) { // always report for cooling mode
5518 13 : if (RatedCapCoolTotalAutoSized) {
5519 6 : varSpeedCoil.RatedCapCoolSens = RatedCapCoolSensDes;
5520 18 : BaseSizer::reportSizerOutput(state,
5521 12 : format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
5522 : varSpeedCoil.Name,
5523 : "Design Size Rated Sensible Cooling Capacity [W]",
5524 : varSpeedCoil.RatedCapCoolSens);
5525 :
5526 : } else {
5527 : // sensible capacity does not have an input field
5528 7 : if (RatedCapCoolSensDes > 0.0) {
5529 6 : varSpeedCoil.RatedCapCoolSens = RatedCapCoolSensDes;
5530 18 : BaseSizer::reportSizerOutput(state,
5531 12 : format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
5532 : varSpeedCoil.Name,
5533 : "Design Size Rated Sensible Cooling Capacity [W]",
5534 : RatedCapCoolSensDes); //, &
5535 : }
5536 : }
5537 26 : OutputReportPredefined::PreDefTableEntry(
5538 13 : state, state.dataOutRptPredefined->pdchCoolCoilTotCap, varSpeedCoil.Name, varSpeedCoil.RatedCapCoolTotal);
5539 26 : OutputReportPredefined::PreDefTableEntry(
5540 13 : state, state.dataOutRptPredefined->pdchCoolCoilSensCap, varSpeedCoil.Name, varSpeedCoil.RatedCapCoolSens);
5541 26 : OutputReportPredefined::PreDefTableEntry(state,
5542 13 : state.dataOutRptPredefined->pdchCoolCoilLatCap,
5543 : varSpeedCoil.Name,
5544 13 : varSpeedCoil.RatedCapCoolTotal - varSpeedCoil.RatedCapCoolSens);
5545 13 : if (varSpeedCoil.RatedCapCoolTotal != 0.0) {
5546 24 : OutputReportPredefined::PreDefTableEntry(state,
5547 12 : state.dataOutRptPredefined->pdchCoolCoilSHR,
5548 : varSpeedCoil.Name,
5549 12 : varSpeedCoil.RatedCapCoolSens / varSpeedCoil.RatedCapCoolTotal);
5550 : } else {
5551 1 : OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchCoolCoilSHR, varSpeedCoil.Name, 0.0);
5552 : }
5553 26 : OutputReportPredefined::PreDefTableEntry(
5554 13 : state, state.dataOutRptPredefined->pdchCoolCoilNomEff, varSpeedCoil.Name, varSpeedCoil.MSRatedCOP(varSpeedCoil.NormSpedLevel));
5555 26 : OutputReportPredefined::addFootNoteSubTable(
5556 : state,
5557 13 : state.dataOutRptPredefined->pdstCoolCoil,
5558 : "Nominal values are gross at rated conditions, i.e., the supply air fan heat and electric power NOT accounted for.");
5559 : }
5560 :
5561 : // START SIZING EVAP PRECOOLING PUMP POWER
5562 18 : IsAutoSize = false;
5563 18 : if (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
5564 11 : if (varSpeedCoil.EvapCondPumpElecNomPower == DataSizing::AutoSize) {
5565 0 : IsAutoSize = true;
5566 : }
5567 : // Auto size high speed evap condenser pump power to Total Capacity * 0.004266 w/w (15 w/ton)
5568 11 : EvapCondPumpElecNomPowerDes = varSpeedCoil.RatedCapCoolTotal * 0.004266;
5569 11 : if (IsAutoSize) {
5570 0 : varSpeedCoil.EvapCondPumpElecNomPower = EvapCondPumpElecNomPowerDes;
5571 0 : BaseSizer::reportSizerOutput(state,
5572 : "AS VS COOLING COIL",
5573 : varSpeedCoil.Name,
5574 : "Design Size Evaporative Condenser Pump Rated Power Consumption [W]",
5575 : EvapCondPumpElecNomPowerDes);
5576 : } else {
5577 11 : if (varSpeedCoil.EvapCondPumpElecNomPower > 0.0 && EvapCondPumpElecNomPowerDes > 0.0) {
5578 0 : EvapCondPumpElecNomPowerUser = varSpeedCoil.EvapCondPumpElecNomPower;
5579 0 : BaseSizer::reportSizerOutput(state,
5580 : "AS VS COOLING COIL",
5581 : varSpeedCoil.Name,
5582 : "Design Size Evaporative Condenser Pump Rated Power Consumption [W]",
5583 : EvapCondPumpElecNomPowerDes,
5584 : "User-Specified Evaporative Condenser Pump Rated Power Consumption [W]",
5585 : EvapCondPumpElecNomPowerUser);
5586 0 : if (state.dataGlobal->DisplayExtraWarnings) {
5587 0 : if ((std::abs(EvapCondPumpElecNomPowerDes - EvapCondPumpElecNomPowerUser) / EvapCondPumpElecNomPowerUser) >
5588 0 : state.dataSize->AutoVsHardSizingThreshold) {
5589 0 : ShowMessage(state,
5590 0 : format("SizeVarSpeedCoil: Potential issue with equipment sizing for {} {}",
5591 0 : varSpeedCoil.CoolHeatType,
5592 : CurrentObjSubfix));
5593 0 : ShowContinueError(state, format("Coil Name = {}", varSpeedCoil.Name));
5594 0 : ShowContinueError(state,
5595 0 : format("User-Specified Evaporative Condenser Pump Rated Power Consumption of {:.2R} [W]",
5596 : EvapCondPumpElecNomPowerUser));
5597 0 : ShowContinueError(state,
5598 0 : format("differs from Design Size Evaporative Condenser Pump Rated Power Consumption of {:.2R} [W]",
5599 : EvapCondPumpElecNomPowerDes));
5600 0 : ShowContinueError(state, "This may, or may not, indicate mismatched component sizes.");
5601 0 : ShowContinueError(state, "Verify that the value entered is intended and is consistent with other components.");
5602 : }
5603 : }
5604 : }
5605 : }
5606 : }
5607 : // END SIZING EVAP PRE-COOLING PUMP POWER
5608 :
5609 : // SIZE DEFROST HEATER
5610 :
5611 : // Resistive Defrost Heater Capacity = capacity at the first stage
5612 18 : IsAutoSize = false;
5613 18 : if (varSpeedCoil.VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
5614 4 : if (varSpeedCoil.DefrostCapacity == DataSizing::AutoSize) {
5615 0 : IsAutoSize = true;
5616 : }
5617 4 : if (varSpeedCoil.DefrostStrategy == Resistive) {
5618 4 : DefrostCapacityDes = varSpeedCoil.RatedCapHeat;
5619 : } else {
5620 0 : DefrostCapacityDes = 0.0;
5621 : }
5622 4 : if (IsAutoSize) {
5623 0 : varSpeedCoil.DefrostCapacity = DefrostCapacityDes;
5624 0 : BaseSizer::reportSizerOutput(
5625 : state, "AS VS HEATING COIL", varSpeedCoil.Name, "Design Size Resistive Defrost Heater Capacity [W]", DefrostCapacityDes);
5626 : } else {
5627 4 : if (varSpeedCoil.DefrostCapacity > 0.0 && DefrostCapacityDes > 0.0 && !HardSizeNoDesRun) {
5628 1 : DefrostCapacityUser = varSpeedCoil.DefrostCapacity;
5629 1 : BaseSizer::reportSizerOutput(state,
5630 : "AS VS HEATING COIL",
5631 : varSpeedCoil.Name,
5632 : "Design Size Resistive Defrost Heater Capacity [W]",
5633 : DefrostCapacityDes,
5634 : "User-Specified Resistive Defrost Heater Capacity [W]",
5635 : DefrostCapacityUser);
5636 1 : if (state.dataGlobal->DisplayExtraWarnings) {
5637 0 : if ((std::abs(DefrostCapacityDes - DefrostCapacityUser) / DefrostCapacityUser) > state.dataSize->AutoVsHardSizingThreshold) {
5638 0 : ShowMessage(state,
5639 0 : format("SizeVarSpeedCoil: Potential issue with equipment sizing for {} {}",
5640 0 : varSpeedCoil.CoolHeatType,
5641 : CurrentObjSubfix));
5642 0 : ShowContinueError(state, format("Coil Name = {}", varSpeedCoil.Name));
5643 0 : ShowContinueError(state, format("User-Specified Resistive Defrost Heater Capacity of {:.2R} [W]", DefrostCapacityUser));
5644 0 : ShowContinueError(state,
5645 0 : format("differs from Design Size Resistive Defrost Heater Capacity of {:.2R} [W]", DefrostCapacityDes));
5646 0 : ShowContinueError(state, "This may, or may not, indicate mismatched component sizes.");
5647 0 : ShowContinueError(state, "Verify that the value entered is intended and is consistent with other components.");
5648 : }
5649 : }
5650 : }
5651 : }
5652 : }
5653 : // END SIZING DEFROST HEATER
5654 :
5655 : // test autosized sensible and total cooling capacity for total > sensible
5656 18 : if (RatedCapCoolSensAutoSized && RatedCapCoolTotalAutoSized) {
5657 6 : if (varSpeedCoil.RatedCapCoolSens > varSpeedCoil.RatedCapCoolTotal) {
5658 0 : ShowWarningError(state,
5659 0 : format("COIL:{}:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT \"{}\"", varSpeedCoil.CoolHeatType, varSpeedCoil.Name));
5660 0 : ShowContinueError(state, format("{}: Rated Sensible Cooling Capacity > Rated Total Cooling Capacity", RoutineName));
5661 0 : ShowContinueError(state, "Each of these capacity inputs have been autosized.");
5662 0 : ShowContinueError(state, format("Rated Sensible Cooling Capacity = {:.2T} W", varSpeedCoil.RatedCapCoolSens));
5663 0 : ShowContinueError(state, format("Rated Total Cooling Capacity = {:.2T} W", varSpeedCoil.RatedCapCoolTotal));
5664 0 : ShowContinueError(state, "See eio file for further details.");
5665 0 : ShowContinueError(state, "Check Total and Sensible Cooling Capacity Coefficients to ensure they are accurate.");
5666 0 : ShowContinueError(state, "Check Zone and System Sizing objects to verify sizing inputs.");
5667 0 : ShowContinueError(state, "Sizing statistics:");
5668 0 : ShowContinueError(state, format("Entering Air Dry-Bulb Temperature = {:.3T} C", MixTemp));
5669 0 : ShowContinueError(state, format("Entering Air Wet-Bulb Temperature = {:.3T} C", MixWetBulb));
5670 0 : ShowContinueError(state, "Entering Condenser Water Temperature used = 24.4444 C");
5671 0 : ShowContinueError(state, "Used design air and water flow rates (i.e., used 1 for ratioVL and ratioVS)");
5672 0 : ShowContinueError(state, format("ratioTDB = {:.3T}", ((MixTemp + 283.15) / 273.15)));
5673 0 : ShowContinueError(state, format("ratioTWB = {:.3T}", ((MixWetBulb + 283.15) / 273.15)));
5674 0 : ShowContinueError(state, format("ratioTS = {:.3T}", ((85.0 + 283.15) / 273.15)));
5675 0 : ShowContinueError(state, "Rated Sensible Cooling Capacity = Rated Total Cooling Capacity * Sensible Heat Ratio");
5676 0 : ShowContinueError(state, format("Total Cooling Capacity Modifier = {:.5T}", TotCapTempModFac));
5677 0 : ShowContinueError(state, "...Rated Total Cooling Capacity = Total Design Load / Total Cooling Capacity Modifier");
5678 0 : ShowContinueError(state, "Carefully review the Load Side Total, Sensible, and Latent heat transfer rates");
5679 0 : ShowContinueError(state, "... to ensure they meet the expected manufacturers performance specifications.");
5680 : }
5681 12 : } else if (RatedCapCoolTotalAutoSized) {
5682 0 : if (varSpeedCoil.RatedCapCoolSens > varSpeedCoil.RatedCapCoolTotal) {
5683 0 : ShowWarningError(state,
5684 0 : format("COIL:{}:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT \"{}\"", varSpeedCoil.CoolHeatType, varSpeedCoil.Name));
5685 0 : ShowContinueError(state, format("{}: Rated Sensible Cooling Capacity > Rated Total Cooling Capacity", RoutineName));
5686 0 : ShowContinueError(state, "Only the rated total capacity input is autosized, consider autosizing both inputs.");
5687 0 : ShowContinueError(state, format("Rated Sensible Cooling Capacity = {:.2T} W", varSpeedCoil.RatedCapCoolSens));
5688 0 : ShowContinueError(state, format("Rated Total Cooling Capacity = {:.2T} W", varSpeedCoil.RatedCapCoolTotal));
5689 0 : ShowContinueError(state, "See eio file for further details.");
5690 0 : ShowContinueError(state, "Check Total and Sensible Cooling Capacity Coefficients to ensure they are accurate.");
5691 0 : ShowContinueError(state, "Check Zone and System Sizing objects to verify sizing inputs.");
5692 0 : ShowContinueError(state, "Sizing statistics for Total Cooling Capacity:");
5693 0 : ShowContinueError(state, format("Entering Air Wet-Bulb Temperature = {:.3T} C", MixWetBulb));
5694 0 : ShowContinueError(state, "Entering Condenser Water Temperature used = 24.4444 C");
5695 0 : ShowContinueError(state, "Used design air and water flow rates (i.e., used 1 for ratioVL and ratioVS)");
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, "Carefully review the Load Side Total, Sensible, and Latent heat transfer rates");
5700 0 : ShowContinueError(state, "... to ensure they meet the expected manufacturers performance specifications.");
5701 : }
5702 : }
5703 :
5704 36 : Array1D<DataHeatBalance::RefrigCondenserType> CondenserType;
5705 : StandardRatings::HPdefrostControl DefrostControl;
5706 18 : switch (varSpeedCoil.VSCoilType) {
5707 11 : case HVAC::Coil_CoolingAirToAirVariableSpeed:
5708 11 : CondenserType.push_back(varSpeedCoil.CondenserType);
5709 11 : switch (varSpeedCoil.DefrostControl) // defrost control; 1=timed, 2=on-demand
5710 : {
5711 0 : case 2:
5712 0 : DefrostControl = StandardRatings::HPdefrostControl::OnDemand;
5713 0 : break;
5714 11 : case 1:
5715 : default:
5716 11 : DefrostControl = StandardRatings::HPdefrostControl::Timed;
5717 11 : break;
5718 : }
5719 11 : if (varSpeedCoil.RatedCapCoolTotal > 0.0) {
5720 60 : StandardRatings::CalcDXCoilStandardRating(state,
5721 10 : varSpeedCoil.Name,
5722 10 : varSpeedCoil.VarSpeedCoilType,
5723 : varSpeedCoil.VSCoilType,
5724 : varSpeedCoil.NumOfSpeeds,
5725 : varSpeedCoil.MSRatedTotCap,
5726 : varSpeedCoil.MSRatedCOP,
5727 : varSpeedCoil.MSCCapAirFFlow,
5728 : varSpeedCoil.MSCCapFTemp,
5729 : varSpeedCoil.MSEIRAirFFlow,
5730 : varSpeedCoil.MSEIRFTemp,
5731 10 : varSpeedCoil.PLFFPLR,
5732 : varSpeedCoil.MSRatedAirVolFlowRate,
5733 : varSpeedCoil.MSRatedEvaporatorFanPowerPerVolumeFlowRate2017,
5734 : varSpeedCoil.MSRatedEvaporatorFanPowerPerVolumeFlowRate2023,
5735 : CondenserType,
5736 20 : 0, // varSpeedCoil.RegionNum, // ??
5737 10 : varSpeedCoil.MinOATCompressor,
5738 10 : varSpeedCoil.OATempCompressorOn,
5739 20 : false, // varSpeedCoil.OATempCompressorOnOffBlank, // ??
5740 : DefrostControl,
5741 20 : ObjexxFCL::Optional_bool_const(),
5742 10 : varSpeedCoil.RatedCapCoolTotal,
5743 10 : varSpeedCoil.RatedAirVolFlowRate);
5744 : }
5745 11 : break;
5746 7 : default:
5747 7 : break;
5748 : }
5749 18 : }
5750 :
5751 34029 : void CalcVarSpeedCoilCooling(EnergyPlusData &state,
5752 : int const DXCoilNum, // Heat Pump Number
5753 : HVAC::FanOp const fanOp, // Fan/Compressor cycling scheme indicator
5754 : [[maybe_unused]] Real64 const SensDemand, // Cooling Sensible Demand [W] !unused1208
5755 : [[maybe_unused]] Real64 const LatentDemand, // Cooling Latent Demand [W]
5756 : HVAC::CompressorOp const compressorOp, // compressor operation flag
5757 : Real64 const PartLoadRatio, // compressor part load ratio
5758 : [[maybe_unused]] Real64 const OnOffAirFlowRatio, // ratio of compressor on flow to average flow over time step
5759 : Real64 const SpeedRatio, // SpeedRatio varies between 1.0 (higher speed) and 0.0 (lower speed)
5760 : int const SpeedNum // Speed number, high bound
5761 : )
5762 : {
5763 :
5764 : // AUTHOR Bo Shen, based on WaterToAirHeatPumpSimple:CalcHPCoolingSimple
5765 : // DATE WRITTEN March 2012
5766 :
5767 : // PURPOSE OF THIS SUBROUTINE:
5768 : // This subroutine is for simulating the cooling mode of the Variable-Speed Water to Air HP Simple
5769 :
5770 : // METHODOLOGY EMPLOYED:
5771 : // Simulate the heat pump performance using the coefficients and rated conditions, interpolating between speed levels
5772 : // If the LatDegradModelSimFlag is enabled, the coil will be simulated twice:
5773 : // (1)first simulation at the rated conditions (2) second simulation at the
5774 : // actual operating conditions. Then call CalcEffectiveSHR and the effective SHR
5775 : // is adjusted.
5776 : // If the LatDegradModelSimFlag is disabled, the cooling coil is only simulated
5777 : // once at the actual operating conditions.
5778 : // Finally, adjust the heat pump outlet conditions based on the PartLoadRatio
5779 : // and RuntimeFrac.
5780 :
5781 : // SUBROUTINE PARAMETER DEFINITIONS:
5782 : static constexpr std::string_view RoutineName("CalcVarSpeedCoilCooling");
5783 : static constexpr std::string_view RoutineNameSourceSideInletTemp("CalcVarSpeedCoilCooling:SourceSideInletTemp");
5784 34029 : Real64 TimeStepSysSec = state.dataHVACGlobal->TimeStepSysSec;
5785 :
5786 : // SUBROUTINE LOCAL VARIABLE DECLARATIONS:
5787 : Real64 Twet_Rated; // Twet at rated conditions (coil air flow rate and air temperatures), sec
5788 : Real64 Gamma_Rated; // Gamma at rated conditions (coil air flow rate and air temperatures)
5789 :
5790 : Real64 SHRss; // Sensible heat ratio at steady state
5791 : Real64 SHReff; // Effective sensible heat ratio at part-load condition
5792 : Real64 CpSource; // Specific heat of water [J/kg_C]
5793 : Real64 CpAir; // Specific heat of air [J/kg_C]
5794 :
5795 : bool LatDegradModelSimFlag; // Latent degradation model simulation flag
5796 : int NumIteration; // Iteration Counter
5797 : Real64 LoadSideInletDBTemp_Unit; // calc conditions for unit
5798 : Real64 LoadSideInletWBTemp_Unit; // calc conditions for unit
5799 : Real64 LoadSideInletHumRat_Unit; // calc conditions for unit
5800 : Real64 LoadSideInletEnth_Unit; // calc conditions for unit
5801 : Real64 CpAir_Unit; // calc conditions for unit
5802 : Real64 AirMassFlowRatio; // airflow ratio at low speed
5803 : Real64 WaterMassFlowRatio; // airflow ratio at high speed
5804 : Real64 EIRAirFFModFac; // air flow fraction modification
5805 : Real64 EIRWaterFFModFac; // water flow fraction modification
5806 : Real64 EIRTempModFac; // total capacity temperature correctio fraction
5807 : Real64 CBFSpeed; // total capacity temperature correctio fraction
5808 : Real64 SHR; // total capacity temperature correctio fraction
5809 : Real64 EIR; // total capacity temperature correctio fraction
5810 : int MaxSpeed; // maximum speed level
5811 : int SpeedCal; // calculated speed level
5812 : Real64 AoEff; // effective air side surface area
5813 : Real64 QLoadTotal1; // total capacity at low speed
5814 : Real64 QLoadTotal2; // total capacity at high speed
5815 : Real64 Winput1; // power consumption at low speed
5816 : Real64 Winput2; // power consumption at high speed
5817 : Real64 QWasteHeat; // recoverable waste heat
5818 : Real64 QWasteHeat1; // recoverable waste heat at low speed
5819 : Real64 QWasteHeat2; // recoverable waste heat at high speed
5820 : Real64 PLF; // part-load function
5821 : Real64 MaxHumRat; // max possible humidity
5822 : Real64 MaxOutletEnth; // max possible outlet enthalpy
5823 :
5824 : // ADDED VARIABLES FOR air source coil
5825 : Real64 CondInletTemp; // Condenser inlet temperature (C). Outdoor dry-bulb temp for air-cooled condenser.
5826 : // Outdoor Wetbulb +(1 - effectiveness)*(outdoor drybulb - outdoor wetbulb) for evap condenser.
5827 : Real64 CondInletHumRat; // Condenser inlet humidity ratio (kg/kg). Zero for air-cooled condenser.
5828 : // For evap condenser, its the humidity ratio of the air leaving the evap cooling pads.
5829 : Real64 CondAirMassFlow; // Condenser air mass flow rate [kg/s]
5830 : Real64 RhoSourceAir; // Density of air [kg/m3]
5831 : Real64 RhoEvapCondWater; // Density of water used for evaporative condenser [kg/m3]
5832 : Real64 EvapCondEffectSped; // condenser evaporative effectiveness at the speed level
5833 : Real64 RhoWater; // condensed water density
5834 : Real64 SpecHumIn; // inlet air specific humidity
5835 : Real64 SpecHumOut; // outlet air specific humidity
5836 34029 : Real64 rhoair(0); // entering air density
5837 :
5838 34029 : if (state.dataVariableSpeedCoils->firstTime) {
5839 : // Set indoor air conditions to the rated condition
5840 16 : state.dataVariableSpeedCoils->LoadSideInletDBTemp_Init = 26.7;
5841 16 : state.dataVariableSpeedCoils->LoadSideInletHumRat_Init = 0.0111;
5842 16 : state.dataVariableSpeedCoils->LoadSideInletEnth_Init = Psychrometrics::PsyHFnTdbW(state.dataVariableSpeedCoils->LoadSideInletDBTemp_Init,
5843 16 : state.dataVariableSpeedCoils->LoadSideInletHumRat_Init);
5844 16 : state.dataVariableSpeedCoils->CpAir_Init = Psychrometrics::PsyCpAirFnW(state.dataVariableSpeedCoils->LoadSideInletHumRat_Init);
5845 16 : state.dataVariableSpeedCoils->firstTime = false;
5846 : }
5847 :
5848 68058 : state.dataVariableSpeedCoils->LoadSideInletWBTemp_Init =
5849 34029 : Psychrometrics::PsyTwbFnTdbWPb(state,
5850 34029 : state.dataVariableSpeedCoils->LoadSideInletDBTemp_Init,
5851 34029 : state.dataVariableSpeedCoils->LoadSideInletHumRat_Init,
5852 34029 : state.dataEnvrn->OutBaroPress,
5853 : RoutineName);
5854 :
5855 34029 : MaxSpeed = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds;
5856 :
5857 : // must be placed inside the loop, otherwise cause bug in release mode, need to be present at two places
5858 34029 : if (SpeedNum > MaxSpeed) {
5859 0 : SpeedCal = MaxSpeed;
5860 : } else {
5861 34029 : SpeedCal = SpeedNum;
5862 : }
5863 :
5864 : // LOAD LOCAL VARIABLES FROM DATA STRUCTURE (for code readability)
5865 34029 : if (!(fanOp == HVAC::FanOp::Continuous) && PartLoadRatio > 0.0) {
5866 10430 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate =
5867 10430 : state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirInletNodeNum).MassFlowRate / PartLoadRatio;
5868 : }
5869 :
5870 34029 : Twet_Rated = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Twet_Rated;
5871 34029 : Gamma_Rated = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Gamma_Rated;
5872 :
5873 34029 : state.dataVariableSpeedCoils->LoadSideMassFlowRate = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate;
5874 :
5875 34029 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
5876 : // Get condenser outdoor node info from DX COOLING Coil
5877 388 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum != 0) {
5878 0 : state.dataVariableSpeedCoils->OutdoorDryBulb_CalcVarSpeedCoilCooling =
5879 0 : state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).Temp;
5880 0 : state.dataVariableSpeedCoils->OutdoorHumRat_CalcVarSpeedCoilCooling =
5881 0 : state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).HumRat;
5882 0 : state.dataVariableSpeedCoils->OutdoorPressure_CalcVarSpeedCoilCooling =
5883 0 : state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).Press;
5884 0 : state.dataVariableSpeedCoils->OutdoorWetBulb_CalcVarSpeedCoilCooling =
5885 0 : state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).OutAirWetBulb;
5886 : } else {
5887 388 : state.dataVariableSpeedCoils->OutdoorDryBulb_CalcVarSpeedCoilCooling = state.dataEnvrn->OutDryBulbTemp;
5888 388 : state.dataVariableSpeedCoils->OutdoorHumRat_CalcVarSpeedCoilCooling = state.dataEnvrn->OutHumRat;
5889 388 : state.dataVariableSpeedCoils->OutdoorPressure_CalcVarSpeedCoilCooling = state.dataEnvrn->OutBaroPress;
5890 388 : state.dataVariableSpeedCoils->OutdoorWetBulb_CalcVarSpeedCoilCooling = state.dataEnvrn->OutWetBulbTemp;
5891 : }
5892 :
5893 776 : RhoSourceAir = Psychrometrics::PsyRhoAirFnPbTdbW(state,
5894 388 : state.dataVariableSpeedCoils->OutdoorPressure_CalcVarSpeedCoilCooling,
5895 388 : state.dataVariableSpeedCoils->OutdoorDryBulb_CalcVarSpeedCoilCooling,
5896 388 : state.dataVariableSpeedCoils->OutdoorHumRat_CalcVarSpeedCoilCooling);
5897 :
5898 388 : if ((SpeedNum == 1) || (SpeedNum > MaxSpeed) || (SpeedRatio == 1.0)) {
5899 365 : CondAirMassFlow = RhoSourceAir * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondAirFlow(SpeedCal);
5900 : } else {
5901 23 : CondAirMassFlow =
5902 23 : RhoSourceAir * (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondAirFlow(SpeedCal) * SpeedRatio +
5903 23 : (1.0 - SpeedRatio) * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondAirFlow(SpeedCal - 1));
5904 : }
5905 :
5906 : // AIR COOL OR EVAP COOLED CONDENSER
5907 388 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserType == DataHeatBalance::RefrigCondenserType::Evap) {
5908 0 : if ((SpeedNum == 1) || (SpeedNum > MaxSpeed) || (SpeedRatio == 1.0)) {
5909 0 : EvapCondEffectSped = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondEffect(SpeedCal);
5910 : } else {
5911 0 : EvapCondEffectSped = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondEffect(SpeedCal) * SpeedRatio +
5912 0 : (1.0 - SpeedRatio) * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondEffect(SpeedCal - 1);
5913 : }
5914 : // (Outdoor wet-bulb temp from DataEnvironment) + (1.0-EvapCondEffectiveness) * (drybulb - wetbulb)
5915 0 : CondInletTemp = state.dataVariableSpeedCoils->OutdoorWetBulb_CalcVarSpeedCoilCooling +
5916 0 : (state.dataVariableSpeedCoils->OutdoorDryBulb_CalcVarSpeedCoilCooling -
5917 0 : state.dataVariableSpeedCoils->OutdoorWetBulb_CalcVarSpeedCoilCooling) *
5918 0 : (1.0 - EvapCondEffectSped);
5919 0 : CondInletHumRat = Psychrometrics::PsyWFnTdbTwbPb(state,
5920 : CondInletTemp,
5921 0 : state.dataVariableSpeedCoils->OutdoorWetBulb_CalcVarSpeedCoilCooling,
5922 0 : state.dataVariableSpeedCoils->OutdoorPressure_CalcVarSpeedCoilCooling);
5923 0 : state.dataVariableSpeedCoils->CompAmbTemp_CalcVarSpeedCoilCooling = CondInletTemp;
5924 : } else { // AIR COOLED CONDENSER
5925 388 : CondInletTemp = state.dataVariableSpeedCoils->OutdoorDryBulb_CalcVarSpeedCoilCooling; // Outdoor dry-bulb temp
5926 776 : state.dataVariableSpeedCoils->CompAmbTemp_CalcVarSpeedCoilCooling =
5927 388 : state.dataVariableSpeedCoils->OutdoorDryBulb_CalcVarSpeedCoilCooling;
5928 388 : CondInletHumRat = state.dataEnvrn->OutHumRat;
5929 : }
5930 :
5931 388 : state.dataVariableSpeedCoils->SourceSideMassFlowRate = CondAirMassFlow;
5932 388 : state.dataVariableSpeedCoils->SourceSideInletTemp = CondInletTemp;
5933 388 : state.dataVariableSpeedCoils->SourceSideInletEnth = Psychrometrics::PsyHFnTdbW(CondInletTemp, CondInletHumRat);
5934 388 : CpSource = Psychrometrics::PsyCpAirFnW(CondInletHumRat);
5935 388 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondInletTemp = CondInletTemp;
5936 :
5937 : // If used in a heat pump, the value of MaxOAT in the heating coil overrides that in the cooling coil (in GetInput)
5938 : // Initialize crankcase heater, operates below OAT defined in input deck for HP DX heating coil
5939 388 : if (state.dataVariableSpeedCoils->OutdoorDryBulb_CalcVarSpeedCoilCooling <
5940 388 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxOATCrankcaseHeater) {
5941 44 : state.dataVariableSpeedCoils->CrankcaseHeatingPower_CalcVarSpeedCoilCooling =
5942 22 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacity;
5943 22 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex > 0) {
5944 1 : state.dataVariableSpeedCoils->CrankcaseHeatingPower_CalcVarSpeedCoilCooling *=
5945 1 : Curve::CurveValue(state,
5946 1 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex,
5947 1 : state.dataEnvrn->OutDryBulbTemp);
5948 : }
5949 : } else {
5950 366 : state.dataVariableSpeedCoils->CrankcaseHeatingPower_CalcVarSpeedCoilCooling = 0.0;
5951 : }
5952 : } else {
5953 33641 : state.dataVariableSpeedCoils->SourceSideMassFlowRate = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate;
5954 33641 : state.dataVariableSpeedCoils->SourceSideInletTemp = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp;
5955 33641 : state.dataVariableSpeedCoils->SourceSideInletEnth = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterEnthalpy;
5956 33641 : CpSource = state.dataPlnt->PlantLoop(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).plantLoc.loopNum)
5957 33641 : .glycol->getSpecificHeat(state, state.dataVariableSpeedCoils->SourceSideInletTemp, RoutineNameSourceSideInletTemp);
5958 : }
5959 :
5960 : // Check for flows, do not perform simulation if no flow in load side or source side.
5961 34029 : if (state.dataVariableSpeedCoils->SourceSideMassFlowRate <= 0.0 || state.dataVariableSpeedCoils->LoadSideMassFlowRate <= 0.0) {
5962 :
5963 23557 : if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) &&
5964 23702 : (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserType == DataHeatBalance::RefrigCondenserType::Air) &&
5965 145 : (state.dataVariableSpeedCoils->LoadSideMassFlowRate > 0.0)) {
5966 : // ALLOW SIMULATION IF AIR-COOLED CONDENSER COIL
5967 57 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SimFlag = true;
5968 : } else {
5969 23500 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SimFlag = false;
5970 23516 : return;
5971 : }
5972 : } else {
5973 10472 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SimFlag = true;
5974 : }
5975 :
5976 10529 : if (compressorOp == HVAC::CompressorOp::Off || state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedCapCoolTotal <= 0.0) {
5977 16 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SimFlag = false;
5978 16 : return;
5979 : }
5980 :
5981 10797 : if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) &&
5982 284 : (CondInletTemp < state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MinOATCompressor)) {
5983 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SimFlag = false;
5984 0 : return;
5985 : }
5986 :
5987 : // Loop the calculation at least once depending whether the latent degradation model
5988 : // is enabled. 1st iteration to calculate the QLatent(rated) at (TDB,TWB)indoorair=(26.7C,19.4C)
5989 : // and 2nd iteration to calculate the QLatent(actual)
5990 10513 : if ((PartLoadRatio < 1e-10) || (Twet_Rated <= 0.0) || (Gamma_Rated <= 0.0) || (SpeedNum > 1.0)) {
5991 10502 : LatDegradModelSimFlag = false;
5992 : // Set NumIteration=1 so that latent model would quit after 1 simulation with the actual condition
5993 10502 : NumIteration = 1;
5994 : } else {
5995 11 : LatDegradModelSimFlag = true;
5996 : // Set NumIteration=0 so that latent model would simulate twice with rated and actual condition
5997 11 : NumIteration = 0;
5998 : }
5999 :
6000 : // Set indoor air conditions to the actual condition
6001 10513 : LoadSideInletDBTemp_Unit = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp;
6002 10513 : LoadSideInletHumRat_Unit = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat;
6003 : LoadSideInletWBTemp_Unit =
6004 10513 : Psychrometrics::PsyTwbFnTdbWPb(state, LoadSideInletDBTemp_Unit, LoadSideInletHumRat_Unit, state.dataEnvrn->OutBaroPress, RoutineName);
6005 10513 : LoadSideInletEnth_Unit = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirEnthalpy;
6006 10513 : CpAir_Unit = Psychrometrics::PsyCpAirFnW(LoadSideInletHumRat_Unit);
6007 :
6008 10513 : state.dataHVACGlobal->OnOffFanPartLoadFraction = 1.0;
6009 10513 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = 1.0;
6010 10513 : if ((SpeedNum == 1) && (PartLoadRatio < 1.0)) {
6011 671 : PLF = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR, PartLoadRatio);
6012 671 : if (PLF < 0.7) {
6013 0 : PLF = 0.7;
6014 : }
6015 671 : if (fanOp == HVAC::FanOp::Cycling)
6016 650 : state.dataHVACGlobal->OnOffFanPartLoadFraction =
6017 : PLF; // save PLF for fan model, don't change fan power for constant fan mode if coil is off
6018 : // calculate the run time fraction
6019 671 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = PartLoadRatio / PLF;
6020 671 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio = PartLoadRatio;
6021 :
6022 671 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac > 1.0) {
6023 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = 1.0; // Reset coil runtime fraction to 1.0
6024 671 : } else if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac < 0.0) {
6025 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = 0.0;
6026 : }
6027 : }
6028 :
6029 : while (true) {
6030 10524 : ++NumIteration;
6031 10524 : if (NumIteration == 1) {
6032 : // Set indoor air conditions to the rated conditions
6033 11 : state.dataVariableSpeedCoils->LoadSideInletDBTemp = state.dataVariableSpeedCoils->LoadSideInletDBTemp_Init;
6034 11 : state.dataVariableSpeedCoils->LoadSideInletHumRat = state.dataVariableSpeedCoils->LoadSideInletHumRat_Init;
6035 11 : state.dataVariableSpeedCoils->LoadSideInletWBTemp = state.dataVariableSpeedCoils->LoadSideInletWBTemp_Init;
6036 11 : state.dataVariableSpeedCoils->LoadSideInletEnth = state.dataVariableSpeedCoils->LoadSideInletEnth_Init;
6037 11 : CpAir = state.dataVariableSpeedCoils->CpAir_Init;
6038 : } else {
6039 : // Set indoor air conditions to the actual condition
6040 10513 : state.dataVariableSpeedCoils->LoadSideInletDBTemp = LoadSideInletDBTemp_Unit;
6041 10513 : state.dataVariableSpeedCoils->LoadSideInletHumRat = LoadSideInletHumRat_Unit;
6042 10513 : state.dataVariableSpeedCoils->LoadSideInletWBTemp = LoadSideInletWBTemp_Unit;
6043 10513 : state.dataVariableSpeedCoils->LoadSideInletEnth = LoadSideInletEnth_Unit;
6044 10513 : CpAir = CpAir_Unit;
6045 : }
6046 :
6047 : // must be placed inside the loop, otherwise cause bug in release mode
6048 10524 : if (SpeedNum > MaxSpeed) {
6049 0 : SpeedCal = MaxSpeed;
6050 : } else {
6051 10524 : SpeedCal = SpeedNum;
6052 : }
6053 :
6054 10524 : if ((SpeedNum == 1) || (SpeedNum > MaxSpeed) || (SpeedRatio == 1.0)) {
6055 7158 : AirMassFlowRatio =
6056 7158 : state.dataVariableSpeedCoils->LoadSideMassFlowRate / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirMassFlowRate;
6057 :
6058 7158 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
6059 272 : WaterMassFlowRatio = 1.0;
6060 : } else {
6061 6886 : WaterMassFlowRatio = state.dataVariableSpeedCoils->SourceSideMassFlowRate /
6062 6886 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterMassFlowRate;
6063 : }
6064 :
6065 7158 : CBFSpeed = DXCoils::AdjustCBF(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCBF(SpeedCal),
6066 7158 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirMassFlowRate(SpeedCal),
6067 7158 : state.dataVariableSpeedCoils->LoadSideMassFlowRate);
6068 :
6069 7158 : if (CBFSpeed > 0.999) CBFSpeed = 0.999;
6070 :
6071 7158 : CalcTotCapSHR_VSWSHP(state,
6072 7158 : state.dataVariableSpeedCoils->LoadSideInletDBTemp,
6073 7158 : state.dataVariableSpeedCoils->LoadSideInletHumRat,
6074 7158 : state.dataVariableSpeedCoils->LoadSideInletEnth,
6075 7158 : state.dataVariableSpeedCoils->LoadSideInletWBTemp,
6076 : AirMassFlowRatio,
6077 : WaterMassFlowRatio,
6078 7158 : state.dataVariableSpeedCoils->LoadSideMassFlowRate,
6079 : CBFSpeed,
6080 7158 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal),
6081 7158 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(SpeedCal),
6082 7158 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(SpeedCal),
6083 7158 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(SpeedCal),
6084 : 0.0,
6085 : 0,
6086 : 0,
6087 : 0,
6088 : QLoadTotal1,
6089 : QLoadTotal2,
6090 7158 : state.dataVariableSpeedCoils->QLoadTotal,
6091 : SHR,
6092 7158 : state.dataVariableSpeedCoils->SourceSideInletTemp,
6093 7158 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirPressure,
6094 : 0.0,
6095 : 1,
6096 7158 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).capModFacTotal);
6097 :
6098 28632 : EIRTempModFac = Curve::CurveValue(state,
6099 7158 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(SpeedCal),
6100 7158 : state.dataVariableSpeedCoils->LoadSideInletWBTemp,
6101 7158 : state.dataVariableSpeedCoils->SourceSideInletTemp);
6102 : EIRAirFFModFac =
6103 7158 : Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(SpeedCal), AirMassFlowRatio);
6104 :
6105 7158 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
6106 272 : EIRWaterFFModFac = 1.0;
6107 : } else {
6108 : EIRWaterFFModFac =
6109 6886 : Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(SpeedCal), WaterMassFlowRatio);
6110 : }
6111 :
6112 7158 : EIR = (1.0 / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(SpeedCal)) * EIRTempModFac * EIRAirFFModFac *
6113 : EIRWaterFFModFac;
6114 :
6115 7158 : CBFSpeed = DXCoils::AdjustCBF(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCBF(SpeedCal),
6116 7158 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirMassFlowRate(SpeedCal),
6117 7158 : state.dataVariableSpeedCoils->LoadSideMassFlowRate);
6118 :
6119 7158 : if (CBFSpeed > 0.999) CBFSpeed = 0.999;
6120 :
6121 7158 : CalcTotCapSHR_VSWSHP(state,
6122 7158 : state.dataVariableSpeedCoils->LoadSideInletDBTemp,
6123 7158 : state.dataVariableSpeedCoils->LoadSideInletHumRat,
6124 7158 : state.dataVariableSpeedCoils->LoadSideInletEnth,
6125 7158 : state.dataVariableSpeedCoils->LoadSideInletWBTemp,
6126 : AirMassFlowRatio,
6127 : WaterMassFlowRatio,
6128 7158 : state.dataVariableSpeedCoils->LoadSideMassFlowRate,
6129 : CBFSpeed,
6130 7158 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal),
6131 7158 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(SpeedCal),
6132 7158 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(SpeedCal),
6133 7158 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(SpeedCal),
6134 : 0.0,
6135 : 0,
6136 : 0,
6137 : 0,
6138 : QLoadTotal1,
6139 : QLoadTotal2,
6140 7158 : state.dataVariableSpeedCoils->QLoadTotal,
6141 : SHR,
6142 7158 : state.dataVariableSpeedCoils->SourceSideInletTemp,
6143 7158 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirPressure,
6144 : 0.0,
6145 : 1,
6146 7158 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).capModFacTotal);
6147 :
6148 7158 : state.dataVariableSpeedCoils->Winput = state.dataVariableSpeedCoils->QLoadTotal * EIR;
6149 :
6150 14316 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
6151 272 : QWasteHeat = 0.0;
6152 : } else {
6153 6886 : QWasteHeat =
6154 6886 : state.dataVariableSpeedCoils->Winput * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeatFrac(SpeedCal);
6155 6886 : QWasteHeat *= Curve::CurveValue(state,
6156 6886 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(SpeedCal),
6157 6886 : state.dataVariableSpeedCoils->LoadSideInletWBTemp,
6158 6886 : state.dataVariableSpeedCoils->SourceSideInletTemp);
6159 : }
6160 : } else {
6161 3366 : AirMassFlowRatio =
6162 3366 : state.dataVariableSpeedCoils->LoadSideMassFlowRate / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirMassFlowRate;
6163 :
6164 3366 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
6165 23 : WaterMassFlowRatio = 1.0;
6166 : } else {
6167 3343 : WaterMassFlowRatio = state.dataVariableSpeedCoils->SourceSideMassFlowRate /
6168 3343 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterMassFlowRate;
6169 : }
6170 :
6171 3366 : AoEff = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEffectiveAo(SpeedCal) * SpeedRatio +
6172 3366 : (1.0 - SpeedRatio) * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEffectiveAo(SpeedCal - 1);
6173 :
6174 3366 : CBFSpeed = std::exp(-AoEff / state.dataVariableSpeedCoils->LoadSideMassFlowRate);
6175 :
6176 3366 : if (CBFSpeed > 0.999) CBFSpeed = 0.999;
6177 :
6178 3366 : CalcTotCapSHR_VSWSHP(state,
6179 3366 : state.dataVariableSpeedCoils->LoadSideInletDBTemp,
6180 3366 : state.dataVariableSpeedCoils->LoadSideInletHumRat,
6181 3366 : state.dataVariableSpeedCoils->LoadSideInletEnth,
6182 3366 : state.dataVariableSpeedCoils->LoadSideInletWBTemp,
6183 : AirMassFlowRatio,
6184 : WaterMassFlowRatio,
6185 3366 : state.dataVariableSpeedCoils->LoadSideMassFlowRate,
6186 : CBFSpeed,
6187 3366 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal - 1),
6188 3366 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(SpeedCal - 1),
6189 3366 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(SpeedCal - 1),
6190 3366 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(SpeedCal - 1),
6191 3366 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal),
6192 3366 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(SpeedCal),
6193 3366 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(SpeedCal),
6194 3366 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(SpeedCal),
6195 : QLoadTotal1,
6196 : QLoadTotal2,
6197 3366 : state.dataVariableSpeedCoils->QLoadTotal,
6198 : SHR,
6199 3366 : state.dataVariableSpeedCoils->SourceSideInletTemp,
6200 3366 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirPressure,
6201 : SpeedRatio,
6202 : 2,
6203 3366 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).capModFacTotal);
6204 :
6205 3366 : SpeedCal = SpeedNum - 1;
6206 13464 : EIRTempModFac = Curve::CurveValue(state,
6207 3366 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(SpeedCal),
6208 3366 : state.dataVariableSpeedCoils->LoadSideInletWBTemp,
6209 3366 : state.dataVariableSpeedCoils->SourceSideInletTemp);
6210 : EIRAirFFModFac =
6211 3366 : Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(SpeedCal), AirMassFlowRatio);
6212 :
6213 3366 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
6214 23 : EIRWaterFFModFac = 1.0;
6215 : } else {
6216 : EIRWaterFFModFac =
6217 3343 : Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(SpeedCal), WaterMassFlowRatio);
6218 : }
6219 :
6220 3366 : EIR = (1.0 / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(SpeedCal)) * EIRTempModFac * EIRAirFFModFac *
6221 : EIRWaterFFModFac;
6222 3366 : Winput1 = QLoadTotal1 * EIR;
6223 :
6224 3366 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
6225 23 : QWasteHeat1 = 0.0;
6226 : } else {
6227 3343 : QWasteHeat1 = Winput1 * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeatFrac(SpeedCal);
6228 3343 : QWasteHeat1 *= Curve::CurveValue(state,
6229 3343 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(SpeedCal),
6230 3343 : state.dataVariableSpeedCoils->LoadSideInletWBTemp,
6231 3343 : state.dataVariableSpeedCoils->SourceSideInletTemp);
6232 : }
6233 :
6234 3366 : SpeedCal = SpeedNum;
6235 13464 : EIRTempModFac = Curve::CurveValue(state,
6236 3366 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(SpeedCal),
6237 3366 : state.dataVariableSpeedCoils->LoadSideInletWBTemp,
6238 3366 : state.dataVariableSpeedCoils->SourceSideInletTemp);
6239 : EIRAirFFModFac =
6240 3366 : Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(SpeedCal), AirMassFlowRatio);
6241 :
6242 3366 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
6243 23 : EIRWaterFFModFac = 1.0;
6244 : } else {
6245 : EIRWaterFFModFac =
6246 3343 : Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(SpeedCal), WaterMassFlowRatio);
6247 : }
6248 :
6249 3366 : EIR = (1.0 / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(SpeedCal)) * EIRTempModFac * EIRAirFFModFac *
6250 : EIRWaterFFModFac;
6251 3366 : Winput2 = QLoadTotal2 * EIR;
6252 :
6253 3366 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
6254 23 : QWasteHeat2 = 0.0;
6255 : } else {
6256 3343 : QWasteHeat2 = Winput2 * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeatFrac(SpeedCal);
6257 3343 : QWasteHeat2 *= Curve::CurveValue(state,
6258 3343 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(SpeedCal),
6259 3343 : state.dataVariableSpeedCoils->LoadSideInletWBTemp,
6260 3343 : state.dataVariableSpeedCoils->SourceSideInletTemp);
6261 : }
6262 :
6263 3366 : state.dataVariableSpeedCoils->Winput = Winput2 * SpeedRatio + (1.0 - SpeedRatio) * Winput1;
6264 3366 : QWasteHeat = QWasteHeat2 * SpeedRatio + (1.0 - SpeedRatio) * QWasteHeat1;
6265 : }
6266 :
6267 10524 : state.dataVariableSpeedCoils->QSensible = state.dataVariableSpeedCoils->QLoadTotal * SHR;
6268 :
6269 10524 : state.dataVariableSpeedCoils->QSource = state.dataVariableSpeedCoils->QLoadTotal + state.dataVariableSpeedCoils->Winput - QWasteHeat;
6270 :
6271 10524 : if (state.dataVariableSpeedCoils->QSource < 0) {
6272 0 : state.dataVariableSpeedCoils->QSource = 0.0;
6273 0 : QWasteHeat = state.dataVariableSpeedCoils->QLoadTotal + state.dataVariableSpeedCoils->Winput;
6274 : }
6275 :
6276 : // Check if the Sensible Load is greater than the Total Cooling Load
6277 10524 : if (state.dataVariableSpeedCoils->QSensible > state.dataVariableSpeedCoils->QLoadTotal) {
6278 0 : state.dataVariableSpeedCoils->QSensible = state.dataVariableSpeedCoils->QLoadTotal;
6279 : }
6280 :
6281 10524 : if (LatDegradModelSimFlag) {
6282 : // Calculate for SHReff using the Latent Degradation Model
6283 22 : if (NumIteration == 1) {
6284 11 : state.dataVariableSpeedCoils->QLatRated = state.dataVariableSpeedCoils->QLoadTotal - state.dataVariableSpeedCoils->QSensible;
6285 11 : } else if (NumIteration == 2) {
6286 11 : state.dataVariableSpeedCoils->QLatActual = state.dataVariableSpeedCoils->QLoadTotal - state.dataVariableSpeedCoils->QSensible;
6287 11 : SHRss = state.dataVariableSpeedCoils->QSensible / state.dataVariableSpeedCoils->QLoadTotal;
6288 66 : SHReff = CalcEffectiveSHR(state,
6289 : DXCoilNum,
6290 : SHRss,
6291 : fanOp,
6292 11 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac,
6293 11 : state.dataVariableSpeedCoils->QLatRated,
6294 11 : state.dataVariableSpeedCoils->QLatActual,
6295 11 : state.dataVariableSpeedCoils->LoadSideInletDBTemp,
6296 11 : state.dataVariableSpeedCoils->LoadSideInletWBTemp);
6297 : // Update sensible capacity based on effective SHR
6298 11 : state.dataVariableSpeedCoils->QSensible = state.dataVariableSpeedCoils->QLoadTotal * SHReff;
6299 11 : goto LOOP_exit;
6300 : }
6301 : } else {
6302 : // Assume SHReff=SHRss
6303 10502 : SHReff = state.dataVariableSpeedCoils->QSensible / state.dataVariableSpeedCoils->QLoadTotal;
6304 10502 : goto LOOP_exit;
6305 : }
6306 : }
6307 10513 : LOOP_exit:;
6308 :
6309 : // considering hot gas reheat here
6310 10513 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HOTGASREHEATFLG > 0) {
6311 0 : state.dataVariableSpeedCoils->QLoadTotal -= QWasteHeat;
6312 0 : state.dataVariableSpeedCoils->QSensible -= QWasteHeat;
6313 0 : SHReff = state.dataVariableSpeedCoils->QSensible / state.dataVariableSpeedCoils->QLoadTotal;
6314 : }
6315 :
6316 10513 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterPower = 0.0;
6317 10513 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterPower = 0.0;
6318 :
6319 10513 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
6320 284 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserType == DataHeatBalance::RefrigCondenserType::Evap) {
6321 : //******************
6322 : // WATER CONSUMPTION IN m3 OF WATER FOR DIRECT
6323 : // H2O [m3/s] = Delta W[kgWater/kgDryAir]*Mass Flow Air[kgDryAir/s]
6324 : // /RhoWater [kgWater/m3]
6325 : //******************
6326 0 : RhoEvapCondWater = Psychrometrics::RhoH2O(state.dataVariableSpeedCoils->OutdoorDryBulb_CalcVarSpeedCoilCooling);
6327 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterConsumpRate =
6328 0 : (CondInletHumRat - state.dataVariableSpeedCoils->OutdoorHumRat_CalcVarSpeedCoilCooling) * CondAirMassFlow / RhoEvapCondWater *
6329 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac;
6330 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondPumpElecPower =
6331 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondPumpElecNomPower *
6332 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac;
6333 : // Calculate basin heater power
6334 0 : CalcBasinHeaterPower(state,
6335 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterPowerFTempDiff,
6336 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).basinHeaterSched,
6337 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterSetPointTemp,
6338 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterPower);
6339 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterPower *=
6340 0 : (1.0 - state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac);
6341 : }
6342 :
6343 284 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterPower =
6344 284 : state.dataVariableSpeedCoils->CrankcaseHeatingPower_CalcVarSpeedCoilCooling *
6345 284 : (1.0 - state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac);
6346 :
6347 : // set water system demand request (if needed)
6348 284 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterSupplyMode == WaterSupplyFromTank) {
6349 0 : state.dataWaterData->WaterStorage(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterSupTankID)
6350 0 : .VdotRequestDemand(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterTankDemandARRID) =
6351 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterConsumpRate;
6352 : }
6353 : }
6354 :
6355 10513 : if ((PartLoadRatio > 0.0 && fanOp == HVAC::FanOp::Continuous) || (fanOp == HVAC::FanOp::Cycling)) {
6356 : // calculate coil outlet state variables
6357 21022 : state.dataVariableSpeedCoils->LoadSideOutletEnth =
6358 10511 : state.dataVariableSpeedCoils->LoadSideInletEnth -
6359 10511 : state.dataVariableSpeedCoils->QLoadTotal / state.dataVariableSpeedCoils->LoadSideMassFlowRate;
6360 21022 : state.dataVariableSpeedCoils->LoadSideOutletDBTemp =
6361 10511 : state.dataVariableSpeedCoils->LoadSideInletDBTemp -
6362 10511 : state.dataVariableSpeedCoils->QSensible / (state.dataVariableSpeedCoils->LoadSideMassFlowRate * CpAir);
6363 :
6364 10511 : MaxHumRat = Psychrometrics::PsyWFnTdbRhPb(state,
6365 10511 : state.dataVariableSpeedCoils->LoadSideOutletDBTemp,
6366 : 0.9999,
6367 10511 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirPressure,
6368 : RoutineName);
6369 10511 : MaxOutletEnth = Psychrometrics::PsyHFnTdbW(state.dataVariableSpeedCoils->LoadSideOutletDBTemp, MaxHumRat);
6370 10511 : if (state.dataVariableSpeedCoils->LoadSideOutletEnth > MaxOutletEnth) {
6371 142 : state.dataVariableSpeedCoils->LoadSideOutletEnth = MaxOutletEnth;
6372 : // QLoadTotal = LoadSideMassFlowRate * (LoadSideInletEnth - LoadSideOutletEnth)
6373 : }
6374 10511 : state.dataVariableSpeedCoils->LoadSideOutletHumRat = Psychrometrics::PsyWFnTdbH(
6375 10511 : state, state.dataVariableSpeedCoils->LoadSideOutletDBTemp, state.dataVariableSpeedCoils->LoadSideOutletEnth, RoutineName);
6376 10511 : if (state.dataVariableSpeedCoils->LoadSideOutletHumRat > MaxHumRat) {
6377 16 : state.dataVariableSpeedCoils->LoadSideOutletHumRat = MaxHumRat;
6378 : }
6379 : }
6380 :
6381 : // Actual outlet conditions are "average" for time step
6382 10513 : if (fanOp == HVAC::FanOp::Continuous) {
6383 : // continuous fan, cycling compressor
6384 83 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirEnthalpy =
6385 83 : PartLoadRatio * state.dataVariableSpeedCoils->LoadSideOutletEnth +
6386 83 : (1.0 - PartLoadRatio) * state.dataVariableSpeedCoils->LoadSideInletEnth;
6387 83 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat =
6388 83 : PartLoadRatio * state.dataVariableSpeedCoils->LoadSideOutletHumRat +
6389 83 : (1.0 - PartLoadRatio) * state.dataVariableSpeedCoils->LoadSideInletHumRat;
6390 83 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp =
6391 83 : Psychrometrics::PsyTdbFnHW(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirEnthalpy,
6392 83 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat);
6393 83 : state.dataVariableSpeedCoils->PLRCorrLoadSideMdot = state.dataVariableSpeedCoils->LoadSideMassFlowRate;
6394 : } else {
6395 : // default to cycling fan, cycling compressor
6396 10430 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirEnthalpy = state.dataVariableSpeedCoils->LoadSideOutletEnth;
6397 10430 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat = state.dataVariableSpeedCoils->LoadSideOutletHumRat;
6398 10430 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp = state.dataVariableSpeedCoils->LoadSideOutletDBTemp;
6399 10430 : state.dataVariableSpeedCoils->PLRCorrLoadSideMdot = state.dataVariableSpeedCoils->LoadSideMassFlowRate * PartLoadRatio;
6400 : }
6401 :
6402 : // scale heat transfer rates to PLR and power to RTF
6403 10513 : state.dataVariableSpeedCoils->QLoadTotal *= PartLoadRatio;
6404 10513 : state.dataVariableSpeedCoils->QSensible *= PartLoadRatio;
6405 : // count the powr separately
6406 10513 : state.dataVariableSpeedCoils->Winput *= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac;
6407 10513 : state.dataVariableSpeedCoils->QSource *= PartLoadRatio;
6408 10513 : QWasteHeat *= PartLoadRatio;
6409 :
6410 : // Update heat pump data structure
6411 10513 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Power = state.dataVariableSpeedCoils->Winput;
6412 10513 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal = state.dataVariableSpeedCoils->QLoadTotal;
6413 10513 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible = state.dataVariableSpeedCoils->QSensible;
6414 10513 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLatent =
6415 10513 : state.dataVariableSpeedCoils->QLoadTotal - state.dataVariableSpeedCoils->QSensible;
6416 10513 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Energy = state.dataVariableSpeedCoils->Winput * TimeStepSysSec;
6417 10513 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLoadTotal = state.dataVariableSpeedCoils->QLoadTotal * TimeStepSysSec;
6418 10513 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySensible = state.dataVariableSpeedCoils->QSensible * TimeStepSysSec;
6419 10513 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLatent =
6420 10513 : (state.dataVariableSpeedCoils->QLoadTotal - state.dataVariableSpeedCoils->QSensible) * TimeStepSysSec;
6421 10513 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterConsumption =
6422 10513 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterPower * TimeStepSysSec;
6423 10513 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterConsump =
6424 10513 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterConsumpRate * TimeStepSysSec;
6425 10513 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterConsumption =
6426 10513 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterPower * TimeStepSysSec;
6427 10513 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondPumpElecConsumption =
6428 10513 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondPumpElecPower * TimeStepSysSec;
6429 10513 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac == 0.0) {
6430 2 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).COP = 0.0;
6431 : } else {
6432 10511 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).COP =
6433 10511 : state.dataVariableSpeedCoils->QLoadTotal / state.dataVariableSpeedCoils->Winput;
6434 : }
6435 10513 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio = PartLoadRatio;
6436 10513 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate = state.dataVariableSpeedCoils->PLRCorrLoadSideMdot;
6437 10513 : rhoair = Psychrometrics::PsyRhoAirFnPbTdbW(state,
6438 10513 : state.dataEnvrn->OutBaroPress,
6439 10513 : state.dataVariableSpeedCoils->LoadSideInletDBTemp,
6440 10513 : state.dataVariableSpeedCoils->LoadSideInletHumRat,
6441 : RoutineName);
6442 : // This seems wrong, initializing mass flow rate to StdRhoAir or actual air density,
6443 : // then using that mass flow rate, then back calculating volume using inlet conditions.
6444 : // Volume should be constant through a fan and air mass flow rate should vary based on inlet conditions.
6445 10513 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirVolFlowRate =
6446 10513 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate / rhoair;
6447 :
6448 10513 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
6449 284 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate = 0.0;
6450 284 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterTemp = 0.0;
6451 284 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterEnthalpy = 0.0;
6452 284 : state.dataHeatBal->HeatReclaimVS_Coil(DXCoilNum).AvailCapacity = state.dataVariableSpeedCoils->QSource;
6453 284 : if (state.dataHeatBal->HeatReclaimVS_Coil(DXCoilNum).WaterHeatingDesuperheaterReclaimedHeatTotal > 0.0)
6454 0 : state.dataVariableSpeedCoils->QSource -= state.dataHeatBal->HeatReclaimVS_Coil(DXCoilNum).WaterHeatingDesuperheaterReclaimedHeatTotal;
6455 : } else {
6456 10229 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate = state.dataVariableSpeedCoils->SourceSideMassFlowRate;
6457 10229 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterTemp =
6458 10229 : state.dataVariableSpeedCoils->SourceSideInletTemp +
6459 10229 : state.dataVariableSpeedCoils->QSource / (state.dataVariableSpeedCoils->SourceSideMassFlowRate * CpSource);
6460 10229 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterEnthalpy =
6461 10229 : state.dataVariableSpeedCoils->SourceSideInletEnth +
6462 10229 : state.dataVariableSpeedCoils->QSource / state.dataVariableSpeedCoils->SourceSideMassFlowRate;
6463 10229 : state.dataHeatBal->HeatReclaimVS_Coil(DXCoilNum).AvailCapacity = state.dataVariableSpeedCoils->QSource;
6464 10229 : if (state.dataHeatBal->HeatReclaimVS_Coil(DXCoilNum).WaterHeatingDesuperheaterReclaimedHeatTotal > 0.0)
6465 1 : state.dataVariableSpeedCoils->QSource -= state.dataHeatBal->HeatReclaimVS_Coil(DXCoilNum).WaterHeatingDesuperheaterReclaimedHeatTotal;
6466 : }
6467 10513 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSource = state.dataVariableSpeedCoils->QSource;
6468 10513 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySource = state.dataVariableSpeedCoils->QSource * TimeStepSysSec;
6469 :
6470 10513 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QWasteHeat = QWasteHeat;
6471 :
6472 10513 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondensateCollectMode == CondensateToTank) {
6473 : // calculate and report condensation rates (how much water extracted from the air stream)
6474 : // water flow of water in m3/s for water system interactions
6475 0 : RhoWater = Psychrometrics::RhoH2O((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp +
6476 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp) /
6477 : 2.0);
6478 : // CR9155 Remove specific humidity calculations
6479 0 : SpecHumIn = state.dataVariableSpeedCoils->LoadSideInletHumRat;
6480 0 : SpecHumOut = state.dataVariableSpeedCoils->LoadSideOutletHumRat;
6481 : // mdot * del HumRat / rho water
6482 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondensateVdot =
6483 0 : max(0.0, (state.dataVariableSpeedCoils->LoadSideMassFlowRate * (SpecHumIn - SpecHumOut) / RhoWater));
6484 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondensateVol =
6485 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondensateVdot * TimeStepSysSec;
6486 : }
6487 : }
6488 :
6489 0 : void CalcVarSpeedHPWH(EnergyPlusData &state,
6490 : int const DXCoilNum, // the number of the DX coil to be simulated
6491 : Real64 const PartLoadRatio, // sensible water heating load / full load sensible water heating capacity
6492 : Real64 const SpeedRatio, // SpeedRatio varies between 1.0 (higher speed) and 0.0 (lower speed)
6493 : int const SpeedNum, // Speed number, high bound
6494 : HVAC::FanOp const fanOp // Continuous fan OR cycling compressor
6495 : )
6496 : {
6497 :
6498 : // SUBROUTINE INFORMATION:
6499 : // AUTHOR Bo Shen, ORNL
6500 : // DATE WRITTEN 12/2014
6501 :
6502 : // PURPOSE OF THIS SUBROUTINE:
6503 : // Calculates the gross cooling capacity of a variable-speed heat pump water heater evaporator and
6504 : // heating capacity of the condenser coil given the rated heating capacity and COP.
6505 :
6506 : // METHODOLOGY EMPLOYED:
6507 : // The routine requires the user to enter the total heating capacity and COP for the
6508 : // heat pump water heater along with logicals defining if fan and condenser pump are included at numerous speed levels.
6509 : // Since manufacturer's can rate their HPWH equipment with or without including condenser
6510 : // pump heat, this information is required to accurately determine the condenser's leaving
6511 : // water temperature. In addition, knowledge of the fan heat is required to back into
6512 : // a compressor COP.
6513 :
6514 : // SUBROUTINE PARAMETER DEFINITIONS:
6515 : static constexpr std::string_view RoutineName("CalcVarSpeedHPWH");
6516 0 : Real64 TimeStepSysSec = state.dataHVACGlobal->TimeStepSysSec;
6517 :
6518 : // SUBROUTINE LOCAL VARIABLE DECLARATIONS:
6519 : Real64 OperatingHeatingCapacity; // Water heating operating capacity including the impact of capacity and COP curves (W)
6520 : Real64 OperatingHeatingCOP; // Water heating operating COP including the impact of capacity and COP curves (W/W)
6521 : Real64 OperatingHeatingPower; // Water heating operating Power (W)
6522 : Real64 CompressorPower; // Power consumed by compressor only (W)
6523 :
6524 : Real64 TotalTankHeatingCapacity; // Water heating capacity corrected for condenser water pump heat (W)
6525 : Real64 TankHeatingCOP; // Water heating COP corrected for fan and condenser water pump power (W/W)
6526 : // (these previous 2 variables also include the impact of capacity and COP curves)
6527 : Real64 EvapCoolingCapacity; // Air cooling capacity corrected for evap fan and cond water pump heat (W)
6528 : Real64 InletWaterTemp; // Condenser water inlet temperature (C)
6529 : Real64 OutletWaterTemp; // Condenser water outlet temperature (C)
6530 : Real64 EvapInletMassFlowRate; // Evaporator air inlet mass flow rate (m3/s)
6531 : Real64 CondInletMassFlowRate; // Condenser water inlet mass flow rate (m3/s)
6532 : Real64 CpWater; // Specific heat of condenser inlet water (J/Kg/k)
6533 : Real64 InletAirTemp; // HPWH inlet air temperature (dry-bulb or wet-bulb) (C)
6534 : Real64 AirMassFlowRatio; // Ratio of evaporator inlet air mass flow rate to rated mass flow rate
6535 : Real64 WaterMassFlowRatio; // Ratio of evaporator inlet water mass flow rate to rated mass flow rate
6536 : Real64 PumpHeatToWater; // Amount of pump heat attributed to heating water
6537 : Real64 PLF; // part-load function
6538 : Real64 CBFSpeed; // bypass factor as individual speed level
6539 : Real64 COPAirFFModFac; // air flow fraction modification
6540 : Real64 COPWaterFFModFac; // water flow fraction modification
6541 : Real64 COPTempModFac; // total capacity temperature correctio fraction
6542 : Real64 TOTCAPAirFFModFac; // air flow fraction modification
6543 : Real64 TOTCAPWaterFFModFac; // water flow fraction modification
6544 : Real64 TOTCAPTempModFac; // total capacity temperature correctio fraction
6545 : Real64 SHR; // total capacity temperature correctio fraction
6546 : Real64 COP; // total capacity temperature correctio fraction
6547 : Real64 AoEff; // effective air side surface area
6548 : Real64 Winput1; // power consumption at low speed
6549 : Real64 Winput2; // power consumption at high speed
6550 : Real64 LoadPressure; // evaporator inlet pressure
6551 : Real64 hDelta; // Change in air enthalpy across the cooling coil [J/kg]
6552 : Real64 hADP; // Apparatus dew point enthalpy [J/kg]
6553 : Real64 tADP; // Apparatus dew point temperature [C]
6554 : Real64 wADP; // Apparatus dew point humidity ratio [kg/kg]
6555 : Real64 hTinwADP; // Enthalpy at inlet dry-bulb and wADP [J/kg]
6556 : Real64 WHCAP1; // total heating capacity at low speed [W]
6557 : Real64 WHCAP2; // total heating capacity at high speed [W]
6558 : Real64 CpAir; // Specific heat of air [J/kg_C]
6559 : Real64 MaxHumRat; // max possible humidity
6560 : Real64 MaxOutletEnth; // max possible outlet enthalpy
6561 : int EvapInletNode; // Evaporator air inlet node number
6562 : int SpeedCal; // calculated speed level
6563 0 : Real64 rhoair = 0.0; // entering air density
6564 0 : Real64 RhoWater = 0.0; // water density
6565 :
6566 : // note: load side is the evaporator side, and source side is the condenser side
6567 :
6568 0 : int CondInletNode = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterInletNodeNum;
6569 0 : int CondOutletNode = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterOutletNodeNum;
6570 : // If heat pump water heater is OFF, set outlet to inlet and RETURN
6571 0 : if (PartLoadRatio == 0.0) {
6572 0 : state.dataLoopNodes->Node(CondOutletNode) = state.dataLoopNodes->Node(CondInletNode);
6573 0 : return;
6574 : } else {
6575 0 : EvapInletNode = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirInletNodeNum;
6576 0 : InletWaterTemp = state.dataLoopNodes->Node(CondInletNode).Temp;
6577 0 : CondInletMassFlowRate = state.dataLoopNodes->Node(CondInletNode).MassFlowRate;
6578 0 : EvapInletMassFlowRate = state.dataLoopNodes->Node(EvapInletNode).MassFlowRate;
6579 0 : CpWater = Psychrometrics::CPHW(InletWaterTemp);
6580 0 : CompressorPower = 0.0;
6581 0 : OperatingHeatingPower = 0.0;
6582 0 : TankHeatingCOP = 0.0;
6583 : }
6584 :
6585 : // LOAD LOCAL VARIABLES FROM DATA STRUCTURE (for code readability)
6586 0 : if (!(fanOp == HVAC::FanOp::Continuous) && PartLoadRatio > 0.0) {
6587 0 : CondInletMassFlowRate = CondInletMassFlowRate / PartLoadRatio;
6588 0 : EvapInletMassFlowRate = EvapInletMassFlowRate / PartLoadRatio;
6589 : }
6590 :
6591 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate = EvapInletMassFlowRate;
6592 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate = CondInletMassFlowRate;
6593 :
6594 : // determine inlet air temperature type for curve objects
6595 0 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirTemperatureType == HVAC::OATType::WetBulb) {
6596 0 : InletAirTemp = state.dataHVACGlobal->HPWHInletWBTemp;
6597 : } else {
6598 0 : InletAirTemp = state.dataHVACGlobal->HPWHInletDBTemp;
6599 : }
6600 :
6601 : // check if indoor evaporator or outdoor evaporator
6602 0 : Real64 CrankcaseHeatingPower = 0.0;
6603 0 : if (EvapInletNode != 0) {
6604 0 : state.dataVariableSpeedCoils->LoadSideInletDBTemp = state.dataLoopNodes->Node(EvapInletNode).Temp;
6605 0 : state.dataVariableSpeedCoils->LoadSideInletHumRat = state.dataLoopNodes->Node(EvapInletNode).HumRat;
6606 0 : LoadPressure = state.dataLoopNodes->Node(EvapInletNode).Press;
6607 : // prevent the air pressure not given
6608 0 : if (LoadPressure < 10.0) LoadPressure = state.dataEnvrn->OutBaroPress;
6609 :
6610 0 : state.dataVariableSpeedCoils->LoadSideInletWBTemp = state.dataLoopNodes->Node(EvapInletNode).OutAirWetBulb;
6611 0 : state.dataVariableSpeedCoils->LoadSideInletEnth = state.dataLoopNodes->Node(EvapInletNode).Enthalpy;
6612 : } else {
6613 0 : state.dataVariableSpeedCoils->LoadSideInletDBTemp = state.dataEnvrn->OutDryBulbTemp;
6614 0 : state.dataVariableSpeedCoils->LoadSideInletHumRat = state.dataEnvrn->OutHumRat;
6615 0 : LoadPressure = state.dataEnvrn->OutBaroPress;
6616 0 : state.dataVariableSpeedCoils->LoadSideInletWBTemp = state.dataEnvrn->OutWetBulbTemp;
6617 0 : state.dataVariableSpeedCoils->LoadSideInletEnth = state.dataEnvrn->OutEnthalpy;
6618 :
6619 : // Initialize crankcase heater, operates below OAT defined in input deck for HP DX heating coil
6620 0 : if (state.dataEnvrn->OutDryBulbTemp < state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxOATCrankcaseHeater) {
6621 0 : CrankcaseHeatingPower = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacity;
6622 0 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex > 0) {
6623 0 : CrankcaseHeatingPower *=
6624 0 : Curve::CurveValue(state,
6625 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex,
6626 0 : state.dataEnvrn->OutDryBulbTemp);
6627 : }
6628 : };
6629 : }
6630 :
6631 0 : state.dataVariableSpeedCoils->LoadSideMassFlowRate = EvapInletMassFlowRate;
6632 0 : state.dataVariableSpeedCoils->SourceSideMassFlowRate = CondInletMassFlowRate;
6633 0 : state.dataVariableSpeedCoils->SourceSideInletTemp = InletWaterTemp;
6634 0 : state.dataVariableSpeedCoils->SourceSideInletEnth = state.dataLoopNodes->Node(CondInletNode).Enthalpy;
6635 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterEnthalpy = state.dataVariableSpeedCoils->SourceSideInletEnth;
6636 :
6637 : // Check for flows, do not perform simulation if no flow in load side or source side.
6638 0 : if ((state.dataVariableSpeedCoils->SourceSideMassFlowRate <= 0.0) || (state.dataVariableSpeedCoils->LoadSideMassFlowRate <= 0.0)) {
6639 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SimFlag = false;
6640 0 : return;
6641 : } else {
6642 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SimFlag = true;
6643 : }
6644 :
6645 : // part-load calculation
6646 0 : state.dataHVACGlobal->OnOffFanPartLoadFraction = 1.0;
6647 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = 1.0;
6648 0 : if ((SpeedNum == 1) && (PartLoadRatio < 1.0)) {
6649 0 : PLF = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR, PartLoadRatio);
6650 0 : if (PLF < 0.7) {
6651 0 : PLF = 0.7;
6652 : }
6653 0 : if (fanOp == HVAC::FanOp::Cycling)
6654 0 : state.dataHVACGlobal->OnOffFanPartLoadFraction =
6655 : PLF; // save PLF for fan model, don't change fan power for constant fan mode if coil is off
6656 : // calculate the run time fraction
6657 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = PartLoadRatio / PLF;
6658 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio = PartLoadRatio;
6659 :
6660 0 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac > 1.0) {
6661 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = 1.0; // Reset coil runtime fraction to 1.0
6662 0 : } else if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac < 0.0) {
6663 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = 0.0;
6664 : }
6665 : }
6666 :
6667 0 : int MaxSpeed = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds;
6668 :
6669 : // interpolate between speeds
6670 : // must be placed inside the loop, otherwise cause bug in release mode
6671 0 : if (SpeedNum > MaxSpeed) {
6672 0 : SpeedCal = MaxSpeed;
6673 : } else {
6674 0 : SpeedCal = SpeedNum;
6675 : }
6676 :
6677 0 : Real64 locFanElecPower = 0.0; // local for fan electric power
6678 0 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SupplyFanIndex > 0) {
6679 0 : locFanElecPower = state.dataFans->fans(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SupplyFanIndex)->totalPower;
6680 : }
6681 0 : if ((SpeedNum == 1) || (SpeedNum > MaxSpeed) || (SpeedRatio == 1.0)) {
6682 0 : AirMassFlowRatio =
6683 0 : state.dataVariableSpeedCoils->LoadSideMassFlowRate / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirMassFlowRate;
6684 0 : WaterMassFlowRatio =
6685 0 : state.dataVariableSpeedCoils->SourceSideMassFlowRate / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterMassFlowRate;
6686 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower =
6687 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWHPumpPower(SpeedCal);
6688 :
6689 0 : COPTempModFac = Curve::CurveValue(state,
6690 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(SpeedCal),
6691 : InletAirTemp,
6692 0 : state.dataVariableSpeedCoils->SourceSideInletTemp);
6693 : COPAirFFModFac =
6694 0 : Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(SpeedCal), AirMassFlowRatio);
6695 : COPWaterFFModFac =
6696 0 : Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(SpeedCal), WaterMassFlowRatio);
6697 :
6698 0 : COP = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(SpeedCal) * COPTempModFac * COPAirFFModFac * COPWaterFFModFac;
6699 :
6700 0 : TOTCAPTempModFac = Curve::CurveValue(state,
6701 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(SpeedCal),
6702 : InletAirTemp,
6703 0 : state.dataVariableSpeedCoils->SourceSideInletTemp);
6704 : // Get capacity modifying factor (function of mass flow) for off-rated conditions
6705 : TOTCAPAirFFModFac =
6706 0 : Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(SpeedCal), AirMassFlowRatio);
6707 : // Get capacity modifying factor (function of mass flow) for off-rated conditions
6708 : TOTCAPWaterFFModFac =
6709 0 : Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(SpeedCal), WaterMassFlowRatio);
6710 :
6711 0 : OperatingHeatingCapacity = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal) * TOTCAPTempModFac *
6712 : TOTCAPAirFFModFac * TOTCAPWaterFFModFac;
6713 :
6714 0 : state.dataVariableSpeedCoils->Winput = OperatingHeatingCapacity / COP;
6715 0 : OperatingHeatingPower = state.dataVariableSpeedCoils->Winput;
6716 :
6717 0 : OperatingHeatingCOP = COP;
6718 0 : PumpHeatToWater = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower *
6719 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpFracToWater;
6720 0 : TankHeatingCOP = OperatingHeatingCOP;
6721 :
6722 : // account for pump heat if not included in total water heating capacity
6723 0 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondPumpHeatInCapacity) {
6724 0 : TotalTankHeatingCapacity = OperatingHeatingCapacity;
6725 : } else {
6726 0 : TotalTankHeatingCapacity = OperatingHeatingCapacity + PumpHeatToWater;
6727 : }
6728 :
6729 : // calculate evaporator total cooling capacity
6730 0 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FanPowerIncludedInCOP) {
6731 0 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondPumpPowerInCOP) {
6732 : // make sure fan power is full load fan power, it isn't though,
6733 0 : CompressorPower = OperatingHeatingPower - locFanElecPower / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac -
6734 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower;
6735 0 : if (OperatingHeatingPower > 0.0) TankHeatingCOP = TotalTankHeatingCapacity / OperatingHeatingPower;
6736 : } else {
6737 0 : CompressorPower = OperatingHeatingPower - locFanElecPower / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac;
6738 0 : if ((OperatingHeatingPower + state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower) > 0.0)
6739 0 : TankHeatingCOP = TotalTankHeatingCapacity /
6740 0 : (OperatingHeatingPower + state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower);
6741 : }
6742 : } else {
6743 0 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondPumpPowerInCOP) {
6744 : // make sure fan power is full load fan power
6745 0 : CompressorPower = OperatingHeatingPower - state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower;
6746 0 : if ((OperatingHeatingPower + locFanElecPower / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac) > 0.0)
6747 0 : TankHeatingCOP = TotalTankHeatingCapacity /
6748 0 : (OperatingHeatingPower + locFanElecPower / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac);
6749 : } else {
6750 0 : CompressorPower = OperatingHeatingPower;
6751 0 : if ((OperatingHeatingPower + locFanElecPower / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac +
6752 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower) > 0.0)
6753 0 : TankHeatingCOP = TotalTankHeatingCapacity /
6754 0 : (OperatingHeatingPower + locFanElecPower / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac +
6755 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower);
6756 : }
6757 : }
6758 :
6759 0 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondPumpHeatInCapacity) {
6760 0 : EvapCoolingCapacity = TotalTankHeatingCapacity - PumpHeatToWater - CompressorPower;
6761 : } else {
6762 0 : EvapCoolingCapacity = TotalTankHeatingCapacity - CompressorPower;
6763 : }
6764 :
6765 0 : CBFSpeed = DXCoils::AdjustCBF(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCBF(SpeedCal),
6766 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirMassFlowRate(SpeedCal),
6767 0 : state.dataVariableSpeedCoils->LoadSideMassFlowRate);
6768 :
6769 : } else {
6770 0 : AirMassFlowRatio =
6771 0 : state.dataVariableSpeedCoils->LoadSideMassFlowRate / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirMassFlowRate;
6772 0 : WaterMassFlowRatio =
6773 0 : state.dataVariableSpeedCoils->SourceSideMassFlowRate / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterMassFlowRate;
6774 0 : AoEff = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEffectiveAo(SpeedCal) * SpeedRatio +
6775 0 : (1.0 - SpeedRatio) * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEffectiveAo(SpeedCal - 1);
6776 0 : CBFSpeed = std::exp(-AoEff / state.dataVariableSpeedCoils->LoadSideMassFlowRate);
6777 :
6778 : // calculate low speed
6779 0 : SpeedCal = SpeedNum - 1;
6780 :
6781 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower =
6782 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWHPumpPower(SpeedCal);
6783 0 : COPTempModFac = Curve::CurveValue(state,
6784 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(SpeedCal),
6785 : InletAirTemp,
6786 0 : state.dataVariableSpeedCoils->SourceSideInletTemp);
6787 : COPAirFFModFac =
6788 0 : Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(SpeedCal), AirMassFlowRatio);
6789 : COPWaterFFModFac =
6790 0 : Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(SpeedCal), WaterMassFlowRatio);
6791 :
6792 0 : COP = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(SpeedCal) * COPTempModFac * COPAirFFModFac * COPWaterFFModFac;
6793 :
6794 0 : TOTCAPTempModFac = Curve::CurveValue(state,
6795 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(SpeedCal),
6796 : InletAirTemp,
6797 0 : state.dataVariableSpeedCoils->SourceSideInletTemp);
6798 : // Get capacity modifying factor (function of mass flow) for off-rated conditions
6799 : TOTCAPAirFFModFac =
6800 0 : Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(SpeedCal), AirMassFlowRatio);
6801 : // Get capacity modifying factor (function of mass flow) for off-rated conditions
6802 : TOTCAPWaterFFModFac =
6803 0 : Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(SpeedCal), WaterMassFlowRatio);
6804 :
6805 0 : OperatingHeatingCapacity = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal) * TOTCAPTempModFac *
6806 : TOTCAPAirFFModFac * TOTCAPWaterFFModFac;
6807 :
6808 0 : state.dataVariableSpeedCoils->Winput = OperatingHeatingCapacity / COP;
6809 0 : Winput1 = state.dataVariableSpeedCoils->Winput;
6810 0 : WHCAP1 = OperatingHeatingCapacity;
6811 :
6812 : // calculate upper speed
6813 0 : SpeedCal = SpeedNum;
6814 :
6815 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower =
6816 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWHPumpPower(SpeedCal);
6817 0 : COPTempModFac = Curve::CurveValue(state,
6818 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(SpeedCal),
6819 : InletAirTemp,
6820 0 : state.dataVariableSpeedCoils->SourceSideInletTemp);
6821 : COPAirFFModFac =
6822 0 : Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(SpeedCal), AirMassFlowRatio);
6823 : COPWaterFFModFac =
6824 0 : Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(SpeedCal), WaterMassFlowRatio);
6825 :
6826 0 : COP = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(SpeedCal) * COPTempModFac * COPAirFFModFac * COPWaterFFModFac;
6827 :
6828 0 : TOTCAPTempModFac = Curve::CurveValue(state,
6829 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(SpeedCal),
6830 : InletAirTemp,
6831 0 : state.dataVariableSpeedCoils->SourceSideInletTemp);
6832 : // Get capacity modifying factor (function of mass flow) for off-rated conditions
6833 : TOTCAPAirFFModFac =
6834 0 : Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(SpeedCal), AirMassFlowRatio);
6835 : // Get capacity modifying factor (function of mass flow) for off-rated conditions
6836 : TOTCAPWaterFFModFac =
6837 0 : Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(SpeedCal), WaterMassFlowRatio);
6838 :
6839 0 : OperatingHeatingCapacity = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal) * TOTCAPTempModFac *
6840 : TOTCAPAirFFModFac * TOTCAPWaterFFModFac;
6841 :
6842 0 : Winput2 = OperatingHeatingCapacity / COP;
6843 0 : WHCAP2 = OperatingHeatingCapacity;
6844 :
6845 : // interpolation
6846 0 : state.dataVariableSpeedCoils->Winput = Winput2 * SpeedRatio + (1.0 - SpeedRatio) * Winput1;
6847 0 : OperatingHeatingPower = state.dataVariableSpeedCoils->Winput;
6848 0 : OperatingHeatingCapacity = WHCAP2 * SpeedRatio + (1.0 - SpeedRatio) * WHCAP1;
6849 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower =
6850 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWHPumpPower(SpeedNum) * SpeedRatio +
6851 0 : (1.0 - SpeedRatio) * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWHPumpPower(SpeedNum - 1);
6852 :
6853 0 : OperatingHeatingCOP = OperatingHeatingCapacity / OperatingHeatingPower;
6854 0 : TankHeatingCOP = OperatingHeatingCOP;
6855 :
6856 0 : PumpHeatToWater = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower *
6857 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpFracToWater;
6858 :
6859 : // account for pump heat if not included in total water heating capacity
6860 0 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondPumpHeatInCapacity) {
6861 0 : TotalTankHeatingCapacity = OperatingHeatingCapacity;
6862 : } else {
6863 0 : TotalTankHeatingCapacity = OperatingHeatingCapacity + PumpHeatToWater;
6864 : }
6865 :
6866 0 : Real64 HPRTF = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac;
6867 : // calculate evaporator total cooling capacity
6868 0 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FanPowerIncludedInCOP) {
6869 0 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondPumpPowerInCOP) {
6870 : // make sure fan power is full load fan power
6871 0 : CompressorPower = OperatingHeatingPower - locFanElecPower / HPRTF -
6872 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower;
6873 0 : if (OperatingHeatingPower > 0.0) TankHeatingCOP = TotalTankHeatingCapacity / OperatingHeatingPower;
6874 : } else {
6875 0 : CompressorPower = OperatingHeatingPower - locFanElecPower / HPRTF;
6876 0 : if ((OperatingHeatingPower + state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower) > 0.0)
6877 0 : TankHeatingCOP = TotalTankHeatingCapacity /
6878 0 : (OperatingHeatingPower + state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower);
6879 : }
6880 : } else {
6881 0 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondPumpPowerInCOP) {
6882 : // make sure fan power is full load fan power
6883 0 : CompressorPower = OperatingHeatingPower - state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower;
6884 0 : if ((OperatingHeatingPower + locFanElecPower / HPRTF) > 0.0)
6885 0 : TankHeatingCOP = TotalTankHeatingCapacity / (OperatingHeatingPower + locFanElecPower / HPRTF);
6886 : } else {
6887 0 : CompressorPower = OperatingHeatingPower;
6888 0 : if ((OperatingHeatingPower + locFanElecPower / HPRTF +
6889 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower) > 0.0)
6890 0 : TankHeatingCOP = TotalTankHeatingCapacity / (OperatingHeatingPower + locFanElecPower / HPRTF +
6891 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower);
6892 : }
6893 : }
6894 :
6895 0 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondPumpHeatInCapacity) {
6896 0 : EvapCoolingCapacity = TotalTankHeatingCapacity - PumpHeatToWater - CompressorPower;
6897 : } else {
6898 0 : EvapCoolingCapacity = TotalTankHeatingCapacity - CompressorPower;
6899 : }
6900 : }
6901 :
6902 0 : state.dataVariableSpeedCoils->QSource = TotalTankHeatingCapacity;
6903 0 : state.dataVariableSpeedCoils->QLoadTotal = EvapCoolingCapacity;
6904 0 : state.dataHVACGlobal->DXCoilTotalCapacity = EvapCoolingCapacity; // for standard rating calculation
6905 0 : SHR = 1.0;
6906 : // if indoor, calculate SHR
6907 0 : if (EvapInletNode != 0) {
6908 0 : if (CBFSpeed > 0.999) CBFSpeed = 0.999;
6909 :
6910 0 : if (CBFSpeed < 0.001) {
6911 0 : SHR = 1.0;
6912 : } else {
6913 0 : hDelta = state.dataVariableSpeedCoils->QLoadTotal / state.dataVariableSpeedCoils->LoadSideMassFlowRate;
6914 0 : hADP = state.dataVariableSpeedCoils->LoadSideInletEnth - hDelta / (1.0 - CBFSpeed);
6915 0 : tADP = Psychrometrics::PsyTsatFnHPb(state, hADP, LoadPressure, RoutineName);
6916 0 : wADP = Psychrometrics::PsyWFnTdbH(state, tADP, hADP, RoutineName);
6917 0 : hTinwADP = Psychrometrics::PsyHFnTdbW(state.dataVariableSpeedCoils->LoadSideInletDBTemp, wADP);
6918 0 : if ((state.dataVariableSpeedCoils->LoadSideInletEnth - hADP) > 1.e-10) {
6919 0 : SHR = min((hTinwADP - hADP) / (state.dataVariableSpeedCoils->LoadSideInletEnth - hADP), 1.0);
6920 : } else {
6921 0 : SHR = 1.0;
6922 : }
6923 : }
6924 : }
6925 :
6926 0 : state.dataVariableSpeedCoils->QSensible = state.dataVariableSpeedCoils->QLoadTotal * SHR;
6927 :
6928 : // determine condenser water inlet/outlet condition at full capacity
6929 0 : if (CondInletMassFlowRate == 0.0) {
6930 0 : OutletWaterTemp = InletWaterTemp;
6931 : } else {
6932 0 : OutletWaterTemp = InletWaterTemp + TotalTankHeatingCapacity / (CpWater * CondInletMassFlowRate);
6933 : }
6934 :
6935 0 : state.dataLoopNodes->Node(CondOutletNode).Temp = OutletWaterTemp;
6936 :
6937 0 : state.dataLoopNodes->Node(CondOutletNode).MassFlowRate = state.dataLoopNodes->Node(CondInletNode).MassFlowRate;
6938 :
6939 : // send heating capacity and COP to water heater module for standards rating calculation
6940 : // total heating capacity including condenser pump
6941 0 : state.dataVariableSpeedCoils->VSHPWHHeatingCapacity = TotalTankHeatingCapacity;
6942 : // total heating COP including compressor, fan, and condenser pump
6943 0 : state.dataVariableSpeedCoils->VSHPWHHeatingCOP = TankHeatingCOP;
6944 :
6945 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).TotalHeatingEnergyRate = TotalTankHeatingCapacity * PartLoadRatio;
6946 : // calculate total compressor plus condenser pump power, fan power reported in fan module
6947 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).ElecWaterHeatingPower =
6948 0 : (CompressorPower + state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower) *
6949 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac;
6950 :
6951 : // pass the outputs for the cooling coil section
6952 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterPower = 0.0;
6953 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterPower =
6954 0 : CrankcaseHeatingPower * (1.0 - state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac);
6955 :
6956 : // calculate coil outlet state variables
6957 0 : state.dataVariableSpeedCoils->LoadSideOutletEnth =
6958 0 : state.dataVariableSpeedCoils->LoadSideInletEnth -
6959 0 : state.dataVariableSpeedCoils->QLoadTotal / state.dataVariableSpeedCoils->LoadSideMassFlowRate;
6960 0 : CpAir = Psychrometrics::PsyCpAirFnW(state.dataVariableSpeedCoils->LoadSideInletHumRat);
6961 0 : state.dataVariableSpeedCoils->LoadSideOutletDBTemp =
6962 0 : state.dataVariableSpeedCoils->LoadSideInletDBTemp -
6963 0 : state.dataVariableSpeedCoils->QSensible / (state.dataVariableSpeedCoils->LoadSideMassFlowRate * CpAir);
6964 :
6965 0 : MaxHumRat = Psychrometrics::PsyWFnTdbRhPb(state,
6966 0 : state.dataVariableSpeedCoils->LoadSideOutletDBTemp,
6967 : 0.9999,
6968 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirPressure,
6969 : RoutineName);
6970 0 : MaxOutletEnth = Psychrometrics::PsyHFnTdbW(state.dataVariableSpeedCoils->LoadSideOutletDBTemp, MaxHumRat);
6971 0 : if (state.dataVariableSpeedCoils->LoadSideOutletEnth > MaxOutletEnth) {
6972 0 : state.dataVariableSpeedCoils->LoadSideOutletEnth = MaxOutletEnth;
6973 : }
6974 0 : state.dataVariableSpeedCoils->LoadSideOutletHumRat = Psychrometrics::PsyWFnTdbH(
6975 0 : state, state.dataVariableSpeedCoils->LoadSideOutletDBTemp, state.dataVariableSpeedCoils->LoadSideOutletEnth, RoutineName);
6976 0 : if (state.dataVariableSpeedCoils->LoadSideOutletHumRat > MaxHumRat) {
6977 0 : state.dataVariableSpeedCoils->LoadSideOutletHumRat = MaxHumRat;
6978 : }
6979 :
6980 : // Actual outlet conditions are "average" for time step
6981 0 : if (fanOp == HVAC::FanOp::Continuous) {
6982 : // continuous fan, cycling compressor
6983 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirEnthalpy =
6984 0 : PartLoadRatio * state.dataVariableSpeedCoils->LoadSideOutletEnth +
6985 0 : (1.0 - PartLoadRatio) * state.dataVariableSpeedCoils->LoadSideInletEnth;
6986 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat =
6987 0 : PartLoadRatio * state.dataVariableSpeedCoils->LoadSideOutletHumRat +
6988 0 : (1.0 - PartLoadRatio) * state.dataVariableSpeedCoils->LoadSideInletHumRat;
6989 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp =
6990 0 : Psychrometrics::PsyTdbFnHW(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirEnthalpy,
6991 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat);
6992 0 : state.dataVariableSpeedCoils->PLRCorrLoadSideMdot = state.dataVariableSpeedCoils->LoadSideMassFlowRate;
6993 : } else {
6994 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirEnthalpy = state.dataVariableSpeedCoils->LoadSideOutletEnth;
6995 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat = state.dataVariableSpeedCoils->LoadSideOutletHumRat;
6996 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp = state.dataVariableSpeedCoils->LoadSideOutletDBTemp;
6997 0 : state.dataVariableSpeedCoils->PLRCorrLoadSideMdot = state.dataVariableSpeedCoils->LoadSideMassFlowRate * PartLoadRatio;
6998 : }
6999 :
7000 : // scale heat transfer rates to PLR and power to RTF
7001 0 : state.dataVariableSpeedCoils->QLoadTotal *= PartLoadRatio;
7002 0 : state.dataVariableSpeedCoils->QSensible *= PartLoadRatio;
7003 : // count the powr separately
7004 0 : state.dataVariableSpeedCoils->Winput *=
7005 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac; //+ VarSpeedCoil(DXCoilNum)%CrankcaseHeaterPower &
7006 : //+ VarSpeedCoil(DXCoilNum)%BasinHeaterPower + VarSpeedCoil(DXCoilNum)%EvapCondPumpElecPower
7007 0 : state.dataVariableSpeedCoils->QSource *= PartLoadRatio;
7008 :
7009 : // Update heat pump data structure
7010 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower =
7011 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower *
7012 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac; // water heating pump power
7013 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Power = state.dataVariableSpeedCoils->Winput;
7014 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal = state.dataVariableSpeedCoils->QLoadTotal;
7015 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible = state.dataVariableSpeedCoils->QSensible;
7016 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLatent =
7017 0 : state.dataVariableSpeedCoils->QLoadTotal - state.dataVariableSpeedCoils->QSensible;
7018 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSource = state.dataVariableSpeedCoils->QSource;
7019 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Energy = state.dataVariableSpeedCoils->Winput * TimeStepSysSec;
7020 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLoadTotal = state.dataVariableSpeedCoils->QLoadTotal * TimeStepSysSec;
7021 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySensible = state.dataVariableSpeedCoils->QSensible * TimeStepSysSec;
7022 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLatent =
7023 0 : (state.dataVariableSpeedCoils->QLoadTotal - state.dataVariableSpeedCoils->QSensible) * TimeStepSysSec;
7024 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySource = state.dataVariableSpeedCoils->QSource * TimeStepSysSec;
7025 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterConsumption =
7026 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterPower * TimeStepSysSec;
7027 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterConsump = 0.0;
7028 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterConsumption = 0.0;
7029 : // re-use EvapCondPumpElecConsumption to store WH pump energy consumption
7030 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondPumpElecConsumption =
7031 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower * TimeStepSysSec;
7032 0 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac == 0.0) {
7033 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).COP = 0.0;
7034 : } else {
7035 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).COP =
7036 0 : state.dataVariableSpeedCoils->QLoadTotal / state.dataVariableSpeedCoils->Winput;
7037 : }
7038 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio = PartLoadRatio;
7039 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate = state.dataVariableSpeedCoils->PLRCorrLoadSideMdot;
7040 0 : rhoair = Psychrometrics::PsyRhoAirFnPbTdbW(state,
7041 0 : state.dataEnvrn->OutBaroPress,
7042 0 : state.dataVariableSpeedCoils->LoadSideInletDBTemp,
7043 0 : state.dataVariableSpeedCoils->LoadSideInletHumRat,
7044 : RoutineName);
7045 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirVolFlowRate =
7046 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate / rhoair;
7047 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate = state.dataVariableSpeedCoils->SourceSideMassFlowRate;
7048 0 : RhoWater = Psychrometrics::RhoH2O(InletWaterTemp); // initialize
7049 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterVolFlowRate =
7050 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate / RhoWater;
7051 :
7052 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterTemp =
7053 0 : state.dataVariableSpeedCoils->SourceSideInletTemp +
7054 0 : state.dataVariableSpeedCoils->QSource / (state.dataVariableSpeedCoils->SourceSideMassFlowRate * CpWater);
7055 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterEnthalpy =
7056 0 : state.dataVariableSpeedCoils->SourceSideInletEnth +
7057 0 : state.dataVariableSpeedCoils->QSource / state.dataVariableSpeedCoils->SourceSideMassFlowRate;
7058 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QWasteHeat = 0.0;
7059 :
7060 0 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).bIsDesuperheater) // desuperheater doesn't save power and cooling energy variables
7061 : {
7062 : // source side is the water side; load side is the air side
7063 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Power = 0.0;
7064 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal = 0.0;
7065 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible = 0.0;
7066 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLatent = 0.0;
7067 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Energy = 0.0;
7068 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLoadTotal = 0.0;
7069 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySensible = 0.0;
7070 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLatent = 0.0;
7071 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterConsumption = 0.0;
7072 : }
7073 : }
7074 :
7075 0 : void setVarSpeedHPWHFanType(EnergyPlusData &state, int const dXCoilNum, HVAC::FanType fanType)
7076 : {
7077 0 : state.dataVariableSpeedCoils->VarSpeedCoil(dXCoilNum).supplyFanType = fanType;
7078 0 : }
7079 :
7080 0 : void setVarSpeedHPWHFanIndex(EnergyPlusData &state, int const dXCoilNum, int const fanIndex)
7081 : {
7082 0 : state.dataVariableSpeedCoils->VarSpeedCoil(dXCoilNum).SupplyFanIndex = fanIndex;
7083 0 : }
7084 :
7085 33673 : void CalcVarSpeedCoilHeating(EnergyPlusData &state,
7086 : int const DXCoilNum, // Heat Pump Number
7087 : HVAC::FanOp const fanOp, // Fan/Compressor cycling scheme indicator
7088 : [[maybe_unused]] Real64 const SensDemand, // Cooling Sensible Demand [W] !unused1208
7089 : HVAC::CompressorOp const compressorOp, // compressor operation flag
7090 : Real64 const PartLoadRatio, // compressor part load ratio
7091 : [[maybe_unused]] Real64 const OnOffAirFlowRatio, // ratio of compressor on flow to average flow over time step
7092 : Real64 const SpeedRatio, // SpeedRatio varies between 1.0 (higher speed) and 0.0 (lower speed)
7093 : int const SpeedNum // Speed number, high bound, i.e. SpeedNum - 1 is the other side
7094 : )
7095 : {
7096 :
7097 : // AUTHOR Bo Shen, based on WaterToAirHeatPumpSimple:CalcHPHeatingSimple
7098 : // DATE WRITTEN March 2012
7099 :
7100 : // PURPOSE OF THIS SUBROUTINE:
7101 : // This subroutine is for simulating the heating mode of the Variable Speed Water to Air HP Simple
7102 :
7103 : // METHODOLOGY EMPLOYED:
7104 : // Simulate the heat pump performance using the coefficients and rated conditions
7105 : // Finally, adjust the heat pump outlet conditions based on the PartLoadRatio
7106 : // and RuntimeFrac.
7107 :
7108 : // SUBROUTINE PARAMETER DEFINITIONS:
7109 : static constexpr std::string_view RoutineName("CalcVarSpeedCoilHeating");
7110 : static constexpr std::string_view RoutineNameSourceSideInletTemp("CalcVarSpeedCoilHeating:SourceSideInletTemp");
7111 33673 : Real64 TimeStepSysSec = state.dataHVACGlobal->TimeStepSysSec;
7112 :
7113 : // SUBROUTINE LOCAL VARIABLE DECLARATIONS:
7114 : Real64 CpSource; // Specific heat of water [J/kg_C]
7115 : Real64 AirMassFlowRatio; // airflow ratio at low speed
7116 : Real64 WaterMassFlowRatio; // airflow ratio at high speed
7117 : Real64 TotCapAirFFModFac; // air flow fraction modification
7118 : Real64 TotCapWaterFFModFac; // water flow fraction modification
7119 : Real64 TotCapTempModFac; // total capacity temperature correction fraction
7120 : Real64 EIRAirFFModFac; // air flow fraction modification
7121 : Real64 EIRWaterFFModFac; // water flow fraction modification
7122 : Real64 EIRTempModFac; // total capacity temperature correction fraction
7123 : Real64 EIR; // total capacity temperature correction fraction
7124 : int SpeedCal; // calculated speed level
7125 : Real64 QLoadTotal1; // heating capacity at low speed
7126 : Real64 QLoadTotal2; // heating capacity at high speed
7127 : Real64 Winput1; // power consumption at low speed
7128 : Real64 Winput2; // power consumption at high speed
7129 : Real64 QWasteHeat; // recoverable waste heat
7130 : Real64 QWasteHeat1; // recoverable waste heat at low speed
7131 : Real64 QWasteHeat2; // recoverable waste heat at high speed
7132 : Real64 PLF; // part-load function
7133 33673 : Real64 rhoair(0.0); // entering air density
7134 :
7135 : // ADDED VARIABLES FOR air source coil
7136 33673 : int MaxSpeed = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds;
7137 :
7138 : // LOAD LOCAL VARIABLES FROM DATA STRUCTURE (for code readability)
7139 33673 : if (!(fanOp == HVAC::FanOp::Continuous) && PartLoadRatio > 0.0) {
7140 17652 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate =
7141 17652 : state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirInletNodeNum).MassFlowRate / PartLoadRatio;
7142 : }
7143 :
7144 33673 : state.dataVariableSpeedCoils->LoadSideMassFlowRate = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate;
7145 33673 : state.dataVariableSpeedCoils->LoadSideInletDBTemp = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp;
7146 33673 : state.dataVariableSpeedCoils->LoadSideInletHumRat = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat;
7147 :
7148 33673 : state.dataVariableSpeedCoils->LoadSideInletWBTemp = Psychrometrics::PsyTwbFnTdbWPb(state,
7149 33673 : state.dataVariableSpeedCoils->LoadSideInletDBTemp,
7150 33673 : state.dataVariableSpeedCoils->LoadSideInletHumRat,
7151 33673 : state.dataEnvrn->OutBaroPress,
7152 : RoutineName);
7153 33673 : state.dataVariableSpeedCoils->LoadSideInletEnth = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirEnthalpy;
7154 33673 : Real64 CpAir = Psychrometrics::PsyCpAirFnW(state.dataVariableSpeedCoils->LoadSideInletHumRat); // Specific heat of air [J/kg_C]
7155 :
7156 33673 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
7157 : // Get condenser outdoor node info from DX Heating Coil
7158 36 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum != 0) {
7159 0 : state.dataVariableSpeedCoils->OutdoorDryBulb =
7160 0 : state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).Temp;
7161 0 : state.dataVariableSpeedCoils->OutdoorHumRat =
7162 0 : state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).HumRat;
7163 0 : state.dataVariableSpeedCoils->OutdoorPressure =
7164 0 : state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).Press;
7165 0 : state.dataVariableSpeedCoils->OutdoorWetBulb =
7166 0 : state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).OutAirWetBulb;
7167 : } else {
7168 36 : state.dataVariableSpeedCoils->OutdoorDryBulb = state.dataEnvrn->OutDryBulbTemp;
7169 36 : state.dataVariableSpeedCoils->OutdoorHumRat = state.dataEnvrn->OutHumRat;
7170 36 : state.dataVariableSpeedCoils->OutdoorPressure = state.dataEnvrn->OutBaroPress;
7171 36 : state.dataVariableSpeedCoils->OutdoorWetBulb = state.dataEnvrn->OutWetBulbTemp;
7172 : }
7173 36 : state.dataVariableSpeedCoils->SourceSideMassFlowRate = 1.0; // not used and avoid divided by zero
7174 36 : state.dataVariableSpeedCoils->SourceSideInletTemp = state.dataVariableSpeedCoils->OutdoorDryBulb;
7175 36 : state.dataVariableSpeedCoils->SourceSideInletEnth =
7176 36 : Psychrometrics::PsyHFnTdbW(state.dataVariableSpeedCoils->OutdoorDryBulb, state.dataVariableSpeedCoils->OutdoorHumRat);
7177 36 : CpSource = Psychrometrics::PsyCpAirFnW(state.dataEnvrn->OutHumRat);
7178 :
7179 : // Initialize crankcase heater, operates below OAT defined in input deck for HP DX heating coil
7180 36 : if (state.dataVariableSpeedCoils->OutdoorDryBulb < state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxOATCrankcaseHeater) {
7181 33 : state.dataVariableSpeedCoils->CrankcaseHeatingPower = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacity;
7182 33 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex > 0) {
7183 1 : state.dataVariableSpeedCoils->CrankcaseHeatingPower *=
7184 1 : Curve::CurveValue(state,
7185 1 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex,
7186 1 : state.dataEnvrn->OutDryBulbTemp);
7187 : }
7188 : } else {
7189 3 : state.dataVariableSpeedCoils->CrankcaseHeatingPower = 0.0;
7190 : }
7191 : } else {
7192 33637 : state.dataVariableSpeedCoils->SourceSideMassFlowRate = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate;
7193 33637 : state.dataVariableSpeedCoils->SourceSideInletTemp = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp;
7194 33637 : state.dataVariableSpeedCoils->SourceSideInletEnth = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterEnthalpy;
7195 33637 : CpSource = state.dataPlnt->PlantLoop(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).plantLoc.loopNum)
7196 33637 : .glycol->getSpecificHeat(state, state.dataVariableSpeedCoils->SourceSideInletTemp, RoutineNameSourceSideInletTemp);
7197 : }
7198 :
7199 : // Check for flows, do not perform simulation if no flow in load side or source side.
7200 33673 : if ((state.dataVariableSpeedCoils->SourceSideMassFlowRate <= 0.0) || (state.dataVariableSpeedCoils->LoadSideMassFlowRate <= 0.0)) {
7201 16038 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SimFlag = false;
7202 16038 : return;
7203 : } else {
7204 17635 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SimFlag = true;
7205 : }
7206 :
7207 17659 : if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) &&
7208 24 : (state.dataVariableSpeedCoils->OutdoorDryBulb < state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MinOATCompressor)) {
7209 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SimFlag = false;
7210 0 : return;
7211 : }
7212 :
7213 17635 : if (compressorOp == HVAC::CompressorOp::Off) {
7214 1 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SimFlag = false;
7215 1 : return;
7216 : }
7217 :
7218 17634 : if (SpeedNum > MaxSpeed) {
7219 0 : SpeedCal = MaxSpeed;
7220 : } else {
7221 17634 : SpeedCal = SpeedNum;
7222 : }
7223 :
7224 17634 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = 1.0;
7225 17634 : state.dataHVACGlobal->OnOffFanPartLoadFraction = 1.0;
7226 17634 : if ((SpeedNum == 1) && (PartLoadRatio < 1.0)) {
7227 39 : PLF = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR, PartLoadRatio);
7228 39 : if (PLF < 0.7) {
7229 0 : PLF = 0.7;
7230 : }
7231 39 : if (fanOp == HVAC::FanOp::Cycling)
7232 32 : state.dataHVACGlobal->OnOffFanPartLoadFraction =
7233 : PLF; // save PLF for fan model, don't change fan power for constant fan mode if coil is off
7234 : // calculate the run time fraction
7235 39 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = PartLoadRatio / PLF;
7236 39 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio = PartLoadRatio;
7237 :
7238 39 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac > 1.0) {
7239 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = 1.0; // Reset coil runtime fraction to 1.0
7240 39 : } else if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac < 0.0) {
7241 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = 0.0;
7242 : }
7243 : }
7244 :
7245 17634 : if ((SpeedNum == 1) || (SpeedNum > MaxSpeed) || (SpeedRatio == 1.0)) {
7246 12217 : AirMassFlowRatio =
7247 12217 : state.dataVariableSpeedCoils->LoadSideMassFlowRate / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirMassFlowRate;
7248 :
7249 12217 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
7250 18 : WaterMassFlowRatio = 1.0;
7251 : } else {
7252 12199 : WaterMassFlowRatio = state.dataVariableSpeedCoils->SourceSideMassFlowRate /
7253 12199 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterMassFlowRate;
7254 : }
7255 :
7256 48868 : TotCapTempModFac = Curve::CurveValue(state,
7257 12217 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(SpeedCal),
7258 12217 : state.dataVariableSpeedCoils->LoadSideInletDBTemp,
7259 12217 : state.dataVariableSpeedCoils->SourceSideInletTemp);
7260 : TotCapAirFFModFac =
7261 12217 : Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(SpeedCal), AirMassFlowRatio);
7262 :
7263 12217 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
7264 18 : TotCapWaterFFModFac = 1.0;
7265 : } else {
7266 : TotCapWaterFFModFac =
7267 12199 : Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(SpeedCal), WaterMassFlowRatio);
7268 : }
7269 :
7270 12217 : state.dataVariableSpeedCoils->QLoadTotal = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal) *
7271 12217 : TotCapTempModFac * TotCapAirFFModFac * TotCapWaterFFModFac;
7272 12217 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).capModFacTotal = TotCapTempModFac * TotCapAirFFModFac * TotCapWaterFFModFac;
7273 24434 : state.dataVariableSpeedCoils->TotRatedCapacity =
7274 12217 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal); // for defrosting power cal
7275 :
7276 48868 : EIRTempModFac = Curve::CurveValue(state,
7277 12217 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(SpeedCal),
7278 12217 : state.dataVariableSpeedCoils->LoadSideInletDBTemp,
7279 12217 : state.dataVariableSpeedCoils->SourceSideInletTemp);
7280 : EIRAirFFModFac =
7281 12217 : Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(SpeedCal), AirMassFlowRatio);
7282 :
7283 12217 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
7284 18 : EIRWaterFFModFac = 1.0;
7285 : } else {
7286 : EIRWaterFFModFac =
7287 12199 : Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(SpeedCal), WaterMassFlowRatio);
7288 : }
7289 :
7290 12217 : EIR = (1.0 / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(SpeedCal)) * EIRTempModFac * EIRAirFFModFac *
7291 : EIRWaterFFModFac;
7292 12217 : state.dataVariableSpeedCoils->Winput = state.dataVariableSpeedCoils->QLoadTotal * EIR;
7293 :
7294 24434 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
7295 18 : QWasteHeat = 0.0;
7296 : } else {
7297 12199 : QWasteHeat = state.dataVariableSpeedCoils->Winput * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeatFrac(SpeedCal);
7298 12199 : QWasteHeat *= Curve::CurveValue(state,
7299 12199 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(SpeedCal),
7300 12199 : state.dataVariableSpeedCoils->LoadSideInletDBTemp,
7301 12199 : state.dataVariableSpeedCoils->SourceSideInletTemp);
7302 : }
7303 :
7304 : } else {
7305 5417 : AirMassFlowRatio =
7306 5417 : state.dataVariableSpeedCoils->LoadSideMassFlowRate / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirMassFlowRate;
7307 :
7308 5417 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
7309 5 : WaterMassFlowRatio = 1.0;
7310 : } else {
7311 5412 : WaterMassFlowRatio = state.dataVariableSpeedCoils->SourceSideMassFlowRate /
7312 5412 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterMassFlowRate;
7313 : }
7314 :
7315 5417 : SpeedCal = SpeedNum - 1;
7316 21668 : TotCapTempModFac = Curve::CurveValue(state,
7317 5417 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(SpeedCal),
7318 5417 : state.dataVariableSpeedCoils->LoadSideInletDBTemp,
7319 5417 : state.dataVariableSpeedCoils->SourceSideInletTemp);
7320 : TotCapAirFFModFac =
7321 5417 : Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(SpeedCal), AirMassFlowRatio);
7322 :
7323 5417 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
7324 5 : TotCapWaterFFModFac = 1.0;
7325 : } else {
7326 : TotCapWaterFFModFac =
7327 5412 : Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(SpeedCal), WaterMassFlowRatio);
7328 : }
7329 :
7330 5417 : QLoadTotal1 = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal) * TotCapTempModFac * TotCapAirFFModFac *
7331 : TotCapWaterFFModFac;
7332 :
7333 21668 : EIRTempModFac = Curve::CurveValue(state,
7334 5417 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(SpeedCal),
7335 5417 : state.dataVariableSpeedCoils->LoadSideInletDBTemp,
7336 5417 : state.dataVariableSpeedCoils->SourceSideInletTemp);
7337 : EIRAirFFModFac =
7338 5417 : Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(SpeedCal), AirMassFlowRatio);
7339 :
7340 5417 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
7341 5 : EIRWaterFFModFac = 1.0;
7342 : } else {
7343 : EIRWaterFFModFac =
7344 5412 : Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(SpeedCal), WaterMassFlowRatio);
7345 : }
7346 :
7347 5417 : EIR = (1.0 / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(SpeedCal)) * EIRTempModFac * EIRAirFFModFac *
7348 : EIRWaterFFModFac;
7349 5417 : Winput1 = QLoadTotal1 * EIR;
7350 :
7351 5417 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
7352 5 : QWasteHeat1 = 0.0;
7353 : } else {
7354 5412 : QWasteHeat1 = Winput1 * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeatFrac(SpeedCal);
7355 5412 : QWasteHeat1 *= Curve::CurveValue(state,
7356 5412 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(SpeedCal),
7357 5412 : state.dataVariableSpeedCoils->LoadSideInletDBTemp,
7358 5412 : state.dataVariableSpeedCoils->SourceSideInletTemp);
7359 : }
7360 :
7361 5417 : SpeedCal = SpeedNum;
7362 21668 : TotCapTempModFac = Curve::CurveValue(state,
7363 5417 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(SpeedCal),
7364 5417 : state.dataVariableSpeedCoils->LoadSideInletDBTemp,
7365 5417 : state.dataVariableSpeedCoils->SourceSideInletTemp);
7366 : TotCapAirFFModFac =
7367 5417 : Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(SpeedCal), AirMassFlowRatio);
7368 :
7369 5417 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
7370 5 : TotCapWaterFFModFac = 1.0;
7371 : } else {
7372 : TotCapWaterFFModFac =
7373 5412 : Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(SpeedCal), WaterMassFlowRatio);
7374 : }
7375 :
7376 5417 : QLoadTotal2 = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal) * TotCapTempModFac * TotCapAirFFModFac *
7377 : TotCapWaterFFModFac;
7378 :
7379 21668 : EIRTempModFac = Curve::CurveValue(state,
7380 5417 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(SpeedCal),
7381 5417 : state.dataVariableSpeedCoils->LoadSideInletDBTemp,
7382 5417 : state.dataVariableSpeedCoils->SourceSideInletTemp);
7383 : EIRAirFFModFac =
7384 5417 : Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(SpeedCal), AirMassFlowRatio);
7385 :
7386 5417 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
7387 5 : EIRWaterFFModFac = 1.0;
7388 : } else {
7389 : EIRWaterFFModFac =
7390 5412 : Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(SpeedCal), WaterMassFlowRatio);
7391 : }
7392 :
7393 5417 : EIR = (1.0 / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(SpeedCal)) * EIRTempModFac * EIRAirFFModFac *
7394 : EIRWaterFFModFac;
7395 5417 : Winput2 = QLoadTotal2 * EIR;
7396 :
7397 5417 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
7398 5 : QWasteHeat2 = 0.0;
7399 : } else {
7400 5412 : QWasteHeat2 = Winput2 * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeatFrac(SpeedCal);
7401 5412 : QWasteHeat2 *= Curve::CurveValue(state,
7402 5412 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(SpeedCal),
7403 5412 : state.dataVariableSpeedCoils->LoadSideInletDBTemp,
7404 5412 : state.dataVariableSpeedCoils->SourceSideInletTemp);
7405 : }
7406 :
7407 5417 : state.dataVariableSpeedCoils->QLoadTotal = QLoadTotal2 * SpeedRatio + (1.0 - SpeedRatio) * QLoadTotal1;
7408 5417 : state.dataVariableSpeedCoils->Winput = Winput2 * SpeedRatio + (1.0 - SpeedRatio) * Winput1;
7409 5417 : QWasteHeat = QWasteHeat2 * SpeedRatio + (1.0 - SpeedRatio) * QWasteHeat1;
7410 5417 : state.dataVariableSpeedCoils->TotRatedCapacity =
7411 5417 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal) * SpeedRatio +
7412 5417 : (1.0 - SpeedRatio) * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal - 1);
7413 : }
7414 :
7415 17634 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterPower = 0.0; // necessary to clear zero for water source coils
7416 17634 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostPower = 0.0; // clear the defrost power
7417 17634 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
7418 : // Calculating adjustment factors for defrost
7419 : // Calculate delta w through outdoor coil by assuming a coil temp of 0.82*DBT-9.7(F) per DOE2.1E
7420 23 : state.dataVariableSpeedCoils->OutdoorCoilT = 0.82 * state.dataVariableSpeedCoils->OutdoorDryBulb - 8.589;
7421 23 : state.dataVariableSpeedCoils->OutdoorCoildw =
7422 23 : max(1.0e-6,
7423 23 : (state.dataVariableSpeedCoils->OutdoorHumRat -
7424 23 : Psychrometrics::PsyWFnTdpPb(state, state.dataVariableSpeedCoils->OutdoorCoilT, state.dataVariableSpeedCoils->OutdoorPressure)));
7425 :
7426 : // Initializing defrost adjustment factors
7427 23 : state.dataVariableSpeedCoils->LoadDueToDefrost = 0.0;
7428 23 : state.dataVariableSpeedCoils->HeatingCapacityMultiplier = 1.0;
7429 23 : state.dataVariableSpeedCoils->FractionalDefrostTime = 0.0;
7430 23 : state.dataVariableSpeedCoils->InputPowerMultiplier = 1.0;
7431 : // Check outdoor temperature to determine of defrost is active
7432 23 : if (state.dataVariableSpeedCoils->OutdoorDryBulb <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxOATDefrost) {
7433 : // Calculate defrost adjustment factors depending on defrost control type
7434 19 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostControl == Timed) {
7435 12 : state.dataVariableSpeedCoils->FractionalDefrostTime = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostTime;
7436 12 : if (state.dataVariableSpeedCoils->FractionalDefrostTime > 0.0) {
7437 11 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingCapacityMultiplierEMSOverrideOn &&
7438 1 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingInputPowerMultiplierEMSOverrideOn) {
7439 2 : state.dataVariableSpeedCoils->HeatingCapacityMultiplier =
7440 1 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingCapacityMultiplierEMSOverrideValue;
7441 1 : state.dataVariableSpeedCoils->InputPowerMultiplier =
7442 1 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingInputPowerMultiplierEMSOverrideValue;
7443 : } else {
7444 9 : state.dataVariableSpeedCoils->HeatingCapacityMultiplier = 0.909 - 107.33 * state.dataVariableSpeedCoils->OutdoorCoildw;
7445 9 : state.dataVariableSpeedCoils->InputPowerMultiplier = 0.90 - 36.45 * state.dataVariableSpeedCoils->OutdoorCoildw;
7446 18 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingCapacityMultiplierEMSOverrideOn ||
7447 9 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingInputPowerMultiplierEMSOverrideOn) {
7448 0 : ShowWarningMessage(
7449 : state,
7450 0 : format("The Frost Heating Capacity Multiplier actuator and the Frost Heating Input Power Multiplier "
7451 : "actuator must be both provided for DX heating coil {}",
7452 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
7453 0 : ShowContinueError(state, "EMS actuators are ignored. Simulation is continuing.");
7454 : }
7455 : }
7456 : }
7457 : } else { // else defrost control is on-demand
7458 7 : state.dataVariableSpeedCoils->FractionalDefrostTime = 1.0 / (1.0 + 0.01446 / state.dataVariableSpeedCoils->OutdoorCoildw);
7459 7 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingCapacityMultiplierEMSOverrideOn &&
7460 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingInputPowerMultiplierEMSOverrideOn) {
7461 0 : state.dataVariableSpeedCoils->HeatingCapacityMultiplier =
7462 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingCapacityMultiplierEMSOverrideValue;
7463 0 : state.dataVariableSpeedCoils->InputPowerMultiplier =
7464 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingInputPowerMultiplierEMSOverrideValue;
7465 : } else {
7466 7 : state.dataVariableSpeedCoils->HeatingCapacityMultiplier = 0.875 * (1.0 - state.dataVariableSpeedCoils->FractionalDefrostTime);
7467 7 : state.dataVariableSpeedCoils->InputPowerMultiplier = 0.954 * (1.0 - state.dataVariableSpeedCoils->FractionalDefrostTime);
7468 14 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingCapacityMultiplierEMSOverrideOn ||
7469 7 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingInputPowerMultiplierEMSOverrideOn) {
7470 0 : ShowWarningMessage(state,
7471 0 : format("The Frost Heating Capacity Multiplier actuator and the Frost Heating Input Power Multiplier "
7472 : "actuator must be both provided for DX heating coil {}",
7473 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
7474 0 : ShowContinueError(state, "EMS actuators are ignored. Simulation is continuing.");
7475 : }
7476 : }
7477 : }
7478 : // correction fractional defrost time shorten by runtime fraction
7479 19 : state.dataVariableSpeedCoils->FractionalDefrostTime *= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac;
7480 :
7481 19 : if (state.dataVariableSpeedCoils->FractionalDefrostTime > 0.0) {
7482 : // Calculate defrost adjustment factors depending on defrost control strategy
7483 17 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostStrategy == ReverseCycle) {
7484 0 : state.dataVariableSpeedCoils->LoadDueToDefrost = (0.01 * state.dataVariableSpeedCoils->FractionalDefrostTime) *
7485 0 : (7.222 - state.dataVariableSpeedCoils->OutdoorDryBulb) *
7486 0 : (state.dataVariableSpeedCoils->TotRatedCapacity / 1.01667);
7487 0 : state.dataVariableSpeedCoils->DefrostEIRTempModFac =
7488 0 : Curve::CurveValue(state,
7489 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostEIRFT,
7490 0 : max(15.555, state.dataVariableSpeedCoils->LoadSideInletWBTemp),
7491 0 : max(15.555, state.dataVariableSpeedCoils->OutdoorDryBulb));
7492 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostPower =
7493 0 : state.dataVariableSpeedCoils->DefrostEIRTempModFac * (state.dataVariableSpeedCoils->TotRatedCapacity / 1.01667) *
7494 0 : state.dataVariableSpeedCoils->FractionalDefrostTime;
7495 : } else { // Defrost strategy is resistive
7496 17 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostPower =
7497 17 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostCapacity *
7498 17 : state.dataVariableSpeedCoils->FractionalDefrostTime;
7499 : }
7500 : } else { // Defrost is not active because (OutDryBulbTemp > VarSpeedCoil(DXCoilNum).MaxOATDefrost)
7501 2 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostPower = 0.0;
7502 : }
7503 : }
7504 :
7505 23 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterPower =
7506 23 : state.dataVariableSpeedCoils->CrankcaseHeatingPower * (1.0 - state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac);
7507 : //! Modify total heating capacity based on defrost heating capacity multiplier
7508 : //! MaxHeatCap passed from parent object VRF Condenser and is used to limit capacity of TU's to that available from condenser
7509 : // IF(PRESENT(MaxHeatCap))THEN
7510 : // TotCap = MIN(MaxHeatCap,TotCap * HeatingCapacityMultiplier)
7511 : // ELSE
7512 : // TotCap = TotCap * HeatingCapacityMultiplier
7513 : // END IF
7514 46 : state.dataVariableSpeedCoils->QLoadTotal =
7515 23 : state.dataVariableSpeedCoils->QLoadTotal * state.dataVariableSpeedCoils->HeatingCapacityMultiplier -
7516 23 : state.dataVariableSpeedCoils->LoadDueToDefrost;
7517 : // count the powr separately
7518 23 : state.dataVariableSpeedCoils->Winput *= state.dataVariableSpeedCoils->InputPowerMultiplier; //+ VarSpeedCoil(DXCoilNum)%DefrostPower
7519 : }
7520 :
7521 17634 : state.dataVariableSpeedCoils->QSource = state.dataVariableSpeedCoils->QLoadTotal + QWasteHeat - state.dataVariableSpeedCoils->Winput;
7522 17634 : state.dataVariableSpeedCoils->QSensible = state.dataVariableSpeedCoils->QLoadTotal;
7523 :
7524 17634 : if (state.dataVariableSpeedCoils->QSource < 0) {
7525 1 : state.dataVariableSpeedCoils->QSource = 0.0;
7526 1 : QWasteHeat = state.dataVariableSpeedCoils->Winput - state.dataVariableSpeedCoils->QLoadTotal;
7527 : }
7528 :
7529 : // calculate coil outlet state variables
7530 35268 : state.dataVariableSpeedCoils->LoadSideOutletEnth =
7531 17634 : state.dataVariableSpeedCoils->LoadSideInletEnth +
7532 17634 : state.dataVariableSpeedCoils->QLoadTotal / state.dataVariableSpeedCoils->LoadSideMassFlowRate;
7533 35268 : state.dataVariableSpeedCoils->LoadSideOutletDBTemp =
7534 17634 : state.dataVariableSpeedCoils->LoadSideInletDBTemp +
7535 17634 : state.dataVariableSpeedCoils->QSensible / (state.dataVariableSpeedCoils->LoadSideMassFlowRate * CpAir);
7536 17634 : state.dataVariableSpeedCoils->LoadSideOutletHumRat = Psychrometrics::PsyWFnTdbH(
7537 17634 : state, state.dataVariableSpeedCoils->LoadSideOutletDBTemp, state.dataVariableSpeedCoils->LoadSideOutletEnth, RoutineName);
7538 :
7539 : // Actual outlet conditions are "average" for time step
7540 17634 : if (fanOp == HVAC::FanOp::Continuous) {
7541 : // continuous fan, cycling compressor
7542 24 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirEnthalpy =
7543 24 : PartLoadRatio * state.dataVariableSpeedCoils->LoadSideOutletEnth +
7544 24 : (1.0 - PartLoadRatio) * state.dataVariableSpeedCoils->LoadSideInletEnth;
7545 24 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat =
7546 24 : PartLoadRatio * state.dataVariableSpeedCoils->LoadSideOutletHumRat +
7547 24 : (1.0 - PartLoadRatio) * state.dataVariableSpeedCoils->LoadSideInletHumRat;
7548 24 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp =
7549 24 : Psychrometrics::PsyTdbFnHW(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirEnthalpy,
7550 24 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat);
7551 24 : state.dataVariableSpeedCoils->PLRCorrLoadSideMdot = state.dataVariableSpeedCoils->LoadSideMassFlowRate;
7552 : } else {
7553 : // default to cycling fan, cycling compressor
7554 17610 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirEnthalpy = state.dataVariableSpeedCoils->LoadSideOutletEnth;
7555 17610 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat = state.dataVariableSpeedCoils->LoadSideOutletHumRat;
7556 17610 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp = state.dataVariableSpeedCoils->LoadSideOutletDBTemp;
7557 17610 : state.dataVariableSpeedCoils->PLRCorrLoadSideMdot = state.dataVariableSpeedCoils->LoadSideMassFlowRate * PartLoadRatio;
7558 : }
7559 :
7560 : // scale heat transfer rates to PLR and power to RTF
7561 17634 : state.dataVariableSpeedCoils->QLoadTotal *= PartLoadRatio;
7562 17634 : state.dataVariableSpeedCoils->QSensible *= PartLoadRatio;
7563 : // count the powr separately
7564 35268 : state.dataVariableSpeedCoils->Winput *=
7565 17634 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac; //+ VarSpeedCoil(DXCoilNum)%CrankcaseHeaterPower
7566 17634 : state.dataVariableSpeedCoils->QSource *= PartLoadRatio;
7567 17634 : QWasteHeat *= PartLoadRatio;
7568 :
7569 : // Update heat pump data structure
7570 17634 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Power = state.dataVariableSpeedCoils->Winput;
7571 17634 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal = state.dataVariableSpeedCoils->QLoadTotal;
7572 17634 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible = state.dataVariableSpeedCoils->QSensible;
7573 17634 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSource = state.dataVariableSpeedCoils->QSource;
7574 17634 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Energy = state.dataVariableSpeedCoils->Winput * TimeStepSysSec;
7575 17634 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLoadTotal = state.dataVariableSpeedCoils->QLoadTotal * TimeStepSysSec;
7576 17634 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySensible = state.dataVariableSpeedCoils->QSensible * TimeStepSysSec;
7577 17634 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLatent = 0.0;
7578 17634 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySource = state.dataVariableSpeedCoils->QSource * TimeStepSysSec;
7579 17634 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterConsumption =
7580 17634 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterPower * TimeStepSysSec;
7581 17634 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostConsumption =
7582 17634 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostPower * TimeStepSysSec;
7583 17634 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac == 0.0) {
7584 0 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).COP = 0.0;
7585 : } else {
7586 17634 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).COP =
7587 17634 : state.dataVariableSpeedCoils->QLoadTotal / state.dataVariableSpeedCoils->Winput;
7588 : }
7589 17634 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio = PartLoadRatio;
7590 17634 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate = state.dataVariableSpeedCoils->PLRCorrLoadSideMdot;
7591 17634 : rhoair = Psychrometrics::PsyRhoAirFnPbTdbW(state,
7592 17634 : state.dataEnvrn->OutBaroPress,
7593 17634 : state.dataVariableSpeedCoils->LoadSideInletDBTemp,
7594 17634 : state.dataVariableSpeedCoils->LoadSideInletHumRat,
7595 : RoutineName);
7596 17634 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirVolFlowRate =
7597 17634 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate / rhoair;
7598 :
7599 17634 : if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
7600 23 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate = 0.0;
7601 23 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterTemp = 0.0;
7602 23 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterEnthalpy = 0.0;
7603 : } else {
7604 17611 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate = state.dataVariableSpeedCoils->SourceSideMassFlowRate;
7605 17611 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterTemp =
7606 17611 : state.dataVariableSpeedCoils->SourceSideInletTemp -
7607 17611 : state.dataVariableSpeedCoils->QSource / (state.dataVariableSpeedCoils->SourceSideMassFlowRate * CpSource);
7608 17611 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterEnthalpy =
7609 17611 : state.dataVariableSpeedCoils->SourceSideInletEnth -
7610 17611 : state.dataVariableSpeedCoils->QSource / state.dataVariableSpeedCoils->SourceSideMassFlowRate;
7611 : }
7612 :
7613 17634 : state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QWasteHeat = QWasteHeat;
7614 : }
7615 :
7616 8 : Real64 GetCoilCapacityVariableSpeed(EnergyPlusData &state,
7617 : std::string const &CoilType, // must match coil types in this module
7618 : std::string const &CoilName, // must match coil names for the coil type
7619 : bool &ErrorsFound // set to true if problem
7620 : )
7621 : {
7622 :
7623 : // FUNCTION INFORMATION:
7624 : // AUTHOR Bo Shen, based on WaterToAirHeatPumpSimple:GetCoilCapacity
7625 : // DATE WRITTEN March 2012
7626 :
7627 : // PURPOSE OF THIS FUNCTION:
7628 : // This function looks up the rated coil capacity at the nominal speed level for the given coil and returns it. If
7629 : // incorrect coil type or name is given, ErrorsFound is returned as true and capacity is returned
7630 : // as negative.
7631 :
7632 : // Return value
7633 : Real64 CoilCapacity; // returned capacity of matched coil
7634 :
7635 : // FUNCTION LOCAL VARIABLE DECLARATIONS:
7636 : int WhichCoil;
7637 :
7638 : // Obtains and Allocates WatertoAirHP related parameters from input file
7639 8 : if (state.dataVariableSpeedCoils->GetCoilsInputFlag) { // First time subroutine has been entered
7640 0 : GetVarSpeedCoilInput(state);
7641 0 : state.dataVariableSpeedCoils->GetCoilsInputFlag = false;
7642 : }
7643 :
7644 14 : if (Util::SameString(CoilType, "COIL:COOLING:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT") ||
7645 12 : Util::SameString(CoilType, "COIL:HEATING:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT") ||
7646 20 : Util::SameString(CoilType, "COIL:COOLING:DX:VARIABLESPEED") || Util::SameString(CoilType, "COIL:HEATING:DX:VARIABLESPEED") ||
7647 8 : Util::SameString(CoilType, "COIL:WATERHEATING:AIRTOWATERHEATPUMP:VARIABLESPEED")) {
7648 8 : WhichCoil = Util::FindItemInList(CoilName, state.dataVariableSpeedCoils->VarSpeedCoil);
7649 8 : if (WhichCoil != 0) {
7650 16 : if (Util::SameString(CoilType, "COIL:HEATING:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT") ||
7651 16 : Util::SameString(CoilType, "COIL:HEATING:DX:VARIABLESPEED")) {
7652 0 : CoilCapacity = state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).RatedCapHeat;
7653 8 : } else if (Util::SameString(CoilType, "COIL:WATERHEATING:AIRTOWATERHEATPUMP:VARIABLESPEED")) {
7654 0 : CoilCapacity = state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).RatedCapWH;
7655 : } else {
7656 8 : CoilCapacity = state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).RatedCapCoolTotal;
7657 : }
7658 : }
7659 : } else {
7660 0 : WhichCoil = 0;
7661 : }
7662 :
7663 8 : if (WhichCoil == 0) {
7664 0 : ShowSevereError(state, format("GetCoilCapacityVariableSpeed: Could not find CoilType=\"{}\" with Name=\"{}\"", CoilType, CoilName));
7665 0 : ErrorsFound = true;
7666 0 : CoilCapacity = -1000.0;
7667 : }
7668 :
7669 8 : return CoilCapacity;
7670 : }
7671 :
7672 27 : int GetCoilIndexVariableSpeed(EnergyPlusData &state,
7673 : std::string const &CoilType, // must match coil types in this module
7674 : std::string const &CoilName, // must match coil names for the coil type
7675 : bool &ErrorsFound // set to true if problem
7676 : )
7677 : {
7678 :
7679 : // FUNCTION INFORMATION:
7680 : // AUTHOR Bo Shen, based on WaterToAirHeatPumpSimple:GetCoilIndex
7681 : // DATE WRITTEN March 2012
7682 :
7683 : // PURPOSE OF THIS FUNCTION:
7684 : // This function looks up the coil index for the given coil and returns it. If incorrect
7685 : // coil type or name is given, ErrorsFound is returned as true and index is returned as zero.
7686 :
7687 : // Return value
7688 : int IndexNum; // returned index of matched coil
7689 :
7690 : // Obtains and Allocates WatertoAirHP related parameters from input file
7691 27 : if (state.dataVariableSpeedCoils->GetCoilsInputFlag) { // First time subroutine has been entered
7692 13 : GetVarSpeedCoilInput(state);
7693 13 : state.dataVariableSpeedCoils->GetCoilsInputFlag = false;
7694 : }
7695 :
7696 27 : IndexNum = Util::FindItemInList(CoilName, state.dataVariableSpeedCoils->VarSpeedCoil);
7697 :
7698 27 : if (IndexNum == 0) {
7699 0 : ShowSevereError(state, format("GetCoilIndexVariableSpeed: Could not find CoilType=\"{}\" with Name=\"{}\"", CoilType, CoilName));
7700 0 : ErrorsFound = true;
7701 : }
7702 :
7703 27 : return IndexNum;
7704 : }
7705 :
7706 1 : Real64 GetCoilAirFlowRateVariableSpeed(EnergyPlusData &state,
7707 : std::string const &CoilType, // must match coil types in this module
7708 : std::string const &CoilName, // must match coil names for the coil type
7709 : bool &ErrorsFound // set to true if problem
7710 : )
7711 : {
7712 :
7713 : // FUNCTION INFORMATION:
7714 : // AUTHOR Bo Shen, based on WaterToAirHeatPumpSimple:GetCoilAirFlowRate
7715 : // DATE WRITTEN March 2012
7716 :
7717 : // PURPOSE OF THIS FUNCTION:
7718 : // This function looks up the max coil air flow rate for the given coil and returns it. If incorrect
7719 : // coil type or name is given, ErrorsFound is returned as true and capacity is returned as negative.
7720 :
7721 : // Return value
7722 : Real64 CoilAirFlowRate; // returned air volume flow rate of matched coil
7723 :
7724 : // FUNCTION LOCAL VARIABLE DECLARATIONS:
7725 : int WhichCoil;
7726 :
7727 : // Obtains and Allocates WatertoAirHP related parameters from input file
7728 1 : if (state.dataVariableSpeedCoils->GetCoilsInputFlag) { // First time subroutine has been entered
7729 0 : GetVarSpeedCoilInput(state);
7730 0 : state.dataVariableSpeedCoils->GetCoilsInputFlag = false;
7731 : }
7732 :
7733 2 : if (Util::SameString(CoilType, "COIL:COOLING:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT") ||
7734 2 : Util::SameString(CoilType, "COIL:HEATING:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT") ||
7735 3 : Util::SameString(CoilType, "COIL:COOLING:DX:VARIABLESPEED") || Util::SameString(CoilType, "COIL:HEATING:DX:VARIABLESPEED") ||
7736 1 : Util::SameString(CoilType, "COIL:WATERHEATING:AIRTOWATERHEATPUMP:VARIABLESPEED")) {
7737 1 : WhichCoil = Util::FindItemInList(CoilName, state.dataVariableSpeedCoils->VarSpeedCoil);
7738 1 : if (WhichCoil != 0) {
7739 1 : if (state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).RatedAirVolFlowRate == DataSizing::AutoSize) { // means autosize
7740 0 : CoilAirFlowRate = state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).RatedAirVolFlowRate;
7741 : } else {
7742 1 : CoilAirFlowRate = state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).MSRatedAirVolFlowRate(
7743 1 : state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).NumOfSpeeds) /
7744 1 : state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).MSRatedAirVolFlowRate(
7745 1 : state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).NormSpedLevel) *
7746 1 : state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).RatedAirVolFlowRate;
7747 : } // use largest air flow rate
7748 : }
7749 : } else {
7750 0 : WhichCoil = 0;
7751 : }
7752 :
7753 1 : if (WhichCoil == 0) {
7754 0 : ShowSevereError(state, format("GetCoilAirFlowRateVariableSpeed: Could not find CoilType=\"{}\" with Name=\"{}\"", CoilType, CoilName));
7755 0 : ErrorsFound = true;
7756 0 : CoilAirFlowRate = -1000.0;
7757 : }
7758 :
7759 1 : return CoilAirFlowRate;
7760 : }
7761 :
7762 0 : int GetVSCoilPLFFPLR(EnergyPlusData &state,
7763 : std::string const &CoilType, // must match coil types in this module
7764 : std::string const &CoilName, // must match coil names for the coil type
7765 : bool &ErrorsFound // set to true if problem
7766 : )
7767 : {
7768 :
7769 : // FUNCTION INFORMATION:
7770 : // AUTHOR Bo Shen
7771 : // DATE WRITTEN 12/2014
7772 :
7773 : // PURPOSE OF THIS FUNCTION:
7774 : // This function looks up the given coil and returns PLR curve index. If incorrect
7775 : // coil type or name is given, ErrorsFound is returned as true and value is returned as zero.
7776 :
7777 : // Return value
7778 : int PLRNumber; // returned outlet node of matched coil
7779 :
7780 : // FUNCTION LOCAL VARIABLE DECLARATIONS:
7781 : int WhichCoil;
7782 :
7783 : // Obtains and Allocates WatertoAirHP related parameters from input file
7784 0 : if (state.dataVariableSpeedCoils->GetCoilsInputFlag) { // First time subroutine has been entered
7785 0 : GetVarSpeedCoilInput(state);
7786 0 : state.dataVariableSpeedCoils->GetCoilsInputFlag = false;
7787 : }
7788 :
7789 0 : WhichCoil = Util::FindItemInList(CoilName, state.dataVariableSpeedCoils->VarSpeedCoil);
7790 0 : if (WhichCoil != 0) {
7791 0 : PLRNumber = state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).PLFFPLR;
7792 : }
7793 :
7794 0 : if (WhichCoil == 0) {
7795 0 : ShowSevereError(state, format("GetVSCoilPLFFPLR: Could not find CoilType=\"{}\" with Name=\"{}\"", CoilType, CoilName));
7796 0 : ErrorsFound = true;
7797 0 : PLRNumber = 0;
7798 : }
7799 :
7800 0 : return PLRNumber;
7801 : }
7802 :
7803 5 : int GetVSCoilCapFTCurveIndex(EnergyPlusData &state,
7804 : int const CoilIndex, // must match coil names for the coil type
7805 : bool &ErrorsFound // set to true if problem
7806 : )
7807 : {
7808 :
7809 : // FUNCTION INFORMATION:
7810 : // AUTHOR Richard Raustad
7811 : // DATE WRITTEN 7/2017
7812 :
7813 : // PURPOSE OF THIS FUNCTION:
7814 : // This function looks up the given coil and returns CapFT curve index. If incorrect
7815 : // coil index is given, ErrorsFound is returned as true and value is returned as zero.
7816 :
7817 : // Return value
7818 : int CapFTIndex; // returned CapFT curve index of matched coil
7819 :
7820 : // Obtains and Allocates WatertoAirHP related parameters from input file
7821 5 : if (state.dataVariableSpeedCoils->GetCoilsInputFlag) { // First time subroutine has been entered
7822 0 : GetVarSpeedCoilInput(state);
7823 0 : state.dataVariableSpeedCoils->GetCoilsInputFlag = false;
7824 : }
7825 :
7826 5 : if (CoilIndex == 0) {
7827 0 : ShowSevereError(state, "GetVSCoilCapFTCurveIndex: Could not find Coil");
7828 0 : ErrorsFound = true;
7829 0 : CapFTIndex = 0;
7830 : } else {
7831 5 : CapFTIndex =
7832 5 : state.dataVariableSpeedCoils->VarSpeedCoil(CoilIndex).MSCCapFTemp(state.dataVariableSpeedCoils->VarSpeedCoil(CoilIndex).NumOfSpeeds);
7833 : }
7834 :
7835 5 : return CapFTIndex;
7836 : }
7837 :
7838 1 : int GetCoilInletNodeVariableSpeed(EnergyPlusData &state,
7839 : std::string const &CoilType, // must match coil types in this module
7840 : std::string const &CoilName, // must match coil names for the coil type
7841 : bool &ErrorsFound // set to true if problem
7842 : )
7843 : {
7844 :
7845 : // FUNCTION INFORMATION:
7846 : // AUTHOR Bo Shen, based on WaterToAirHeatPumpSimple:GetCoilInletNode
7847 : // DATE WRITTEN March 2012
7848 :
7849 : // PURPOSE OF THIS FUNCTION:
7850 : // This function looks up the given coil and returns the inlet node. If incorrect
7851 : // coil type or name is given, ErrorsFound is returned as true and value is returned as zero.
7852 :
7853 : // Return value
7854 : int NodeNumber; // returned outlet node of matched coil
7855 :
7856 : // FUNCTION LOCAL VARIABLE DECLARATIONS:
7857 : int WhichCoil;
7858 :
7859 : // Obtains and Allocates WatertoAirHP related parameters from input file
7860 1 : if (state.dataVariableSpeedCoils->GetCoilsInputFlag) { // First time subroutine has been entered
7861 0 : GetVarSpeedCoilInput(state);
7862 0 : state.dataVariableSpeedCoils->GetCoilsInputFlag = false;
7863 : }
7864 :
7865 1 : WhichCoil = Util::FindItemInList(CoilName, state.dataVariableSpeedCoils->VarSpeedCoil);
7866 1 : if (WhichCoil != 0) {
7867 1 : NodeNumber = state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).AirInletNodeNum;
7868 : }
7869 :
7870 1 : if (WhichCoil == 0) {
7871 0 : ShowSevereError(state, format("GetCoilInletNodeVariableSpeed: Could not find CoilType=\"{}\" with Name=\"{}\"", CoilType, CoilName));
7872 0 : ErrorsFound = true;
7873 0 : NodeNumber = 0;
7874 : }
7875 :
7876 1 : return NodeNumber;
7877 : }
7878 :
7879 4 : int GetCoilOutletNodeVariableSpeed(EnergyPlusData &state,
7880 : std::string const &CoilType, // must match coil types in this module
7881 : std::string const &CoilName, // must match coil names for the coil type
7882 : bool &ErrorsFound // set to true if problem
7883 : )
7884 : {
7885 :
7886 : // FUNCTION INFORMATION:
7887 : // AUTHOR Bo Shen, based on WaterToAirHeatPumpSimple:GetCoilOutletNode
7888 : // DATE WRITTEN March 2012
7889 :
7890 : // PURPOSE OF THIS FUNCTION:
7891 : // This function looks up the given coil and returns the outlet node. If incorrect
7892 : // coil type or name is given, ErrorsFound is returned as true and value is returned as zero.
7893 :
7894 : // Return value
7895 : int NodeNumber; // returned outlet node of matched coil
7896 :
7897 : // FUNCTION LOCAL VARIABLE DECLARATIONS:
7898 : int WhichCoil;
7899 :
7900 : // Obtains and Allocates WatertoAirHP related parameters from input file
7901 4 : if (state.dataVariableSpeedCoils->GetCoilsInputFlag) { // First time subroutine has been entered
7902 3 : GetVarSpeedCoilInput(state);
7903 3 : state.dataVariableSpeedCoils->GetCoilsInputFlag = false;
7904 : }
7905 :
7906 4 : WhichCoil = Util::FindItemInList(CoilName, state.dataVariableSpeedCoils->VarSpeedCoil);
7907 4 : if (WhichCoil != 0) {
7908 4 : NodeNumber = state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).AirOutletNodeNum;
7909 : }
7910 :
7911 4 : if (WhichCoil == 0) {
7912 0 : ShowSevereError(state, format("GetCoilOutletNodeVariableSpeed: Could not find CoilType=\"{}\" with Name=\"{}\"", CoilType, CoilName));
7913 0 : ErrorsFound = true;
7914 0 : NodeNumber = 0;
7915 : }
7916 :
7917 4 : return NodeNumber;
7918 : }
7919 :
7920 8 : int GetVSCoilCondenserInletNode(EnergyPlusData &state,
7921 : std::string const &CoilName, // must match coil names for the coil type
7922 : bool &ErrorsFound // set to true if problem
7923 : )
7924 : {
7925 :
7926 : // FUNCTION INFORMATION:
7927 : // AUTHOR Bo Shen, based on DXCoil:GetCoilCondenserInletNode
7928 : // DATE WRITTEN July 2012
7929 :
7930 : // PURPOSE OF THIS FUNCTION:
7931 : // This function looks up the given coil and returns the condenser inlet node. If
7932 : // incorrect coil name is given, ErrorsFound is returned as true.
7933 :
7934 : // Return value
7935 : int CondNode; // returned condenser node number of matched coil
7936 :
7937 : // FUNCTION LOCAL VARIABLE DECLARATIONS:
7938 : int WhichCoil;
7939 :
7940 : // Obtains and Allocates WatertoAirHP related parameters from input file
7941 8 : if (state.dataVariableSpeedCoils->GetCoilsInputFlag) { // First time subroutine has been entered
7942 0 : GetVarSpeedCoilInput(state);
7943 0 : state.dataVariableSpeedCoils->GetCoilsInputFlag = false;
7944 : }
7945 :
7946 8 : WhichCoil = Util::FindItemInList(CoilName, state.dataVariableSpeedCoils->VarSpeedCoil);
7947 8 : if (WhichCoil != 0) {
7948 8 : CondNode = state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).CondenserInletNodeNum;
7949 : } else {
7950 0 : ShowSevereError(state, format("GetCoilCondenserInletNode: Invalid VS DX Coil, Type= VS DX Cooling Name=\"{}\"", CoilName));
7951 0 : ErrorsFound = true;
7952 0 : CondNode = 0;
7953 : }
7954 :
7955 8 : return CondNode;
7956 : }
7957 :
7958 13 : Real64 GetVSCoilMinOATCompressor(EnergyPlusData &state,
7959 : int const CoilIndex, // index to cooling coil
7960 : bool &ErrorsFound // set to true if problem
7961 : )
7962 : {
7963 : // Obtains and Allocates WatertoAirHP related parameters from input file
7964 13 : if (state.dataVariableSpeedCoils->GetCoilsInputFlag) { // First time subroutine has been entered
7965 0 : GetVarSpeedCoilInput(state);
7966 0 : state.dataVariableSpeedCoils->GetCoilsInputFlag = false;
7967 : }
7968 :
7969 13 : if (CoilIndex == 0) {
7970 0 : ShowSevereError(state, "GetVSCoilMinOATCompressor: Index passed = 0");
7971 0 : ShowContinueError(state, "... returning Min OAT as -1000.");
7972 0 : ErrorsFound = true;
7973 0 : return -1000.0;
7974 : } else {
7975 13 : return state.dataVariableSpeedCoils->VarSpeedCoil(CoilIndex).MinOATCompressor;
7976 : }
7977 : }
7978 :
7979 7 : int GetVSCoilNumOfSpeeds(EnergyPlusData &state,
7980 : std::string const &CoilName, // must match coil names for the coil type
7981 : bool &ErrorsFound // set to true if problem
7982 : )
7983 : {
7984 :
7985 : // FUNCTION INFORMATION:
7986 : // AUTHOR Richard Raustad, FSEC
7987 : // DATE WRITTEN March 2013
7988 :
7989 : // PURPOSE OF THIS FUNCTION:
7990 : // This function looks up the given coil and returns number of speeds. If
7991 : // incorrect coil name is given, ErrorsFound is returned as true.
7992 :
7993 : // Return value
7994 : int Speeds; // returned number of speeds
7995 :
7996 : // Obtains and Allocates WatertoAirHP related parameters from input file
7997 7 : if (state.dataVariableSpeedCoils->GetCoilsInputFlag) { // First time subroutine has been entered
7998 0 : GetVarSpeedCoilInput(state);
7999 0 : state.dataVariableSpeedCoils->GetCoilsInputFlag = false;
8000 : }
8001 :
8002 7 : int WhichCoil = Util::FindItemInList(CoilName, state.dataVariableSpeedCoils->VarSpeedCoil);
8003 7 : if (WhichCoil != 0) {
8004 7 : Speeds = state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).NumOfSpeeds;
8005 : } else {
8006 0 : ShowSevereError(state, format("GetVSCoilNumOfSpeeds: Invalid VS DX Coil, Type= VS DX Coil Name=\"{}\"", CoilName));
8007 0 : ErrorsFound = true;
8008 0 : Speeds = 0;
8009 : }
8010 :
8011 7 : return Speeds;
8012 : }
8013 :
8014 28 : Real64 GetVSCoilRatedSourceTemp(EnergyPlusData &state, int const CoilIndex)
8015 : {
8016 28 : Real64 RatedSourceTemp = 0.0;
8017 28 : switch (state.dataVariableSpeedCoils->VarSpeedCoil(CoilIndex).VSCoilType) {
8018 7 : case HVAC::Coil_CoolingWaterToAirHPVSEquationFit: {
8019 7 : RatedSourceTemp = RatedInletWaterTemp;
8020 7 : } break;
8021 3 : case HVAC::Coil_HeatingWaterToAirHPVSEquationFit: {
8022 3 : RatedSourceTemp = RatedInletWaterTempHeat;
8023 3 : } break;
8024 1 : case HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed: {
8025 1 : RatedSourceTemp = state.dataVariableSpeedCoils->VarSpeedCoil(CoilIndex).WHRatedInletWaterTemp;
8026 1 : } break;
8027 12 : case HVAC::Coil_CoolingAirToAirVariableSpeed: {
8028 12 : RatedSourceTemp = RatedAmbAirTemp;
8029 12 : } break;
8030 5 : case HVAC::Coil_HeatingAirToAirVariableSpeed: {
8031 5 : RatedSourceTemp = RatedAmbAirTempHeat;
8032 5 : } break;
8033 0 : default: {
8034 0 : assert(false);
8035 : } break;
8036 : }
8037 28 : return RatedSourceTemp;
8038 : }
8039 :
8040 12 : void SetVarSpeedCoilData(EnergyPlusData &state,
8041 : int const WSHPNum, // Number of OA Controller
8042 : bool &ErrorsFound, // Set to true if certain errors found
8043 : ObjexxFCL::Optional_int CompanionCoolingCoilNum, // Index to cooling coil for heating coil = SimpleWSHPNum
8044 : ObjexxFCL::Optional_int CompanionHeatingCoilNum, // Index to heating coil for cooling coil = SimpleWSHPNum
8045 : ObjexxFCL::Optional_int MSHPDesignSpecIndex // index to UnitarySystemPerformance:Multispeed object
8046 : )
8047 : {
8048 :
8049 : // SUBROUTINE INFORMATION:
8050 : // AUTHOR Bo Shen, based on WaterToAirHeatPumpSimple:SetWSHPData
8051 : // DATE WRITTEN March 2012
8052 :
8053 : // PURPOSE OF THIS SUBROUTINE:
8054 : // This routine was designed to "push" information from a parent object to this WSHP coil object.
8055 :
8056 : // Obtains and Allocates WatertoAirHP related parameters from input file
8057 12 : if (state.dataVariableSpeedCoils->GetCoilsInputFlag) { // First time subroutine has been entered
8058 0 : GetVarSpeedCoilInput(state);
8059 0 : state.dataVariableSpeedCoils->GetCoilsInputFlag = false;
8060 : }
8061 :
8062 12 : if (WSHPNum <= 0 || WSHPNum > state.dataVariableSpeedCoils->NumVarSpeedCoils) {
8063 0 : ShowSevereError(state,
8064 0 : format("SetVarSpeedCoilData: called with VS WSHP Coil Number out of range={} should be >0 and <{}",
8065 : WSHPNum,
8066 0 : state.dataVariableSpeedCoils->NumVarSpeedCoils));
8067 0 : ErrorsFound = true;
8068 0 : return;
8069 : }
8070 :
8071 12 : if (present(CompanionCoolingCoilNum)) {
8072 0 : state.dataVariableSpeedCoils->VarSpeedCoil(WSHPNum).CompanionCoolingCoilNum = CompanionCoolingCoilNum;
8073 0 : state.dataVariableSpeedCoils->VarSpeedCoil(WSHPNum).FindCompanionUpStreamCoil = true;
8074 0 : state.dataVariableSpeedCoils->VarSpeedCoil(CompanionCoolingCoilNum).CompanionHeatingCoilNum = WSHPNum;
8075 : }
8076 :
8077 12 : if (present(CompanionHeatingCoilNum)) {
8078 1 : state.dataVariableSpeedCoils->VarSpeedCoil(WSHPNum).CompanionHeatingCoilNum = CompanionHeatingCoilNum;
8079 1 : state.dataVariableSpeedCoils->VarSpeedCoil(CompanionHeatingCoilNum).CompanionCoolingCoilNum = WSHPNum;
8080 : }
8081 :
8082 12 : if (present(MSHPDesignSpecIndex)) {
8083 11 : state.dataVariableSpeedCoils->VarSpeedCoil(WSHPNum).MSHPDesignSpecIndex = MSHPDesignSpecIndex;
8084 : }
8085 : }
8086 :
8087 67679 : void UpdateVarSpeedCoil(EnergyPlusData &state, int const DXCoilNum)
8088 : {
8089 : // SUBROUTINE INFORMATION:
8090 : // AUTHOR Bo Shen, based on WaterToAirHeatPumpSimple:UpdateSimpleWSHP
8091 : // DATE WRITTEN March 2012
8092 :
8093 : // PURPOSE OF THIS SUBROUTINE:
8094 : // This subroutine updates the Water to Air Heat Pump outlet nodes.
8095 :
8096 : // METHODOLOGY EMPLOYED:
8097 : // Data is moved from the HP data structure to the HP outlet nodes.
8098 :
8099 : // Using/Aliasing
8100 67679 : Real64 TimeStepSysSec = state.dataHVACGlobal->TimeStepSysSec;
8101 :
8102 67679 : auto &varSpeedCoil = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum);
8103 :
8104 : // WatertoAirHP(DXCoilNum)%SimFlag=.FALSE.
8105 67679 : if (!varSpeedCoil.SimFlag) {
8106 : // Heatpump is off; just pass through conditions
8107 39555 : varSpeedCoil.Power = 0.0;
8108 39555 : varSpeedCoil.QLoadTotal = 0.0;
8109 39555 : varSpeedCoil.QSensible = 0.0;
8110 39555 : varSpeedCoil.QLatent = 0.0;
8111 39555 : varSpeedCoil.QSource = 0.0;
8112 39555 : varSpeedCoil.Energy = 0.0;
8113 39555 : varSpeedCoil.EnergyLoadTotal = 0.0;
8114 39555 : varSpeedCoil.EnergySensible = 0.0;
8115 39555 : varSpeedCoil.EnergyLatent = 0.0;
8116 39555 : varSpeedCoil.EnergySource = 0.0;
8117 39555 : varSpeedCoil.COP = 0.0;
8118 39555 : varSpeedCoil.RunFrac = 0.0;
8119 39555 : varSpeedCoil.PartLoadRatio = 0.0;
8120 :
8121 39555 : varSpeedCoil.OutletAirDBTemp = varSpeedCoil.InletAirDBTemp;
8122 39555 : varSpeedCoil.OutletAirHumRat = varSpeedCoil.InletAirHumRat;
8123 39555 : varSpeedCoil.OutletAirEnthalpy = varSpeedCoil.InletAirEnthalpy;
8124 39555 : varSpeedCoil.OutletWaterTemp = varSpeedCoil.InletWaterTemp;
8125 39555 : varSpeedCoil.OutletWaterEnthalpy = varSpeedCoil.InletWaterEnthalpy;
8126 : }
8127 :
8128 67679 : int AirInletNode = varSpeedCoil.AirInletNodeNum;
8129 67679 : int WaterInletNode = varSpeedCoil.WaterInletNodeNum;
8130 67679 : int AirOutletNode = varSpeedCoil.AirOutletNodeNum;
8131 67679 : int WaterOutletNode = varSpeedCoil.WaterOutletNodeNum;
8132 :
8133 : // Set the air outlet nodes of the WatertoAirHPSimple
8134 67679 : state.dataLoopNodes->Node(AirOutletNode).MassFlowRate = state.dataLoopNodes->Node(AirInletNode).MassFlowRate; // LoadSideMassFlowRate
8135 67679 : state.dataLoopNodes->Node(AirOutletNode).Temp = varSpeedCoil.OutletAirDBTemp;
8136 67679 : state.dataLoopNodes->Node(AirOutletNode).HumRat = varSpeedCoil.OutletAirHumRat;
8137 67679 : state.dataLoopNodes->Node(AirOutletNode).Enthalpy = varSpeedCoil.OutletAirEnthalpy;
8138 :
8139 : // Set the air outlet nodes for properties that just pass through & not used
8140 67679 : state.dataLoopNodes->Node(AirOutletNode).Quality = state.dataLoopNodes->Node(AirInletNode).Quality;
8141 67679 : state.dataLoopNodes->Node(AirOutletNode).Press = state.dataLoopNodes->Node(AirInletNode).Press;
8142 67679 : state.dataLoopNodes->Node(AirOutletNode).MassFlowRateMin = state.dataLoopNodes->Node(AirInletNode).MassFlowRateMin;
8143 67679 : state.dataLoopNodes->Node(AirOutletNode).MassFlowRateMax = state.dataLoopNodes->Node(AirInletNode).MassFlowRateMax; // LoadSideMassFlowRate
8144 67679 : state.dataLoopNodes->Node(AirOutletNode).MassFlowRateMinAvail = state.dataLoopNodes->Node(AirInletNode).MassFlowRateMinAvail;
8145 67679 : state.dataLoopNodes->Node(AirOutletNode).MassFlowRateMaxAvail =
8146 67679 : state.dataLoopNodes->Node(AirInletNode).MassFlowRateMaxAvail; // LoadSideMassFlowRate
8147 :
8148 : // Set the water outlet node of the WatertoAirHPSimple
8149 : // Set the water outlet nodes for properties that just pass through & not used
8150 67679 : if (WaterInletNode != 0 && WaterOutletNode != 0) {
8151 67273 : PlantUtilities::SafeCopyPlantNode(state, WaterInletNode, WaterOutletNode);
8152 67273 : state.dataLoopNodes->Node(WaterOutletNode).Temp = varSpeedCoil.OutletWaterTemp;
8153 67273 : state.dataLoopNodes->Node(WaterOutletNode).Enthalpy = varSpeedCoil.OutletWaterEnthalpy;
8154 : }
8155 :
8156 67679 : varSpeedCoil.Energy = varSpeedCoil.Power * TimeStepSysSec;
8157 67679 : varSpeedCoil.EnergyLoadTotal = varSpeedCoil.QLoadTotal * TimeStepSysSec;
8158 67679 : varSpeedCoil.EnergySensible = varSpeedCoil.QSensible * TimeStepSysSec;
8159 67679 : varSpeedCoil.EnergyLatent = varSpeedCoil.QLatent * TimeStepSysSec;
8160 67679 : varSpeedCoil.EnergySource = varSpeedCoil.QSource * TimeStepSysSec;
8161 :
8162 67679 : if (state.dataContaminantBalance->Contaminant.CO2Simulation) {
8163 1 : state.dataLoopNodes->Node(AirOutletNode).CO2 = state.dataLoopNodes->Node(AirInletNode).CO2;
8164 : }
8165 :
8166 67679 : if (state.dataContaminantBalance->Contaminant.GenericContamSimulation) {
8167 1 : state.dataLoopNodes->Node(AirOutletNode).GenContam = state.dataLoopNodes->Node(AirInletNode).GenContam;
8168 : }
8169 :
8170 67679 : if (varSpeedCoil.reportCoilFinalSizes) {
8171 23 : if (!state.dataGlobal->WarmupFlag && !state.dataGlobal->DoingHVACSizingSimulations && !state.dataGlobal->DoingSizing) {
8172 19 : if (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit ||
8173 17 : varSpeedCoil.VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) { // cooling coil
8174 13 : state.dataRptCoilSelection->coilSelectionReportObj->setCoilFinalSizes(state,
8175 13 : varSpeedCoil.Name,
8176 13 : varSpeedCoil.VarSpeedCoilType,
8177 : varSpeedCoil.RatedCapCoolTotal,
8178 : varSpeedCoil.RatedCapCoolSens,
8179 : varSpeedCoil.RatedAirVolFlowRate,
8180 : varSpeedCoil.RatedWaterMassFlowRate);
8181 6 : } else if (varSpeedCoil.VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit ||
8182 5 : varSpeedCoil.VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) { // heating coil
8183 6 : state.dataRptCoilSelection->coilSelectionReportObj->setCoilFinalSizes(state,
8184 6 : varSpeedCoil.Name,
8185 6 : varSpeedCoil.VarSpeedCoilType,
8186 : varSpeedCoil.RatedCapHeat,
8187 : varSpeedCoil.RatedCapHeat,
8188 : varSpeedCoil.RatedAirVolFlowRate,
8189 : varSpeedCoil.RatedWaterMassFlowRate);
8190 : }
8191 19 : varSpeedCoil.reportCoilFinalSizes = false;
8192 : }
8193 : }
8194 67679 : if (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit ||
8195 34042 : varSpeedCoil.VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
8196 : // Add power to global variable so power can be summed by parent object
8197 34011 : state.dataHVACGlobal->DXElecCoolingPower = varSpeedCoil.Power;
8198 33668 : } else if (varSpeedCoil.VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit) {
8199 : // Add power to global variable so power can be summed by parent object
8200 33636 : state.dataHVACGlobal->DXElecHeatingPower = varSpeedCoil.Power;
8201 32 : } else if (varSpeedCoil.VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
8202 : // Add power to global variable so power can be summed by parent object
8203 31 : state.dataHVACGlobal->DXElecHeatingPower = varSpeedCoil.Power + varSpeedCoil.CrankcaseHeaterPower;
8204 31 : state.dataHVACGlobal->DefrostElecPower = varSpeedCoil.DefrostPower;
8205 : }
8206 67679 : }
8207 :
8208 11 : Real64 CalcEffectiveSHR(EnergyPlusData &state,
8209 : int const DXCoilNum, // Index number for cooling coil
8210 : Real64 const SHRss, // Steady-state sensible heat ratio
8211 : HVAC::FanOp const fanOp, // Fan/compressor cycling scheme indicator
8212 : Real64 const RTF, // Compressor run-time fraction
8213 : Real64 const QLatRated, // Rated latent capacity
8214 : Real64 const QLatActual, // Actual latent capacity
8215 : Real64 const EnteringDB, // Entering air dry-bulb temperature
8216 : Real64 const EnteringWB // Entering air wet-bulb temperature
8217 : )
8218 : {
8219 :
8220 : // FUNCTION INFORMATION:
8221 : // AUTHOR Bo Shen, based on WaterToAirHeatPumpSimple:CalcEffectiveSHR
8222 : // DATE WRITTEN March 2012
8223 :
8224 : // PURPOSE OF THIS FUNCTION:
8225 : // Adjust sensible heat ratio to account for degradation of DX coil latent
8226 : // capacity at part-load (cycling) conditions.
8227 :
8228 : // METHODOLOGY EMPLOYED:
8229 : // With model parameters entered by the user, the part-load latent performance
8230 : // of a DX cooling coil is determined for a constant air flow system with
8231 : // a cooling coil that cycles on/off. The model calculates the time
8232 : // required for condensate to begin falling from the cooling coil.
8233 : // Runtimes greater than this are integrated to a "part-load" latent
8234 : // capacity which is used to determine the "part-load" sensible heat ratio.
8235 : // See reference below for additional details (linear decay model, Eq. 8b).
8236 :
8237 : // For cycling fan operation, a modified version of Henderson and Rengarajan (1996)
8238 : // model is used by ultilizing the fan delay time as the time-off (or time duration
8239 : // for the re-evaporation of moisture from time coil). Refer to Tang, C.C. (2005)
8240 :
8241 : // Return value
8242 : Real64 SHReff; // Effective sensible heat ratio, includes degradation due to cycling effects
8243 :
8244 : // FUNCTION LOCAL VARIABLE DECLARATIONS:
8245 : Real64 Twet; // Nominal time for condensate to begin leaving the coil's condensate drain line
8246 : // at the current operating conditions (sec)
8247 : Real64 Gamma; // Initial moisture evaporation rate divided by steady-state AC latent capacity
8248 : // at the current operating conditions
8249 : Real64 Twet_max; // Maximum allowed value for Twet
8250 : Real64 Ton; // Coil on time (sec)
8251 : Real64 Toff; // Coil off time (sec)
8252 : Real64 Toffa; // Actual coil off time (sec). Equations valid for Toff <= (2.0 * Twet/Gamma)
8253 : Real64 aa; // Intermediate variable
8254 : Real64 To1; // Intermediate variable (first guess at To). To = time to the start of moisture removal
8255 : Real64 To2; // Intermediate variable (second guess at To). To = time to the start of moisture removal
8256 : Real64 Error; // Error for iteration (DO) loop
8257 : Real64 LHRmult; // Latent Heat Ratio (LHR) multiplier. The effective latent heat ratio LHR = (1-SHRss)*LHRmult
8258 :
8259 11 : Real64 Twet_Rated = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Twet_Rated; // [s]
8260 11 : Real64 Gamma_Rated = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Gamma_Rated;
8261 11 : Real64 MaxONOFFCyclesperHour = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxONOFFCyclesperHour; // [cycles/hr]
8262 11 : Real64 LatentCapacityTimeConstant = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).LatentCapacityTimeConstant; // [s]
8263 11 : Real64 FanDelayTime = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FanDelayTime; // [s]
8264 :
8265 : // No moisture evaporation (latent degradation) occurs for runtime fraction of 1.0
8266 : // All latent degradation model parameters cause divide by 0.0 if not greater than 0.0
8267 : // Latent degradation model parameters initialize to 0.0 meaning no evaporation model used.
8268 11 : if ((RTF >= 1.0) || (QLatRated == 0.0) || (QLatActual == 0.0) || (Twet_Rated <= 0.0) || (Gamma_Rated <= 0.0) ||
8269 7 : (MaxONOFFCyclesperHour <= 0.0) || (LatentCapacityTimeConstant <= 0.0) || (RTF <= 0.0)) {
8270 4 : SHReff = SHRss;
8271 4 : return SHReff;
8272 : }
8273 :
8274 7 : Twet_max = 9999.0; // high limit for Twet
8275 :
8276 : // Calculate the model parameters at the actual operating conditions
8277 7 : Twet = min(Twet_Rated * QLatRated / (QLatActual + 1.e-10), Twet_max);
8278 7 : Gamma = Gamma_Rated * QLatRated * (EnteringDB - EnteringWB) / ((26.7 - 19.4) * QLatActual + 1.e-10);
8279 :
8280 : // Calculate the compressor on and off times using a converntional thermostat curve
8281 7 : Ton = 3600.0 / (4.0 * MaxONOFFCyclesperHour * (1.0 - RTF)); // duration of cooling coil on-cycle (sec)
8282 :
8283 7 : if ((fanOp == HVAC::FanOp::Cycling) && (FanDelayTime != 0.0)) {
8284 : // For FanOp::Cycling, moisture is evaporated from the cooling coil back to the air stream
8285 : // until the fan cycle off. Assume no evaporation from the coil after the fan shuts off.
8286 0 : Toff = FanDelayTime;
8287 : } else {
8288 : // For FanOp::Continuous, moisture is evaporated from the cooling coil back to the air stream
8289 : // for the entire heat pump off-cycle.
8290 7 : Toff = 3600.0 / (4.0 * MaxONOFFCyclesperHour * RTF); // duration of cooling coil off-cycle (sec)
8291 : }
8292 :
8293 : // Cap Toff to meet the equation restriction
8294 7 : if (Gamma > 0.0) {
8295 7 : Toffa = min(Toff, 2.0 * Twet / Gamma);
8296 : } else {
8297 0 : Toffa = Toff;
8298 : }
8299 :
8300 : // Use sucessive substitution to solve for To
8301 7 : aa = (Gamma * Toffa) - (0.25 / Twet) * pow_2(Gamma) * pow_2(Toffa);
8302 :
8303 7 : To1 = aa + LatentCapacityTimeConstant;
8304 7 : Error = 1.0;
8305 14 : while (Error > 0.001) {
8306 7 : To2 = aa - LatentCapacityTimeConstant * (std::exp(-To1 / LatentCapacityTimeConstant) - 1.0);
8307 7 : Error = std::abs((To2 - To1) / To1);
8308 7 : To1 = To2;
8309 : }
8310 :
8311 : // Adjust Sensible Heat Ratio (SHR) using Latent Heat Ratio (LHR) multiplier
8312 : // Floating underflow errors occur when -Ton/LatentCapacityTimeConstant is a large negative number.
8313 : // Cap lower limit at -700 to avoid the underflow errors.
8314 7 : aa = std::exp(max(-700.0, -Ton / LatentCapacityTimeConstant));
8315 : // Calculate latent heat ratio multiplier
8316 7 : LHRmult = max(((Ton - To2) / (Ton + LatentCapacityTimeConstant * (aa - 1.0))), 0.0);
8317 :
8318 : // Calculate part-load or "effective" sensible heat ratio
8319 7 : SHReff = 1.0 - (1.0 - SHRss) * LHRmult;
8320 :
8321 7 : if (SHReff < SHRss) SHReff = SHRss; // Effective SHR can be less than the steady-state SHR
8322 7 : if (SHReff > 1.0) SHReff = 1.0; // Effective sensible heat ratio can't be greater than 1.0
8323 :
8324 7 : return SHReff;
8325 : }
8326 :
8327 17696 : void CalcTotCapSHR_VSWSHP(EnergyPlusData &state,
8328 : Real64 const InletDryBulb, // inlet air dry bulb temperature [C]
8329 : Real64 const InletHumRat, // inlet air humidity ratio [kg water / kg dry air]
8330 : Real64 const InletEnthalpy, // inlet air specific enthalpy [J/kg]
8331 : Real64 &InletWetBulb, // inlet air wet bulb temperature [C]
8332 : Real64 const AirMassFlowRatio, // Ratio of actual air mass flow to nominal air mass flow
8333 : Real64 const WaterMassFlowRatio, // Ratio of actual water mass flow to nominal water mass flow
8334 : Real64 const AirMassFlow, // actual mass flow for capacity and SHR calculation
8335 : Real64 const CBF, // coil bypass factor
8336 : Real64 const TotCapNom1, // nominal total capacity at low speed [W]
8337 : int const CCapFTemp1, // capacity modifier curve index, function of entering wetbulb at low speed
8338 : int const CCapAirFFlow1, // capacity modifier curve, function of actual air flow vs rated flow at low speed
8339 : int const CCapWaterFFlow1, // capacity modifier curve, function of actual water flow vs rated flow at low speed
8340 : Real64 const TotCapNom2, // nominal total capacity at high speed [W]
8341 : int const CCapFTemp2, // capacity modifier curve index, function of entering wetbulb at high speed
8342 : int const CCapAirFFlow2, // capacity modifier curve, function of actual air flow vs rated flow at high speed
8343 : int const CCapWaterFFlow2, // capacity modifier curve, function of actual water flow vs rated flow at high speed
8344 : Real64 &TotCap1, // total capacity at the given conditions [W] at low speed
8345 : Real64 &TotCap2, // total capacity at the given conditions [W] at high speed
8346 : Real64 &TotCapSpeed, // integrated total capacity corresponding to the speed ratio
8347 : Real64 &SHR, // sensible heat ratio at the given conditions
8348 : Real64 const CondInletTemp, // Condenser inlet temperature [C]
8349 : Real64 const Pressure, // air pressure [Pa]
8350 : Real64 const SpeedRatio, // from 0.0 to 1.0
8351 : int const NumSpeeds, // number of speeds for input
8352 : Real64 &TotCapModFac // capacity modification factor, func of temp and func of flow
8353 : )
8354 : {
8355 :
8356 : // SUBROUTINE INFORMATION:
8357 : // AUTHOR Bo Shen, , based on DX:CalcTotCapSHR, introducing two speed levels
8358 : // DATE WRITTEN March 2012
8359 :
8360 : // PURPOSE OF THIS SUBROUTINE:
8361 : // Calculates total capacity and sensible heat ratio of a DX coil at the specified conditions
8362 :
8363 : // METHODOLOGY EMPLOYED:
8364 : // With the rated performance data entered by the user, the model employs some of the
8365 : // DOE-2.1E curve fits to adjust the capacity and SHR of the unit as a function
8366 : // of entering air temperatures and supply air flow rate (actual vs rated flow). The model
8367 : // does NOT employ the exact same methodology to calculate performance as DOE-2, although
8368 : // some of the DOE-2 curve fits are employed by this model.
8369 :
8370 : // The model checks for coil dryout conditions, and adjusts the calculated performance appropriately.
8371 :
8372 : // REFERENCES:
8373 : // ASHRAE HVAC 2 Toolkit page 4-81.
8374 : // Henderson, H.I. Jr., K. Rengarajan and D.B. Shirey, III. 1992.The impact of comfort
8375 : // control on air conditioner energy use in humid climates. ASHRAE Transactions 98(2):
8376 : // 104-113.
8377 : // Henderson, H.I. Jr., Danny Parker and Y.J. Huang. 2000.Improving DOE-2's RESYS routine:
8378 : // User Defined Functions to Provide More Accurate Part Load Energy Use and Humidity
8379 : // Predictions. Proceedings of ACEEE Conference.
8380 :
8381 : // SUBROUTINE PARAMETER DEFINITIONS:
8382 : static constexpr std::string_view RoutineName("CalcTotCapSHR_VSWSHP");
8383 17696 : constexpr int MaxIter = 30; // Maximum number of iterations for dry evaporator calculations
8384 17696 : constexpr Real64 Tolerance = 0.01; // Error tolerance for dry evaporator iterations
8385 :
8386 : // SUBROUTINE LOCAL VARIABLE DECLARATIONS:
8387 : Real64 TotCapWaterFlowModFac1; // Total capacity modifier (function of actual supply water flow vs nominal flow) at low speed
8388 : Real64 TotCapTempModFac2; // Total capacity modifier (function of entering wetbulb, outside water inlet temp) at high speed
8389 : Real64 TotCapAirFlowModFac2; // Total capacity modifier (function of actual supply air flow vs nominal flow) at high speed
8390 : Real64 TotCapWaterFlowModFac2; // Total capacity modifier (function of actual supply water flow vs nominal flow) at high speed
8391 : Real64 TotCapCalc; // temporary calculated value of total capacity [W]
8392 : Real64 TotCapCalc1; // temporary calculated value of total capacity [W] at low speed
8393 : Real64 TotCapCalc2; // temporary calculated value of total capacity [W] at high speed
8394 :
8395 17696 : int Counter = 0; // Error tolerance for dry evaporator iterations
8396 17696 : Real64 RF = 0.4; // Relaxation factor for dry evaporator iterations
8397 17696 : Real64 werror = 0.0; // Deviation of humidity ratio in dry evaporator iteration loop
8398 17696 : Real64 SHRCalc = SHR; // initialize temporary calculated value of SHR
8399 17696 : Real64 InletWetBulbCalc = InletWetBulb; // calculated inlet wetbulb temperature used for finding dry coil point [C]
8400 17696 : Real64 InletHumRatCalc = InletHumRat; // calculated inlet humidity ratio used for finding dry coil point [kg water / kg dry air]
8401 17696 : bool LoopOn = true; // flag to control the loop iteration
8402 :
8403 : // LOOP WHILE (ABS(werror) .gt. Tolerance .OR. Counter == 0)
8404 35402 : while (LoopOn) {
8405 : // Get capacity modifying factor (function of inlet wetbulb & condenser inlet temp) for off-rated conditions
8406 17706 : Real64 TotCapTempModFac1 = Curve::CurveValue(state, CCapFTemp1, InletWetBulbCalc, CondInletTemp);
8407 : // Get capacity modifying factor (function of mass flow) for off-rated conditions
8408 17706 : Real64 TotCapAirFlowModFac1 = Curve::CurveValue(state, CCapAirFFlow1, AirMassFlowRatio);
8409 : // Get capacity modifying factor (function of mass flow) for off-rated conditions
8410 17706 : if (CCapWaterFFlow1 == 0) {
8411 589 : TotCapWaterFlowModFac1 = 1.0;
8412 : } else {
8413 17117 : TotCapWaterFlowModFac1 = Curve::CurveValue(state, CCapWaterFFlow1, WaterMassFlowRatio);
8414 : }
8415 :
8416 : // Get total capacity
8417 17706 : if (NumSpeeds < 2) { // ONLY ONE SPEED
8418 14340 : TotCapCalc = TotCapNom1 * TotCapAirFlowModFac1 * TotCapWaterFlowModFac1 * TotCapTempModFac1;
8419 14340 : TotCapCalc1 = TotCapCalc;
8420 14340 : TotCapCalc2 = 0.0;
8421 14340 : TotCapModFac = TotCapAirFlowModFac1 * TotCapWaterFlowModFac1 * TotCapTempModFac1;
8422 : } else {
8423 3366 : TotCapTempModFac2 = Curve::CurveValue(state, CCapFTemp2, InletWetBulbCalc, CondInletTemp);
8424 3366 : TotCapAirFlowModFac2 = Curve::CurveValue(state, CCapAirFFlow2, AirMassFlowRatio);
8425 :
8426 3366 : if (CCapWaterFFlow2 == 0) {
8427 23 : TotCapWaterFlowModFac2 = 1.0;
8428 : } else {
8429 3343 : TotCapWaterFlowModFac2 = Curve::CurveValue(state, CCapWaterFFlow2, WaterMassFlowRatio);
8430 : }
8431 :
8432 3366 : TotCapCalc1 = TotCapNom1 * TotCapAirFlowModFac1 * TotCapWaterFlowModFac1 * TotCapTempModFac1;
8433 3366 : TotCapCalc2 = TotCapNom2 * TotCapAirFlowModFac2 * TotCapWaterFlowModFac2 * TotCapTempModFac2;
8434 :
8435 3366 : TotCapCalc = TotCapCalc2 * SpeedRatio + (1.0 - SpeedRatio) * TotCapCalc1;
8436 3366 : TotCapModFac = (TotCapAirFlowModFac2 * TotCapWaterFlowModFac2 * TotCapTempModFac2) * SpeedRatio +
8437 3366 : (1.0 - SpeedRatio) * (TotCapAirFlowModFac1 * TotCapWaterFlowModFac1 * TotCapTempModFac1);
8438 : }
8439 :
8440 17706 : Real64 localCBF = max(0.0, CBF); // negative coil bypass factor is physically impossible
8441 :
8442 : // Calculate apparatus dew point conditions using TotCap and CBF
8443 17706 : Real64 hDelta = TotCapCalc / AirMassFlow; // Change in air enthalpy across the cooling coil [J/kg]
8444 17706 : Real64 hADP = InletEnthalpy - hDelta / (1.0 - localCBF); // Apparatus dew point enthalpy [J/kg]
8445 17706 : Real64 tADP = Psychrometrics::PsyTsatFnHPb(state, hADP, Pressure, RoutineName); // Apparatus dew point temperature [C]
8446 17706 : Real64 wADP = Psychrometrics::PsyWFnTdbH(state, tADP, hADP, RoutineName); // Apparatus dew point humidity ratio [kg/kg]
8447 17706 : Real64 hTinwADP = Psychrometrics::PsyHFnTdbW(InletDryBulb, wADP); // Enthalpy at inlet dry-bulb and wADP [J/kg]
8448 17706 : if (TotCapCalc > 1.0e-10) {
8449 17699 : SHRCalc = min((hTinwADP - hADP) / (InletEnthalpy - hADP), 1.0); // temporary calculated value of SHR
8450 : } else {
8451 7 : SHRCalc = 1.0;
8452 : }
8453 :
8454 : // Check for dry evaporator conditions (win < wadp)
8455 17706 : if (wADP > InletHumRatCalc || (Counter >= 1 && Counter < MaxIter)) {
8456 17 : if (InletHumRatCalc == 0.0) InletHumRatCalc = 0.00001;
8457 17 : werror = (InletHumRatCalc - wADP) / InletHumRatCalc;
8458 : // Increase InletHumRatCalc at constant inlet air temp to find coil dry-out point. Then use the
8459 : // capacity at the dry-out point to determine exiting conditions from coil. This is required
8460 : // since the TotCapTempModFac doesn't work properly with dry-coil conditions.
8461 17 : InletHumRatCalc = RF * wADP + (1.0 - RF) * InletHumRatCalc;
8462 17 : InletWetBulbCalc = Psychrometrics::PsyTwbFnTdbWPb(state, InletDryBulb, InletHumRatCalc, Pressure);
8463 17 : ++Counter;
8464 34 : if (std::abs(werror) > Tolerance) {
8465 10 : LoopOn = true; // Recalculate with modified inlet conditions
8466 : } else {
8467 7 : LoopOn = false;
8468 : }
8469 : } else {
8470 17689 : LoopOn = false;
8471 : }
8472 : } // END LOOP
8473 :
8474 : // Calculate full load output conditions
8475 17696 : if (SHRCalc > 1.0 || Counter > 0) SHRCalc = 1.0; // if Counter > 0 means a dry coil so SHR = 1
8476 :
8477 17696 : SHR = SHRCalc;
8478 17696 : TotCap1 = TotCapCalc1;
8479 17696 : TotCap2 = TotCapCalc2;
8480 17696 : TotCapSpeed = TotCapCalc;
8481 17696 : InletWetBulb = InletWetBulbCalc;
8482 17696 : }
8483 :
8484 2 : Real64 getVarSpeedPartLoadRatio(EnergyPlusData &state, int const DXCoilNum)
8485 : {
8486 2 : return state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio;
8487 : }
8488 :
8489 : } // namespace VariableSpeedCoils
8490 :
8491 : } // namespace EnergyPlus
|