22 enum ChillerType { Centrifugal, Screw };
24 enum CondenserCoolingType { Water, Air };
26 enum CompressorConfigType { NoVFD, VFD, MagneticBearing };
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) {}
37 std::vector<double> baselinePowerList;
38 std::vector<double> modPowerList;
39 double baselineTotalPower = 0, baselineTotalEnergy = 0, modTotalPower = 0, modTotalEnergy = 0,
45 double baselinePower,
double baselineEnergy,
double modActualCapacity,
46 double modActualEfficiency,
double modPower,
double modEnergy,
48 : baselineActualCapacity(baselineActualCapacity), baselineActualEfficiency(baselineActualEfficiency),
49 baselinePower(baselinePower), baselineEnergy(baselineEnergy), modActualCapacity(modActualCapacity),
50 modActualEfficiency(modActualEfficiency), modPower(modPower), modEnergy(modEnergy),
51 savingsEnergy(savingsEnergy) {}
54 double baselineActualCapacity = 0, baselineActualEfficiency = 0, baselinePower = 0, baselineEnergy = 0,
55 modActualCapacity = 0, modActualEfficiency = 0, modPower = 0, modEnergy = 0, savingsEnergy = 0;
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;
101 double percentCapacity;
103 InitConstCoefficients(chillerType, condenserCoolingType, compressorConfigType, ariCapacity, ariEfficiency,
104 maxCapacityRatio, cCAP, cCHWT, cPLR, cFactor, ratedEIR, percentCapacity);
106 const double load = waterFlowRate * waterDeltaT * 0.041667 ;
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);
113 const double baselineEnergy = baselineOutput.consumptionPower * operatingHours;
114 const double modEnergy = modOutput.consumptionPower * operatingHours;
116 baselineOutput.consumptionPower, baselineEnergy,
117 modOutput.actualCapacity, modOutput.actualEfficiency,
118 modOutput.consumptionPower, modEnergy, baselineEnergy - modEnergy);
147 static StagingPowerConsumptionOutput
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();
155 if (chillersCount != modLoadList.size())
156 throw std::runtime_error(
"Chiller counts for baseline and modification does not match");
158 std::vector<double> cCAP;
159 std::vector<double> cCHWT;
160 std::vector<double> cPLR;
163 double percentCapacity;
165 InitConstCoefficients(chillerType, condenserCoolingType, compressorConfigType, ariCapacity, ariEfficiency,
166 maxCapacityRatio, cCAP, cCHWT, cPLR, cFactor, ratedEIR, percentCapacity);
168 std::vector<double> baselinePowerList;
169 std::vector<double> modPowerList;
170 double baselineTotalPower = 0, baselineTotalEnergy = 0, modTotalPower = 0, modTotalEnergy = 0;
172 baselinePowerList.assign(chillersCount, 0);
173 modPowerList.assign(chillersCount, 0);
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;
182 baselinePowerList[i] = baselineOutput.consumptionPower;
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;
191 modPowerList[i] = modOutput.consumptionPower;
196 modTotalPower, modTotalEnergy, baselineTotalEnergy - modTotalEnergy);
201 Output(
double actualCapacity,
double actualEfficiency,
double consumptionPower)
202 : actualCapacity(actualCapacity), actualEfficiency(actualEfficiency), consumptionPower(consumptionPower) {}
205 double actualCapacity = 0, actualEfficiency = 0, consumptionPower = 0;
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) {
214 ratedEIR = ariEfficiency * cFactor;
215 percentCapacity = ariCapacity / maxCapacityRatio;
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};
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};
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};
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};
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};
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};
249 throw std::runtime_error(
"Undefined Chiller characteristics");
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;
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;
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;
268 double percentLoad = load / actualCapacity;
269 if (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;
274 const double baselineEfficiency = (fCHWT * fFPLR * ratedEIR) / cFactor;
276 return Output(actualCapacity, baselineEfficiency, actualCapacity * baselineEfficiency);