MEASUR-Tools-Suite v1.0.11
The MEASUR Tools Suite is a collection of industrial efficiency calculations written in C++ and with bindings for compilation to WebAssembly.
Loading...
Searching...
No Matches
ChillerEfficiency.h
1
12#ifndef TOOLS_SUITE_CHILLEREFFICIENCY_H
13#define TOOLS_SUITE_CHILLEREFFICIENCY_H
14
15#include <math.h>
16
17#include <stdexcept>
18#include <vector>
19
21 public:
22 enum ChillerType { Centrifugal, Screw };
23
24 enum CondenserCoolingType { Water, Air };
25
26 enum CompressorConfigType { NoVFD, VFD, MagneticBearing };
27
29 StagingPowerConsumptionOutput(std::vector<double> baselinePowerList, std::vector<double> modPowerList,
30 double baselineTotalPower, double baselineTotalEnergy, double modTotalPower,
31 double modTotalEnergy, double savingsEnergy)
32 : baselinePowerList(baselinePowerList), modPowerList(modPowerList), baselineTotalPower(baselineTotalPower),
33 baselineTotalEnergy(baselineTotalEnergy), modTotalPower(modTotalPower), modTotalEnergy(modTotalEnergy),
34 savingsEnergy(savingsEnergy) {}
35
37 std::vector<double> baselinePowerList;
38 std::vector<double> modPowerList;
39 double baselineTotalPower = 0, baselineTotalEnergy = 0, modTotalPower = 0, modTotalEnergy = 0,
40 savingsEnergy = 0;
41 };
42
44 CapacityPowerEnergyConsumptionOutput(double baselineActualCapacity, double baselineActualEfficiency,
45 double baselinePower, double baselineEnergy, double modActualCapacity,
46 double modActualEfficiency, double modPower, double modEnergy,
47 double savingsEnergy)
48 : baselineActualCapacity(baselineActualCapacity), baselineActualEfficiency(baselineActualEfficiency),
49 baselinePower(baselinePower), baselineEnergy(baselineEnergy), modActualCapacity(modActualCapacity),
50 modActualEfficiency(modActualEfficiency), modPower(modPower), modEnergy(modEnergy),
51 savingsEnergy(savingsEnergy) {}
52
54 double baselineActualCapacity = 0, baselineActualEfficiency = 0, baselinePower = 0, baselineEnergy = 0,
55 modActualCapacity = 0, modActualEfficiency = 0, modPower = 0, modEnergy = 0, savingsEnergy = 0;
56 };
57
90 ChillerCapacityEfficiency(const ChillerType chillerType, const CondenserCoolingType condenserCoolingType,
91 const CompressorConfigType compressorConfigType, const double ariCapacity,
92 const double ariEfficiency, const double maxCapacityRatio, const double operatingHours,
93 const double waterFlowRate, const double waterDeltaT,
94 const double baselineWaterSupplyTemp, const double baselineWaterEnteringTemp,
95 const double modWaterSupplyTemp, const double modWaterEnteringTemp) {
96 std::vector<double> cCAP;
97 std::vector<double> cCHWT;
98 std::vector<double> cPLR;
99 double cFactor;
100 double ratedEIR;
101 double percentCapacity;
102
103 InitConstCoefficients(chillerType, condenserCoolingType, compressorConfigType, ariCapacity, ariEfficiency,
104 maxCapacityRatio, cCAP, cCHWT, cPLR, cFactor, ratedEIR, percentCapacity);
105
106 const double load = waterFlowRate * waterDeltaT * 0.041667 /*500.0 / 12000*/;
107
108 auto baselineOutput = ChillerPowerConsumption(baselineWaterSupplyTemp, baselineWaterEnteringTemp, cCAP, cCHWT,
109 cPLR, load, cFactor, percentCapacity, ratedEIR);
110 auto modOutput = ChillerPowerConsumption(modWaterSupplyTemp, modWaterEnteringTemp, cCAP, cCHWT, cPLR, load,
111 cFactor, percentCapacity, ratedEIR);
112
113 const double baselineEnergy = baselineOutput.consumptionPower * operatingHours;
114 const double modEnergy = modOutput.consumptionPower * operatingHours;
115 return CapacityPowerEnergyConsumptionOutput(baselineOutput.actualCapacity, baselineOutput.actualEfficiency,
116 baselineOutput.consumptionPower, baselineEnergy,
117 modOutput.actualCapacity, modOutput.actualEfficiency,
118 modOutput.consumptionPower, modEnergy, baselineEnergy - modEnergy);
119 }
120
147 static StagingPowerConsumptionOutput
148 ChillerStagingEfficiency(const ChillerType chillerType, const CondenserCoolingType condenserCoolingType,
149 const CompressorConfigType compressorConfigType, const double ariCapacity,
150 const double ariEfficiency, const double maxCapacityRatio, const double operatingHours,
151 const double waterSupplyTemp, const double waterEnteringTemp,
152 const std::vector<double> baselineLoadList, const std::vector<double> modLoadList) {
153 unsigned int chillersCount = baselineLoadList.size();
154
155 if (chillersCount != modLoadList.size())
156 throw std::runtime_error("Chiller counts for baseline and modification does not match");
157
158 std::vector<double> cCAP;
159 std::vector<double> cCHWT;
160 std::vector<double> cPLR;
161 double cFactor;
162 double ratedEIR;
163 double percentCapacity;
164
165 InitConstCoefficients(chillerType, condenserCoolingType, compressorConfigType, ariCapacity, ariEfficiency,
166 maxCapacityRatio, cCAP, cCHWT, cPLR, cFactor, ratedEIR, percentCapacity);
167
168 std::vector<double> baselinePowerList;
169 std::vector<double> modPowerList;
170 double baselineTotalPower = 0, baselineTotalEnergy = 0, modTotalPower = 0, modTotalEnergy = 0;
171
172 baselinePowerList.assign(chillersCount, 0);
173 modPowerList.assign(chillersCount, 0);
174
175 for (unsigned int i = 0; i < chillersCount; i++) {
176 if (baselineLoadList[i] > 0) {
177 auto baselineOutput = ChillerPowerConsumption(waterSupplyTemp, waterEnteringTemp, cCAP, cCHWT, cPLR,
178 baselineLoadList[i], cFactor, percentCapacity, ratedEIR);
179 baselineTotalPower += baselineOutput.consumptionPower;
180 baselineTotalEnergy += baselineOutput.consumptionPower * operatingHours;
181
182 baselinePowerList[i] = baselineOutput.consumptionPower;
183 }
184
185 if (modLoadList[i] > 0) {
186 auto modOutput = ChillerPowerConsumption(waterSupplyTemp, waterEnteringTemp, cCAP, cCHWT, cPLR,
187 modLoadList[i], cFactor, percentCapacity, ratedEIR);
188 modTotalPower += modOutput.consumptionPower;
189 modTotalEnergy += modOutput.consumptionPower * operatingHours;
190
191 modPowerList[i] = modOutput.consumptionPower;
192 }
193 }
194
195 return StagingPowerConsumptionOutput(baselinePowerList, modPowerList, baselineTotalPower, baselineTotalEnergy,
196 modTotalPower, modTotalEnergy, baselineTotalEnergy - modTotalEnergy);
197 }
198
199 private:
200 struct Output {
201 Output(double actualCapacity, double actualEfficiency, double consumptionPower)
202 : actualCapacity(actualCapacity), actualEfficiency(actualEfficiency), consumptionPower(consumptionPower) {}
203
204 Output() = default;
205 double actualCapacity = 0, actualEfficiency = 0, consumptionPower = 0;
206 };
207
208 static void InitConstCoefficients(const ChillerType& chillerType, const CondenserCoolingType& condenserCoolingType,
209 const CompressorConfigType& compressorConfigType, const double ariCapacity,
210 const double ariEfficiency, const double maxCapacityRatio,
211 std::vector<double>& cCAP, std::vector<double>& cCHWT, std::vector<double>& cPLR,
212 double& cFactor, double& ratedEIR, double& percentCapacity) {
213 cFactor = 0.284333 /*3.412 / 12*/;
214 ratedEIR = ariEfficiency * cFactor;
215 percentCapacity = ariCapacity / maxCapacityRatio;
216
217 if (chillerType == Centrifugal && condenserCoolingType == Water && compressorConfigType == NoVFD) {
218 cCAP = {-0.49737319, -0.00956073, -0.00059561, 0.04352099, -0.00058394, 0.00096007};
219 cCHWT = {1.15361547, -0.03067901, 0.00030591, 0.00670874, 0.0000528, -0.00009297};
220 cPLR = {0.27969646, 0.57375735, 0.25690463, -0.00580717, 0.00014649, -0.00353007};
221 }
222 else if (chillerType == Centrifugal && condenserCoolingType == Water && compressorConfigType == VFD) {
223 cCAP = {-0.38924542, -0.02195141, -0.00027343, 0.04974775, -0.00053441, 0.00067295};
224 cCHWT = {1.42868233, -0.08227751, 0.00030243, 0.03622194, -0.00029211, 0.00043788};
225 cPLR = {0.14703037, -0.00349667, 1.01161313, -0.00359697, 0.00027167, -0.01164471};
226 }
227 else if (chillerType == Centrifugal && condenserCoolingType == Water &&
228 compressorConfigType == MagneticBearing) {
229 cCAP = {1.37074482, -0.04210769, -0.00029363, 0.01559556, -0.00051769, 0.00119421};
230 cCHWT = {1.37895823, -0.03063673, 0.00013163, -0.0004975, 0.00005392, 0.00009815};
231 cPLR = {-0.08770346, 0.63231272, 0.52312154, 0.00289049, 0.00008105, -0.00786588};
232 }
233 else if (chillerType == Centrifugal && condenserCoolingType == Air && compressorConfigType == NoVFD) {
234 cCAP = {-1.38147235, 0.10363494, -0.00103756, 0.00368918, -0.00006936, 0.00002531};
235 cCHWT = {-0.40465075, 0.03093917, -0.00029274, 0.00840319, 0.00002946, -0.00010866};
236 cPLR = {0.24258001, 0.41468, 0.34273973, 0, 0, 0};
237 }
238 else if (chillerType == Screw && condenserCoolingType == Air && compressorConfigType == NoVFD) {
239 cCAP = {0.67083991, 0.00274941, 0.00018121, 0.00326176, -0.00003443, -0.0000339};
240 cCHWT = {0.93630582, -0.0101571, 0.00021678, -0.00245357, 0.00013577, -0.00021563};
241 cPLR = {0.01040687, 1.05183303, -0.09462459, 0.00163543, -0.00000779, -0.00060324};
242 }
243 else if (chillerType == Screw && condenserCoolingType == Water && compressorConfigType == NoVFD) {
244 cCAP = {0.89823061, 0.0004535, 0.0002369, -0.0010475, -0.0000293, -0.00002035};
245 cCHWT = {0.62493622, -0.00099309, 0.00017366, -0.00086447, 0.00019627, -0.0003377};
246 cPLR = {-0.11699212, 1.26354492, -0.21946673, 0.00294536, 0.00001688, -0.00185917};
247 }
248 else {
249 throw std::runtime_error("Undefined Chiller characteristics");
250 }
251 }
252
253 static Output ChillerPowerConsumption(const double waterSupplyTemp, const double waterEnteringTemp,
254 const std::vector<double>& cCAP, const std::vector<double>& cCHWT,
255 const std::vector<double>& cPLR, const double load, const double cFactor,
256 const double percentCapacity, const double ratedEIR) {
257 const double deltaT = waterEnteringTemp - waterSupplyTemp;
258
259 double capacity = cCAP[0] + cCAP[1] * waterSupplyTemp + cCAP[2] * waterSupplyTemp * waterSupplyTemp +
260 cCAP[3] * waterEnteringTemp + cCAP[4] * waterEnteringTemp * waterEnteringTemp +
261 cCAP[5] * waterSupplyTemp * waterEnteringTemp;
262 const double actualCapacity = capacity * capacity * percentCapacity;
263
264 const double fCHWT = cCHWT[0] + cCHWT[1] * waterSupplyTemp + cCHWT[2] * waterSupplyTemp * waterSupplyTemp +
265 cCHWT[3] * waterEnteringTemp + cCHWT[4] * waterEnteringTemp * waterEnteringTemp +
266 cCHWT[5] * waterSupplyTemp * waterEnteringTemp;
267
268 double percentLoad = load / actualCapacity;
269 if (percentLoad < 0.1)
270 percentLoad = 0.1;
271 const double fFPLR = cPLR[0] + cPLR[1] * percentLoad + cPLR[2] * percentLoad * percentLoad + cPLR[3] * deltaT +
272 cPLR[4] * deltaT * deltaT + cPLR[5] * deltaT * percentLoad;
273
274 const double baselineEfficiency = (fCHWT * fFPLR * ratedEIR) / cFactor;
275
276 return Output(actualCapacity, baselineEfficiency, actualCapacity * baselineEfficiency);
277 }
278};
279
280#endif // TOOLS_SUITE_CHILLEREFFICIENCY_H
Contains the Consumption (Water / Power / Energy) & Savings calculators for Chiller Efficiency : Temp...
static CapacityPowerEnergyConsumptionOutput ChillerCapacityEfficiency(const ChillerType chillerType, const CondenserCoolingType condenserCoolingType, const CompressorConfigType compressorConfigType, const double ariCapacity, const double ariEfficiency, const double maxCapacityRatio, const double operatingHours, const double waterFlowRate, const double waterDeltaT, const double baselineWaterSupplyTemp, const double baselineWaterEnteringTemp, const double modWaterSupplyTemp, const double modWaterEnteringTemp)
static StagingPowerConsumptionOutput ChillerStagingEfficiency(const ChillerType chillerType, const CondenserCoolingType condenserCoolingType, const CompressorConfigType compressorConfigType, const double ariCapacity, const double ariEfficiency, const double maxCapacityRatio, const double operatingHours, const double waterSupplyTemp, const double waterEnteringTemp, const std::vector< double > baselineLoadList, const std::vector< double > modLoadList)