🖥️ Procédé Haber-Bosch ★★

Notebook Capytale de cet exercice : 44de-11678473

On s’intéresse à la synthèse de l’ammoniac NH3 par le procédé Haber-Bosch, qui combine l’azote N2 et l’hydrogène H2 selon la réaction chimique

N2+3 H2→2 NH3

La réaction est réalisée dans un réacteur piston adiabatique de section 𝑆=5 cm2, de longueur 𝐿=6 m à la pression 𝑃=200 bar.

La vitesse volumique de réaction à la position 𝑥 dans le réacteur dépend des pressions partielles et s’écrit

𝑟=𝑘(𝑇)(𝑃N2𝑃H23−𝑃NH32𝑃∘2𝐾∘(𝑇))

On se place dans l’approximation d’Ellingham. L’écoulement est supposé lent et horizontal. Le réacteur ne comporte aucune pièce mobile.

1/ Exprimer la constante de vitesse de réaction 𝑘(𝑇) en fonction de l’énergie d’activation 𝐸𝑎 et de la température 𝑇.

Coup de pouce 1
Énoncer la loi d’Arrhenius.
Corrigé

La loi d’Arrhenius s’écrit

𝑘(𝑇)=𝐴exp(−𝐸𝑎𝑅𝑇)

où 𝐴 est le facteur préexponentiel.

2/ Exprimer les pressions partielles des différentes espèces en fonction des débits molaires et de la pression 𝑃. En déduire l’écriture d’une fonction Python r(F_N2, F_H2, F_NH3, T) qui calcule la vitesse volumique de réaction.

Coup de pouce 1
Exprimer la pression partielle en fonction de la fraction molaire.
Coup de pouce 2
Diviser les quantités de matière par le volume pour faire apparaitre des concentrations. Comment faire apparaitre des débits molaires ?
Coup de pouce 3
Quel est le lien entre la constante d’équilibre et l’enthalpie libre standard de réaction ?
Corrigé
{𝑃N2=𝐹N2𝐹N2+𝐹H2+𝐹NH3𝑃𝑃H2=𝐹H2𝐹N2+𝐹H2+𝐹NH3𝑃𝑃NH3=𝐹NH3𝐹N2+𝐹H2+𝐹NH3𝑃

La constante d’équilibre s’écrit

𝐾∘(𝑇)=exp(−Δ𝑟𝐺∘𝑅𝑇)=exp(−Δ𝑟𝐻∘−𝑇Δ𝑟𝑆∘𝑅𝑇)
import numpy as np
R = 8.314  # J/(mol·K)
DrH = -92.2e3
DrS = -198
P = 200e5  # en Pa
A = 1e-8   # facteur préexponentiel
E_a = 160e3  # en J/mol
def r(F_N2, F_H2, F_NH3, T):
    P_N2 = F_N2 / (F_N2 + F_H2 + F_NH3) * P
    P_H2 = F_H2 / (F_N2 + F_H2 + F_NH3) * P
    P_NH3 = F_NH3 / (F_N2 + F_H2 + F_NH3) * P
    k = A * np.exp(-E_a / (R * T))
    K = np.exp(- (DrH - T * DrS) / (R * T))
    return k * (P_N2 * P_H2**3 - P_NH3**2 * 1e5**2 / K)

3/ En effectuant des bilans de matière sur une tranche élémentaire du réacteur, montrer que les débits molaires des différentes espèces vérifient

{d𝐹N2d𝑥=−𝑆𝑟(𝑥)d𝐹H2d𝑥=−3𝑆𝑟(𝑥)d𝐹NH3d𝑥=2𝑆𝑟(𝑥)
Corrigé

On fait un bilan de matière de N2 sur une tranche d’épaisseur d𝑥 de réacteur en régime stationnaire :

0=𝐹N2(𝑥)d𝑡−𝐹N2(𝑥+d𝑥)d𝑡−𝑟(𝑥)d𝑉d𝑡0=−d𝐹N2d𝑥d𝑥−𝑟(𝑥)𝑆d𝑥

D’où l’équation demandée

d𝐹N2d𝑥=−𝑆𝑟(𝑥)

C’est le même principe pour H2 et NH3, avec les coefficients stœchiométriques appropriés.

4/ En effectuant un bilan d’enthalpie sur une tranche élémentaire du réacteur, montrer que la température dans le réacteur vérifie

d𝑇d𝑥=−𝑟(𝑥)𝑆Δ𝑟𝐻∘𝐹N2(𝑥)𝑀N2𝑐𝑃,N2+𝐹H2(𝑥)𝑀H2𝑐𝑃,H2+𝐹NH3(𝑥)𝑀NH3𝑐𝑃,NH3
Corrigé

Le réacteur est adiabatique et sans pièce mobile : le PPI appliqué à une tranche d’épaisseur d𝑥 en régime stationnaire annule le flux d’enthalpie total,

0=(∑𝑖𝐹i𝑀i𝑐𝑃,i)d𝑇+Δ𝑟𝐻∘d𝜉d𝑡

Le premier terme est l’échauffement du mélange à composition figée (seconde loi de Joule, le débit massique de l’espèce 𝑖 valant 𝐹i𝑀i), le second l’effet thermique de la réaction. Sur la tranche, d𝜉d𝑡=𝑟(𝑥)𝑆d𝑥, d’où

d𝑇d𝑥=−𝑟(𝑥)𝑆Δ𝑟𝐻∘𝐹N2(𝑥)𝑀N2𝑐𝑃,N2+𝐹H2(𝑥)𝑀H2𝑐𝑃,H2+𝐹NH3(𝑥)𝑀NH3𝑐𝑃,NH3

On souhaite déterminer numériquement les profils de débits molaires et de température dans le réacteur. Le problème est sous la forme d’un problème d’Euler, on le résout en utilisant la fonction solve_ivp du module scipy.integrate. Cette fonction renvoie un objet solution contenant notamment solution.t (les positions dans le réacteur) et solution.y (les valeurs des variables d’état aux différentes positions).

5/ Compléter le code Python suivant.

S = 5e-4  # m^2
M_N2 = 28e-3  # kg/mol
M_H2 = 2e-3  # kg/mol
M_NH3 = 17e-3  # kg/mol
c_P_N2 = 1040  # J/(kg·K)
c_P_H2 = 2230  # J/(kg·K)
c_P_NH3 = 2175  # J/(kg·K)
def f(t,Y):
    F_N2, F_H2, F_NH3, T = Y
    dF_N2 = ...
    dF_H2 = ...
    dF_NH3 = ...
    dT = ...
    return [dF_N2, dF_H2, dF_NH3, dT]
Corrigé
S = 5e-4  # m^2
M_N2 = 28e-3  # kg/mol
M_H2 = 2e-3  # kg/mol
M_NH3 = 17e-3  # kg/mol
c_P_N2 = 1040  # J/(kg·K)
c_P_H2 = 2230  # J/(kg·K)
c_P_NH3 = 2175  # J/(kg·K)
def f(t,Y):
    F_N2, F_H2, F_NH3, T = Y
    r_val = r(F_N2, F_H2, F_NH3, T)
    dF_N2 = - S * r_val
    dF_H2 = - 3 * S * r_val
    dF_NH3 = 2 * S * r_val
    dT = (- r_val * S * DrH) / (F_N2 * M_N2 * c_P_N2 + F_H2 * M_H2 * c_P_H2 + F_NH3 * M_NH3 * c_P_NH3)
    return [dF_N2, dF_H2, dF_NH3, dT]

Les réactifs sont introduits dans le réacteur dans les proportions stœchiométriques, sans ammoniac initialement et avec un débit volumique total de 4000⁠ ⁠m3 h−1 et une température de 500 K.

6/ Compléter le code Python suivant pour résoudre numériquement le problème.

T_0 = ...
F_N2_0 = ...
F_H2_0 = ...
F_NH3_0 = ...
L = 6
Y0 = [F_N2_0, F_H2_0, F_NH3_0, T_0]
from scipy.integrate import solve_ivp
solution = solve_ivp(f, [0, L], Y0, "BDF")
Corrigé

D’après l’équation d’état des gaz parfaits, le débit molaire en entrée est

𝐹tot=𝑃𝐷𝑉𝑅𝑇

On en déduit les débits molaires initiaux

{𝐹N20=𝐹tot4=𝑃𝐷𝑉4𝑅𝑇𝐹H20=3𝐹tot4=3𝑃𝐷𝑉4𝑅𝑇𝐹NH30=0
T_0 = 500
D_V = 4000 / 3600  # en m^3/s
F_N2_0 = P * D_V / (4 * R * T_0)
F_H2_0 = 3 * P * D_V / (4 * R * T_0)
F_NH3_0 = 0

7/ Que vaut le taux de conversion de l’azote dans le réacteur ? Quelle température est atteinte à la sortie du réacteur ?

Corrigé

Le taux de conversion de l’azote est

𝑋N2=𝐹N20−𝐹N2𝐿𝐹N20
F_N2_L = solution.y[0,-1]
X_N2 = (F_N2_0 - F_N2_L) / F_N2_0
print("Taux de conversion de l'azote :", X_N2)
T_L = solution.y[3,-1]
print("Température à la sortie du réacteur :", T_L)

Données

EspèceN2H2NH3
Masse molaire (g mol−1)28217
Capacité thermique massique
à pression constante (J kg−1 ⁠K−1)
104022302175