Source code for ACHP.Compressor

from __future__ import division, print_function
from CoolProp.CoolProp import PropsSI
import CoolProp as CP

[docs]class CompressorClass(): """ Compressor Model based on 10-coefficient Model from `ANSI/AHRI standard 540 <http://www.ahrinet.org/App_Content/ahri/files/standards%20pdfs/ANSI%20standards%20pdfs/ANSI-ARI-540-2004%20latest.pdf>`_ Required Parameters: =========== ========== ======================================================================== Variable Units Description =========== ========== ======================================================================== M Ibm/hr A numpy-like list of compressor map coefficients for mass flow P Watts A numpy-like list of compressor map coefficients for electrical power Ref N/A A string representing the refrigerant Tin_r K Refrigerant inlet temperature pin_r Pa Refrigerant suction pressure (absolute) pout_r Pa Refrigerant discharge pressure (absolute) fp -- Fraction of electrical power lost as heat to ambient Vdot_ratio -- Displacement Scale factor =========== ========== ======================================================================== All variables are of double-type unless otherwise specified """ def __init__(self,**kwargs): #Load up the parameters passed in # using the dictionary self.__dict__.update(kwargs)
[docs] def Update(self,**kwargs): #Update the parameters passed in # using the dictionary self.__dict__.update(kwargs)
[docs] def OutputList(self): """ Return a list of parameters for this component for further output It is a list of tuples, and each tuple is formed of items with indices: [0] Description of value [1] Units of value [2] The value itself """ return [ ('M1','-',self.M[0]), ('M2','-',self.M[1]), ('M3','-',self.M[2]), ('M4','-',self.M[3]), ('M5','-',self.M[4]), ('M6','-',self.M[5]), ('M7','-',self.M[6]), ('M8','-',self.M[7]), ('M9','-',self.M[8]), ('M10','-',self.M[9]), ('P1','-',self.P[0]), ('P2','-',self.P[1]), ('P3','-',self.P[2]), ('P4','-',self.P[3]), ('P5','-',self.P[4]), ('P6','-',self.P[5]), ('P7','-',self.P[6]), ('P8','-',self.P[7]), ('P9','-',self.P[8]), ('P10','-',self.P[9]), ('Heat Loss Fraction','-',self.fp), ('Displacement scale factor','-',self.Vdot_ratio), ('Power','W',self.W), ('Mass flow rate','kg/s',self.mdot_r), ('Inlet Temperature','K',self.Tin_r), ('Outlet Temperature','K',self.Tout_r), ('Inlet Enthalpy','J/kg',self.hin_r), ('Outlet Enthalpy','J/kg',self.hout_r), ('Overall isentropic efficiency','-',self.eta_oi), ('Pumped flow rate','m^3/s',self.Vdot_pumped), ('Ambient heat loss','W',self.Q_amb) ]
[docs] def Calculate(self): #AbstractState if hasattr(self,'Backend'): #check if backend is given AS = CP.AbstractState(self.Backend, self.Ref) else: #otherwise, use the defualt backend AS = CP.AbstractState('HEOS', self.Ref) self.AS = AS #Local copies of coefficients P=self.P M=self.M #Calculate suction superheat and dew temperatures AS.update(CP.PQ_INPUTS, self.pin_r, 1.0) self.Tsat_s_K=AS.T() #[K] AS.update(CP.PQ_INPUTS, self.pout_r, 1.0) self.Tsat_d_K=AS.T() #[K] self.DT_sh_K=self.Tin_r-self.Tsat_s_K #Convert saturation temperatures in K to F Tsat_s = self.Tsat_s_K * 9/5 - 459.67 Tsat_d = self.Tsat_d_K * 9/5 - 459.67 #Apply the 10 coefficient ARI map to saturation temps in F power_map = P[0] + P[1] * Tsat_s + P[2] * Tsat_d + P[3] * Tsat_s**2 + P[4] * Tsat_s * Tsat_d + P[5] * Tsat_d**2 + P[6] * Tsat_s**3 + P[7] * Tsat_d * Tsat_s**2 + P[8] * Tsat_d**2*Tsat_s + P[9] * Tsat_d**3 mdot_map = M[0] + M[1] * Tsat_s + M[2] * Tsat_d + M[3] * Tsat_s**2 + M[4] * Tsat_s * Tsat_d + M[5] * Tsat_d**2 + M[6] * Tsat_s**3 + M[7] * Tsat_d * Tsat_s**2 + M[8] * Tsat_d**2*Tsat_s + M[9] * Tsat_d**3 # Convert mass flow rate to kg/s from lbm/h mdot_map *= 0.000125998 # Add more mass flow rate to scale mdot_map*=self.Vdot_ratio power_map*=self.Vdot_ratio P1 = self.pin_r P2 = self.pout_r T1_actual = self.Tsat_s_K + self.DT_sh_K T1_map = self.Tsat_s_K + 20 * 5 / 9 AS.update(CP.PT_INPUTS, P1, T1_map) v_map = 1 / AS.rhomass() #[m^3/kg] s1_map = AS.smass() #[J/kg-K] h1_map = AS.hmass() #[J/kg] AS.update(CP.PT_INPUTS, P1, T1_actual) s1_actual = AS.smass() #[J/kg-K] h1_actual = AS.hmass() #[J/kg] v_actual = 1 / AS.rhomass() #[m^3/kg] F = 0.75 mdot = (1 + F * (v_map / v_actual - 1)) * mdot_map AS.update(CP.PSmass_INPUTS, P2, s1_map) h2s_map = AS.hmass() #[J/kg] AS.update(CP.PSmass_INPUTS, P2, s1_actual) h2s_actual = AS.hmass() #[J/kg] #Shaft power based on 20F superheat calculation from fit overall isentropic efficiency power = power_map * (mdot / mdot_map) * (h2s_actual - h1_actual) / (h2s_map - h1_map) h2 = power * (1 - self.fp) / mdot + h1_actual self.eta_oi=mdot*(h2s_actual-h1_actual)/(power) AS.update(CP.HmassP_INPUTS, h2, P2) self.Tout_r = AS.T() #[K] self.sout_r = AS.smass() #[J/kg-K] self.sin_r = s1_actual self.hout_r = h2 self.hin_r = h1_actual self.mdot_r=mdot self.W=power self.CycleEnergyIn=power*(1-self.fp) self.Vdot_pumped= mdot*v_actual self.Q_amb=-self.fp*power
if __name__=='__main__': for i in range(1): kwds={ 'M':[217.3163128,5.094492028,-0.593170311,4.38E-02,-2.14E-02,1.04E-02,7.90E-05,-5.73E-05,1.79E-04,-8.08E-05], 'P':[-561.3615705,-15.62601841,46.92506685,-0.217949552,0.435062616,-0.442400826,2.25E-04,2.37E-03,-3.32E-03,2.50E-03], 'Ref':'R134a', 'Tin_r':280, 'pin_r':PropsSI('P','T',279,'Q',1,'R134a'), 'pout_r':PropsSI('P','T',315,'Q',1,'R134a'), 'fp':0.15, #Fraction of electrical power lost as heat to ambient 'Vdot_ratio': 1.0, #Displacement Scale factor 'Backend':'HEOS' #choose between: 'HEOS','TTSE&HEOS','BICUBIC&HEOS','REFPROP','SRK','PR' } Comp=CompressorClass(**kwds) Comp.Calculate() print(Comp.W,'W') print(Comp.Vdot_pumped,'m^3/s') print(Comp.Q_amb, 'W')