21 enum ChillerType { Centrifugal, Screw };
23 enum CondenserCoolingType { Water, Air };
25 enum CompressorConfigType { NoVFD, VFD, MagneticBearing };
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) {}
36 std::vector<double> baselinePowerList;
37 std::vector<double> modPowerList;
38 double baselineTotalPower = 0, baselineTotalEnergy = 0, modTotalPower = 0, modTotalEnergy = 0,
44 double baselinePower,
double baselineEnergy,
double modActualCapacity,
45 double modActualEfficiency,
double modPower,
double modEnergy,
47 : baselineActualCapacity(baselineActualCapacity), baselineActualEfficiency(baselineActualEfficiency),
48 baselinePower(baselinePower), baselineEnergy(baselineEnergy), modActualCapacity(modActualCapacity),
49 modActualEfficiency(modActualEfficiency), modPower(modPower), modEnergy(modEnergy),
50 savingsEnergy(savingsEnergy) {}
53 double baselineActualCapacity = 0, baselineActualEfficiency = 0, baselinePower = 0, baselineEnergy = 0,
54 modActualCapacity = 0, modActualEfficiency = 0, modPower = 0, modEnergy = 0, savingsEnergy = 0;
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;
100 double percentCapacity;
102 InitConstCoefficients(chillerType, condenserCoolingType, compressorConfigType, ariCapacity, ariEfficiency,
103 maxCapacityRatio, cCAP, cCHWT, cPLR, cFactor, ratedEIR, percentCapacity);
105 const double load = waterFlowRate * waterDeltaT * 0.041667 ;
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);
112 const double baselineEnergy = baselineOutput.consumptionPower * operatingHours;
113 const double modEnergy = modOutput.consumptionPower * operatingHours;
115 baselineOutput.consumptionPower, baselineEnergy,
116 modOutput.actualCapacity, modOutput.actualEfficiency,
117 modOutput.consumptionPower, modEnergy, baselineEnergy - modEnergy);
146 static StagingPowerConsumptionOutput
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();
154 if (chillersCount != modLoadList.size())
155 throw std::runtime_error(
"Chiller counts for baseline and modification does not match");
157 std::vector<double> cCAP;
158 std::vector<double> cCHWT;
159 std::vector<double> cPLR;
162 double percentCapacity;
164 InitConstCoefficients(chillerType, condenserCoolingType, compressorConfigType, ariCapacity, ariEfficiency,
165 maxCapacityRatio, cCAP, cCHWT, cPLR, cFactor, ratedEIR, percentCapacity);
167 std::vector<double> baselinePowerList;
168 std::vector<double> modPowerList;
169 double baselineTotalPower = 0, baselineTotalEnergy = 0, modTotalPower = 0, modTotalEnergy = 0;
171 baselinePowerList.assign(chillersCount, 0);
172 modPowerList.assign(chillersCount, 0);
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;
181 baselinePowerList[i] = baselineOutput.consumptionPower;
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;
190 modPowerList[i] = modOutput.consumptionPower;
195 modTotalPower, modTotalEnergy, baselineTotalEnergy - modTotalEnergy);
200 Output(
double actualCapacity,
double actualEfficiency,
double consumptionPower)
201 : actualCapacity(actualCapacity), actualEfficiency(actualEfficiency), consumptionPower(consumptionPower) {}
204 double actualCapacity = 0, actualEfficiency = 0, consumptionPower = 0;
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) {
213 ratedEIR = ariEfficiency * cFactor;
214 percentCapacity = ariCapacity / maxCapacityRatio;
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};
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};
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};
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};
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};
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};
248 throw std::runtime_error(
"Undefined Chiller characteristics");
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;
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;
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;
267 double percentLoad = load / actualCapacity;
268 if (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;
273 const double baselineEfficiency = (fCHWT * fFPLR * ratedEIR) / cFactor;
275 return Output(actualCapacity, baselineEfficiency, actualCapacity * baselineEfficiency);