El diagrama de trama de la red de intercambiadores del caso base se muestra en la figura . Se muestra el duty de cada cambiador, y las temperaturas en los extremos de cada unidad. Los datos de las corrientes se muestran en la tabla . Como los rangos de temperatura eran muy amplios, las corrientes se han dividido en tramos de capacidad calorífica constante.
Para realizar algunos de los cálculos vamos a auxiliarnos del entorno orientado a objetos PinchPython. En primer lugar, en el diseño de la nueva red de intercambiadores se eligió min ^oC. Con estos datos, podemos calcular los consumos óptimos del proceso, y compararlos con los consumos actuales. En el caso base, sin el horno adicional, se consumen MW de calefacción, y con el horno adicional MW. En cuanto a los consumos óptimos, los calcularemos con el siguiente programa:
#!/usr/bin/env python # -*- coding: iso-8859-1 -*- # Cálculo de los consumos óptimos de la unidad de destilación atmosférica from PinchPython import * # Función principal def Main(): # Tenemos 10 corrientes (pero divididas por tramos) c11 = Corriente() c12 = Corriente() c13 = Corriente() c14 = Corriente() c21 = Corriente() c22 = Corriente() c23 = Corriente() c24 = Corriente() c31 = Corriente() c32 = Corriente() c41 = Corriente() c42 = Corriente() c51 = Corriente() c52 = Corriente() c61 = Corriente() c62 = Corriente() c63 = Corriente() c64 = Corriente() c71 = Corriente() c72 = Corriente() c73 = Corriente() c81 = Corriente() c91 = Corriente() c92 = Corriente() c93 = Corriente() c94 = Corriente() c101 = Corriente() c102 = Corriente() c103 = Corriente() # Corriente 1 (por tramos) c11.setT0(349.) c11.setTf(243.) c11.setMCP(0.215) c12.setT0(243.) c12.setTf(213.) c12.setMCP(0.197) c13.setT0(213.) c13.setTf(167.) c13.setMCP(0.178) c14.setT0(167.) c14.setTf(90.) c14.setMCP(0.168) # Corriente 2 (por tramos) c21.setT0(341.) c21.setTf(210.) c21.setMCP(0.105) c22.setT0(210.) c22.setTf(172.) c22.setMCP(0.1) c23.setT0(172.) c23.setTf(111.) c23.setMCP(0.087) c24.setT0(111.) c24.setTf(65.) c24.setMCP(0.076) # Corriente 2 (por tramos) c31.setT0(268.) c31.setTf(135.) c31.setMCP(0.065) c32.setT0(135.) c32.setTf(38.) c32.setMCP(0.054) # Corriente 4 (por tramos) c41.setT0(251.) c41.setTf(169.) c41.setMCP(0.105) c42.setT0(169.) c42.setTf(77.) c42.setMCP(0.091) # Corriente 5 (por tramos) c51.setT0(235.) c51.setTf(127.) c51.setMCP(0.008) c52.setT0(127.) c52.setTf(38.) c52.setMCP(0.007) # Corriente 6 (por tramos) c61.setT0(168.) c61.setTf(136.) c61.setMCP(0.600) c62.setT0(136.) c62.setTf(118.) c62.setMCP(0.478) c63.setT0(118.) c63.setTf(108.) c63.setMCP(0.410) c64.setT0(108.) c64.setTf(71.) c64.setMCP(0.303) # Corriente 7 (por tramos) c71.setT0(136.) c71.setTf(118.) c71.setMCP(0.256) c72.setT0(118.) c72.setTf(108.) c72.setMCP(0.210) c73.setT0(108.) c73.setTf(71.) c73.setMCP(0.159) # Corriente 8 (sólo 1 tramo) c81.setT0(15.6) c81.setTf(121.) c81.setMCP(0.379) # Corriente 9 (por tramos) c91.setT0(120.) c91.setTf(122.) c91.setMCP(0.400) c92.setT0(122.) c92.setTf(163.) c92.setMCP(0.422) c93.setT0(163.) c93.setTf(186.) c93.setMCP(0.600) c94.setT0(186.) c94.setTf(194.) c94.setMCP(0.725) # Corriente 10 (por tramos) c101.setT0(189.) c101.setTf(237.) c101.setMCP(0.477) c102.setT0(237.) c102.setTf(265.) c102.setMCP(0.496) c103.setT0(265.) c103.setTf(368.) c103.setMCP(0.660) # La corriente ficticia nos permite tener acceso a todas las corrientes # que se hayan definido, y clasificarlas según su tipo (fría o caliente) corrientesFrias = corrienteFicticia.getListaDeCorrientesFrias() corrientesCalientes = corrienteFicticia.getListaDeCorrientesCalientes() # Creamos las curvas compuestas a partir de las corrientes curvaCompuestaFria = CurvaCompuesta(corrientesFrias) curvaCompuestaCaliente = CurvaCompuesta(corrientesCalientes) # Valor de ATMin ATMin = 20.0 # ºC # Creamos la tabla del problema, a partir de las curvas compuestas # y de ATMin tabla = TablaDelProblema(curvaCompuestaFria,curvaCompuestaCaliente,ATMin) # La tabla del problema nos proporciona esta información # Posición del punto pinch tPinch = tabla.getTemperaturaModificadaPinch() # Consumos óptimos del proceso qc = tabla.getQC() qh = tabla.getQH() # Presentación de los resultados print "T Pinch="+str(tPinch)+" ºC" print "QC ="+str(qc)+" MW" print "QH ="+str(qh)+" MW" if '__main__' == __name__: Main()
La primera línea del programa indica que el contenido del programa debe pasarse al programa python, que es el que se encargará de ejecutarlo. En la segunda línea indicamos la codificación de caracteres adecuada para el idioma español (aunque en este programa no hay ninguna salida que contenga caracteres con tildes, etc, es una buena idea incluirlo en todos nuestros programas). Todas las líneas que comienzan con son comentarios, y son ignorados durante la ejecución del programa. Se ponen simplemente para mejorar la legibilidad del programa. Por tanto las dos primeras líneas son ignoradas a la hora de ejecutar el contenido del programa. Sólo tienen sentido para el sistema operativo.
En la siguiente línea de código, se incluye todo el código de la biblioteca PinchPython, que es el entorno orientado a objetos para realizar el análisis pinch de procesos químicos.
La siguiente línea crea la función principal del programa. En Python no es imprescindible poner una función principal, se puede poner el código directamente, pero es una buena idea estructurar el programa por si en un futuro queremos ampliarlo.
Dentro de la función, primero se crean las corrientes, después las curvas compuestas, después la tabla del problema, y finalmente se obtienen los consumos óptimos. Como puede verse, siempre se manejan los mismos conceptos (curva compuesta, tabla del problema, corriente fría, etc) que en un análisis pinch convencional. Además, la complejidad del programa es mínima, por lo que este entorno orientado a objetos es realmente una herramienta muy útil.
Una vez creado el programa, le damos permisos de ejecución con la orden
chmod a+x revamping_uda
y después lo ejecutamos con
./revamping_uda
Los resultados son:
T Pinch=173.0 ºC QC =42.6154 MW QH =60.788 MW
Por tanto, si logramos diseñar una red de intercambiadores con el método pinch, el consumo de calefacción del proceso será un menor que el caso propuesto de añadir un horno.
2004-05-30