40#include "util/CurveFitVal.h"
44 enum CompressorType { Centrifugal, Screw, Reciprocating };
52 VariableDisplacementUnload,
57 enum Stage { Single, Two, Multiple };
59 enum Lubricant { Injected, Free, None };
61 enum Modulation { Throttle, VariableDisplacement };
63 enum ComputeFrom { PercentagePower, PercentageCapacity, PowerMeasured, CapacityMeasured,
PowerFactor };
66 Output(
double kW_Calc,
double C_Calc,
double PerkW,
double C_Per)
67 : kW_Calc(kW_Calc), C_Calc(C_Calc), PerkW(PerkW), C_Per(C_Per) {}
70 double kW_Calc = 0, C_Calc = 0, PerkW = 0, C_Per = 0;
74 OutputBlowOff(
double kW_Calc,
double C_Calc,
double PerkW,
double C_Per,
double C_blow,
double blowPer)
75 : kW_Calc(kW_Calc), C_Calc(C_Calc), PerkW(PerkW), C_Per(C_Per), C_blow(C_blow), blowPer(blowPer) {}
78 double kW_Calc = 0, C_Calc = 0, PerkW = 0, C_Per = 0, C_blow = 0, blowPer = 0;
82 int getC_fl_Adjusted()
const {
return C_fl_Adjusted; }
83 int getkW_fl_Adjusted()
const {
return kW_fl_Adjusted; }
84 int getC_max_Adjusted()
const {
return C_max_Adjusted; }
85 int getkW_max_Adjusted()
const {
return kW_max_Adjusted; }
89 : kW_fl(kW_fl), C_fl(C_fl), C_fl_raw(C_fl), kW_fl_raw(kW_fl), kW_fl_Adjusted(kW_fl), C_fl_Adjusted(C_fl),
90 C_max_Adjusted(0), kW_max_Adjusted(0) {}
93 const double C_fl_raw, kW_fl_raw;
96 double kW_fl_Adjusted;
98 double C_max_Adjusted;
99 double kW_max_Adjusted;
107 return OutputBlowOff();
116 virtual void AdjustDischargePressure(std::vector<double>, std::vector<double>,
double,
double) {}
119 void PressureInletCorrection(CompressorType CompType,
const double capacity,
const double full_load_bhp,
120 const double poly_exponent,
const double P_ratedDischarge,
const double P_RatedIn,
121 const double Eff,
const double P_fl,
const double P_max,
const double P_in,
122 const bool PresAdj,
const double P_atm) {
123 double kW = 0, Cap = 0;
125 PressureInletCorrection(Cap, kW, CompType, capacity, full_load_bhp, poly_exponent, P_ratedDischarge, P_RatedIn,
126 Eff, P_fl, P_in, PresAdj, P_atm);
127 kW_fl_Adjusted = kW_fl = kW;
128 C_fl_Adjusted = C_fl = Cap;
130 PressureInletCorrection(Cap, kW, CompType, capacity, full_load_bhp, poly_exponent, P_ratedDischarge, P_RatedIn,
131 Eff, P_max, P_in, PresAdj, P_atm);
132 kW_max_Adjusted = kW;
133 C_max_Adjusted = Cap;
136 double roundDouble(
double value)
const;
139 void PressureInletCorrection(
double& cap,
double& kW, CompressorType CompType,
const double capacity,
140 const double full_load_bhp,
const double poly_exponent,
const double P_ratedDischarge,
141 const double P_RatedIn,
const double Eff,
const double dischargePres,
142 const double P_in,
const bool PresAdj,
const double P_atm) {
143 if (CompType == CompressorType::Centrifugal)
146 double Pres_kW = 1, Pres_Flow = 1;
148 Pres_kW = -0.0000577 * pow(P_atm, 3) + 0.000251 * pow(P_atm, 2) + 0.0466 * P_atm + 0.4442;
149 Pres_Flow = 0.000258 * pow(P_atm, 3) - 0.0116 * pow(P_atm, 2) + 0.176 * P_atm + 0.09992;
152 kW = (Pres_kW * (P_atm / P_in) * full_load_bhp * 0.746 / Eff *
153 PressureInletCorrection_PressRatio(poly_exponent, (P_ratedDischarge + P_RatedIn) / P_RatedIn,
154 dischargePres, CompType == CompressorType::Screw ? P_RatedIn : P_atm));
155 cap = (Pres_Flow * capacity * (1 - 0.00075 * (dischargePres - P_ratedDischarge)));
158 double PressureInletCorrection_PressRatio(
double poly_exponent,
double PressRatio1,
double OpPress,
159 double P_PressRatio2) {
160 double PressRatio2 = (OpPress + P_PressRatio2) / P_PressRatio2;
161 double PolyPower = ((poly_exponent - 1) / poly_exponent);
162 return (pow(PressRatio2, PolyPower) - 1) / (pow(PressRatio1, PolyPower) - 1);
183 CPer_blow = C_blow / C_fl;
184 kWPer_blow = kW_blow / kW_fl;
260 double blowPer)
override;
272 double P_max = 0)
override {
275 CurveFitVal curveFitValCap(DischargePressure, Capacity, 2);
276 C_fl_Adjusted = C_fl = curveFitValCap.
calculate(P_fl);
278 CPer_blow = C_blow / C_fl;
284 double CPer_blow = 1;
285 double kWPer_blow = 0;
299 kWPer_nl = kW_nl / kW_fl;
380 double P_max = 0)
override {
383 CurveFitVal curveFitValCap(DischargePressure, Capacity, 2);
384 C_fl_Adjusted = C_fl = curveFitValCap.
calculate(P_fl);
389 const double CPer_fl = 1;
390 const double CPer_nl = 0;
407 const double C_max,
const double kW_ul,
const double C_ul)
408 :
CompressorsBase(kW_fl, C_fl), C_max(C_max), C_max_raw(C_max), C_ul(C_ul) {
409 C_max_Adjusted = C_max;
411 kWPer_nl = kW_nl / kW_fl;
412 kWPer_ul = kW_ul / kW_fl;
413 CPer_max = C_max / C_fl;
414 CPer_ul = C_ul / C_fl;
415 CPer_ulB = C_ul / C_max;
495 double P_max)
override {
496 if (P_fl > 0 || P_max > 0) {
497 CurveFitVal curveFitValCap(DischargePressure, Capacity, 2);
500 C_fl_Adjusted = C_fl = curveFitValCap.
calculate(P_fl);
502 C_max_Adjusted = C_max = curveFitValCap.
calculate(P_max);
504 CPer_max = C_max / C_fl;
505 CPer_ul = C_ul / C_fl;
506 CPer_ulB = C_ul / C_max;
512 const double kWPer_max = 1, C_max_raw = 1, C_ul = 1;
518 const double CPer_nl = 0;
536 const bool woUnload =
true,
const CompressorType CompType = CompressorType::Screw,
537 double noLoadPowerFM = .7,
const double kW_max = 0)
538 :
CompressorsBase(kW_fl, C_fl), kW_nl(kW_nl), mod_exp(mod_exp), woUnload(woUnload), CompType(CompType),
539 noLoadPowerFM(noLoadPowerFM), kW_max(kW_max) {
540 lf_nl = kW_nl / kW_fl;
628 const double P_ratedDischarge,
const double P_RatedIn,
const double Eff,
629 const double P_fl,
const double P_max,
const double P_in,
const bool PresAdj,
630 const double P_atm = 14.69) {
631 PressureInletCorrection(CompType, capacity, full_load_bhp, poly_exponent, P_ratedDischarge, P_RatedIn, Eff,
632 P_fl, P_max, P_in, PresAdj, P_atm);
636 const double kW_nl = 1;
637 const double mod_exp = 1;
638 const bool woUnload =
true;
639 const CompressorType CompType;
641 double noLoadPowerFM;
656 :
CompressorsBase(kW_fl, C_fl), kWPer_max(kWPer_max), kWPer_fl(kWPer_fl) {
657 kW_max = kWPer_max * kW_fl;
745 const double P_ratedDischarge,
const double P_RatedIn,
const double Eff,
746 const double P_fl,
const double P_max,
const double P_in,
const bool PresAdj,
747 const double P_atm = 14.69) {
748 PressureInletCorrection(CompressorType::Screw, capacity, full_load_bhp, poly_exponent, P_ratedDischarge,
749 P_RatedIn, Eff, P_fl, P_max, P_in, PresAdj, P_atm);
751 kW_max = kWPer_max * kW_fl;
756 const double kWPer_max = 1, kWPer_fl = 1;
787 const double P_fl,
const double P_max,
const double P_mod,
const double lf_ul,
788 const double P_atm = 14.7,
const CompressorType CompType = CompressorType::Reciprocating,
789 const Lubricant LubricantType = Lubricant::None,
790 ControlType CntrlType = ControlType::LoadUnload,
const double kW_nl = 1,
791 const double PerC_ul = 100,
double t_blowdown = .003,
double P_sump_ul = 15,
792 double noLoadPowerFM = .7,
double kW_ul = 0,
double P_ul = 0,
double C_ul = 0)
793 :
CompressorsBase(kW_fl, C_fl), kW_max(kW_max), P_atm(P_atm), P_fl(P_fl), P_max(P_max), P_mod(P_mod),
794 CompType(CompType), LubricantType(LubricantType), CntrlType(CntrlType), lf_nl(kW_nl / kW_fl),
795 C_storage(C_storage), kW_nl(kW_nl), PerC_ul(PerC_ul), t_blowdown(t_blowdown), P_sump_ul(P_sump_ul),
796 noLoadPowerFM(noLoadPowerFM), kW_ul(kW_ul), P_ul(P_ul), C_ul(C_ul) {
797 double lf_ul_ = lf_ul;
799 if (CompType == CompressorType::Screw && LubricantType == Lubricant::None)
800 throw std::invalid_argument(
"Lubricant needs to be Injected or free for Screw Compressor Type");
802 setNoLoadPowerFM(noLoadPowerFM, LubricantType, CntrlType);
803 setModExp(CntrlType);
804 if (CompType == CompressorType::Screw) {
805 if (LubricantType == Lubricant::Injected) {
809 else if (LubricantType == Lubricant::Free) {
813 setUnloadSumpPressure(15);
816 else if (CompType == CompressorType::Reciprocating) {
820 setUnloadSumpPressure(15);
824 if (CntrlType != ControlType::ModulationUnload) {
831 void setBlowdown(
double blowdown) { t_blowdown = blowdown; }
833 void setUnloadSumpPressure(
double sumpPressure) { P_sump_ul = sumpPressure; }
835 void setNoLoadPowerFM(
double noLoadPowerFM, Lubricant LubricantType, ControlType ControlType) {
836 if (LubricantType == Lubricant::Injected && ControlType == ControlType::LoadUnload) {
840 lf_fl = noLoadPowerFM;
844 void setC_ul() { C_ul = C_fl * PerC_ul / 100; }
847 double kW_maxmod = lf_fl * kW_max;
848 kW_ul = (kW_max - kW_maxmod) * pow(C_ul / C_fl, mod_exp) + kW_maxmod;
851 void setP_ul() { P_ul = P_max + (1 - (C_ul / C_fl)) * P_mod; }
853 void setModExp(ControlType ControlType) {
855 if (ControlType == ControlType::VariableDisplacementUnload) {
942 const double P_ratedDischarge,
const double P_RatedIn,
const double Eff,
943 const double P_fl,
const double P_max,
const double P_in,
const bool PresAdj,
944 const double P_atm = 14.69) {
945 PressureInletCorrection(CompressorType::Screw, capacity, full_load_bhp, poly_exponent, P_ratedDischarge,
946 P_RatedIn, Eff, P_fl, P_max, P_in, PresAdj, P_atm);
948 kW_max = kW_max_Adjusted;
953 const double P_atm, P_fl, P_max, P_mod;
954 const double P_range = 0;
955 CompressorType CompType;
956 Lubricant LubricantType;
957 ControlType CntrlType;
958 const double lf_nl, C_storage, kW_nl = 1;
960 double PerC_ul = 100, t_blowdown = 0.003, P_sump_ul = 15, t_sdt = 0.004, a_tol = 0.02, t_reload = 0.001,
962 double noLoadPowerFM, kW_ul, P_ul, C_ul, mod_exp ;
964 double CurveFit(
double,
bool)
const;
991 const double kW_nl,
const double P_fl,
const double P_max,
const double P_mod,
992 const double P_atm = 14.7,
const double PerC_ul = 100,
993 Compressors::ControlType CntrlType = Compressors::VariableDisplacementUnload,
994 const double t_blowdown = .003,
const double P_sump_ul = 15,
995 const double noLoadPowerFM = .7,
double kW_ul = 0,
double P_ul = 0,
997 :
Compressors_LoadUnload(kW_fl, C_fl, C_storage, kW_max, P_fl, P_max, P_mod, 1, P_atm,
Compressors::Screw,
998 Compressors::Injected, CntrlType, kW_nl, PerC_ul, t_blowdown, P_sump_ul, noLoadPowerFM,
999 kW_ul, P_ul, C_ul) {}
1004 Compressor_VFD(
const double fullLoadPower,
const double midTurndownPower,
const double turndownPower,
1005 const double noLoadPower,
const double capacityFullFload,
const double midTurndownAirflow,
1006 const double turndownAirflow)
1007 :
CompressorsBase(fullLoadPower, capacityFullFload), noLoadPower(noLoadPower) {
1008 turndownPercentPower = turndownPower / fullLoadPower;
1009 noLoadPercentPower = noLoadPower / fullLoadPower;
1010 midTurndownPercentPower = midTurndownPower / fullLoadPower;
1012 turndownPercentCapacity = turndownAirflow / capacityFullFload;
1013 midTurndownPercentCapacity = midTurndownAirflow / capacityFullFload;
1084 double turndownPercentPower;
1085 double noLoadPercentPower;
1086 double midTurndownPercentPower;
1087 double turndownPercentCapacity;
1088 double midTurndownPercentCapacity;
1096 : C_lkred(C_lkred), C_usage_lkred(C_usage_lkred), PerC_lkred(PerC_lkred) {}
1099 double C_lkred = 0, C_usage_lkred = 0, PerC_lkred = 0;
1104 : C_af_red(C_af_red), CPer_af_red(CPer_af_red) {}
1107 double C_af_red = 0, CPer_af_red = 0;
1112 : P_fl_rpred(P_fl_rpred), kW_fl_rpadj(kW_fl_rpadj), C_usage_rpred(C_usage_rpred), PerC_rpred(PerC_rpred) {}
1115 double P_fl_rpred = 0, kW_fl_rpadj = 0, C_usage_rpred = 0, PerC_rpred = 0;
1120 : kW_fl_adj(kW_fl_adj), C_usage_adj(C_usage_adj), PerC_adj(PerC_adj) {}
1123 double kW_fl_adj = 0, C_usage_adj = 0, PerC_adj = 0;
1128 : kW_savings(kW_savings), kWh_savings(kWh_savings), cost_savings(cost_savings) {}
1131 double kW_savings = 0, kWh_savings = 0, cost_savings = 0;
1148 const double C_lkred = PerC_lkred * C_lk;
1149 const double C_usage_lkred = C_usage - C_lkred;
1166 const double C_af_red = C_usage - C_avgaf_red;
1188 double P_rpred,
double P_alt = 14.69,
1189 double P_atm = 14.69) {
1190 const double P_fl_rpred = P_fl - P_rpred;
1191 const double kW_fl_rpadj =
1192 kW_fl * ((pow((P_fl_rpred + P_alt) / P_alt, 0.283) - 1) / (pow((P_fl + P_atm) / P_atm, 0.283) - 1));
1193 const double C_usage_rpred = (C_usage - (C_usage - (C_usage * ((P_fl_rpred + P_alt) / (P_fl + P_atm)))) * 0.6);
1215 double P_fl_adj,
double P_alt = 14.69,
1216 double P_atm = 14.69) {
1217 const double kW_fl_adj =
1218 kW_fl * ((pow((P_fl_adj + P_alt) / P_alt, 0.283) - 1) / (pow((P_fl + P_atm) / P_atm, 0.283) - 1));
1219 const double C_usage_adj = (C_usage - (C_usage - (C_usage * ((P_fl_adj + P_alt) / (P_fl + P_atm)))) * 0.6);
1242 double kW_fl_rated,
double P_fl_rated,
1243 double dischargePresBaseline,
double dischargePresMod,
1244 double P_alt = 14.69,
double P_atm = 14.69) {
1245 const double kW_savings =
kWAdjusted(kW_fl_rated, P_fl_rated, dischargePresBaseline, P_alt, P_atm) -
1246 kWAdjusted(kW_fl_rated, P_fl_rated, dischargePresMod, P_alt, P_atm);
1247 const double kWh_savings = kW_savings * operatingHours;
1262 static double kWAdjusted(
double kW_fl_rated,
double P_fl_rated,
double P_discharge,
double P_alt = 14.69,
1263 double P_atm = 14.69) {
1264 return kW_fl_rated *
1265 ((pow((P_discharge + P_alt) / P_alt, 0.283) - 1) / (pow((P_fl_rated + P_atm) / P_atm, 0.283) - 1));
static ReduceAirLeaksOutput ReduceAirLeaks(double C_fl, double C_usage, double C_lk, double PerC_lkred)
static ReduceSystemAirPressureOutput ReduceSystemAirPressure(double C_fl, double C_usage, double P_fl, double kW_fl, double P_rpred, double P_alt=14.69, double P_atm=14.69)
static ImproveEndUseEfficiencyOutput ImproveEndUseEfficiency(double C_fl, double C_usage, double C_avgaf_red)
static double kWAdjusted(double kW_fl_rated, double P_fl_rated, double P_discharge, double P_alt=14.69, double P_atm=14.69)
static AdjustCascadingSetPointOutput AdjustCascadingSetPoint(double C_fl, double C_usage, double P_fl, double kW_fl, double P_fl_adj, double P_alt=14.69, double P_atm=14.69)
static PressureReductionSavingOutput PressureReductionSaving(double operatingHours, double costPerkWh, double kW_fl_rated, double P_fl_rated, double dischargePresBaseline, double dischargePresMod, double P_alt=14.69, double P_atm=14.69)
CompressorsBase::Output calculateFromCMeasured(double C) override
CompressorsBase::Output calculateFromPerC(double C_Per) override
CompressorsBase::Output calculateFromkWMeasured(double kW) override
CompressorsBase::Output calculateFromPerkW(double PerkW) override
CompressorsBase::Output calculateFromVIPFMeasured(double V, double I, double PF) override
CompressorsBase::OutputBlowOff calculateFromPerkW_BlowOff(double PerkW, double blowPer) override
CompressorsBase::OutputBlowOff calculateFromCMeasured_BlowOff(double C) override
void AdjustDischargePressure(std::vector< double > Capacity, std::vector< double > DischargePressure, double P_fl, double P_max=0) override
CompressorsBase::OutputBlowOff calculateFromkWMeasured_BlowOff(double kW, double blowPer) override
CompressorsBase::OutputBlowOff calculateFromVIPFMeasured_BlowOff(double V, double I, double PF, double blowPer) override
Compressors_Centrifugal_BlowOff(const double kW_fl, const double C_fl, const double kW_blow, const double C_blow)
CompressorsBase::OutputBlowOff calculateFromPerC_BlowOff(double C_Per) override
Compressors_Centrifugal_LoadUnload(const double kW_fl, const double C_fl, const double kW_nl)
void AdjustDischargePressure(std::vector< double > Capacity, std::vector< double > DischargePressure, double P_fl, double P_max=0) override
CompressorsBase::Output calculateFromCMeasured(double C) override
CompressorsBase::Output calculateFromPerkW(double PerkW) override
CompressorsBase::Output calculateFromPerC(double C_Per) override
CompressorsBase::Output calculateFromkWMeasured(double kW) override
CompressorsBase::Output calculateFromVIPFMeasured(double V, double I, double PF) override
CompressorsBase::Output calculateFromPerkW(double PerkW) override
void AdjustDischargePressure(std::vector< double > Capacity, std::vector< double > DischargePressure, double P_fl, double P_max) override
CompressorsBase::Output calculateFromPerC(double C_Per) override
CompressorsBase::Output calculateFromCMeasured(double C) override
CompressorsBase::Output calculateFromVIPFMeasured(double V, double I, double PF) override
CompressorsBase::Output calculateFromkWMeasured(double kW) override
Compressors_Centrifugal_ModulationUnload(const double kW_fl, const double C_fl, const double kW_nl, const double C_max, const double kW_ul, const double C_ul)
CompressorsBase::Output calculateFromVIPFMeasured(double V, double I, double PF) override
void Pressure_InletCorrection(const double capacity, const double full_load_bhp, const double poly_exponent, const double P_ratedDischarge, const double P_RatedIn, const double Eff, const double P_fl, const double P_max, const double P_in, const bool PresAdj, const double P_atm=14.69)
CompressorsBase::Output calculateFromCMeasured(double C) override
CompressorsBase::Output calculateFromkWMeasured(double kW) override
CompressorsBase::Output calculateFromPerkW(double PerkW) override
Compressors_LoadUnload(const double kW_fl, const double C_fl, const double C_storage, const double kW_max, const double P_fl, const double P_max, const double P_mod, const double lf_ul, const double P_atm=14.7, const CompressorType CompType=CompressorType::Reciprocating, const Lubricant LubricantType=Lubricant::None, ControlType CntrlType=ControlType::LoadUnload, const double kW_nl=1, const double PerC_ul=100, double t_blowdown=.003, double P_sump_ul=15, double noLoadPowerFM=.7, double kW_ul=0, double P_ul=0, double C_ul=0)
CompressorsBase::Output calculateFromPerC(double C_Per) override
CompressorsBase::Output calculateFromCMeasured(double C) override
CompressorsBase::Output calculateFromPerC(double C_Per) override
CompressorsBase::Output calculateFromkWMeasured(double kW) override
Compressors_ModulationWOUnload(const double kW_fl, const double C_fl, const double kW_nl, const double mod_exp=1, const bool woUnload=true, const CompressorType CompType=CompressorType::Screw, double noLoadPowerFM=.7, const double kW_max=0)
CompressorsBase::Output calculateFromPerkW(double PerkW) override
void Pressure_InletCorrection(const double capacity, const double full_load_bhp, const double poly_exponent, const double P_ratedDischarge, const double P_RatedIn, const double Eff, const double P_fl, const double P_max, const double P_in, const bool PresAdj, const double P_atm=14.69)
CompressorsBase::Output calculateFromVIPFMeasured(double V, double I, double PF) override
Compressors_ModulationWithUnload(const double kW_fl, const double C_fl, const double C_storage, const double kW_max, const double kW_nl, const double P_fl, const double P_max, const double P_mod, const double P_atm=14.7, const double PerC_ul=100, Compressors::ControlType CntrlType=Compressors::VariableDisplacementUnload, const double t_blowdown=.003, const double P_sump_ul=15, const double noLoadPowerFM=.7, double kW_ul=0, double P_ul=0, double C_ul=0)
void Pressure_InletCorrection(const double capacity, const double full_load_bhp, const double poly_exponent, const double P_ratedDischarge, const double P_RatedIn, const double Eff, const double P_fl, const double P_max, const double P_in, const bool PresAdj, const double P_atm=14.69)
CompressorsBase::Output calculateFromVIPFMeasured(double V, double I, double PF) override
CompressorsBase::Output calculateFromCMeasured(double C) override
CompressorsBase::Output calculateFromkWMeasured(double kW) override
CompressorsBase::Output calculateFromPerkW(double PerkW) override
CompressorsBase::Output calculateFromPerC(double C_Per) override
Compressors_StartStop(const double kW_fl, const double C_fl, const double kWPer_max, const double kWPer_fl)