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