Documentos de Académico
Documentos de Profesional
Documentos de Cultura
program equilibrio
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
real:: z0,z1,fz,dfz,erel
integer:: k
doubleprecision:: signo,coefb,coefc,coefd,coefp,coefq,teta,R,y,z,z2,z3
print*,''
print*,'=================================================================='
print*,'=================================================================='
print*,''
print*,''
print*,''
! Definición de constantes
numcomp=2
T=313.24 ! Temperatura en °K
comp1='dioxidodecarbono'
A1=129.0270745
B1=-4735
C1=-21.268
D1=0.040909
E1=1
comp2='propanol'
A2=82.61307454
B2=-8604.8
C2=-10.11
D2=0.0000031334
E2=2
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 *,''
print *,''
end do!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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
print *,''
print *,''
print *,''
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
k1=psat1/P
k2=psat2/P
y1=k1*x1
y2=k2*x2
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 !========================================================================================
if (i==1) then
w=w1
Tc=Tc1
Pc=Pc1
PM=PM1
if (h==1) xi=x1
if (h==2) yi=y1
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) 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
if (j==1) then
w=w1
Tc=Tc1
Pc=Pc1
if (h==1) xj=x1
if (h==2) yj=y1
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 (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!::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
coefb=B-1
coefc=A-3*B**2-2*B
coefd=B**3+B**2-A*B
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
end do!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
coefp=(1/3.0)*(3*coefc-coefb**2)
coefq=(1/27.0)*(27*coefd-9*coefb*coefc+2*coefb**3)
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
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
if (coefq>0) signo=-1
if (coefq<0) signo=1
do k=0, 2!---------------------------------------------------------------------------------------------
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
end if
do e = 1, numcomp!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++
if (e==1) then
bi=bi1
sumaU=sumaU1
bi=bi2
sumaU=sumaU2
end if
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)))
if (h==1) then
if (e==1) fugl1=fug
if (e==2) fugl2=fug
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
do d = 1, numcomp!;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
if (d==1) then
x=x1
fugl=fugl1
fugv=fugv1
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!;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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
end do!*******************************************************************************************
if (iter==1) then
if (yT>1) yy=yT*2
if (yT<1) yy=yT/2
end if
Pant=P
if (contador==0) then
if (yT>1) P=P+0.5
if (yT<1) P=P-0.5
if (yT>1) P=P+0.1
if (yT<1) P=P-0.1
if (yT>1) P=P+0.05
if (yT<1) P=P-0.05
if (yT>1) P=P+0.01
if (yT<1) P=P-0.01
if (yT>1) P=P+0.005
if (yT<1) P=P-0.005
if (yT>1) P=P+0.001
if (yT<1) P=P-0.001
if (yT>1) P=P+0.0005
if (yT<1) P=P-0.0005
end if
errabsP=abs(1-yT)
end do!¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
!print *,''
end do!xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx