Nous considérerons un séparateur avec 1 entrée (numérotée 1) et deux sorties (numérotée 2 et 3) fonctionnant avec un mélange binaire de constituants A et B dont les compositions sont données par des fractions, $x_A$ et $x_B$. Les débits globaux sont notés $F_T$ et les partiels, $F_A$ et $F_B$. Si les fractions sont molaires alors les débits devront être exprimés en mole par unité de temps. Si les fractions sont massiques alors les débits devront être exprimés en masse par unité de temps.
Le bloc de code ci-dessous permet de dessiner le flowsheet et de faire apparaître les débits globaux et partiels ainsi que les compositions des trois courants.
import numpy as np
import matplotlib.pyplot as plt
%matplotlib
#tracé du flowsheet
def plot_flowsheet_sd():
fig, ax = plt.subplots(figsize=(5, 5))
xs, ys = 40, 40 #position du separateur
lx, ly = 40, 20 #taille du separateur
la, hla, hwa=25, 5,5 #taille des fleches
ax.set_aspect( 1 )
plt.axis('off')
plt.plot([xs,xs+lx,xs+lx,xs,xs],[ys,ys,ys+ly,ys+ly,ys])
plt.plot([xs,xs+lx],[ys,ys+ly],'b--')
plt.arrow(xs-la-hla,ys+ly/2,la,0, head_width=hwa, head_length=hla, fc='k', ec='k')
plt.arrow(xs+lx/2,ys,0,-la, head_width=hwa, head_length=hla, fc='k', ec='k')
plt.arrow(xs+lx/2,ys+ly,0,la, head_width=hwa, head_length=hla, fc='k', ec='k')
plt.text(45,48,'Séparateur',c='b', size=15)
plt.text(xs-la-hla,ys+ly/2-5, r"$F_{T1}$", size=15)
plt.text(xs-la-hla,ys+ly/2-10, r"$x_{A1}$", size=15)
plt.text(xs-la-hla,ys+ly/2-15, r"$x_{B1}$", size=15)
plt.text(xs+lx/2+5,ys-5, r"$F_{T2}$", size=15)
plt.text(xs+lx/2+5,ys-10, r"$x_{A2}$", size=15)
plt.text(xs+lx/2+5,ys-15, r"$x_{B2}$", size=15)
plt.text(xs+lx/2+5,ys+ly+20-5, r"$F_{T3}$", size=15)
plt.text(xs+lx/2+5,ys+ly+20-10, r"$x_{A3}$", size=15)
plt.text(xs+lx/2+5,ys+ly+20-15, r"$x_{B3}$", size=15)
plot_flowsheet_sd()
#Ecriture des débits partiels
plt.text(xs-la-hla,ys+ly/2-25, r"$F_{A1}=F_{T1}~x_{A1}$", color='r',size=12)
plt.text(xs-la-hla,ys+ly/2-30, r"$F_{B1}=F_{T1}~x_{B1}$", color='g',size=12)
plt.text(xs+lx/2+17,ys-10, r"$F_{A2}=F_{T2}~x_{A2}$", color='r',size=12)
plt.text(xs+lx/2+17,ys-15, r"$F_{B2}=F_{T2}~x_{B2}$", color='g',size=12)
plt.text(xs+lx/2+17,ys+ly+20-10, r"$F_{A3}=F_{T3}~x_{A3}$", color='r',size=12)
plt.text(xs+lx/2+17,ys+ly+20-15, r"$F_{B3}=F_{T3}~x_{B3}$", color='g',size=12)
plt.show()
Using matplotlib backend: nbAgg
Les équations, permettant de décrire les bilans de matière, sont les suivantes :
Bilan sur le débit global
Bilan sur les débits partiels de A et de B
Lien entre les différentes fractions molaires
Il y a donc 6 équations pour 9 inconnues $F_{T1},F_{T2},F_{T3},x_{A1},x_{A2},x_{A3},x_{B1},x_{B2},x_{B3}$.
Il faut cependant noter que ces équations ne sont pas indépendantes puisque la première est la somme des équations 2 et 3 en considérant les équations 4, 5 et 6.
Il y a donc seulement 5 équations indépendantes qui forment un système comportant 9 inconnues. Il faut donc fixer 4 variables pour obtenir une solution unique et déterminer les 5 inconnues à l'aide de 5 équations.
On fixera dans cet exercice les 4 paramètres suivants : $F_{T1},F_{T3},x_{B1},x_{B2}$. Les 5 équations nous permettront alors de déterminer les 5 inconnues : $F_{T2},x_{A1},x_{A2},x_{A3},x_{B3}$
Les lignes de codes ci-dessous permettent de visualiser les 4 données fixées et de vérifier si une solution "physique" existe. Si ce n'est pas le cas, un message s'affiche pour vous dire dans quel sens modifier les 4 données pour retomber sur un problème ayant une solution physique. Vous pouvez donc vous exercer en changeant le jeu des 4 paramètres fixés et refaire les calculs.
A noter que si vous choisissez $x_{B1}=x_{B2}$, il s'agit d'un simple diviseur de courant qui ne modifie pas la composition des courants de sortie.
#Les 4 paramètres fixés
FT1=300
XB1=0.5
XB2=0.7
FT3=100
#Analyse de la cohérence du jeu de données
if ((FT1*XB1)-(FT1-FT3)*XB2)/FT3 >1:
print ('Attention le jeu de données ne correspond pas à une solution physique')
print ('XB3>1, il y a soit :')
print (' i) trop de B en entrée (essayez de réduire XB1 ou FT1)' )
print (' ii) pas assez de B en sortie 2 (essayez d augmenter XB2 ou FT2=FT1-FT3)' )
if ((FT1*XB1)-(FT1-FT3)*XB2)/FT3 <0:
print ('Attention le jeu de données ne correspond pas à une solution physique')
print ('XB3<0, il y a soit :')
print (' i) pas assez de B en entrée (essayez d augmenter XB1 ou FT1)' )
print (' ii) trop de B en sortie 2 (essayez de réduire XB2 ou FT2=FT1-FT3)' )
#Tracé des 4 paramètres fixés sur le flowsheet
def plot_flowsheet_data():
plt.text(xs-la-hla,ys+ly/2-5, r"$F_{T1}$"+'={}'.format(FT1), size=15)
plt.text(xs-la-hla,ys+ly/2-15, r"$x_{B1}$"+'={:.2f}'.format(XB1), size=15)
plt.text(xs+lx/2+5,ys-15, r"$x_{B2}$"+'={:.2f}'.format(XB2), size=15)
plt.text(xs+lx/2+5,ys+ly+20-5, r"$F_{T3}$"+'={}'.format(FT3), size=15)
def plot_flowsheet():
plot_flowsheet_sd()
plot_flowsheet_data()
plot_flowsheet()
plt.show()
Les blocs suivant permettent d'appliquer les différents bilans pour déterminer l'ensemble des inconnues. Vous pouvez donc exécuter les blocs successivement pour comprendre comment on arrive à déterminer l'ensemble des inconnues.
plot_flowsheet()
XA1=1-XB1
plt.text(xs-la-hla,ys+ly/2-10, r"$x_{A1}$"+'={:.2f}'.format(XA1), color='r',size=15)
plt.text(0,95, r"$x_{A1}+x_{B1}=1$", color='r',size=12)
plt.show()
plot_flowsheet()
XA1=1-XB1
plt.text(xs-la-hla,ys+ly/2-10, r"$x_{A1}$"+'={:.2f}'.format(XA1), color='r',size=15)
plt.text(0,95, r"$x_{A1}+x_{B1}=1$", color='r',size=12)
XA2=1-XB2
plt.text(xs+lx/2+5,ys-10, r"$x_{A2}$"+'={:.2f}'.format(XA2), color='b',size=15)
plt.text(0,90, r"$x_{A2}+x_{B2}=1$", color='b',size=12)
Text(0, 90, '$x_{A2}+x_{B2}=1$')
plot_flowsheet()
XA1=1-XB1
plt.text(xs-la-hla,ys+ly/2-10, r"$x_{A1}$"+'={:.2f}'.format(XA1), color='r',size=15)
plt.text(0,95, r"$x_{A1}+x_{B1}=1$", color='r',size=12)
XA2=1-XB2
plt.text(xs+lx/2+5,ys-10, r"$x_{A2}$"+'={:.2f}'.format(XA2), color='b',size=15)
plt.text(0,90, r"$x_{A2}+x_{B2}=1$", color='b',size=12)
FT2=FT1-FT3
plt.text(xs+lx/2+5,ys-5, r"$F_{T2}$"+'={}'.format(FT2), color='g',size=15)
plt.text(0,85, r"$F_{T1}=F_{T2}+F_{T3}$", color='g',size=12)
Text(0, 85, '$F_{T1}=F_{T2}+F_{T3}$')
plot_flowsheet()
XA1=1-XB1
plt.text(xs-la-hla,ys+ly/2-10, r"$x_{A1}$"+'={:.2f}'.format(XA1), color='r',size=15)
plt.text(0,95, r"$x_{A1}+x_{B1}=1$", color='r',size=12)
XA2=1-XB2
plt.text(xs+lx/2+5,ys-10, r"$x_{A2}$"+'={:.2f}'.format(XA2), color='b',size=15)
plt.text(0,90, r"$x_{A2}+x_{B2}=1$", color='b',size=12)
FT2=FT1-FT3
plt.text(xs+lx/2+5,ys-5, r"$F_{T2}$"+'={}'.format(FT2), color='g',size=15)
plt.text(0,85, r"$F_{T1}=F_{T2}+F_{T3}$", color='g',size=12)
XA3=(FT1*XA1-FT2*XA2)/FT3
plt.text(xs+lx/2+5,ys+ly+20-10, r"$x_{A3}$"+'={:.2f}'.format(XA3), color='c',size=15)
plt.text(0,80, r"$F_{T1}x_{A1}=F_{T2}x_{A2}+F_{T3}x_{A3}$", color='c',size=12)
Text(0, 80, '$F_{T1}x_{A1}=F_{T2}x_{A2}+F_{T3}x_{A3}$')
plot_flowsheet()
XA1=1-XB1
plt.text(xs-la-hla,ys+ly/2-10, r"$x_{A1}$"+'={:.2f}'.format(XA1), color='r',size=15)
plt.text(0,95, r"$x_{A1}+x_{B1}=1$", color='r',size=12)
XA2=1-XB2
plt.text(xs+lx/2+5,ys-10, r"$x_{A2}$"+'={:.2f}'.format(XA2), color='b',size=15)
plt.text(0,90, r"$x_{A2}+x_{B2}=1$", color='b',size=12)
FT2=FT1-FT3
plt.text(xs+lx/2+5,ys-5, r"$F_{T2}$"+'={}'.format(FT2), color='g',size=15)
plt.text(0,85, r"$F_{T1}=F_{T2}+F_{T3}$", color='g',size=12)
XA3=(FT1*XA1-FT2*XA2)/FT3
plt.text(xs+lx/2+5,ys+ly+20-10, r"$x_{A3}$"+'={:.2f}'.format(XA3), color='c',size=15)
plt.text(0,80, r"$F_{T1}x_{A1}=F_{T2}x_{A2}+F_{T3}x_{A3}$", color='c',size=12)
XB3=(FT1*XB1-FT2*XB2)/FT3
plt.text(xs+lx/2+5,ys+ly+20-15, r"$x_{B3}$"+'={:.2f}'.format(XB3), color='m',size=15)
plt.text(0,75, r"$F_{T1}x_{B1}=F_{T2}x_{B2}+F_{T3}x_{B3}$", color='m',size=12)
Text(0, 75, '$F_{T1}x_{B1}=F_{T2}x_{B2}+F_{T3}x_{B3}$')