#!/usr/bin/python3
# -*- coding: utf-8 -*-
'''Pychemqt, Chemical Engineering Process simulator
Copyright (C) 2009-2023, Juan José Gómez Romera <jjgomera@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.'''
###############################################################################
# library for heat transfer calculation
###############################################################################
from math import exp, factorial, pi
from numpy import tanh
from numpy.lib.scimath import log, log10
from lib.utilities import refDoc
__doi__ = {
1:
{"autor": "VDI-Gesellschaft",
"title": "VDI Heat Atlas 2nd Edition",
"ref": "Berlin, New York. Springer 2010.",
"doi": ""},
2:
{"autor": "Bergman, T.L., Lavine, A.S., Incropera, F.P., DeWitt, D.P.",
"title": "Introduction to Heat Transfer. 6th Ed.",
"ref": "Wiley, 2011.",
"doi": ""},
3:
{"autor": "Churchill, S.W., Chu, H.H.S.",
"title": "Correlating Equations for Laminar and Turbulent Free "
"Convection from a Vertical Plate",
"ref": "Int. J. Heat Mass Transfer 18(11) (1975) 1323-29",
"doi": "10.1016/0017-9310(75)90243-4"},
5:
{"autor": "",
"title": "",
"ref": "",
"doi": ""},
}
[docs]
@refDoc(__doi__, [1, 2, 3])
def Nu_vertical_Churchill(Pr, Ra):
r"""Calculates Nusselt number for laminar and turbulent flows near a
vertical surface with Churchill-Chu correlation [3]_
.. math::
Nu^{1/2} = 0.825 + \frac{0.387 Ra^{1/6}}
{\left(1+(0.492/Pr)^{9/16}\right)^{8/27}}
For laminar flow (Ra ≤ 10⁹) use this correlation with a slightly better
accuracy
.. math::
Nu = 0.68 + \frac{0.67 Ra^{1/4}}
{\left(1+(0.492/Pr)^{9/16}\right)^{4/9}}
The correlation originally developed for vertical flat surfaces can be too
applied to vertical cylinders if this conditions is satisfied:
.. math::
\frac{D}{L} \ge \frac{35}{Gr_L^{1/4}}
Parameters
----------
Pr : float
Prandtl number [-]
Ra : float
Rayleigh number [-]
Returns
-------
Nu : float
Nusselt number, [-]
Notes
-----
This method does not exactly represent the behavior in the transition zone
between laminar and turbulent flows (10⁸ ≤ Ra ≤ 20⁹), but its accuracy is
enought for engineering applications in the entire range of Rayleigh
numbers.
Examples
--------
From [1]_, Example 1, pag. 667
>>> print("%0.f" % Nu_vertical_Churchill(0.7, 9.26e8))
120
From [2]_, Example 9.2, pag. 574:
>>> print("%0.f" % Nu_vertical_Churchill(0.69, 1.813E9))
147
"""
f = 1+(0.492/Pr)**(9/16)
Nu = (0.825+0.387*Ra**(1/6)/f**(8/27))**2 # Eq 9
return Nu
# Pipe Laminar flow
[docs]
def h_tubeside_laminar_Eubank_Proctor(Gz, Gr, Pr, D, L):
"""Coeficiente de transferencia de calor por calor sensible en el interior de tubos horizontales en regimen laminar
Eubank, D. C. and Proctor W. S. - Effect of natural convection on heat transfer with laminar flow in tubes, MS Thesis, Chemical Engineering Department, Massachusetts Institute of Technology, 1951."""
# TODO: De momento se devuelve el valor de h*d/k*(mu_w/mu_a)**0.14
return 1.8*(Gz+12.6*(Gr*Pr*D/L)**0.4)**(1./3)
[docs]
def h_tubeside_laminar_VDI(Re, Pr, D, L):
"""Coeficiente de transferencia de calor por calor sensible en el interior de tubos horizontales en regimen laminar
VDI Heat Atlas G1 Pag 695"""
Nu1 = 4.364
Nu2 = 1.953*(Re*Pr*D/L)**(1./3)
Nu3 = 0.924*Pr**(1./3)*(Re*D/L)**0.5
return (Nu1**3+0.6**3+(Nu2-0.6)**3+Nu3**3)**(1./3)
[docs]
def h_tubeside_laminar_Hausen(Gz):
"""Coeficiente de transferencia de calor por calor sensible en el interior de tubos horizontales en regimen laminar
Perry Capitulo 5 pag 15
0.1<Gz<1e4"""
return 3.66+0.19*Gz**0.8/(1+0.117*Gz**0.467)
[docs]
def h_tubeside_laminar_Sieder_Tate(Gz, Gr):
"""Coeficiente de transferencia de calor por calor sensible en el interior de tubos horizontales en regimen laminar
Sieder and Tate - Heat Transfer and Pressure Drop of Liquids in Tubes, Industrial Engineering Chemistry, Vol. 28, p. 1429, 1936.
Perry Capitulo 5 pag 15
Gz>100"""
return 1.86*Gz**(1./3)+0.87*(1+0.015*Gr**(1./3))
# Pipe Turbulent flow
[docs]
def h_tubeside_turbulent_Sieder_Tate(Re, Pr):
"""Coeficiente de transferencia de calor por calor sensible en el interior de tubos horizontales en regimen turbulento
Sieder and Tate - Heat Transfer and Pressure Drop of Liquids in Tubes, Industrial Engineering Chemistry, Vol. 28, p. 1429, 1936.
Re>10000
0.7<Pr<16700
L/D > 10"""
return 0.027*Re**0.8*Pr**(1./3)#*(mu/mu_w)**0.14
[docs]
def h_tubeside_turbulent_Colburn(Re, Pr):
"""Coeficiente de transferencia de calor por calor sensible en el interior de tubos horizontales en regimen turbulento
DeltaT pequeña
Re>10000
0.7<Pr<160
L/D > 10"""
return 0.023*Re**0.8*Pr**(1./3)
[docs]
def h_tubeside_turbulent_Dittus_Boelter(Re, Pr, calentamiento):
"""Coeficiente de transferencia de calor por calor sensible en el interior de tubos horizontales en regimen turbulento
DeltaT pequeña
Re>10000
0.7<Pr<160
L/D > 10"""
if calentamiento:
return 0.0243*Re**0.8*Pr**0.4
else:
return 0.0265*Re**0.8*Pr**0.3
[docs]
def h_tubeside_turbulent_ESDU(Re, Pr):
"""Coeficiente de transferencia de calor por calor sensible en el interior de tubos horizontales en regimen turbulento
40000<Re<1e6
0.3<Pr<300
L/D>60"""
return 0.0225*Re**0.795*Pr**0.495*exp(-0.0225*log(Pr)**2)
[docs]
def h_tubeside_turbulent_Gnielinski(Re, Pr, D, L):
"""Coeficiente de transferencia de calor por calor sensible en el interior de tubos horizontales en regimen turbulento y de transición
3000<Re<5e6
0.5<Pr<2000
Serth - Process heat transfer_ principles and applications pag 63"""
f = (0.782*log(Re-1.51))**-2
return f/8*(Re-1000.)*Pr/(1+12.7*(f/8)**0.5*(Pr**(2./3)-1))*(1+(D/L)**(2./3))
[docs]
def h_tubeside_turbulent_VDI(Re, Pr, filas_tubos, alineados):
"""Coeficiente de transferencia de calor por calor sensible en el interior de tubos horizontales en regimen turbulento
Re>10
Pr<600
alineados: indica si los tubos estan colocados en linea
filas_tubos: numeros de filas de tubos"""
if alineados:
if Re < 300:
a = 0.742
m = 0.431
elif Re < 2e5:
a = 0.211
m = 0.651
else:
a = 0.116
m = 0.7
else:
if Re < 300:
a = 1.309
m = 0.360
elif Re < 2e5:
a = 0.273
m = 0.635
else:
a = 0.124
m = 0.7
F1 = (Pr/Pr_w)**0.26
if filas_tubos > 10:
F2 = 1
else:
F2 = 0.9
return a*Re**m*Pr**0.34*F1*F2
# Double pipe
[docs]
def h_anulli_Laminar(Re, Pr, a, dhL=0, boundary=0):
"""VDI Heat Atlas G2 Pag.702"""
if boundary == 0: #Inner surface heated
Nu1 = 3.66+1.2*a**-0.8
fg = 1.615*(1+0.14*a**-0.5)
elif boundary == 1: #Outer surface heated
Nu1 = 3.66+1.2*a**0.5
fg = 1.615*(1+0.14*a**(1./3))
elif boundary == 2: #Both surfaces heated
Nu1 = 3.66+(4-0.102/(a+0.02))*a**0.04
fg = 1.615*(1+0.14*a**0.1)
Nu2 = fg*(Re*Pr*dhL)**(1./3)
Nu3 = (2/(1+22*Pr))**(1./6)*(Re*Pr*dhL)**0.5
return (Nu1**3+Nu2**3+Nu3**3)**(1./3.)
[docs]
def h_anulli_Turbulent(Re, Pr, a, dhL=0, boundary=0):
"""VDI Heat Atlas G2 Pag.703"""
if boundary == 0: #Inner surface heated
Fann = 0.75*a**-0.17
elif boundary == 1: #Outer surface heated
Fann = (0.9-0.15*a**0.6)
elif boundary == 2: #Both surfaces heated
Fann = (0.75*a**-0.17+(0.9-0.15*a**0.6))/(1+a)
Re_ = Re*((1+a**2)*log(a)+(1-a**2))/((1-a)**2*log(a))
Xann = (1.8*log10(Re_)-1.5)**-2
k1 = 1.07+900/Re-0.63/(1+10*Pr)
Nu = Xann/8*Re*Pr/(k1+12.7*(Xann/8)**0.5*(Pr**(2./3.)-1))*(1+dhL**(2./3.))*Fann
return Nu
[docs]
def h_anulli_Transition(Re, Pr, a, dhL=0, boundary=0):
"""VDI Heat Atlas G2 Pag.704"""
g = (Re-2300.)/(1.e4-2300.)
Nu_lam = h_anulli_Laminar(2300, Pr, a, dhL, boundary)
Nu_turb = h_anulli_Turbulent(1.e4, Pr, a, dhL, boundary)
Nu = (1-g)*Nu_lam+g*Nu_turb
return Nu
#
# Unused
def Nu_Convection_Free_External_Horizontal_Plate(Pr, Ra):
"""Calculo del Nusselt en convección natural externa de una pared vertical"""
f = (1+(0.492/Pr)**(9./16))**(-16./9)
Nu = (0.825+0.387*(Ra*f)**(1./6))**2
return Nu
[docs]
def Nu_Convection_Free_External_Horizontal_Plate(Pr, Ra):
"""Calculo del Nusselt en convección natural externa de una pared horizontal"""
f = (1+(0.322/Pr)**(11./20))**(-20./11)
x = Ra*f
if x < 7e4:
Nu = 0.766*x**0.2
else:
Nu = 0.15*x**(1./3)
return Nu
# Convection
[docs]
def h_tube_Condensation_Akers(fluid, Di):
"""ref Pag 557 Kakac: Boiler..."""
Ge = fluid.caudalmasico*4/pi/Di**2*((1-fluid.x)+fluid.x*(fluid.Liquido.rho/fluid.Vapor.rho)**0.5)
Re = Di*Ge/fluid.Liquido.mu
if Re < 5e4:
C = 5.03
n = 1./3
else:
C = 0.0265
n = 0.8
return C*Re**n*fluid.Liquido.Prandt**(1./3)
[docs]
def h_tube_Condensation_Cavallini(fluid, Di):
"""ref Pag 557 Kakac: Boiler..."""
Ge = fluid.caudalmasico*4/pi/Di**2*((1-fluid.x)+fluid.x*(fluid.Liquido.rho/fluid.Vapor.rho)**0.5)
Re = Di*Ge/fluid.Liquido.mu
return 0.05*Re**0.8*fluid.Liquido.Prandt**(1./3)
[docs]
def h_tube_Condensation_Boyko(fluid, Di):
"""ref Pag 557 Kakac: Boiler..."""
G = fluid.caudalmasico*4/pi/Di**2
Re = Di*G/fluid.Liquido.mu
return 0.021*Re**0.8*fluid.Liquido.Prandt**0.43*(1+fluid.x*(fluid.Liquido.rho/fluid.Vapor.rho-1))**0.5
[docs]
def h_tube_Condensation_Shah(fluid, Di):
"""ref Pag 557 Kakac: Boiler..."""
G = fluid.caudalmasico*4/pi/Di**2
Re = Di*G/fluid.Liquido.mu
Nul = 0.023*Re**0.8*fluid.Liquido.Prandt**0.4
return Nul*((1-fluid.x)**0.8+3.8*fluid.x**0.76*(1-fluid.x)**0.04/fluid.Pr**0.38)
[docs]
def h_tube_Condensation_Kosky(fluid, Di):
"""ref Pag 558 Kakac: Boiler..."""
pass
[docs]
def h_tube_Condensation_Traviss(fluid, Di, X):
"""ref Pag 558 Kakac: Boiler..."""
G = fluid.caudalmasico*4/pi/Di**2
Re = Di*G*(1-fluid.x)/fluid.Liquido.mu
F1 = 0.15*(1/X+2.85*X**-0.476)
if Re < 50:
F2 = 0.707*fluid.Liquido.Prandt*Re
elif Re < 1125:
F2 = 5*fluid.Liquido.Prandt+5*log(1+fluid.Liquido.Prandt*(0.0964*Re**0.585-1))
else:
F2 = 5*fluid.Liquido.Prandt+5*log(1+5*fluid.Liquido.Prandt)+2.5*log(0.0031*Re**0.812)
return fluid.Pr*Re**0.9*F1/F2
# Heat Exchanger design methods
[docs]
def efectividad(NTU, C_, flujo, **kwargs):
"""Calculo de la efectividad del cambiador
Flujo vendra definido por su acronimo
CF: Counter flow
PF: Parallel flow
CrFMix: Crossflow, both fluids mixed
CrFSMix: Crossflow, one fluid mixed, other unmixed
CrFunMix: Crossflow, both fluids unmixed
1-2TEMAE: 1-2 pass shell and tube exchanger
kwargs: Opciones adicionales:
mixed: corriente mezclada para CrFSMix
Cmin, Cmax
"""
if C_ == 0:
ep = 1-exp(-NTU)
elif flujo == "PF":
if C_ == 1:
ep = (1-exp(-2*NTU))/2
else:
ep = (1-exp(-NTU*(1+C_)))/(1+C_)
elif flujo == "CF":
if C_ == 1:
ep = NTU/(1+NTU)
else:
ep = (1-exp(-NTU*(1-C_)))/(1-C_*exp(-NTU*(1-C_)))
elif flujo == "CrFunMix":
def P(n, y):
suma = 0
for j in range(1, n+1):
suma += (n+1-j)/factorial(j)*y**(n+j)
return suma/factorial(n+1)
n = 1
suma = 0
while True:
inc = C_**n*P(n, NTU)
suma += inc
n += 1
if inc < 1e-12:
break
ep = 1-exp(-NTU)-exp(-(1+C_)*NTU)*suma
elif flujo == "CrFMix":
if C_ == 1:
ep = 1/(2/(1-exp(-NTU))-1/NTU)
else:
ep = 1/(1/(1-exp(-NTU))+C_/(1-exp(-NTU*C_))-1/NTU)
elif flujo == "CrFSMix":
if C_ == 1:
ep = 1-exp(-(1-exp(-NTU)))
else:
if kwargs["mixed"] == "Cmin":
ep = 1-exp(-(1-exp(-NTU*C_))/C_)
else:
ep = (1-exp(-C_*(1-exp(-NTU))))/C_
elif flujo == "1-2TEMAE":
if C_ == 1:
ep = 2/(2+2**0.5/tanh(2**0.5*NTU/2))
else:
ep = 2/((1+C_)+(1+C_**2)**0.5/tanh(NTU*(1+C_**2)**0.5/2))
return ep
[docs]
def TemperatureEffectiveness(NTU, R, flujo, **kwargs):
"""Calculo de la temperatura efectividad del cambiador
Flujo vendra definido por su acronimo
CF: Counter flow
PF: Parallel flow
CrFMix: Crossflow, both fluids mixed
CrFSMix: Crossflow, one fluid mixed, other unmixed
CrFunMix: Crossflow, both fluids unmixed
1-2TEMAE: 1-2 TEMA E
1-2TEMAE2: 1-2 TEMA E, shell fluid flow divided
1-3TEMAE: 1-3 TEMA E
1-4TEMAE: 1-4 TEMA E
1-1TEMAG: 1-1 TEMA G
1-2TEMAG: 1-2 TEMA G
1-1TEMAH: 1-1 TEMA H
1-2TEMAH: 1-2 TEMA H
1-1TEMAJ: 1-1 TEMA J
1-2TEMAJ: 1-2 TEMA J
1-4TEMAJ: 1-4 TEMA J
kwargs: Opciones adicionales:
mixed: corriente mezclada para CrFSMix
1, 2
"""
if flujo == "PF":
if R == 1:
ep = NTU/(1+NTU)
else:
ep = (1-exp(-NTU*(1-R)))/(1-R*exp(-NTU*(1-R)))
elif flujo == "CF":
if R == 1:
ep = (1-exp(-2*NTU))/2.
else:
ep = (1-exp(-NTU*(1+R)))/(1+R)
elif flujo == "CrFunMix":
ep = 1-exp(NTU**0.22/R*(exp(-R*NTU**0.78)-1))
# def P(n, y):
# suma=0
# for j in range(1, n+1):
# suma+=(n+1-j)/factorial(j)*y**(n+j)
# return suma/factorial(n+1)
# n=1
# suma=0
# while True:
# inc=R**n*P(n, NTU)
# suma+=inc
# n+=1
# if inc<1e-12:
# break
# ep=1-exp(-NTU)-exp(-(1+R)*NTU)*suma
elif flujo == "CrFMix":
K1 = 1-exp(-NTU)
if R == 1:
ep = 1/(2/K1-1/NTU)
else:
K2 = 1-exp(-R*NTU)
ep = 1/(1/K1+R/K2-1/NTU)
elif flujo == "CrFSMix":
K = 1-exp(-NTU)
if R == 1:
ep = 1-exp(-K)
else:
if kwargs["mixed"] == "1":
ep = (1-exp(-R*K))/R
else:
K = 1-exp(-R*NTU)
ep = 1-exp(-K/R)
elif flujo == "1-2TEMAE":
if R == 1:
ep = 1/(1+1/tanh(NTU/2**0.5)/2**0.5)
else:
E = (1+R**2)**0.5
ep = 2/(1+R+E/tanh(E*NTU/2))
elif flujo == "1-2TEMAE2":
E = exp(NTU)
if R == 2:
ep = 0.5*(1-(1+E**-2)/2/(1+NTU))
else:
B = exp(-NTU*R/2.)
ep = 1/R*(1-(2-R)*(2.*E+R*B)/(2+R)/(2.*E-R/B))
elif flujo == "1-3TEMAE":
l1 = -3./2+(9./4+R*(R-1))**0.5
l2 = -3./2-(9./4+R*(R-1))**0.5
l3 = R
d = l1-l2
X1 = exp(l1*NTU/3.)/2/d
X2 = exp(l2*NTU/3.)/2/d
X3 = exp(l3*NTU/3.)/2/d
if R == 1:
A = -exp(-NTU)/18-exp(NTU/3)/2+(NTU+5)/9
else:
A = X1*(R+l1)*(R-l2)/2/l1-X3*d-X2*(R+l2)*(R-l1)/2/l2+1/(1-R)
B = X1*(R-l2)-X2*(R-l1)+X3*d
C = X2*(3*R+l1)-X1*(3*R+l2)+X3*d
ep = 1/R*(1-C/(A*C+B**2))
elif flujo == "1-4TEMAE":
if R == 1:
A = 1/tanh(5**0.5*NTU/4)
B = tanh(NTU/4)
ep = 4/(4+5**0.5*A+B)
else:
D = (4+R**2)**0.5
A = 1/tanh(D*NTU/4)
B = tanh(NTU*R/4)
ep = 4/(2*(1+R)+D*A+R*B)
elif flujo == "1-1TEMAG":
if R == 1:
B = NTU/(2+NTU)
else:
D = exp(-NTU*(1-R)/2)
B = (1-D)/(1-R*D)
A = 1/(1+R)*(1-exp(-NTU*(1+R)/2))
ep = A+B-A*B*(1+R)+R*A*B**2
elif flujo == "1-2TEMAG":
if R == 2:
alfa = exp(-NTU)
ep = (1+2*NTU-alfa**2)/(4+4*NTU-(1-alfa)**2)
else:
alfa = exp(-NTU*(2+R)/4)
beta = exp(-NTU*(2-R)/2)
A = -2*R*(1-alfa)**2/(2+R)
B = (4-beta*(2+R))/(2-R)
ep = (B-alfa**2)/(A+2+R*B)
elif flujo == "1-1TEMAH":
A = 1/(1+R/2)*(1-exp(-NTU*(1+R/2)/2))
if R == 2:
B = NTU/(2+NTU)
else:
D = exp(-NTU*(1-R/2)/2)
B = (1-D)/(1-R*D/2)
E = (A+B-A*B*R/2)/2
ep = E*(1+(1-B*R/2)*(1-A*R/2+A*B*R))-A*B*(1-B*R/2)
elif flujo == "1-2TEMAH":
if R == 4:
H = NTU
E = NTU/2
else:
beta = NTU*(4-R)/8
H = (1-exp(-2*beta))/(4/R-1)
E = (1-exp(-beta))/(4/R-1)
alfa = NTU*(4-R)/8
D = (1-exp(-alfa))/(4/R+1)
G = (1-D)**2*(D**2+E**2)+D**2*(1+E)**2
B = (1+H)*(1+E)**2
ep = 1/R*(1-(1-D)**4/(B-4*G/R))
elif flujo == "1-1TEMAJ":
A = exp(NTU)
if R == 2:
ep = 0.5*(1-(1+1/A**2)/2/(1+NTU))
else:
B = exp(-NTU*R/2)
ep = 1/R*(1-(2-R)*(2*A+R*B)/(2+R)/(2*A-R/B))
elif flujo == "1-2TEMAJ":
l = (1+R**2/4)**0.5
A = exp(NTU)
B = (A**l+1)/(A**l-1)
C = A**((1+l)/2)/(l-1+(1+l)*A**l)
D = 1+l*A**((l-1)/2)/(A**l-1)
ep = 1/(1+R/2+l*B-2*l*C*D)
elif flujo == "1-4TEMAJ":
l = (1+R**2/16)**0.5
A = exp(NTU)
B = (A**l+1)/(A**l-1)
C = A**((1+l)/2)/(l-1+(1+l)*A**l)
D = 1+l*A**((l-1)/2)/(A**l-1)
E = exp(R*NTU/2)
ep = 1/(1+R/4*(1+3*E)/(1+E)+l*B-2*l*C*D)
return ep
[docs]
def CorrectionFactor(P, R, flujo, **kwargs):
"""Calculo de la factor de correccion
Flujo vendra definido por su acronimo
CF: Counter flow
PF: Parallel flow
CrFMix: Crossflow, both fluids mixed
CrFSMix: Crossflow, one fluid mixed, other unmixed
CrFunMix: Crossflow, both fluids unmixed
1-2TEMAE: 1-2 pass shell and tube exchanger
kwargs: Opciones adicionales:
mixed: corriente mezclada para CrFSMix
Cmin, Cmax
"""
if flujo == "PF" or flujo == "CF":
f = 1
elif flujo == "CrFSMix":
if kwargs["mixed"] == "1":
f = log((1-R*P)/(1-P))/(1-1/R)/log(1+R*log(1-P))
else:
f = log((1-R*P)/(1-P))/(R-1)/log(1+log(1-R*P)/R)
elif flujo == "1-2TEMAE":
if R == 1:
if P*(2+2**0.5) >= 2:
f = 0
else:
f = 2**0.5*P/(1-P)/log((2-P*(2-2**0.5))/(2-P*(2+2**0.5)))
else:
E = (1+R**2)**0.5
if P*(1+R+E) >= 2:
f = 0
else:
f = E*log((1-R*P)/(1-P))/(1-R)/log((2-P*(1+R-E))/(2-P*(1+R+E)))
else: # Para los ordenamientos de flujo sin solucion analitica
NTU = NTU_fPR(P, R, flujo, **kwargs)
if R == 1:
f = P/NTU/(1-P)
else:
f = log((1-R*P)/(1-P))/NTU/(1-R)
return f
[docs]
def NTU_fPR(P, R, flujo, **kwargs):
"""Calculo de la factor de correccion
Flujo vendra definido por su acronimo
CF: Counter flow
PF: Parallel flow
CrFMix: Crossflow, both fluids mixed
CrFSMix: Crossflow, one fluid mixed, other unmixed
CrFunMix: Crossflow, both fluids unmixed
1-2TEMAE: 1-2 pass shell and tube exchanger
kwargs: Opciones adicionales:
mixed: corriente mezclada para CrFSMix
Cmin, Cmax
"""
if flujo == "1-2TEMAE":
if R == 1:
NTU = log((1-P)/2-3*P)
else:
E = (1+R**2)**0.5
NTU = log((2-P*(1+R-E))/(2-P*(1+R+E)))/E
else:
if R == 1:
NTU = P/(1-P)
else:
NTU = log((1-R/P)/(1-P))/(1-R)
return NTU
[docs]
def Fi(P, R, flujo, **kwargs):
F = CorrectionFactor(P, R, flujo, **kwargs)
if R == 1:
Fi = F*(1-P)
else:
Fi = F*P*(1-R)/log((1-R*P)/(1-P))
return Fi