33#ifndef TOOLS_SUITE_COMPRESSORS_H
34#define TOOLS_SUITE_COMPRESSORS_H
41#include "util/CurveFitVal.h"
45 enum CompressorType { Centrifugal, Screw, Reciprocating };
53 VariableDisplacementUnload,
58 enum Stage { Single, Two, Multiple };
60 enum Lubricant { Injected, Free, None };
62 enum Modulation { Throttle, VariableDisplacement };
64 enum ComputeFrom { PercentagePower, PercentageCapacity, PowerMeasured, CapacityMeasured,
PowerFactor };
67 Output(
double kW_Calc,
double C_Calc,
double PerkW,
double C_Per)
68 : kW_Calc(kW_Calc), C_Calc(C_Calc), PerkW(PerkW), C_Per(C_Per) {}
71 double kW_Calc = 0, C_Calc = 0, PerkW = 0, C_Per = 0;
75 OutputBlowOff(
double kW_Calc,
double C_Calc,
double PerkW,
double C_Per,
double C_blow,
double blowPer)
76 : kW_Calc(kW_Calc), C_Calc(C_Calc), PerkW(PerkW), C_Per(C_Per), C_blow(C_blow), blowPer(blowPer) {}
79 double kW_Calc = 0, C_Calc = 0, PerkW = 0, C_Per = 0, C_blow = 0, blowPer = 0;
83 int getC_fl_Adjusted()
const {
return C_fl_Adjusted; }
84 int getkW_fl_Adjusted()
const {
return kW_fl_Adjusted; }
85 int getC_max_Adjusted()
const {
return C_max_Adjusted; }
86 int getkW_max_Adjusted()
const {
return kW_max_Adjusted; }
90 : 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),
91 C_max_Adjusted(0), kW_max_Adjusted(0) {}
94 const double C_fl_raw, kW_fl_raw;
97 double kW_fl_Adjusted;
99 double C_max_Adjusted;
100 double kW_max_Adjusted;
108 return OutputBlowOff();
117 virtual void AdjustDischargePressure(std::vector<double>, std::vector<double>,
double,
double) {}
120 void PressureInletCorrection(CompressorType CompType,
const double capacity,
const double full_load_bhp,
121 const double poly_exponent,
const double P_ratedDischarge,
const double P_RatedIn,
122 const double Eff,
const double P_fl,
const double P_max,
const double P_in,
123 const bool PresAdj,
const double P_atm) {
124 double kW = 0, Cap = 0;
126 PressureInletCorrection(Cap, kW, CompType, capacity, full_load_bhp, poly_exponent, P_ratedDischarge, P_RatedIn,
127 Eff, P_fl, P_in, PresAdj, P_atm);
128 kW_fl_Adjusted = kW_fl = kW;
129 C_fl_Adjusted = C_fl = Cap;
131 PressureInletCorrection(Cap, kW, CompType, capacity, full_load_bhp, poly_exponent, P_ratedDischarge, P_RatedIn,
132 Eff, P_max, P_in, PresAdj, P_atm);
133 kW_max_Adjusted = kW;
134 C_max_Adjusted = Cap;
137 double roundDouble(
double value)
const;
140 void PressureInletCorrection(
double& cap,
double& kW, CompressorType CompType,
const double capacity,
141 const double full_load_bhp,
const double poly_exponent,
const double P_ratedDischarge,
142 const double P_RatedIn,
const double Eff,
const double dischargePres,
143 const double P_in,
const bool PresAdj,
const double P_atm) {
144 if (CompType == CompressorType::Centrifugal)
147 double Pres_kW = 1, Pres_Flow = 1;
149 Pres_kW = -0.0000577 * pow(P_atm, 3) + 0.000251 * pow(P_atm, 2) + 0.0466 * P_atm + 0.4442;
150 Pres_Flow = 0.000258 * pow(P_atm, 3) - 0.0116 * pow(P_atm, 2) + 0.176 * P_atm + 0.09992;
153 kW = (Pres_kW * (P_atm / P_in) * full_load_bhp * 0.746 / Eff *
154 PressureInletCorrection_PressRatio(poly_exponent, (P_ratedDischarge + P_RatedIn) / P_RatedIn,
155 dischargePres, CompType == CompressorType::Screw ? P_RatedIn : P_atm));
156 cap = (Pres_Flow * capacity * (1 - 0.00075 * (dischargePres - P_ratedDischarge)));
159 double PressureInletCorrection_PressRatio(
double poly_exponent,
double PressRatio1,
double OpPress,
160 double P_PressRatio2) {
161 double PressRatio2 = (OpPress + P_PressRatio2) / P_PressRatio2;
162 double PolyPower = ((poly_exponent - 1) / poly_exponent);
163 return (pow(PressRatio2, PolyPower) - 1) / (pow(PressRatio1, PolyPower) - 1);
184 CPer_blow = C_blow / C_fl;
185 kWPer_blow = kW_blow / kW_fl;
261 double blowPer)
override;
273 double P_max = 0)
override {
276 CurveFitVal curveFitValCap(DischargePressure, Capacity, 2);
277 C_fl_Adjusted = C_fl = curveFitValCap.
calculate(P_fl);
279 CPer_blow = C_blow / C_fl;
285 double CPer_blow = 1;
286 double kWPer_blow = 0;
300 kWPer_nl = kW_nl / kW_fl;
381 double P_max = 0)
override {
384 CurveFitVal curveFitValCap(DischargePressure, Capacity, 2);
385 C_fl_Adjusted = C_fl = curveFitValCap.
calculate(P_fl);
390 const double CPer_fl = 1;
391 const double CPer_nl = 0;
408 const double C_max,
const double kW_ul,
const double C_ul)
409 :
CompressorsBase(kW_fl, C_fl), C_max(C_max), C_max_raw(C_max), C_ul(C_ul) {
410 C_max_Adjusted = C_max;
412 kWPer_nl = kW_nl / kW_fl;
413 kWPer_ul = kW_ul / kW_fl;
414 CPer_max = C_max / C_fl;
415 CPer_ul = C_ul / C_fl;
416 CPer_ulB = C_ul / C_max;
496 double P_max)
override {
497 if (P_fl > 0 || P_max > 0) {
498 CurveFitVal curveFitValCap(DischargePressure, Capacity, 2);
501 C_fl_Adjusted = C_fl = curveFitValCap.
calculate(P_fl);
503 C_max_Adjusted = C_max = curveFitValCap.
calculate(P_max);
505 CPer_max = C_max / C_fl;
506 CPer_ul = C_ul / C_fl;
507 CPer_ulB = C_ul / C_max;
513 const double kWPer_max = 1, C_max_raw = 1, C_ul = 1;
519 const double CPer_nl = 0;
537 const bool woUnload =
true,
const CompressorType CompType = CompressorType::Screw,
538 double noLoadPowerFM = .7,
const double kW_max = 0)
539 :
CompressorsBase(kW_fl, C_fl), kW_nl(kW_nl), mod_exp(mod_exp), woUnload(woUnload), CompType(CompType),
540 noLoadPowerFM(noLoadPowerFM), kW_max(kW_max) {
541 lf_nl = kW_nl / kW_fl;
629 const double P_ratedDischarge,
const double P_RatedIn,
const double Eff,
630 const double P_fl,
const double P_max,
const double P_in,
const bool PresAdj,
631 const double P_atm = 14.69) {
632 PressureInletCorrection(CompType, capacity, full_load_bhp, poly_exponent, P_ratedDischarge, P_RatedIn, Eff,
633 P_fl, P_max, P_in, PresAdj, P_atm);
637 const double kW_nl = 1;
638 const double mod_exp = 1;
639 const bool woUnload =
true;
640 const CompressorType CompType;
642 double noLoadPowerFM;
657 :
CompressorsBase(kW_fl, C_fl), kWPer_max(kWPer_max), kWPer_fl(kWPer_fl) {
658 kW_max = kWPer_max * kW_fl;
746 const double P_ratedDischarge,
const double P_RatedIn,
const double Eff,
747 const double P_fl,
const double P_max,
const double P_in,
const bool PresAdj,
748 const double P_atm = 14.69) {
749 PressureInletCorrection(CompressorType::Screw, capacity, full_load_bhp, poly_exponent, P_ratedDischarge,
750 P_RatedIn, Eff, P_fl, P_max, P_in, PresAdj, P_atm);
752 kW_max = kWPer_max * kW_fl;
757 const double kWPer_max = 1, kWPer_fl = 1;
788 const double P_fl,
const double P_max,
const double P_mod,
const double lf_ul,
789 const double P_atm = 14.7,
const CompressorType CompType = CompressorType::Reciprocating,
790 const Lubricant LubricantType = Lubricant::None,
791 ControlType CntrlType = ControlType::LoadUnload,
const double kW_nl = 1,
792 const double PerC_ul = 100,
double t_blowdown = .003,
double P_sump_ul = 15,
793 double noLoadPowerFM = .7,
double kW_ul = 0,
double P_ul = 0,
double C_ul = 0)
794 :
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),
795 CompType(CompType), LubricantType(LubricantType), CntrlType(CntrlType), lf_nl(kW_nl / kW_fl),
796 C_storage(C_storage), kW_nl(kW_nl), PerC_ul(PerC_ul), t_blowdown(t_blowdown), P_sump_ul(P_sump_ul),
797 noLoadPowerFM(noLoadPowerFM), kW_ul(kW_ul), P_ul(P_ul), C_ul(C_ul) {
798 double lf_ul_ = lf_ul;
800 if (CompType == CompressorType::Screw && LubricantType == Lubricant::None)
801 throw std::invalid_argument(
"Lubricant needs to be Injected or free for Screw Compressor Type");
803 setNoLoadPowerFM(noLoadPowerFM, LubricantType, CntrlType);
804 setModExp(CntrlType);
805 if (CompType == CompressorType::Screw) {
806 if (LubricantType == Lubricant::Injected) {
810 else if (LubricantType == Lubricant::Free) {
814 setUnloadSumpPressure(15);
817 else if (CompType == CompressorType::Reciprocating) {
821 setUnloadSumpPressure(15);
825 if (CntrlType != ControlType::ModulationUnload) {
832 void setBlowdown(
double blowdown) { t_blowdown = blowdown; }
834 void setUnloadSumpPressure(
double sumpPressure) { P_sump_ul = sumpPressure; }
836 void setNoLoadPowerFM(
double noLoadPowerFM, Lubricant LubricantType, ControlType ControlType) {
837 if (LubricantType == Lubricant::Injected && ControlType == ControlType::LoadUnload) {
841 lf_fl = noLoadPowerFM;
845 void setC_ul() { C_ul = C_fl * PerC_ul / 100; }
848 double kW_maxmod = lf_fl * kW_max;
849 kW_ul = (kW_max - kW_maxmod) * pow(C_ul / C_fl, mod_exp) + kW_maxmod;
852 void setP_ul() { P_ul = P_max + (1 - (C_ul / C_fl)) * P_mod; }
854 void setModExp(ControlType ControlType) {
856 if (ControlType == ControlType::VariableDisplacementUnload) {
943 const double P_ratedDischarge,
const double P_RatedIn,
const double Eff,
944 const double P_fl,
const double P_max,
const double P_in,
const bool PresAdj,
945 const double P_atm = 14.69) {
946 PressureInletCorrection(CompressorType::Screw, capacity, full_load_bhp, poly_exponent, P_ratedDischarge,
947 P_RatedIn, Eff, P_fl, P_max, P_in, PresAdj, P_atm);
949 kW_max = kW_max_Adjusted;
954 const double P_atm, P_fl, P_max, P_mod;
955 const double P_range = 0;
956 CompressorType CompType;
957 Lubricant LubricantType;
958 ControlType CntrlType;
959 const double lf_nl, C_storage, kW_nl = 1;
961 double PerC_ul = 100, t_blowdown = 0.003, P_sump_ul = 15, t_sdt = 0.004, a_tol = 0.02, t_reload = 0.001,
963 double noLoadPowerFM, kW_ul, P_ul, C_ul, mod_exp ;
965 double CurveFit(
double,
bool)
const;
992 const double kW_nl,
const double P_fl,
const double P_max,
const double P_mod,
993 const double P_atm = 14.7,
const double PerC_ul = 100,
994 Compressors::ControlType CntrlType = Compressors::VariableDisplacementUnload,
995 const double t_blowdown = .003,
const double P_sump_ul = 15,
996 const double noLoadPowerFM = .7,
double kW_ul = 0,
double P_ul = 0,
998 :
Compressors_LoadUnload(kW_fl, C_fl, C_storage, kW_max, P_fl, P_max, P_mod, 1, P_atm,
Compressors::Screw,
999 Compressors::Injected, CntrlType, kW_nl, PerC_ul, t_blowdown, P_sump_ul, noLoadPowerFM,
1000 kW_ul, P_ul, C_ul) {}
1005 Compressor_VFD(
const double fullLoadPower,
const double midTurndownPower,
const double turndownPower,
1006 const double noLoadPower,
const double capacityFullFload,
const double midTurndownAirflow,
1007 const double turndownAirflow)
1008 :
CompressorsBase(fullLoadPower, capacityFullFload), noLoadPower(noLoadPower) {
1009 turndownPercentPower = turndownPower / fullLoadPower;
1010 noLoadPercentPower = noLoadPower / fullLoadPower;
1011 midTurndownPercentPower = midTurndownPower / fullLoadPower;
1013 turndownPercentCapacity = turndownAirflow / capacityFullFload;
1014 midTurndownPercentCapacity = midTurndownAirflow / capacityFullFload;
1085 double turndownPercentPower;
1086 double noLoadPercentPower;
1087 double midTurndownPercentPower;
1088 double turndownPercentCapacity;
1089 double midTurndownPercentCapacity;
1097 : C_lkred(C_lkred), C_usage_lkred(C_usage_lkred), PerC_lkred(PerC_lkred) {}
1100 double C_lkred = 0, C_usage_lkred = 0, PerC_lkred = 0;
1105 : C_af_red(C_af_red), CPer_af_red(CPer_af_red) {}
1108 double C_af_red = 0, CPer_af_red = 0;
1113 : P_fl_rpred(P_fl_rpred), kW_fl_rpadj(kW_fl_rpadj), C_usage_rpred(C_usage_rpred), PerC_rpred(PerC_rpred) {}
1116 double P_fl_rpred = 0, kW_fl_rpadj = 0, C_usage_rpred = 0, PerC_rpred = 0;
1121 : kW_fl_adj(kW_fl_adj), C_usage_adj(C_usage_adj), PerC_adj(PerC_adj) {}
1124 double kW_fl_adj = 0, C_usage_adj = 0, PerC_adj = 0;
1129 : kW_savings(kW_savings), kWh_savings(kWh_savings), cost_savings(cost_savings) {}
1132 double kW_savings = 0, kWh_savings = 0, cost_savings = 0;
1149 const double C_lkred = PerC_lkred * C_lk;
1150 const double C_usage_lkred = C_usage - C_lkred;
1167 const double C_af_red = C_usage - C_avgaf_red;
1189 double P_rpred,
double P_alt = 14.69,
1190 double P_atm = 14.69) {
1191 const double P_fl_rpred = P_fl - P_rpred;
1192 const double kW_fl_rpadj =
1193 kW_fl * ((pow((P_fl_rpred + P_alt) / P_alt, 0.283) - 1) / (pow((P_fl + P_atm) / P_atm, 0.283) - 1));
1194 const double C_usage_rpred = (C_usage - (C_usage - (C_usage * ((P_fl_rpred + P_alt) / (P_fl + P_atm)))) * 0.6);
1216 double P_fl_adj,
double P_alt = 14.69,
1217 double P_atm = 14.69) {
1218 const double kW_fl_adj =
1219 kW_fl * ((pow((P_fl_adj + P_alt) / P_alt, 0.283) - 1) / (pow((P_fl + P_atm) / P_atm, 0.283) - 1));
1220 const double C_usage_adj = (C_usage - (C_usage - (C_usage * ((P_fl_adj + P_alt) / (P_fl + P_atm)))) * 0.6);
1243 double kW_fl_rated,
double P_fl_rated,
1244 double dischargePresBaseline,
double dischargePresMod,
1245 double P_alt = 14.69,
double P_atm = 14.69) {
1246 const double kW_savings =
kWAdjusted(kW_fl_rated, P_fl_rated, dischargePresBaseline, P_alt, P_atm) -
1247 kWAdjusted(kW_fl_rated, P_fl_rated, dischargePresMod, P_alt, P_atm);
1248 const double kWh_savings = kW_savings * operatingHours;
1263 static double kWAdjusted(
double kW_fl_rated,
double P_fl_rated,
double P_discharge,
double P_alt = 14.69,
1264 double P_atm = 14.69) {
1265 return kW_fl_rated *
1266 ((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)