Aula 4 - Compressores

Análise de dados de catálogos de compressores

Vamos importar três conjuntos de dados, que foram retirados de diferentes catálogos. O compressor alternativo foi abordado na aula passada, enquanto os outros foram retirados deste catálogo de compressor scroll e deste compressor parafuso

import pandas as pd

recdf = pd.read_csv("reciprocating.csv",delimiter=',',skiprows=5)
screwdf = pd.read_csv("screw.csv",delimiter=',',skiprows=6)
scrolldf = pd.read_csv("scroll.csv",delimiter=',',skiprows=6)

Links para os arquivos de texto acima:

Vazão real de compressores alternativos

Examinando o catálogo, observamos que a vazão aspirada pelo compressor depende da temperatura de evaporação e de condensação - porém, observe que a temperatura de sucção e de entrada do tubo capilar estão especificadas. Logo, as condições de evaporação e condensação determinam na verdade a pressão de sucção e descarga do compressor, enquanto que as outras temperaturas determinam o grau de superaquecimento e de subresfriamento do ciclo.

import matplotlib.pyplot as plt
import numpy as np

plt.rc('font', size=12)

Vd = 13.54e-6 # in m3
n = 60 #Hz
z = 1
fluid = 'R600a'
Treturn = 32.2 + 273

Vd_dot = Vd * n * z # m3/s

T_cond = np.unique(recdf["Condensing Temperature [C]"].values)
fig, ax = plt.subplots()
colors=["k","b","r"]

i = 0
for Tc in T_cond:
  df = recdf[recdf["Condensing Temperature [C]"] == Tc]
  T_evap = df["Evaporating Temperature [C]"].values
  m_dot_actual = df["Gas Flow Rate [kg/h]"].values
  ax.plot(T_evap,m_dot_actual,'o',color=colors[i],label="Tcond = %.2f ºC" %(Tc))
  i = i+1
  
ax.set_xlabel("Temperatura de Evaporação [ºC]")
ax.set_ylabel("Vazão de gás [kg/h]")
ax.legend()
ax.grid()
plt.show()
from CoolProp.CoolProp import PropsSI

fig, ax = plt.subplots()
colors=["k","b","r"]

i = 0
for Tc in T_cond:
  df = recdf[recdf["Condensing Temperature [C]"] == Tc]
  T_evap = df["Evaporating Temperature [C]"].values
  Pcond = PropsSI("P","T",Tc+273,"Q",0,fluid)
  v_in = np.array([1.0/PropsSI("D","T",Te+273+10,"P",PropsSI("P","T",Te+273,"Q",1,fluid),fluid) for Te in T_evap])
  
  m_dot_actual = df["Gas Flow Rate [kg/h]"].values
  
  # we take the inverse of the density 
  # of the vapor at the evaporing *pressure*
  # and the return gas temperature
  
  m_dot_ideal = Vd_dot/v_in
  eta_v = m_dot_actual/(3600*m_dot_ideal)
  
  ax.plot(T_evap,eta_v*100,'-',color=colors[i],label="Tcond = %.2f ºC" %(Tc))
  i = i+1
  
ax.set_xlabel("Temperatura de evaporação [ºC]")
ax.set_ylabel("Eficiência volumétrica [%]")
ax.set_ylim(0,110)
## (0.0, 110.0)
ax.legend()
ax.grid()
plt.show()

O ciclo que é seguido então, para o ponto de mais alta temperatura de condensação e mais baixa temperatura de evaporação é:

# adaptado de http://pyromat.org/doc_howto.html#cycle_rankine
plt.rc('font', size=14) 

# Vapor compression cycle analysis

# Use different color codes to change the color of the plots
color = 'r'    # Red
#color = 'b'   # Blue
# This is a True/False flag to deactivate the plot text
show_text = True
# This is a True/False flag to allow over-plotting of previous results
clear_plots = True

Tevap = T_evap[0] + 273
Tcond = Tc + 273
Tliquid = 32.2 + 273
dTsup = Tliquid - Tevap

Pevap = PropsSI("P","T",Tevap,"Q",1,fluid)
hvevap = PropsSI("H","P",Pevap,"Q",1,fluid)
h1 = PropsSI("H","T",Tliquid,"P",Pevap,fluid)
s1 = PropsSI("S","P",Pevap,"H",h1,fluid)
P1 = Pevap

Pcond = PropsSI("P","T",Tcond,"Q",1,fluid)

P2 = Pcond
s2 = s1
h2 = PropsSI("H","P",P2,"S",s2,fluid)


P3 = Pcond
hlcond = PropsSI("H","P",P3,"Q",0,fluid)
h3 = PropsSI("H","T",Tliquid,"P",Pcond,fluid)

P4 = Pevap
h4 = h3

# All the states are known, now.
#
qL = h1-h4
qH = h2-h3
wcomp = h2-h1
COP = qL/wcomp


# Generate some diagrams
# Let figure 1 be a P-h diagram
f1 = plt.figure(1,)
if clear_plots:
    plt.clf()
ax1 = f1.add_subplot(111)
ax1.set_xlabel('Entalpia, h (kJ/kg)')
ax1.set_ylabel('Pressão, P (bar)')
ax1.set_title('Ciclo de Compressão de Vapor')


# Generate the dome on both plots
Tt = PropsSI("TTRIPLE",fluid)
Pt = PropsSI("PTRIPLE",fluid)

Tcr = PropsSI("TCRIT",fluid)
Pcr = PropsSI("PCRIT",fluid)

T = np.arange(Tt,Tcr,2.5)

hL = 1e-3*np.array([
  PropsSI("H","T",Ti,"Q",0,fluid) for Ti in T
])
hV = 1e-3*np.array([
  PropsSI("H","T",Ti,"Q",1,fluid) for Ti in T
])
P = 1e-5*np.array([
  PropsSI("P","T",Ti,"Q",0,fluid) for Ti in T
])

ax1.plot(hL,P,'k')
ax1.plot(hV,P,'k')

# Process 1-2
p = np.linspace(P1,P2)
h = np.array([PropsSI("H","P",Pi,"S",s1,fluid) for Pi in p])
ax1.plot(h*1e-3,1e-5*p,color,linewidth=1.5)

# Process 2-3
ax1.plot(1e-3*np.array([h2,h3]),1e-5*np.array([P2,P3]),color,linewidth=1.5)

# Process 3-4
ax1.plot(1e-3*np.array([h3,h4]),1e-5*np.array([P3,P4]),color,linewidth=1.5)

# Process 4-5
ax1.plot(1e-3*np.array([h4,h1]),1e-5*np.array([P4,P1]),color,linewidth=1.5)

ax1.grid('on')
ax1.set_yscale('log')

ax1.set_ylim(bottom = 0.1)
## (0.1, 90.73127791782629)
ax1.set_xlim(left = 0)
## (0.0, 787.4314855953381)
if show_text:
    ax1.text(1.03e-3*h1,0.99*1e-5*P1,"1")
    ax1.text(1.01e-3*h2,0.99*1e-5*P2,"2")
    ax1.text(0.90e-3*h3,0.99*1e-5*P3,"3")
    ax1.text(0.90e-3*h4,0.99*1e-5*P4,"4")

plt.show()
#plt.show(block=False)

Examine o código acima e veja como o diagrama foi gerado, principalmente em termos das especeficicações das variações do ciclo padrão.

Em termos de métricas, na temperatura de condensação (em ºC) de

print(Tc)
## 55

e de evaporação (em ºC) de:

print(Tevap-273)
## -30

as métricas calculadas de acordo com o ciclo são:

print("Cálculos de ciclo:")
## Cálculos de ciclo:
print("Efeito refrigerante específico  = %.2f kJ/kg" %(1e-3*qL))
## Efeito refrigerante específico  = 335.48 kJ/kg
print("Trabalho de compressão específico  = %.2f kJ/kg" %(1e-3*wcomp))
## Trabalho de compressão específico  = 132.63 kJ/kg
print("COP  = %.2f" %(COP))
## COP  = 2.53

Vamos comparar esses dados (obtidos apenas a partir do ciclo) com os dados que são retirados do catálogo:

Qdot = df["Cooling Capacity [W]"].values[0]
Wdot = df["Power [W]"].values[0]
COP_exp = df["Efficiency [W/W]"].values[0]
mdot = m_dot_actual[0]/3600 # kg/h para kg/s
qL_exp = Qdot/mdot
wcomp_exp = Wdot/mdot

print("Dados de catálogo:")
## Dados de catálogo:
print("Efeito refrigerante específico  = %.2f kJ/kg" %(1e-3*qL_exp))
## Efeito refrigerante específico  = 334.29 kJ/kg
print("Trabalho de compressão específico  = %.2f kJ/kg" %(1e-3*wcomp_exp))
## Trabalho de compressão específico  = 257.14 kJ/kg
print("COP  = %.2f" %(COP_exp))
## COP  = 1.30

O ERE calculado pelo ciclo bate com os dados experimentais, mas o trabalho de compressão (e por consequência o COP) não. Por quê?

Curvas de capacidade do compressor alternativo

Vamos plotar o desempenho do compressor alternativo em termos da sua capacidade de refrigeração:

import matplotlib.pyplot as plt
from CoolProp.CoolProp import PropsSI
import numpy as np

plt.rc('font', size=12)

Vd = 13.54e-6 # in m3
n = 60 #Hz
z = 1
fluid = 'R600a'
Treturn = 32.2 + 273

Vd_dot = Vd * n * z # m3/s

T_cond = np.unique(recdf["Condensing Temperature [C]"].values)
fig, ax = plt.subplots()
colors=["k","b","r"]

i = 0
for Tc in T_cond:
  df = recdf[recdf["Condensing Temperature [C]"] == Tc]
  T_evap = df["Evaporating Temperature [C]"].values
  Q_dot_actual = df["Cooling Capacity [W]"].values
  
  ax.plot(T_evap,Q_dot_actual,'o',color=colors[i],label="Tcond = %.2f ºC" %(Tc))
  
  i = i+1
  
ax.set_xlabel("Temperatura de evaporação [ºC]")
ax.set_ylabel("Capacidade de refrigeração [W]")
ax.legend()
ax.grid()
plt.show()
Como calcular a capacidade em um ponto novo?

Podemos utilizar um modelo de regressão linear. Você modela a capacidade como uma função do tipo:

$$ \dot{Q} _{\mathrm{L,modelo}} = a _0 + a _1 t _{\mathrm{evap}} + a _2 t _{\mathrm{cond}} $$

Pelo Método dos Mínimos Quadrados, os coeficientes \(a_i\) são tais que minimizam a soma dos quadrados dos erros entre modelo e dados experimentais. Seja uma observação \(i\) (i.e., um conjunto de dados em uma dada temperatura de condensação e evaporação). Então o erro dessa observação é:

$$ e i = \left(\dot{Q}{\mathrm{L,modelo},i} - \dot{Q}_{\mathrm{L,exp},i}\right) $$ onde “exp” quer dizer os dados experimentais tirados de um catálogo. A soma dos quadrados dos erros é:

$$ S = \sum _i e _i^2 $$

e os coeficientes são a solução do sistema de equações:

$$ \frac{\partial S}{\partial a _0} = 0 $$

$$ \frac{\partial S}{\partial a _1} = 0 $$ $$ \frac{\partial S}{\partial a _2} = 0 $$

O uso do Método dos Mínimos Quadrados vai dar origem a um sistema matricial de equações, que pode ser resolvido; tente deduzir agora como ficaria as três equações acima na forma matricial e observe o código abaixo:

M = recdf[["Evaporating Temperature [C]","Condensing Temperature [C]","Cooling Capacity [W]"]].values

te_values = M[:,0]
tc_values = M[:,1]
QdotL_values = M[:,2]

m = len(te_values) #número de pontos
Se = np.sum(te_values)
Sc = np.sum(tc_values)
SQ = np.sum(QdotL_values)
Se2 = np.sum(te_values**2)
Sc2 = np.sum(tc_values**2)
Sce = np.sum(tc_values*te_values)
SQe = np.sum(te_values*QdotL_values)
SQc = np.sum(tc_values*QdotL_values)

A = np.array([
  [m,Se,Sc],
  [Se,Se2,Sce],
  [Sc,Sce,Sc2]])
b = np.array([SQ,SQe,SQc])
a0,a1,a2 = np.linalg.solve(A,b)

Gerando figuras para comparar:

T_cond = np.unique(recdf["Condensing Temperature [C]"].values)
colors=["k","b","r"]

i = 0
for Tc in T_cond:
  fig, ax = plt.subplots()
  df = recdf[recdf["Condensing Temperature [C]"] == Tc]
  T_evap = df["Evaporating Temperature [C]"].values
  T_evap_model = np.linspace(min(T_evap),max(T_evap))
  Q_dot_actual = df["Cooling Capacity [W]"].values
  Q_dot_model = a0 + a1*T_evap_model + a2*Tc
  
  ax.plot(T_evap,Q_dot_actual,'o',color=colors[i],label="Exp.")
  ax.plot(T_evap_model,Q_dot_model,'--',color=colors[i],label="Mod.")
  i = i+1
  
  ax.set_xlabel("Temperatura de evaporação [ºC]")
  ax.set_ylabel("Capacidade de refrigeração [W]")
  ax.legend()
  ax.grid()
  ax.set_title("Temperatura de condensação = %.2f ºC"  %(Tc,))
  fig.savefig("A4_QL_Tc_%d.png" %(Tc,),dpi=600)
knitr::include_graphics('A4_QL_Tc_35.png')
...

Figure 1: ...

knitr::include_graphics('A4_QL_Tc_45.png')
...

Figure 2: ...

knitr::include_graphics('A4_QL_Tc_55.png')
...

Figure 3: ...

Desempenho de compressores scroll

Para compressores scroll:

fluid = 'R134a'
Treturn = 20

Vd_dot = 25 # m3/h

T_cond = np.unique(scrolldf["Condensing Temperature [C]"].values)
fig, ax = plt.subplots()
colors=["k","b","r"]

i = 0
for Tc in T_cond:
  df = scrolldf[scrolldf["Condensing Temperature [C]"] == Tc]
  T_evap = df["Evaporating Temperature [C]"].values
  h4 = PropsSI("H","T",Tc+273,"Q",0,fluid)
  v_in = np.empty_like(T_evap)
  h1 = np.empty_like(T_evap)
  
  for (j,Te) in enumerate(T_evap):
    if (Tc == 50 and Te <= -10):
      v_in[j] = 1.0/PropsSI("D","T",Te+273+10,"P",PropsSI("P","T",Te+273,"Q",1,fluid),fluid)
      h1[j] = PropsSI("H","T",Te+273+10,"P",PropsSI("P","T",Te+273,"Q",1,fluid),fluid)
    else:
      v_in[j] = 1.0/PropsSI("D","T",Treturn+273,"P",PropsSI("P","T",Te+273,"Q",1,fluid),fluid)
      h1[j] = PropsSI("H","T",Treturn+273,"P",PropsSI("P","T",Te+273,"Q",1,fluid),fluid)
  
  Q_dot_actual = df["Cooling Capacity [W]"].values
  m_dot_actual = 3600*Q_dot_actual/(h1-h4)
  
  # we take the inverse of the density 
  # of the vapor at the evaporing *pressure*
  # and the return gas temperature
  
  m_dot_ideal = Vd_dot/v_in
  eta_v = m_dot_actual/m_dot_ideal
  
  ax.plot(T_evap,eta_v*100,'-',color=colors[i],label="Tcond = %.2f ºC" %(Tc))
  i = i+1
  
ax.set_xlabel("Temperatura de evaporação [ºC]")
ax.set_ylabel("Eficiência volumétrica [%]")
ax.set_ylim(50,110)
## (50.0, 110.0)
ax.legend()
ax.grid()
plt.show()

Essa é a grande vantagem dos compressores scroll: sua alta eficiência volumétrica. Porém, atente-se ao custo desses compressores.

Desempenho de compressores parafuso

fluid = 'R134a'

Vd_dot = 46 # m3/h

T_cond = np.unique(screwdf["Condensing Temperature [C]"].values)
fig, ax = plt.subplots()
colors=["k","b","r"]

i = 0
for Tc in T_cond:
  df = screwdf[screwdf["Condensing Temperature [C]"] == Tc]
  T_evap = df["Evaporating Temperature [C]"].values
  Pcond = PropsSI("P","T",Tc+273,"Q",0,fluid)
  h4 = PropsSI("H","T",Tc+273-5,"P",Pcond,fluid)
  v_in = np.array([1.0/PropsSI("D","T",Te+273+10,"P",PropsSI("P","T",Te+273,"Q",1,fluid),fluid) for Te in T_evap])
  h1 = np.array([PropsSI("H","T",Te+273+10,"P",PropsSI("P","T",Te+273,"Q",1,fluid),fluid) for Te in T_evap])
  
  Q_dot_actual = df["Cooling Capacity [W]"].values
  m_dot_actual = 3600*Q_dot_actual/(h1-h4)
  
  # we take the inverse of the density 
  # of the vapor at the evaporing *pressure*
  # and the return gas temperature
  
  m_dot_ideal = Vd_dot/v_in
  eta_v = m_dot_actual/m_dot_ideal
  
  ax.plot(T_evap,eta_v*100,'-',color=colors[i],label="Tcond = %.2f ºC" %(Tc))
  i = i+1
  
ax.set_xlabel("Temperatura de evaporação [ºC]")
ax.set_ylabel("Eficiência volumétrica [%]")
ax.set_ylim(50,110)
## (50.0, 110.0)
ax.legend()
ax.grid()
plt.show()
O rendimento volumétrico dos compressores parafuso não tão alto como os scroll, mas mais alto que os compressores alternativos. Além disso, o ponto de operação influencia bastante; como você pode reduzir os dados?
Previous
Next