Está en la página 1de 14

!

Programa desarrolado en Fortran 95

!Por: Ing. Estuardo Javier Gan Rodriguez

!21 de Octubre de 2019

program equilibrio

!Nombre de constantes y variables de la ecuación de Peng-Robinson

character*18 ::metodo,comp,comp1,comp2

integer:: d,e,f,g,h,i,j,numcomp,n,iter,contador,s

real:: Pc,Tc,w,PM,Pc1,Tc1,w1,PM1,x1,Pc2,Tc2,w2,PM2,x2,P,T,Rg,m,alfa,ai,aj,bi,xi,xj,A,B,sumaA,sumaB,sumaPM,denliq

real:: psat1,psat2,A1,B1,C1,D1,E1,A2,B2,C2,D2,E2,y1,y2,yi,yj,yy,denvap,kij,k12

real:: k1,k2,fug,fugl,fugv,fugl1,fugl2,fugv1,fugv2,zliq,zvap,bi1,bi2,sumaU,sumaU1,sumaU2,yT,yT1,errabsY,errabsP

!Nombre de constantes y variables del método de Newton-Raphson

real:: z0,z1,fz,dfz,erel

!Nombre de constantes y variables del método de Tartaglia

integer:: k

doubleprecision:: signo,coefb,coefc,coefd,coefp,coefq,teta,R,y,z,z2,z3

print*,''

print*,'=================================================================='

print*,'Subrutina para el calculo del factor de compresibilidad y densidad'

print*,' de fluidos empleando la ecuacion de estado de Peng-Robinson'

print*,'=================================================================='

print*,''

print*,''

print*,''

! Definición de constantes

numcomp=2

metodo='mtartaglia' !Definición del método numérico (mnewton) o analítico (mtartaglia) a emplear

T=313.24 ! Temperatura en °K

!P=3.313 ! Presión inicial supuesta en MPa

comp1='dioxidodecarbono'

!x1=0.7843 ! Composición molar del compuesto

PM1=44.01 ! Peso molecular en kg/kgmol

w1=0.225 ! Factor acéntrico


Pc1=7.374 ! Presión crítica en MPa

Tc1=304.12 ! Temperatura crítica en °K

!Constantes de ecuación de Antoine extendida

A1=129.0270745

B1=-4735

C1=-21.268

D1=0.040909

E1=1

comp2='propanol'

!x2=1-x1 ! Composición molar del compuesto

PM2=60.096 ! Peso molecular en kg/kgmol

w2=0.629 ! Factor acéntrico

Pc2=5.175 ! Presión crítica en MPa

Tc2=536.78 ! Temperatura crítica en °K

!Constantes de ecuación de Antoine extendida

A2=82.61307454

B2=-8604.8

C2=-10.11

D2=0.0000031334

E2=2

k12=0.108 !Parámetro de interacción binario

Rg=0.008314472 ! Constante de gases m3·MPa/°K·kgmol

! Impresión de datos de composición y propiedades de cada compuesto

do f = 1, numcomp!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

if (f==1) then

comp=comp1

!x=x1

w=w1

Tc=Tc1

Pc=Pc1

PM=PM1
elseif (f==2) then

comp=comp2

!x=x2

w=w2

Tc=Tc2

Pc=Pc2

PM=PM2

end if

print *,'compuesto',f,'= ',comp

!print *,'composicion =',x

print *,'peso molecular =',PM,'kg/kgmol'

print *,'factor acentrico =',w

print *,'presion critica =',Pc,'MPa'

print *,'temperatura critica =',Tc,' k'

print *,''

print *,''

end do!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

!Bucle para actualización de datos de composición experimentales de la fase líquida

do s = 1, 9 !xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

if (s==1) x1=0.202

if (s==2) x1=0.2572

if (s==3) x1=0.3141

if (s==4) x1=0.4054

if (s==5) x1=0.4405

if (s==6) x1=0.5256

if (s==7) x1=0.5773

if (s==8) x1=0.6774

if (s==9) x1=0.7843

x2=1-x1 ! Nota: únicamente para mezclas binarias x2=1-x1

print *,''

print *,''

! Impresión de título de cada tabulado


print *,' TABULADO DE CALCULO DE DENSIDAD A: ', T, 'K y x:',x1

print *,''

print *,' Presion[=]MPa Zliquido Zvapor Dliq[=]kg/m3 Dvap[=]kg/m3 sumaY'

print *,' -------------------------------------------------------------------------------'

! Ecuación de Antoine extendida para cálculo de Presión de saturación expresada en MPa

psat1=exp(A1+B1/T+C1*LOG(T)+D1*T**E1)*0.1

psat2=exp(A2+B2/T+C2*LOG(T)+D2*T**E2)*0.1

! Regla de presiones parciales para estimación de la Presión Total (del sistema) expresada en MPa

P=x1*psat1+x2*psat2

! Ley de Raoult para cálculo estimativo de constantes de equilibrio

k1=psat1/P

k2=psat2/P

! Cálculo estimativo de las fracciones molares de la fase vapor

y1=k1*x1

y2=k2*x2

yT=y1+y2 !sumatoria total inicial de las fracciones mol de la fase vapor

iter=0 ! Asignación inicial del número de iteraciones igual a O

contador=0 ! Asginación inicial del contador de cambio de presión

errabsP=1 ! Asignación de valor aleatorio del error absoluto mayor a 0.0001

! Bucle para lograr un valor fjo de la presión

do while (errabsP>0.0001)!¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡

errabsY=1 ! Asignación de valor aleatorio del error absoluto que deba ser mayor a 0.00001

! Bucle para lograr un valor fjo de la sumatoria de las fracciones mol de la fase vapor a una misma presión

do while (errabsY>0.00001) !
*******************************************************************************

!Bucle de repetición para cálculo del factor de compresibilidad de la fase líquida y vapor

do h = 1, 2 !========================================================================================

! ECUACIONES CORRESPONDIENTES A LA ECUACIÓN DE ESTADO DE PENG-ROBINSON

sumaA=0 !valor inicial de la sumatoria correspondiente a A

sumaB=0 !valor inicial de la sumatoria correspondiente a B

sumaPM=0 !valor inicial de la sumatoria correspondiente a PM

!Bucle de repetición de la sumatoria con respecto al compuesto 'i'


do i = 1, numcomp!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

if (i==1) then

w=w1

Tc=Tc1

Pc=Pc1

PM=PM1

if (h==1) xi=x1

if (h==2) yi=y1

elseif (i==2) then

w=w2

Tc=Tc2

Pc=Pc2

PM=PM2

if (h==1) xi=x2

if (h==2) yi=y2

end if

m=0.37464+1.54226*w-0.26992*w**2

alfa=(1+m*(1-(T/Tc)**0.5))**2

ai=0.45724*alfa*(P/Pc)/(T/Tc)**2

bi=0.0778*(P/Pc)/(T/Tc)

!Grabación de los parámetros "bi" para su posterior empleo en el cálculo de los coeficientes de fugacidad

if (i==1) bi1=bi

if (i==2) bi2=bi

if (h==1) sumaB=sumaB+xi*bi !Expresión de la sumatoria correspondiente al término B en fase liquida

if (h==2) sumaB=sumaB+yi*bi !Expresión de la sumatoria correspondiente al término B en fase vapor

if (h==1) sumaPM=sumaPM+xi*PM !Expresión del promedio de los pesos moleculares de la fase liquida

if (h==2) sumaPM=sumaPM+yi*PM !Expresión del promedio de los pesos moleculares de la fase vapor

sumaU=0 !valor inicial de la sumatoria correspondiente a la sumatoria sumaU

!Bucle de repetición de la sumatoria con respecto al compuesto 'j'


do j = 1, numcomp!&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

if (j==1) then

w=w1

Tc=Tc1

Pc=Pc1

if (h==1) xj=x1

if (h==2) yj=y1

elseif (j==2) then

w=w2

Tc=Tc2

Pc=Pc2

if (h==1) xj=x2

if (h==2) yj=y2

end if

m=0.37464+1.54226*w-0.26992*w**2

alfa=(1+m*(1-(T/Tc)**0.5))**2

aj=0.45724*alfa*(P/Pc)/(T/Tc)**2

if (i==j) kij=0

if ((i==1 .and. j==2) .or. (i==2 .and. j==1)) kij=k12

if (h==1) sumaA=sumaA+xi*xj*sqrt(ai*aj)*(1-kij)! Sumatoria correspondiente al término A en fase liquida

if (h==2) sumaA=sumaA+yi*yj*sqrt(ai*aj)*(1-kij)! Sumatoria correspondiente al término A en fase vapor

if (h==1) sumaU=sumaU+xj*sqrt(ai*aj)*(1-kij)

if (h==2) sumaU=sumaU+yj*sqrt(ai*aj)*(1-kij)

end do!&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

!Grabación de parámetros sumaU para su posterior empleo en el cálculo de los coeficientes de fugacidad

if (i==1) sumaU1=sumaU

if (i==2) sumaU2=sumaU

end do!::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

A=sumaA !A es igual a la sumatoria de los términos en 'i' y 'j'


B=sumaB !B es igual a la sumatoria de los términos en 'i'

PM=sumaPM !PM es igual a la sumatoria de los términos en 'i'

!Valores correspondientes a los coeficientes de la ecuación cúbica de z:(z3+b*z2+c*z+d=0)

coefb=B-1

coefc=A-3*B**2-2*B

coefd=B**3+B**2-A*B

!Cálculo del factor de compresibilidad según el método seleccionado (Newton-Raphson o Tartaglia)

if (metodo=='mnewton') then!:X

! Ciclo de iteración para cálculo del factor de compresibilidad por el Método de Newton-Raphson

z=0.5 ! Valor inicial supuesto del factor de compresibilidad z para método de Newton

erel=1 ! Asignación de valor del error relativo mayor a 0.001

do while (erel>0.001) !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

fz=z**3+(B-1)*z**2+(A-3*B**2-2*B)*z+(B**3+B**2-A*B); ! Función del factor z a igualar a un valor de 0

dfz=3*z**2+(B-1)*2*z+(A-3*B**2-2*B); ! Derivada de la función del factor z

z1=z-fz/dfz; ! Cálculo del nuevo valor del factor z

erel=abs(z1-z)/z1; ! Error relativo del factor z calculado

z=z1; ! Suposición del nuevo valor inicial del factor z

end do!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

elseif (metodo=='mtartaglia') then

!MÉTODO DE TARTAGLIA PARA LA DETERMINACIÓN ANALÍTICA DE LAS RAICES DE LA ECUACIÓN CÚBICA

coefp=(1/3.0)*(3*coefc-coefb**2)

coefq=(1/27.0)*(27*coefd-9*coefb*coefc+2*coefb**3)

teta=acos(sqrt(coefq**2/4.0/(-coefp**3/27.0))) !valor de teta expresado en radianes

R=coefp**3/27.0+coefq**2/4.0 !El valor de R es conocido como el discriminante


!Cuando el discriminante R es mayor o igual a 0 hay solo 1 raiz real

if (R>=0) then!:)

!La raiz cúbica de un número negativo da error en Fortran, por lo cual en caso de que

!dicho número sea negativo, se toma su valor absoluto, y una vez calculada la raiz cúbica

!se multiplica por -1

signo=1

if ((-(coefq*0.5)-sqrt(R))<0) signo=-1

y=(-(coefq*0.5)+sqrt(R))**(dble(1.0)/dble(3.0))+signo*((abs(-(coefq*0.5)-sqrt(R)))**(dble(1.0)/dble(3.0)))

z=y-coefb/3.0

!Cuando el discriminante R es menor a 0 hay 3 raices reales diferentes

elseif (R<0) then

if (coefq>0) signo=-1

if (coefq<0) signo=1

!Bucle de cambio del valor de 'k' desde un valor de 0 hasta un valor de 2

do k=0, 2!---------------------------------------------------------------------------------------------

!El valor de 120 es convertido a radianes al multiplicarlo por pi/180

y=signo*2*sqrt(-coefp/3.0)*cos(teta/3.0+120*k*(3.141592654/180))

z=y-coefb/3.0

if (k==0) z1=z

if (k==1) z2=z

if (k==2) z3=z

end do!------------------------------------------------------------------------------------------------

if (h==1) z=min(z1,z2,z3) !El valor mínimo de las 3 raices obtenidas corresponde al factor z del líquido

if (h==2) z=max(z1,z2,z3) !El valor máximo de las 3 raices obtenidas corresponde al factor z del vapor

end if!:)

end if!:X

if (h==1) then

zliq=z ! traspaso de factor de compresibilidad de la fase líquida

denliq=PM*P/(Rg*zliq*T) ! Cálculo de la densidad másica de la fase líquida en kg/m3


elseif (h==2) then

zvap=z ! traspaso de factor de compresibilidad de la fase vapor

denvap=PM*P/(Rg*z*T) ! Cálculo de la densidad másica de la fase líquida en kg/m3

end if

! Bucle para cálculo del coeficiente de fugacidad de la fase líquida y vapor

do e = 1, numcomp!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++

if (e==1) then

bi=bi1

sumaU=sumaU1

elseif (e==2) then

bi=bi2

sumaU=sumaU2

end if

!cálculo del coeficiente de fugacidad parcial del compuesto i en la mezcla

fug=exp((z-1)*bi/B-log(z-B)-A/(2.828*B)*(2*sumaU/A-bi/B)*log((z+2.414*B)/(z-0.414*B)))

!traspaso de fugacidades correspondientes a la fase líquida

if (h==1) then

if (e==1) fugl1=fug

if (e==2) fugl2=fug

!traspaso de fugacidades correspondientes a la fase vapor

elseif (h==2) then

if (e==1) fugv1=fug

if (e==2) fugv2=fug

end if

end do!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++

end do!===========================================================================================

yT1=0 ! valor inicial de la sumatoria total correspondiente a la sumatoria de fracciones mol de fase vapor

! Bucle para cálculo de las fracciones molares actualizadas de la fase vapor

do d = 1, numcomp!;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
if (d==1) then

x=x1

fugl=fugl1

fugv=fugv1

elseif (d==2) then

x=x2

fugl=fugl2

fugv=fugv2

end if

yi=x*fugl/fugv

yT1=yT1+yi

if (d==1) y1=yi

if (d==2) y2=yi

end do!;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

!Normalización de las composiciones molares actualizadas de la fase vapor

y1=y1/yT1

y2=y2/yT1

errabsY=abs(yT1-yT) ! Cálculo del error absoluto de la sumatoria total de las fracciones mol de fase vapor

yT=yT1 ! Reasignación de la actual sumatoria total calculada hacia la anterior

end do!*******************************************************************************************

iter=iter+1 !número de iteraciones totales

!print "(7f14.4)",P,zliq,zvap,denliq,denvap,yT ! Impresión de resultados

if (iter==1) then

if (yT>1) yy=yT*2

if (yT<1) yy=yT/2

end if

! Actualización del contador en caso de cumplirse la condición dada

if (((yT>1) .AND. (yy<1)) .or. ((yT<1) .AND. (yy>1))) contador=contador+1

Pant=P

! Incrementos o decrementos a la Presión según se vaya requiriendo

if (contador==0) then

if (yT>1) P=P+0.5
if (yT<1) P=P-0.5

elseif (contador==1) then

if (yT>1) P=P+0.1

if (yT<1) P=P-0.1

elseif (contador==2) then

if (yT>1) P=P+0.05

if (yT<1) P=P-0.05

elseif (contador==3) then

if (yT>1) P=P+0.01

if (yT<1) P=P-0.01

elseif (contador==4) then

if (yT>1) P=P+0.005

if (yT<1) P=P-0.005

elseif (contador==5) then

if (yT>1) P=P+0.001

if (yT<1) P=P-0.001

elseif (contador==6) then

if (yT>1) P=P+0.0005

if (yT<1) P=P-0.0005

end if

yy=yT ! Grabación de la sumatoria total de fracción mol

errabsP=abs(1-yT)

end do!¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡

print "(7f14.4)",P,zliq,zvap,denliq,denvap,yT ! Impresión de resultados

print *,' -------------------------------------------------------------------------------'

!print *,''

!print *,'N° de iteraciones realizadas: ',iter

end do!xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

end program equilibrio

También podría gustarte