# Illustration 8.1
# Page: 278
print'Illustration 8.1 - Page: 278\n\n'
# solution
#****Data****#
P_star = 2*10**(5);# [N/square m]
X_methane = 0.6;
X_ethane = 0.2;
X_propane = 0.08;
X_nbutane = 0.06;
X_npentane = 0.06;
#******#
MoleFraction = [0.6, 0.2 ,0.08, 0.06 ,0.06]
Heading = ["Component", "Equilibrium Partial Pressure", "Vapour Pressue " ,"Mole Fraction"];
Component = ["Methane", "Ethane " ,"Propane" ,"n-Butane", "n-Pentane"];
VapPressure = [0 ,42.05, 8.96, 2.36 ,0.66];# [N/square m]
Sum = 0;
print Heading[0],"\t \t \t \t",Heading[1],"\t \t \t \t",Heading[2],"\t \t \t \t",Heading[3],"\t \n"
for i in range(0,5):
print "\n ",Component[i]," \t \t \t \t \t",("{:.2e}".format(MoleFraction[i]*P_star)),"\t \t \t \t \t \t \t \t ",("{:.2e}".format(VapPressure[i]*10**(5))),
if VapPressure[i]==0:
Sum = Sum+0;
else:
print "\t \t \t \t \t \t \t \t \t \t",("{:.2e}".format((MoleFraction[i]*P_star)/(VapPressure[i]*10**(5)))),"\t",
Sum = Sum+(MoleFraction[i]*P_star)/(VapPressure[i]*10**(5))
print"\n Mole Fraction Of solvent Oil is ",round(1-Sum,3)
# Illustration 8.2
# Page: 286
print'Illustration 8.2 - Page: 286\n\n'
# solution
from scipy.optimize import fsolve
import numpy
import matplotlib.pyplot as plt
%matplotlib inline
#****Data****#
# Absorber:
G = 0.250;# [cubic m/s]
Temp1 = 273+26.0;# [K]
Pt = 1.07*10**(5);# [N/square m]
y1 = 0.02;
x2 = 0.005;
#******#
G1 = G*(273.0/Temp1)*(Pt/(1.0133*10**(5)))*(1/22.41);# [kmol/s]
Y1 = y1/(1-y1);# [kmol benzene/kmol dry gas]
Gs = G1*(1.0-y1);# [kmol dry gas/s]
# For 95% removal of benzene:
Y2 = Y1*0.05;
X2 = x2/(1.0-x2);# [kmol benzene/kmol oil]
# Vapour pressure of benzene:
P_star = 13330.0;# [N/square m]
X_star = numpy.zeros(20);
Y_star = numpy.zeros(20);
j = -1;
for i in range(1,21,1):
j = j+1;
x = i/100.0;
X_star[j] = i/100.0;
def f27(y):
return (y/(1+y))-(P_star/Pt)*(x/(1+x))
Y_star[j] = fsolve(f27,0.0);
# For min flow rate:
X1 = 0.176;# [kmolbenzene/kmol oil]
DataMinFlow = numpy.array([[X2, Y2],[X1, Y1]]);
plt.plot(X_star,Y_star,label="Equlibrium Line")
plt.plot(DataMinFlow[:,0],DataMinFlow[:,1],label="Min Flow Rate Line");
minLs = (Gs*(Y1-Y2)/(X1-X2));# [kmol/s]
# For 1.5 times the minimum:
Ls = 1.5*minLs;# [kmol/s]
X1_prime = (Gs*1.0*(Y1-Y2)/Ls)+X2;# [kmol benzene/kmol oil]
DataOperLine = numpy.array([[X2 ,Y2],[X1_prime ,Y1]]);
plt.plot(DataOperLine[:,0],DataOperLine[:,1],label="Operating Line")
plt.grid('on');
xlabel("moles of benzene / mole wash oil");
ylabel("moles benzene / mole dry gas");
legend(loc='lower right');
plt.title("Absorption")
plt.show()
print"The Oil circulation rate is ",("{:.2e}".format(Ls))," kmol/s\n"
# Stripping
Temp2 = 122+273;# [K]
# Vapour pressure at 122 OC
P_star = 319.9;# [kN/square m]
Pt = 101.33;# [kN/square m]
X_star = numpy.zeros(7);
Y_star = numpy.zeros(7);
j = -1;
for i in range(0,7,1):
j = j+1;
x = i/10.0;
X_star[j] = i/10.0;
def f28(y):
return (y/(1.0+y))-(P_star/Pt)*(x/(1.0+x))
Y_star[j] = fsolve(f28,0.0);
X1 = X2;# [kmol benzene/kmol oil]
X2 = X1_prime;# [kmol benzene/kmol oil]
Y1 = 0.0;# [kmol benzene/kmol steam]
# For min. steam rate:
Y2 = 0.45;
DataMinFlow =numpy.array([[X2 ,Y2],[X1 ,Y1]]);
minGs = Ls*(X2-X1)/(Y2-Y1);# [kmol steam/s]
slopeOperat = 1.5*(Y2-Y1)/(X2-X1);
def f29(x):
return slopeOperat*(x-X1)+Y1
x =numpy.arange(0,0.14,0.01)
plt.plot(Y_star,X_star,label="Equlibrium Line")
plt.plot(DataMinFlow[:,0],DataMinFlow[:,1],label="Min Flow Rate Line")
plt.plot(x,f29(x),label="Operating Line");
plt.grid('on');
xlabel("moles of benzene / mole wash oil");
ylabel("moles benzene / mole dry gas");
plt.legend(loc='lower left');
plt.title("Stripping");
plt.show()
print"The Steam circulation rate is ",("{:.2e}".format(1.5*minGs))," kmol/s\n"
#the answers are slightly different in textbook due to approximation while here answers are precise
# Illustration 8.3
# Page: 292
print'Illustration 8.3 - Page: 292\n\n'
# solution
import math
# Since tower is a tray device:
# Following changes in notation is made:
# L1 to LNp
# L2 to L0
# X1 to XNp
# X2 to X0
# G1 to GNpPlus1
# G2 to G1
# Y1 to YNpPlus1
# Y2 to Y1
# x1 to xNp
# x2 to x0
# y1 to yNpPlus1
# y2 to y1
# From Illustration 8.2:
yNpPlus1 = 0.02;
Y1 = 0.00102;
y1 = Y1/(1+Y1);
GNpPlus1 = 0.01075;# [kmol/s]
x0 = 0.005;
m = 0.125;# [m = y_star/x]
Ls = 1.787*10**(-3);# [kmol/s]
Gs = 0.01051;# [kmol/s]
XNp = 0.1190;
LNp = Ls*(1+XNp);# [kmol/s]
ANp = LNp/(m*GNpPlus1);
X0 = x0/(1-x0);
L0 = Ls*(1+X0);# [kmol/s]
G1 = Gs*(1+Y1);# [kmol/s]
A1 = L0/(m*G1);
A = (ANp*A1)**0.5;
# From Eqn. 5.55:
Np = (math.log((yNpPlus1-(m*x0))/(y1-(m*x0))*(1-(1/A))+(1/A)))/math.log(A);
print"Absorber\n"
print"From Analytical Method, no. of theoretical trays required is \n",round(Np,4)
# From Fig. 8.13 (Pg292):
Np = 7.6;
print"From Graphical Method, no. of theoretical trays required is \n",Np
# Stripper
SNp = 1/ANp;
S1 = 1/A1;
# Due to relative nonconstancy of the stripping factor,graphical method should be used.
print"Stripper\n"
# From Fig. 8.11 (Pg 289):
Np = 6.7;
print"From Graphical Method, no. of theoretical trays required is \n",Np
# From Fig. 5.16 (Pg 129):
Np = 6.0;
print"From Fig. 5.16, no. of theoretical trays required is \n",Np
# Illustration 8.4
# Page: 295
print'Illustration 8.4 - Page: 295\n\n'
# solution
import math
import numpy
from scipy.optimize import fsolve
import matplotlib.pyplot as plt
%matplotlib inline
#****Data****#
# a = CH4 b = C5H12
Tempg = 27.0;# [OC]
Tempo = 0.0;# [base temp,OC]
Templ = 35.0;# [OC]
xa = 0.75;# [mole fraction of CH4 in gas]
xb = 0.25;# [mole fraction of C5H12 in gas]
M_Paraffin = 200.0;# [kg/kmol]
hb = 1.884;# [kJ/kg K]
#********#
Ha = 35.59;# [kJ/kmol K]
Hbv = 119.75;# [kJ/kmol K]
Hbl = 117.53;# [kJ/kmol K]
Lb = 27820;# [kJ/kmol]
# M = [Temp (OC) m]
M = numpy.array([[20 ,0.575],[25 ,0.69],[30 ,0.81],[35, 0.95],[40, 1.10],[43, 1.25]]);
# Basis: Unit time
GNpPlus1 = 1.0;# [kmol]
yNpPlus1 = 0.25;# [kmol]
HgNpPlus1 = ((1-yNpPlus1)*Ha*(Tempg-Tempo))+(yNpPlus1*(Hbv*(Tempg-Tempo)+Lb));# [kJ/kmol]
L0 = 2.0;# [kmol]
x0 = 0.0;# [kmol]
HL0 = ((1-x0)*hb*M_Paraffin*(Templ-Tempo))+(x0*hb*(Templ-Tempo));# [kJ/kmol]
C5H12_absorbed = 0.98*xb;# [kmol]
C5H12_remained = xb-C5H12_absorbed;
G1 = xa+C5H12_remained;# [kmol]
y1 = C5H12_remained/G1;# [kmol]
LNp = L0+C5H12_absorbed;# [kmol]
xNp = C5H12_absorbed/LNp;# [kmol]
# Assume:
Temp1 = 35.6;# [OC]
Hg1 = ((1-y1)*Ha*(Temp1-Tempo))+(y1*(Hbv*(Temp1-Tempo)+Lb));# [kJ/kmol]
# Eqn. 8.11:
Qt = 0;
def f30(HlNp):
return ((L0*HL0)+(GNpPlus1*HgNpPlus1))-((LNp*HlNp)+(G1*Hg1)+Qt)
HlNp = fsolve(f30,2);
def f31(TempNp):
return HlNp-(((1-x0)*hb*M_Paraffin*(TempNp-Tempo))+(x0*hb*(TempNp-Tempo)))
TempNp = fsolve(f31,35.6);
# At Temp = TempNp:
mNp = 1.21;
yNp = mNp*xNp;# [kmol]
GNp = G1/(1-yNp);# [kmol]
HgNp = ((1-yNp)*Ha*(TempNp-Tempo))+(yNp*(Hbv*(TempNp-Tempo)+Lb));# [kJ/kmol]
# Eqn. 8.13 with n = Np-1
def f32(LNpMinus1):
return LNpMinus1+GNpPlus1-(LNp+GNp)
LNpMinus1 = fsolve(f32,2);# [kmol]
# Eqn. 8.14 with n = Np-1
def f33(xNpMinus1):
return ((LNpMinus1*xNpMinus1)+(GNpPlus1*yNpPlus1))-((LNp*xNp)+(GNp*yNp))
xNpMinus1 = fsolve(f33,0);# [kmol]
# Eqn. 8.15 with n = Np-1
def f34(HlNpMinus1):
return ((LNpMinus1*HlNpMinus1)+(GNpPlus1*HgNpPlus1))-((LNp*HlNp)+(GNp*HgNp))
HlNpMinus1 = fsolve(f34,0);# [kJ/kmol]
def f35(TempNpMinus1):
return HlNpMinus1-(((1-xNpMinus1)*hb*M_Paraffin*(TempNpMinus1-Tempo))+(xNpMinus1*hb*(TempNpMinus1-Tempo)))
TempNpMinus1 = fsolve(f35,42);# [OC]
# The computation are continued upward through the tower in this manner until the gas composition falls atleast to 0.00662.
# Results = [Tray No.(n) Tn(OC) xn yn]
Results = numpy.array([[4.0 ,42.3 ,0.1091 ,0.1320],[3 ,39.0, 0.0521 ,0.0568],[2 ,36.8 ,0.0184 ,0.01875],[1 ,35.5, 0.00463 ,0.00450]]);
plt.plot(Results[:,0],Results[:,3]);
plt.grid('on');
xlabel('Tray Number');
ylabel('mole fraction of C5H12 in gas');
plt.show();
plt.plot(Results[:,0],Results[:,1]);
plt.grid('on');
xlabel('Tray Number');
ylabel('Temperature(OC)');
plt.show();
# For the required y1
Np = 3.75;
print"The No. of trays will be ",Np
# Illustration 8.5
# Page: 299
print'Illustration 8.5 - Page: 299\n\n'
# solution
import math
import numpy
from scipy.optimize import fsolve
#****Data****#
# a = NH3 b = H2 c = N2 w = water
P = 2.0;# [bars]
Temp = 30.0;# [OC]
L = 6.38;# [kg/s]
W = 0.53;# [weir length,m]
pitch = 12.5/1000;# [m]
D = 0.75;# [Tower diameter,m]
hW = 0.060;# [weir height,m]
t = 0.5;# [tray spacing,m]
#*******#
# From Geometry of Tray Arrangement:
At = 0.4418;# [Tower Cross section,square m]
Ad = 0.0403;# [Downspout Cross section,square m]
An = At-Ad;# [square m]
Ao = 0.0393;# [perforation area,square m]
Z = 0.5307;# [distance between downspouts,square m]
z = (D+W)/2.0;# [average flow width,m]
h1 = 0.04;# [weir crest,m]
# From Eqn. 6.34
Weff = W*(math.sqrt(((D/W)**2)-((((D/W)**2-1)**0.5)+((2*h1/D)*(D/W)))**2));# [m]
q = Weff*(1.839*h1**(3/2));#[cubic m/s]
# This is a recommended rate because it produces the liquid depth on the tray to 10 cm.
Density_L = 996;# [kg/s]
Mw = 18.02;# [kg/kmol]
L1 = 6.38/Mw;# [kmol/s]
Ma = 17.03;# [kg/kmol]
Mb = 28.02;# [kg/kmol]
Mc = 2.02;# [kg/kmol]
MavG = (0.03*Ma)+(0.97*(1/4)*Mb)+(0.97*(3/4)*Mc);# [kg/kmol]
Density_G = (MavG/22.41)*(P/0.986)*(273/(273+Temp));# [kg/cubic m]
G = 0.893;# [kg/s]
sigma = 68*10**(-3);# [N/m]
abcissa = (L/G)*(Density_G/Density_L)**0.5;
# From Table 6.2 (Pg169):
alpha = 0.04893;
beeta = 0.0302;
# From Eqn. 6.30
Cf = ((alpha*math.log10(1.0/abcissa))+beeta)*(sigma/0.02)**0.2;
# From Eqn. 6.29
Vf = Cf*((Density_L-Density_G)/Density_G)**(1.0/2);# [m/s]
# 80% of flooding value:
V = 0.8*Vf;# [m/s]
G = 0.8*G;# [kg/s]
G1 = G/MavG;# [kmol/s]
Vo = V*An/Ao;# [m/s]
l = 0.002;# [m]
Do = 0.00475;# [m]
# From Eqn. 6.37
Co = 1.09*(Do/l)**0.25;
viscosity_G = 1.13*10**(-5);# [kg/m.s]
Reo = Do*Vo*Density_G/viscosity_G;
# At Reynold's No. = Reo
fr = 0.0082;
g = 9.81;# [m/s^2]
# From Eqn. 6.36
def f36(hD):
return (2*hD*g*Density_L/(Vo**2*Density_G))-(Co*(0.40*(1.25-(Ao/An))+(4*l*fr/Do)+(1-(Ao/An))**2))
hD = fsolve(f36,1);
# From Eqn. 6.31;
Aa = (Ao/0.907)*(pitch/Do)**2;# [square m]
Va = V*An/Aa;# [m/s]
# From Eqn. 6.38
hL = 6.10*10**(-3)+(0.725*hW)-(0.238*hW*Va*(Density_G)**0.5)+(1.225*q/z);# [m]
# From Eqn. 6.42
hR = 6*sigma/(Density_L*Do*g);# m
# From Eqn. 6.35
hG = hD+hL+hR;# [m]
Al = 0.025*W;# [square m]
Ada = min(Al,Ad);
# From Eqn. 6.43
h2 = (3/(2*g))*(q/Ada)**2;# [m]
# From Eqn.6.44
h3 = hG+h2;
# since hW+h1+h3 is essentially equal to t/2, flooding will not occur
abcissa = (L/G)*(Density_G/Density_L)**0.5;
V_by_Vf = V/Vf;
# From Fig.6.17, V/Vf = 0.8 & abcissa = 0.239
E = 0.009;
# At the prevailing conditions:
Dg = 2.296*10**(-5);# [square m/s]
viscosity_G = 1.122*10**(-5);# [kg/m.s]
ScG = viscosity_G/(Density_G*Dg)
Dl = 2.421*10**(-9);# [square m/s]
# From Henry's Law:
m = 0.850;
A = L1/(m*G1);
# From Eqn. 6.61:
NtG = (0.776+(4.57*hW)-(0.238*Va*Density_G**0.5)+(104.6*q/Z))/(ScG**0.5);
# From Eqn. 6.64:
thetha_L = hL*z*Z/q;# [s]
# From Eqn. 6.62:
NtL = 40000*(Dl**0.5)*((0.213*Va*Density_G**0.5)+0.15)*thetha_L;
# From Eqn. 6.52:
NtoG = 1/((1/NtG)+(1/(A*NtL)));
# From Eqn. 6.51:
EoG = 1-math.exp(-NtoG);
# From Eqn. 6.63:
DE = ((3.93*10**(-3))+(0.0171*Va)+(3.67*q/Z)+(0.1800*hW))**2;# [square m/s]
# From Eqn. 6.59:
Pe = Z**2/(DE*thetha_L);
# From Eqn. 6.58:
eta = (Pe/2.0)*((1+(4*m*G1*EoG/(L1*Pe)))**0.5-1);
# From Eqn. 6.57:
EMG = EoG*(((1-math.exp(-(eta+Pe)))/((eta+Pe)*(1+(eta+Pe)/eta)))+((exp(eta)-1)/(eta*(1+(eta/(eta+Pe))))));
# From Eqn. 6.60:
EMGE = EMG/((1+(EMG*(E/(1-E)))));
# From Eqn. 8.16:
EO = math.log(1+EMGE*((1.0/A)-1))/math.log(1.0/A);
Np = 14*EO;
yNpPlus1 = 0.03;
x0 = 0;
# From Eqn. 5.54(a):
def f37(y1):
return ((yNpPlus1-y1)/(yNpPlus1-m*x0))-(((A**(Np+1))-A)/((A**(Np+1))-1))
y1 = fsolve(f37,0.03);
print"Mole Fraction Of NH3 in effluent is ",round(y1,4)
# Illustration 8.6
# Page: 304
print'Illustration 8.6 - Page: 304\n\n'
# solution
import matplotlib.pyplot as plt
%matplotlib inline
import numpy
from scipy.optimize import fsolve
import math
#****Data****#
# Gas:
# In:
y_prime1 = 0.02;
Y_prime1 = 0.0204;# [mol/mol dry gas]
# Out:
y_prime2 = 0.00102;
Y_prime2 = 0.00102;# [mol/mol dry gas]
# Non absorbed gas:
MavG = 11;# [kg/kmol]
G = 0.01051;# [kmol/s nonbenzene]
Gm = 0.01075;# [kmol/s]
T = 26;# [OC]
viscosity_G = 10**(-5);# [kg/m.s]
DaG = 1.30*10**(-5);# [square m/s]
# Liquid:
# In:
x_prime2 = 0.005;
X_prime2 = 0.00503;# [mol benzene/mol oil]
# Out:
x_prime1 = 0.1063;
X_prime1 = 0.1190;# [mol benzene/mol oil]
# Benzene free oil:
MavL = 260.0;# [kg/kmol]
viscosity_L = 2*10**(-3);# [kg/kmol]
Density_L = 840;# [kg/cubic cm]
L = 1.787*10**(-3);# [kmol/s]
DaL = 4.77*10**(-10);# [square m/s]
sigma = 0.03;# [N/square m]
m = 0.1250;
#*******#
A = 0.47**2*math.pi/4;# [square m]
# At the bottom:
L_prime1 = ((L*MavL)+(X_prime1*L*78))/A;# [kg/square m.s]
# At the top
L_prime2 = ((L*MavL)+(X_prime2*L*78))/A;# [kg/square m.s]
L_primeav = (L_prime1+L_prime2)/2;# [kg/square m.s]
# At the bottom
G_prime1 = ((G*MavG)+(Y_prime1*G*78))/A;# [kg/square m.s]
# At the top
G_prime2 = ((G*MavG)+(Y_prime2*G*78))/A;# [kg/square m.s]
G_primeav = (G_prime1+G_prime2)/2;# [kg/square m.s]
# From Illustration 6.6:
Fga = 0.0719;# [kmol/cubic cm.s]
Fla = 0.01377;# [kmol/cubic cm.s]
# Operating Line:
X_prime = numpy.array([0.00503 ,0.02 ,0.04 ,0.06 ,0.08 ,0.10 ,0.1190]);
x_prime = numpy.zeros(7);
Y_prime = numpy.zeros(7);
y_prime = numpy.zeros(7);
for i in range(0,7):
x_prime[i] = X_prime[i]/(1+X_prime[i]);
def f38(Y_prime):
return (G*(Y_prime1-Y_prime))-(L*(X_prime1-X_prime[i]))
Y_prime[i] = fsolve(f38,Y_prime1);
y_prime[i] = (Y_prime[i])/(1+Y_prime[i]);
def f39(x):
return m*x
x = numpy.arange(0,0.14,0.01);
# Interface compositions are determined graphically and according to Eqn. 8.21:
yi = [0.000784, 0.00285, 0.00562 ,0.00830 ,0.01090 ,0.01337 ,0.01580];
ylog = zeros(7);
y_by_yDiffyi = zeros(7);
for i in range(0,7):
ylog[i] = math.log10(yi[i]);
y_by_yDiffyi[i] = y_prime[i]/(y_prime[i]-yi[i]);
plt.plot(x_prime,y_prime,label="Operating Line")
plt.plot(x,f39(x),label="Equilibrium Line")
plt.plot(x_prime,yi,label="Interface Composition");
plt.legend(loc='lower right');
plt.grid('on');
xlabel("mole fraction of benzene in liquid");
ylabel("mole fraction of benzene in gas");
plt.show()
plt.plot(ylog,y_by_yDiffyi);
plt.grid();
xlabel("log y");
ylabel("y/(y-yi)");
title("Graphical Integration Curve");
plt.show()
# Area under the curve:
Ac = 6.556;
# Eqn. 8.28:
NtG = (2.303*Ac)+1.152*(math.log10((1-y_prime2)/(1-y_prime1)));
Gav = (Gm+(G/(1-Y_prime2)))/(2*A);# [kmol/square m.s]
HtG = Gav/Fga;# [m]
Z = HtG*NtG;# [m]
print"The depth of packing required is ",round(Z,3)," m"
# Illustration 8.7
# Page: 312
print'Illustration 8.7 - Page: 312\n\n'
# solution
import math
import matplotlib.pyplot as plt
%matplotlib inline
import numpy
from scipy.optimize import fsolve
# Fom Illustration 8.6:
y1 = 0.02;
y2 = 0.00102;
m = 0.125;
x2 = 0.005;
x1 = 0.1063;
# Number of transfer units:
# Method a:
y1_star = m*x1;
y2_star = m*x2;
yDiffy_star1 = y1-y1_star;
yDiffy_star2 = y2-y2_star;
yDiffy_starm = (yDiffy_star1-yDiffy_star2)/math.log(yDiffy_star1/yDiffy_star2);
# From Eqn. 8.48:
NtoG = (y1-y2)/yDiffy_starm;
print"NtoG according to Eqn. 8.48:",round(NtoG,2),"\n"
# Mehod b:
# From Illustration 8.3:
A = 1.424;
NtoG = (math.log((((y1-(m*x2))/(y2-(m*x2)))*(1-(1/A)))+(1/A)))/(1-(1/A));
print"NtoG according to Eqn. 8.50:",round(NtoG,2),"\n"
# Method c:
# Operating Line:
# From Illustration 8.3:
X_prime = [0.00503, 0.02, 0.04 ,0.06 ,0.08 ,0.10 ,0.1190];
x_prime = [0.00502 ,0.01961, 0.0385, 0.0566, 0.0741, 0.0909 ,0.1063]
Y_prime = [0.00102 ,0.00357 ,0.00697 ,0.01036 ,0.01376 ,0.01714 ,0.0204];
y_prime = [0.00102 ,0.00356, 0.00692 ,0.01025 ,0.01356 ,0.01685, 0.0200];
def f2(x):
return m*x
x = numpy.arange(0,0.14,0.01);
plt.plot(x_prime,y_prime,label="Operating Line")
plt.plot(x,f2(x),label="Equilibrium Line");
plt.legend(loc='upper right');
plt.grid('on');
xlabel("mole fraction of benzene in liquid");
ylabel("mole fraction of benzene in gas");
plt.show()
# From graph:
NtoG = 8.7;
print"NtoG from graph:",round(NtoG,2)," \n",
# Method d:
# from Fig 8.10:
Y_star = [0.000625, 0.00245, 0.00483, 0.00712 ,0.00935 ,0.01149, 0.01347];
ordinate = numpy.zeros(7);
for i in range(0,7):
ordinate[i] = 1/(Y_prime[i]-Y_star[i]);
plt.plot(Y_prime,ordinate);
plt.grid('on');
xlabel("Y");
ylabel("1/(Y-Y*)");
plt.title("Graphical Integration");
plt.show()
# Area under the curve:
Ac = 8.63;
# From Eqn. 8.36:
NtoG = Ac+(1.0/2)*math.log((1+y2)/(1+y1));
print"NtoG from graphical integration:",round(NtoG,2),"\n"
# Height of transfer units:
NtoG = 9.16;
# From Illustration 6.6:
Fga = 0.0719;# [kmol/cubic m.s]
Fla = 0.01377;# [kmol/cubic m.s]
Gav = 0.0609;# [kmol/square m.s]
L = 1.787*10**(-3);# [kmol/s]
X1 = x1/(1-x1);
X2 = x2/(1-x2);
Area = 0.1746;# [square m]
Lav = L*((1+X1)+(1+X2))/(2*Area);
# From Eqn. 8.24:
Htg = Gav/Fga;# [m]
# From Eqn. 8.31:
Htl = Lav/Fla;# [m]
# since Solutions are dilute:
HtoG = Htg+Htl/A;# [m]
print"HtoG: ",round(HtoG,2)," m\n",
Z = HtoG*NtoG;# [m]
print"The depth of packing recquired is ",round(Z,2)," m"
# Illustration 8.8
# Page: 317
print'Illustration 8.8 - Page: 317\n\n'
# Solution
import math
import matplotlib.pyplot as plt
%matplotlib inline
import numpy
from scipy.optimize import fsolve
#***Data***
# a:NH3 b:air c:H2O
ya = 0.416;# [mole fraction]
yb = 0.584;# [mole fraction]
G1 = 0.0339;# [kmol/square m.s]
L1 = 0.271;# [kmol/square m.s]
TempG1 = 20;# [OC]
#********#
# At 20 OC
Ca = 36390;# [J/kmol]
Cb = 29100;# [J/kmol]
Cc = 33960;# [J/kmol]
lambda_c = 44.24*10**6;# [J/kmol]
# Enthalpy base = NH3 gas, H2O liquid, air at 1 std atm.
Tempo = 20;# [OC]
lambda_Ao = 0;# [J/kmol]
lambda_Co = 44.24*10**6;# [J/kmol]
# Gas in:
Gb = G1*yb;# [kmol air/square m.s]
Ya1 = ya/(1-ya);# [kmol NH3/kmol air]
yc1 = 0;# [mole fraction]
Yc1 = yc1/(1-yc1);# [kmol air/kmol NH]
# By Eqn 8.58:
Hg1 = (Cb*(TempG1-Tempo))+(Ya1*(Ca*(TempG1-Tempo))+lambda_Ao)+(Yc1*(Cc*(TempG1-Tempo)+lambda_Co));# [J/kmol air]
# Liquid in:
xa1 = 0;# [mole fraction]
xc1 = 1;# [mole fraction]
Hl1 = 0;# [J/kmol air]
#Gas out:
Ya2 = Ya1*(1-0.99);# [kmol NH3/kmol air]
# Assume:
TempG2 = 23.9;# [OC]
yc2 = 0.0293;
def f(Yc2):
return yc2-(Yc2/(Yc2+Ya2+1))
Yc2 = fsolve(f,0.002);# [kmol H2O/kmol air]
Hg2 = (Cb*(TempG2-Tempo))+(Ya2*(Ca*(TempG2-Tempo))+lambda_Ao)+(Yc2*(Cc*(TempG2-Tempo)+lambda_Co));# [J/kmol air]
# Liquid out:
Lc = L1-(Yc1*Gb);# [kmol/square m.s]
La = Gb*(Ya1-Ya2);# [kmol/square m.s]
L2 = La+Lc;# [kmol/square m.s]
xa = La/L2;
xc = Lc/L2;
# At xa & tempo = 20 OC
delta_Hs = -1709.6*1000;# [J/kmol soln]
# Condition at the bottom of the tower:
# Assume:
TempL = 41.3;# {OC}
# At(TempL+TempG1)/2:
Cl = 75481.0;# [J/kmol]
def f40(Cl):
return Hl1+Hg1-((Gb*Hg2)+(L2*(Cl*(TempL-Tempo)+delta_Hs)))
Cl = fsolve(f40,7);# [J/kmol.K]
# For the Gas:
MavG = 24.02;# [kg/kmol]
Density_G = 0.999;# [kg/cubic m]
viscosity_G = 1.517*10**(-5);# [kg/m.s]
kG = 0.0261;# [W/m.K]
CpG = 1336;# [J/kg.K]
Dab = 2.297*10**(-5);# [square m/s]
Dac = 3.084*10**(-5);# [square m/s]
Dcb = 2.488*10**(-5);# [square m/s]
PrG = CpG*viscosity_G/kG;
# For the liquid:
MavL = 17.97;# [kg/kmol]
Density_L = 953.1;# [kg/cubic m]
viscosity_L = 6.408*10**(-4);# [kg/m.s]
Dal = 3.317*10**(-9);# [square m/s]
kl = 0.4777;# [W/m.K]
ScL = viscosity_L/(Density_L*Dal);
PrL = 5.72;
sigma = 3*10**(-4);
G_prime = G1*MavG;# [kg/square m.s]
L_prime = L2*MavL;# [kg/square m.s]
# From data of Chapter 6:
Ds = 0.0472;# [m]
a = 57.57;# [square m/cubic m]
shiLt = 0.054;
e = 0.75;
# By Eqn. 6.71:
eLo = e-shiLt;
# By Eqn. 6.72:
kL = (25.1*Dal/Ds)*(Ds*L_prime/viscosity_L)**0.45*ScL**0.5;# [m/s]
c = Density_L/MavL;# [kmol/cubic m]
Fl = kL*c;# [kmol/cubic m]
# The heat mass transfer analogy of Eqn. 6.72:
hL = (25.1*kl/Ds)*(Ds*L_prime/viscosity_L)**0.45*PrL**0.5;# [m/s]
# The heat transfer analogy of Eqn. 6.69:
hG = (1.195*G_prime*CpG/PrG**(2/3))*(Ds*G_prime/(viscosity_G*(1-eLo)))**(-0.36);# [W/square m.K]
# To obtain the mass transfer coeffecients:
Ra = 1.4;
Rc = 1-Ra;
# From Eqn. 8.83:
Dam = (Ra-ya)/(Ra*((yb/Dab)+((ya+yc1)/Dac))-(ya/Dac));# [square m/s]
Dcm = (Rc-yc1)/(Rc*((yb/Dcb)+((ya+yc1)/Dac))-(yc1/Dac));# [square m/s]
ScGa = viscosity_G/(Density_G*Dam);
ScGc = viscosity_G/(Density_G*Dcm);
# By Eqn. 6.69:
FGa = (1.195*G1/ScGa**(2/3))*(Ds*G_prime/(viscosity_G*(1-eLo)))**(-0.36);# [kmol/square m.K]
FGc = (1.195*G1/ScGc**(2/3))*(Ds*G_prime/(viscosity_G*(1-eLo)))**(-0.36);# [kmol/square m.K]
Ra = Ra-0.1;
# From Eqn. 8.80:
for i in range(0,3):
def f41(xai):
return Ra-(Ra-ya)*((Ra-xa)/(Ra-xai))**(Fl/FGa)
xai = numpy.arange(xa,0.10,0.01)
plt.plot(xai,f41(xai))
Ra = Ra+0.1;
plt.grid('on');
xlabel("Mole fraction NH3 in the liquid, xa");
ylabel("Mole fraction NH3 in the gas ya");
title("Operating Line curves");
plt.show()
Rc = Rc-0.1;
# From Eqn. 8.81:
for i in range(0,3):
def f42(xci):
return Rc-(Rc-yc1)*((Rc-xc)/(Rc-xci))**(Fl/FGc)
xci = numpy.arange(xc,0.85,-0.01);
plot(xci,f42(xci))
Rc = Rc+0.1;
plt.grid('on');
xlabel("Mole fraction H2O in the liquid, xc");
ylabel("Mole fraction H2O in the gas, yc");
title("Operating line Curves");
plt.show()
# Assume:
Tempi = 42.7;# [OC]
# The data of Fig. 8.2 (Pg 279) & Fig 8.4 (Pg 319) are used to draw the eqb curve of Fig 8.25 (Pg 320).
# By interpolation of operating line curves with eqb line and the condition: xai+xci = 1;
Ra = 1.38;
Rc = 1-Ra;
xai = 0.0786;
yai = f41(xai);
xci = 1-xai;
yci = f42(xci);
# From Eqn. 8.77:
dYa_By_dZ = -(Ra*FGa*a/Gb)*math.log((Ra-yai)/(Ra-ya));# [kmol H2O/kmol air]
# From Eqn. 8.78:
dYc_By_dZ = -(Rc*FGc*a/Gb)*math.log((Rc-yci)/(Rc-yc1));# [kmol H2O/kmol air]
# From Eqn. 8.82:
hGa_prime = -(Gb*((Ca*dYa_By_dZ)+(Cc*dYc_By_dZ)))/(1-exp(Gb*((Ca*dYa_By_dZ)+(Cc*dYc_By_dZ))/(hG*a)));# [W/cubic m.K]
# From Eqn. 8.79:
dtG_By_dZ = -(hGa_prime*(TempG1-Tempi))/(Gb*(Cb+(Ya1*Ca)+(Yc1*Cc)));# [K/m]
# When the curves of Fig. 8.2 (pg 279) & 8.24 (Pg 319) are interpolated for concentration xai and xci, the slopes are:
mar = 0.771;
mcr = 1.02;
lambda_c = 43.33*10**6;# [J/kmol]
# From Eqn. 8.3:
Hai = Ca*(Tempi-Tempo)+lambda_Ao-(mar*lambda_c);# [J/kmol]
Hci = Cc*(Tempi-Tempo)+lambda_Co-(mcr*lambda_c);# [J/kmol]
# From Eqn. 8.76
Tempi2 = TempL+(Gb/(hL*a))*(((Hai-Ca*(TempG1-Tempo)-lambda_Ao)*dYa_By_dZ)+((Hci-Cc*(TempG1-Tempo)-lambda_Co)*dYc_By_dZ)-((Cb+(Ya1*Ca)+(Yc1*Cc))*dtG_By_dZ));# [OC]
# The value of Tempi obtained is sufficiently close to the value assumed earlier.
deltaYa=-0.05;
# An interval of deltaYa up the tower
deltaZ = deltaYa/(dYa_By_dZ);# [m]
deltaYc = (dYc_By_dZ*deltaZ);
# At this level:
Ya_next = Ya1+deltaYa;# [kmol/kmol air]
Yc_next = Yc1+deltaYc;# [kmol H2O/kmol air]
tG_next = TempG1+(dtG_By_dZ*deltaZ);# [OC]
L_next = L1+Gb*(deltaYa+deltaYc);# [kmol/square m.s]
xa_next = ((Gb*deltaYa)+(L1*xa))/L_next;# [mole fraction NH3]
Hg_next = (Cb*(tG_next-Tempo))+(Ya_next*(Ca*(tG_next-Tempo))+lambda_Ao)+(Yc_next*(Cc*(tG_next-Tempo)+lambda_Co));# [J/kmol air]
Hl_next = (L1*Hl1)+(Gb*(Hg_next-Hg2)/L_next);# [J/kmol]
# The calculation are continued where the specified gas outlet composition are reached.
# The packed depth is sum of all deltaZ
Z = 1.58;# [m]
print"The packed depth is: ",Z," m\n"
# Illustration 8.9
# Page: 327
print'Illustration 8.9 - Page: 327\n\n'
# solution
from scipy.optimize import fsolve
import numpy
import math
#****Data****#
# C1=CH4 C2=C2H6 C3=n-C3H8 C4=C4H10
Abs=0.15;# [Total absorption,kmol]
T=25;# [OC]
y1=0.7;# [mol fraction]
y2=0.15;# [mol fraction]
y3=0.10;# [mol fraction]
y4=0.05;# [mol fraction]
x1=0.01;# [mol fraction]
x_involatile=0.99;# [mol fraction]
L_by_G=3.5;# [mol liquid/mol entering gas]
#******#
LbyG_top=L_by_G/(1-y2);
LbyG_bottom=(L_by_G+y2)/1;
LbyG_av=(LbyG_top+LbyG_bottom)/2;
# The number of eqb. trays is fixed by C3 absorption:
# For C3 at 25 OC;
m=4.10;
A=LbyG_av/m;
Frabs=0.7;# [Fractional absorption]
X0=0;
# From Eqn. 8.109:
def f43(Np):
return Frabs-((A**Np)-A)/((A**Np)-1)
Np=fsolve(f43,2);
print"Number of trays required is \n",round(Np,2)
#the answers are slightly different in textbook due to approximation while here answers are precise