import numpy as np
from scipy.integrate import quad
def RHS(X, epsilon):
return (1 + epsilon * X) / (1 - X)
= 1
epsilon = 10
volume = 5
v_0 = volume/ v_0
tau = 0.8
X
= quad(RHS, 0, X, args=(epsilon,))
result, _
= result / tau k_pfr
Solutions to workshop 04: Isothermal reactor design
Lecture notes for chemical reaction engineering
Try following problems from Fogler 5e(Fogler 2016).
P 5-7, P 5-8, P 5-9, P 5-11, P 5-24, P 6-4, P 6-6, P 6-7
We will go through some of these problems in the workshop.
P 5-7
The gas-phase reaction
\ce{A -> B + C}
follows an elementary rate law and is to be carried out first in a PFR and then in a separate experiment in a CSTR. When pure A is fed to a 10 dm3 PFR at 300 K and a volumetric flow rate of 5 dm3/s, the conversion is 80%. When a mixture of 50% A and 50% inert (I) is fed to a 10 dm3 CSTR at 320 K and a volumetric flow rate of 5 dm3/s, the conversion is also 80%. What is the activation energy in cal/mol?
Gas phase elementary reaction
\ce{A -> B + C}
Data:
PFR: V = 10 dm^3; V_0 = 5 dm^3/s; T = 300K; X = 0.8
CSTR: V = 10 dm^3; V_0 = 5 dm^3/s; T = 320K; X = 0.8; y_{A0} = 0.5; y_{I0} = 0.5
Rate: -r_A = k C_A = k_0 e^{-E/RT} C_{A0} (1 - X)
For PFR:
\frac{dX}{dV} = \frac{-r_A}{F_{A0}}
\frac{dX}{dV} = \frac{k C_{A0} (1-X)}{C_{A0} \upsilon_0 (1 + \epsilon X)}
\therefore k \tau = \int_0^{0.8} \frac{(1 + \epsilon X)}{(1 - X)} dX
\epsilon = y_{A0} \delta = 1 + (1 + 1 - 1) = 1
k from PFR experiment = 1.209 at 300 K
For CSTR:
V = \frac{F_{A0} X}{-r_A |_{exit}}
V = \frac{\upsilon_0 C_{A0} X}{k C_{A0} \frac{(1-X)}{(1 + \epsilon X)}} = \frac{\upsilon_0 X (1 + \epsilon X)} {k (1-X)}
\epsilon = \frac{1}{2}(1 + 1 - 1) = 0.5
\tau = \frac{10}{2} = 2 s
k = \frac{X (1 + \epsilon X)} {\tau (1 - X)}
= 0.5
epsilon = 2
tau = 0.8
X
= (X * (1 + epsilon * X))/ (tau * (1 - X)) k_cstr
k from CSTR experiment = 2.800 at 320 K
\ln \frac{k_2}{k_1} = \frac{E}{R} \left[ \frac{1}{T_1} - \frac{1}{T_2} \right]
= 1.987
R = np.log(k_cstr/k_pfr) * R /((1/300) - (1/320)) activation_energy
Activation energy = 8006.47 cal/mol
P 5-8
The elementary gas-phase reaction
\ce{A -> B}
takes place isobarically and isothermally in a PFR where 63.2% conversion is achieved. The feed is pure A.
It is proposed to put a CSTR of equal volume upstream of the PFR. Based on the entering molar flow rate to A to the first reactor, what will be the intermediate from the CSTR, X1 , and exit conversion from the PFR, X2 , based on the feed to first reactor?
The entering flow rates and all other variables remain the same as that for the single PFR.
Gas phase reaction \ce{A -> B}. Isothermal, isobaric PFR
X = 0.632
Base case: PFR
\frac{dX}{dV} = -r_A
-r_A = k C_A
C_A = C_{A0} (1 - X)
\tau k = \int_0^X \frac{1}{1-X} dX
import numpy as np
from scipy.integrate import quad
= lambda x: 1 / (1 - x)
RHS = 0.632
Xf = quad(RHS, 0, Xf) tk, _
\tau k = 1.00.
CSTR added upstream of PFR. \rightarrow equal volume. Therefore \tau k = 1.00.
V = \frac{F_{A0} X}{k C_{A0} (1-X)} \Rightarrow \tau k = \frac{X}{1 - X}
1 = \frac{X}{1 - X} \Rightarrow X_{1} = 0.5
For X_2
\tau k = \int_{X_1}^{X_2} \frac{dX}{1-X}
This integral can be easily solved by analytical method
1 = \ln \frac{1}{1-X_2} - \ln \frac{1}{1-X_1}
1 - \ln 2 = \ln \frac{1}{1-X_2} \Rightarrow X_2 = 0.82
Here’s alternative numerical way to solve it.
To calculate X_2 from a given X_1 and \tau k, where \tau k is the result of the definite integral from X_1 to X_2 of \frac{dX}{1-X}, you’ll need to perform the inverse operation. Essentially, you need to solve for X_2 in the equation \tau k = \int_{X_1}^{X_2} \frac{dX}{1-X}.
This operation is not straightforward because it requires finding the roots of a function, which is an iterative numerical process. Python’s scipy
library has methods such as fsolve
for root finding.
import numpy as np
from scipy.integrate import quad
from scipy.optimize import fsolve
def func(x2, x1, tau_k):
= quad(lambda x: 1 / (1 - x), x1, x2)
result, _ return result - tau_k
= 0.5
x1 = 1
tau_k
# provide a good initial guess for x2
= x1 + 0.1
x2_guess
# Solve for x2
= fsolve(func, x2_guess, args=(x1, tau_k)) x2
X_2 = 0.816.
P 5-9
The liquid-phase reaction
\ce{A + B -> C}
follows an elementary rate law and is carried out isothermally in a flow system. The concentrations of the A and B feed streams are 2 M before mixing. The volumetric flow rate of each stream is 5 dm3/min, and the entering temperature is 300 K. The streams are mixed immediately before entering. Two reactors are available. One is a gray, 200.0 dm3 CSTR that can be heated to 77 ^{\circ}C or cooled to 0 ^{\circ}C, and the other is a white, 800.0 dm3 PFR operated at 300 K that cannot be heated or cooled but can be painted red or black. Note that k=0.07 dm^3/mol \cdot min at 300 K and E = 20 kcal/mol.
Which reactor and what conditions do you recommend? Explain the reason for your choice (e.g., color, cost, space available, weather conditions). Back up your reasoning with the appropriate calculations.
How long would it take to achieve 90% conversion in a 200 dm3 batch reactor with CA0 = CB0 = 1 M after mixing at a temperature of 77^{\circ}C?
What would your answer to part (b) be if the reactor were cooled to 0^{\circ}C?
What conversion would be obtained if the CSTR and PFR were operated at 300 K and connected in series? In parallel with 5 mol/min to each?
Keeping Table 1 in mind, what batch reactor volume would be necessary to process the same amount of species A per day as the flow reactors, while achieving 90% conversion?
C_A=\frac{F_A}{v} = \frac{F_{A0}(1 - X)}{v} | = \frac{F_{A0}(1 - X)}{v_0(1 + eX)}\left(\frac{T_0}{T}\right)\frac{P}{P_0} | = C_{A0} \frac{(1 - X)}{(1 + eX)}\left(\frac{T_0}{T}\right)\frac{P}{P_0} |
C_B=\frac{F_B}{v} = \frac{F_{A0}(\Theta_B - (b/a)X)}{v} | = \frac{F_{A0}(\Theta_B - (b/a)X)}{v_0(1 + eX)}\left(\frac{T_0}{T}\right)\frac{P}{P_0} | = C_{A0} \frac{(\Theta_B - (b/a)X)}{(1 + eX)}\left(\frac{T_0}{T}\right)\frac{P}{P_0} |
C_C=\frac{F_C}{v} = \frac{F_{A0}(\Theta_C + (c/a)X)}{v} | = \frac{F_{A0}(\Theta_C + (c/a)X)}{v_0(1 + eX)}\left(\frac{T_0}{T}\right)\frac{P}{P_0} | = C_{A0} \frac{(\Theta_C + (c/a)X)}{(1 + eX)}\left(\frac{T_0}{T}\right)\frac{P}{P_0} |
C_D=\frac{F_D}{v} = \frac{F_{A0}(\Theta_D + (d/a)X)}{v} | = \frac{F_{A0}(\Theta_D + (d/a)X)}{v_0(1 + eX)}\left(\frac{T_0}{T}\right)\frac{P}{P_0} | = C_{A0} \frac{(\Theta_D + (d/a)X)}{(1 + eX)}\left(\frac{T_0}{T}\right)\frac{P}{P_0} |
C_1=\frac{F_1}{v} = \frac{F_{A0}\Theta_1}{v} | = \frac{F_{A0}\Theta_1}{v_0(1 + eX)}\left(\frac{T_0}{T}\right)\frac{P}{P_0} | = C_{A0}\Theta_1 \frac{1}{(1 + eX)}\left(\frac{T_0}{T}\right)\frac{P}{P_0} |
- recommended reactor and conditions
import numpy as np
from scipy.integrate import quad
from scipy.optimize import fsolve
# Data
= 0.07 # dm^3/mol min
k_300 = 20*1000 # cal/mol
E = 1.987 # cal/mol K
R
= 200 # dm^3
V_CSTR = 800 # dm^3
V_PFR
= 5 # dm^3/min
v_0A = 5 # dm^3/min
v_0B
= v_0A + v_0B
v_0
= 2 # mol/dm^3
C_Ain = 2 # mol/dm^3
C_Bin
= C_Ain * v_0A
F_A0 = C_Bin * v_0B
F_B0
= F_A0/v_0
C_A0 = F_B0/v_0
C_B0
# Calculate k at 77 degC (350 K)
= k_300 * np.exp( (E/R) * ((1/300) - (1/350)) )
k_350 = k_300 * np.exp( (E/R) * ((1/300) - (1/273)) )
k_273
# CSTR conversion
# Calculate concentrations and rate
= lambda x: C_A0 * (1 - x)
CA = lambda x: C_B0 * (1 - x)
CB
= lambda x,k: k * CA(x) * CB(x)
rA
# Function to find the root of
def func(x, *args):
= args
v, fa0, k = rA(x,k)
rate return x - v * rate/ fa0
= 0
x_guess
= fsolve(func, x2_guess, args=(V_CSTR, F_A0, k_350)) x_cstr
X_{CSTR} at 350 K = 0.926.
To calculate the PFR conversion we solve
\frac{dX}{dV} = \frac{-r_A}{F_{A0}}
using similar approach from problem P 5-8.
# PFR conversion
def find_x(x1, *args):
= args
v, k, fa0 = quad(lambda x: 1 / rA(x,k), 0, x1)
result, _ return fa0 * result - v
= 0
x_guess = fsolve(find_x, x_guess, args=(V_PFR, k_300, F_A0)) x_pfr
X_{PFR} at 300 K = 0.848.
As the PFR conversion is lower than CSTR conversion, use of CSTR operating at 350 K is recommended.
- Batch time
# Batch time
= 200 # dm^3
v = 200 # moles
N_A0 = 200 # moles
N_B0 = 0.9
X
= quad(lambda x: N_A0 / (rA(x, k_350) * v), 0, X) batch_time, _
Batch time at 350 K = 1.065 min.
- Batch time at 273 K
= quad(lambda x: N_A0 / (rA(x, k_273) * v), 0, X) batch_time, _
Batch time at 273 K = 3550.191 min (2.5 days).
- CSTR / PFR connected in series
# Function to find the root of
def func(x, *args):
= args
v, fa0, k = rA(x,k)
rate return x - v * rate/ fa0
= 0
x_guess
= fsolve(func, x2_guess, args=(V_CSTR, F_A0, k_300))
x_cstr_1
def find_x(x2, *args):
= args
x1, v, k, fa0 = quad(lambda x: 1 / rA(x,k), x1, x2)
result, _ return fa0 * result - v
= x_cstr_1
x_guess = fsolve(find_x, x_guess, args=(x_cstr_1, V_PFR, k_300, F_A0)) x_pfr_2
X_{1, CSTR} at 300 K = 0.440.
X_{2, PFR} at 300 K = 0.865.
- CSTR and PFR connected in parallel
# Function to find the root of
def func(x, *args):
= args
v, fa0, k = rA(x,k)
rate return x - v * rate/ fa0
= 0
x_guess
= fsolve(func, x2_guess, args=(V_CSTR, F_A0/2, k_300))
x_cstr_1
def find_x(x2, *args):
= args
x1, v, k, fa0 = quad(lambda x: 1 / rA(x,k), x1, x2)
result, _ return fa0 * result - v
= 0
x_guess = fsolve(find_x, x_guess, args=(0, V_PFR, k_300, F_A0/2)) x_pfr_2
X_{1, CSTR} at 300 K = 0.555.
X_{2, PFR} at 300 K = 0.918.
X_{Final} = 0.736.
P 5-11
The irreversible elementary gas-phase reaction
\ce{A + B -> C + D}
is carried out isothermally at 305 K in a packed-bed reactor with 100 kg of catalyst.
The entering pressure was 20 atm and the exit pressure is 2 atm. The feed is equal molar in A and B and the flow is in the turbulent flow regime, with FA0 = 10 mol/min and CA0 = 0.4 mol/dm3. Currently 80% conversion is achieved. What would be the conversion if the catalyst particle size were doubled and everything else remained the same?
Elementary reaction
\ce{A + B -> C + D}
From the initial conversion data given, we will determine rate constant. And use this rate constant to calculate coversion when catalyst particle size is dubbled.
Isothermal reaction
C_A = C_{A0}(1-X) \frac{P}{P_0}
let P/P_0 = y. For single isothermal reactions with \epsilon = 0, y^2 = 1 - \alpha w
Equimolar flow of A and B. Therefore, C_A = C_B
-r'_A = k C_A C_B = k C_A^2 = k C_{A0}^2 (1-X)^2 y^2 \tag{1}
\frac{dX}{dW} = \frac{-r'_A}{F_{A0}} \tag{2}
\frac{dy}{dW} = - \frac{\alpha}{2p} \tag{3}
\frac{dX}{dW} = \frac{k C_{A0}^2 (1-X)^2 y^2 }{F_{A0}}
\frac{dX}{(1 - X)^2} = \frac{k C_{A0}^2} {F_{A0}} (1 - \alpha w)^2 dW
\int_0^X \frac{dX}{(1 - X)^2} = \frac{k C_{A0}^2} {F_{A0}} \int_0^W (1 - \alpha w)^2 dW
\frac{X}{(1 - X)} = \frac{k C_{A0}^2} {F_{A0}} \left[ W - \frac{\alpha W^2}{2} \right] \tag{4}
y = 2/20 = 0.1, y^2 = 1 - \alpha W. Therefore, \alpha = (1 - (0.1)^2)/(100) = 9.9 \times 10^{-3} 1/kg
Substituting in Equation 4 we get k = 4.95 dm^6/(kg-cat \ mol \ min).
For Turbulent flow, \alpha \approx 1/Dp. Therefore, as the particle size doubles, \alpha will be halved. \alpha = 4.95 \times 10^{-3}
Substituting in Equation 4: X = 0.86
Alternate approach
We can solve Equation 1, Equation 2, and Equation 3 simultaneously to obtain conversion and pressure as a function of weight.
As we do not know k value, we will use root finding to find the value of k that satisfies the condition where X reaches X_{final} at W_{final}.
import numpy as np
from scipy.integrate import solve_ivp
from scipy.optimize import root_scalar
= 305 # K
T = 100 # kg
W = 10 # mol/min
F_A0 = 0.4 # mol/dm^3
C_A0 = 0.8
X_final = 20 # atm
P_0 = 2 # atm
P
# Calculate alpha using pressure drop data
= P/P_0
y = (1 - y**2)/W
alpha_1
# System of differential equations
def system(W, y, *args):
= y
X, p = args
k, ca0, fa0, alpha
= k * ca0**2 * (1-X)**2 * p**2
rate = rate / fa0
dX_dW = -alpha / (2*p)
dp_dW return [dX_dW, dp_dW]
# initial conditions
# at start of reactor, conversion is 0 and p is 1
= [0, 1]
y0
# Function to integrate over W
def solve_k(k):
= (k, C_A0, F_A0, alpha_1)
system_args = solve_ivp(system, [0, W], y0, args=system_args, dense_output=True)
sol = sol.sol(W)[0]
X return X - X_final
# Use root finding to solve for k
# since we don't know the value of k we provide a very large search space
= root_scalar(solve_k, bracket=[1e-4, 1e4], method='bisect')
result = result.root
k
# Now alpha is alpha/2
= alpha_1/2
alpha_2
# Calculate the final conversion with this new alpha value
= (k, C_A0, F_A0, alpha_2)
system_args = solve_ivp(system, [0, W], y0, args=system_args, dense_output=True)
sol = sol.sol(W)[0] X
k = 4.963.
X (for \alpha = 0.005) = 0.856.
P 5-24
The gas-phase reaction
\ce{A + B -> C + D}
takes place isothermally at 300 K in a packed-bed reactor in which the feed is equal molar in A and B with CA0 = 0.1 mol/dm3. The reaction is second order in A and zero order in B. Currently, 50% conversion is achieved in a reactor with 100 kg of catalysts for a volumetric flow rate 100 dm3/min. The pressure-drop parameter, \alpha, is \alpha = 0.0099 kg–1. If the activation energy is 10,000 cal/mol, what is the specific reaction rate constant at 400 K?
import numpy as np
from scipy.integrate import solve_ivp
from scipy.optimize import root_scalar
= 300 # K
T = 100 # kg
W = 100 # dm^3/min
v_0 = 0.1 # mol/dm^3
C_A0 = C_A0 * v_0 # mol/min
F_A0 = 0.5
X_final = 0.0099 # 1/kg
alpha_1
# System of differential equations
def system(W, y, *args):
= y
X, p = args
k, ca0, fa0, alpha
= k * ca0**2 * (1-X)**2 * p**2
rate = rate / fa0
dX_dW = -alpha / (2*p)
dp_dW return [dX_dW, dp_dW]
# initial conditions
# at start of reactor, conversion is 0 and p is 1
= [0, 1]
y0
# Function to integrate over W
def solve_k(k):
= (k, C_A0, F_A0, alpha_1)
system_args = solve_ivp(system, [0, W], y0, args=system_args, dense_output=True)
sol = sol.sol(W)[0]
X return X - X_final
# Use root finding to solve for k
# since we don't know the value of k we provide a very large search space
= root_scalar(solve_k, bracket=[1e-4, 1e4], method='bisect')
result = result.root
k
= 10000 # cal/mol
EA = 400
T2 = 1.987
R
= (EA/R)*((1/T) - (1/T2))
ln_k2k1
= k*np.exp(ln_k2k1) k2
k at 300 K = 19.832 dm^6/(kg-cat \ mol \ min).
k at 400 K = 1314.531 dm^6/(kg-cat \ mol \ min).
P 6-4
The elementary gas-phase reaction
\ce{(CH3)3COOC(CH3)3 -> C2H6 + 2 CH3COCH3}
\ce{A -> B + 2 C}
is carried out isothermally at 400 K in a flow reactor with no pressure drop. The specific reaction rate at 50^{\circ}C is 10-4 min-1 (from pericosity data) and the activation energy is 85 kJ/mol. Pure di-tert-butyl peroxide enters the reactor at 10 atm and 127^{\circ}C and a molar flow rate of 2.5 mol/min, i.e., FA = 2.5 mol/min.
Use the algorithm for molar flow rates to formulate and solve the problem. Plot FA, FB, FC, and then X as a function of plug-flow reactor volume and space time to achieve 90% conversion.
Calculate the plug-flow volume and space time for a CSTR for 90% conversion.
import numpy as np
from scipy.integrate import quad
import matplotlib.pyplot as plt
= 273.15
T_ref = 0.0821
R
= 127 + T_ref # K
T0 = 85000 # J/mol
EA = 10 # atm
P0 = 1
yA0
= 2.5 # mol/min
F_A0
= yA0 * P0/(R * T0)
C_A0
= 1 + 2 -1
delta = yA0 * delta
epsilon
= 1e-4 # 1/min
k_50 = k_50* np.exp( (EA/8.314) * (1/(50 + T_ref) - (1/T0)) )
k_127
= lambda x: C_A0 * (1 - x) / (1 + epsilon * x)
CA = lambda k, x: k * CA(x)
rA
# Molar flow rates
= lambda x: F_A0 * (1 - x)
FA = lambda x: F_A0 * (x)
FB = lambda x: F_A0 * (2 * x)
FC
def integral(x, *args):
= args
fa0, k return fa0/ rA(k, x)
= (F_A0, k_127)
system_args = np.linspace(0, 0.9, 100)
X_range = []
V
# Calculate volume for each X
for X in X_range:
= quad(integral, 0, X, args=system_args)
v, _
V.append(v)
='X vs. Volume')
plt.plot(V, X_range, label
'Volume ($dm^3$)')
plt.xlabel('Conversion (X)')
plt.ylabel('Conversion X as a Function of Reactor Volume')
plt.title(
plt.legend()True)
plt.grid(0,1)
plt.ylim(0,1000)
plt.xlim(
plt.show()
= FA(X_range)
FA_v = FB(X_range)
FB_v = FC(X_range)
FC_v
='FA')
plt.plot(V, FA_v, label='FB')
plt.plot(V, FB_v, label='FC')
plt.plot(V, FC_v, label
'Volume ($dm^3$)')
plt.xlabel('Molar Flow Rate (mol/min)')
plt.ylabel('Molar Flow Rates of A, B, and C as Functions of Reactor Volume')
plt.title(
plt.legend()True)
plt.grid(0, 1000)
plt.xlim(
plt.show()
= 0.9
x_final
= (F_A0, k_127)
system_args = quad(integral, 0, x_final, args=system_args)
V_PFR, _ = F_A0 * x_final / rA(k_127, x_final)
V_CSTR
= F_A0/ C_A0
v0 = v0 *(1 + epsilon * x_final)
v = V_CSTR/v tau
V_{PFR} for X = 0.90 at 127 °C = 952.277 dm^3.
V_{CSTR} for X = 0.90 at 127 °C = 4698.226 dm^3.
\tau_{CSTR} for X = 0.90 at 127 °C = 204.301 min.
P 6-6
(Membrane reactor) The first-order, gas-phase, reversible reaction
\ce{ A <=> B + 2 C }
is taking place in a membrane reactor. Pure A enters the reactor, and B diffuses out through the membrane. Unfortunately, a small amount of the reactant A also diffuses through the membrane.
Plot and analyze the flow rates of A, B, and C and the conversion X down the reactor, as well as the flow rates of A and B through the membrane.
Next, compare the conversion profiles in a conventional PFR with those of a membrane reactor from part (a). What generalizations can you make?
Would the conversion of A be greater or smaller if C were diffusing out instead of B?
Discuss qualitatively how your curves would change if the temperature were increased significantly or decreased significantly for an exothermic reaction. Repeat the discussion for an endothermic reaction.
Additional information:
k = 10 min-1 | FA0 = 100 mol/min |
KC = 0.01 mol/dm3 | v_0 = 100 dm3/min |
kCA= 1 min-1 | Vreactor = 20 dm3 |
kCB = 40 min-1 |
import numpy as np
from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt
# Data
= 10 # 1/min
k = 0.01 # mol/dm^3^
K_eq = 1 # min^-1^
k_CA = 40 # min^-1^
k_CB
= 100 # mol/min
F_A0 = 100 # dm^3^/min
v_0 = 20 # dm^3^
V_reactor
= F_A0/v_0
C_T0
= lambda ca, cb, cc: - k * (ca - cb * cc**2/ K_eq )
r_A = lambda ca, cb, cc: - r_A(ca, cb, cc)
r_B = lambda ca, cb, cc: - r_A(ca, cb, cc)/2
r_C
= lambda ca: k_CA * ca
r_diff_A = lambda cb: k_CB * cb
r_diff_B
= lambda f, ft: C_T0 * f/ft
C
# System of differential equations for membrane reactor
def membrane_reactor(V, y, *args):
= y
FA, FB, FC
= FA + FB + FC
FT = C(FA, FT)
CA = C(FB, FT)
CB = C(FC, FT)
CC
= r_A(CA, CB, CC) - r_diff_A(CA)
dFA_dV = r_B(CA, CB, CC) - r_diff_B(CB)
dFB_dV = r_C(CA, CB, CC)
dFC_dV
return [dFA_dV, dFB_dV, dFC_dV]
# System of differential equations for pfr
def pfr(V, y, *args):
= y
FA, FB, FC
= FA + FB + FC
FT = C(FA, FT)
CA = C(FB, FT)
CB = C(FC, FT)
CC
= r_A(CA, CB, CC)
dFA_dV = r_B(CA, CB, CC)
dFB_dV = r_C(CA, CB, CC)
dFC_dV
return [dFA_dV, dFB_dV, dFC_dV]
# initial conditions
# at start of reactor, conversion is 0 and p is 1
= [F_A0, 0, 0]
y0
= solve_ivp(membrane_reactor, [0, V_reactor], y0, dense_output=True)
sol_membrane = solve_ivp(pfr, [0, V_reactor], y0, dense_output=True)
sol_pfr
# Generating data for plotting
= np.linspace(0, V_reactor, 100)
V = sol_membrane.sol(V)
FA_m, FB_m, FC_m = sol_pfr.sol(V)
FA_p, FB_p, FC_p
# Plotting
'b', label='$F_Am$')
plt.plot(V, FA_m, 'g', label='$F_Bm$')
plt.plot(V, FB_m, 'r', label='$F_Cm$')
plt.plot(V, FC_m,
'b--', label='$F_Ap$')
plt.plot(V, FA_p, 'g--', label='$F_Bp$')
plt.plot(V, FB_p, 'r--', label='$F_Cp$')
plt.plot(V, FC_p,
'Volume (dm$^3$)')
plt.xlabel('Molar Flow Rate (mol/min)')
plt.ylabel('Molar Flow Rates of A, B, and C in the Reactor')
plt.title(
plt.legend()True)
plt.grid(0, 20)
plt.xlim(
plt.show()
P 6-7
Fuel Cells Rationale. With the focus on alternative clean-energy sources, we are moving toward an increased use of fuel cells to operate appliances ranging from computers to automobiles. For example, the hydrogen/oxygen fuel cell produces clean energy as the products are water and electricity, which may lead to a hydrogen-based economy instead of a petroleum-based economy. A large component in the processing train for fuel cells is the water-gas shift membrane reactor. (M. Gummala, N. Gupla, B. Olsomer, and Z. Dardas, Paper 103c, 2003, AIChE National Meeting, New Orleans, LA.)
\ce{CO + H2O <=> CO2 + H2}
Here, CO and water are fed to the membrane reactor containing the catalyst. Hydrogen can diffuse out the sides of the membrane, while \ce{CO}, \ce{H2O}, and \ce{CO2} cannot. Based on the following information, plot the concentrations and molar flow rates of each of the reacting species down the length of the membrane reactor.
Assume the following: The volumetric feed is 10 dm3/min at 10 atm, and the equimolar feed of CO and water vapor with CT0 = 0.4 mol/dm3. The equilibrium constant is Ke = 1.44, with k = 1.37 dm^6/ \text{mol kg-cat} \cdot \text{min}, and the mass transfer coefficient k_{H_2} = 0.1 dm^3/ \text{kg-cat} \cdot \text{min}
(Hint: First calculate the entering molar flow rate of CO and then relate FA and X.)
What is the membrane reactor volume necessary to achieve 85% conversion of CO?
Sophia wants you to compare the MR with a conventional PFR. What will you tell her?
For that same membrane reactor volume, Nicolas wants to know what would be the conversion of CO if the feed rate were doubled?
import numpy as np
from scipy.integrate import solve_ivp
from scipy.optimize import root_scalar
import matplotlib.pyplot as plt
# Data
= 1.37
k = 1.44
K_eq = 0.1
k_H2
= 10
v_0 = 10
p = 0.4
C_T0
= C_T0* v_0/2
F_A0 = C_T0* v_0/2
F_B0 = 0
F_C0 = 0
F_D0
# A, B, C, D --> CO, H2O, CO2, H2
# System of differential equations for membrane reactor
def fuel_cell(V, y, *args):
= y
FA, FB, FC, FD
= FA + FB + FC + FD
FT
= C_T0 * FA / FT
CA = C_T0 * FB / FT
CB = C_T0 * FC / FT
CC = C_T0 * FD / FT
CD
= -k * (CA * CB - CC * CD/ K_eq)
rate
= rate
rA = rate
rB = -rate
rC = -rate
rD
= k_H2 * CD
rH2
= rA
dFA_dV = rB
dFB_dV = rC
dFC_dV = rD - rH2
dFD_dV
return [dFA_dV, dFB_dV, dFC_dV, dFD_dV]
# initial conditions
# at start of reactor, conversion is 0 and p is 1
= [F_A0, F_B0, F_C0, F_D0]
y0
= 500
V_reactor = solve_ivp(fuel_cell, [0, V_reactor], y0, dense_output=True)
sol_fuel_cell
def target(V):
= sol_fuel_cell.sol(V)[0] # Get FA at V
FA return FA - F_A0*(1-0.85)
= root_scalar(target, bracket=[0, V_reactor], method='bisect')
result = result.root
v_x85
# Generating data for plotting
= np.linspace(0, V_reactor, 100)
V = sol_fuel_cell.sol(V)
FA, FB, FC, FD
# Plotting
'b', label='$F_A$')
plt.plot(V, FA, 'g', label='$F_B$')
plt.plot(V, FB, 'r', label='$F_C$')
plt.plot(V, FC, 'm', label='$F_D$')
plt.plot(V, FD,
'Volume (dm$^3$)')
plt.xlabel('Molar Flow Rate (mol/min)')
plt.ylabel('Molar Flow Rates of A, B, C, and D in the Reactor')
plt.title(
plt.legend()True)
plt.grid(0, V_reactor)
plt.xlim(
plt.show()
Volume of reacctor to achieve X = 0.85: 429.53 dm^3.
References
Citation
@online{utikar2024,
author = {Utikar, Ranjeet},
title = {Solutions to Workshop 04: {Isothermal} Reactor Design},
date = {2024-03-19},
url = {https://cre.smilelab.dev//content/workshops/04-isothermal-reactor-design/solutions.html},
langid = {en}
}