0% found this document useful (0 votes)
297 views12 pages

Peng-Robinson Fortran Program

This Fortran program calculates the saturation pressure of a pure fluid using the Peng-Robinson equation of state. It contains subroutines to calculate the vapor and liquid volumes. The program inputs the fluid properties, calculates fugacities for each phase, and iterates to find the pressure where the fugacities are equal within a specified tolerance, representing the saturation pressure.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
297 views12 pages

Peng-Robinson Fortran Program

This Fortran program calculates the saturation pressure of a pure fluid using the Peng-Robinson equation of state. It contains subroutines to calculate the vapor and liquid volumes. The program inputs the fluid properties, calculates fugacities for each phase, and iterates to find the pressure where the fugacities are equal within a specified tolerance, representing the saturation pressure.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 12

2.

Listing Program Fortran 77 untuk Peng-Robinson cairan murni

c =======================================================================
c || Program Untuk Menghitung Tekanan Uap Jenuh dengan ||
c || Persamaan Keadaan PR ||
c =======================================================================

program psatpr
implicit none
real*16 T,P,Tc,Pc,eps,a,b,R,zv,zl,rlnphiv,phil,phiv,TEMP,alfa
real*16 vv,vl,vlfin,vvfin,Mr,rlnphil,fl,fv,pnew,TR,w,ASTAR,BSTAR
parameter (R = 8.314)
integer flag,iter,maxiter,itnum,prflag

C ***********************************************************************
c INPUT SIFAT-SIFAT ZAT YANG DIGUNAKAN

write(*,*)'Program Tekanan Uap dengan EOS Peng-Robinson'


write(*,*)
write(*,*)'Masukkan nilai awal:'
write(*,*)'T (Kelvin) = '
read(*,*)T
write(*,*)'Masukkan data karakteristik zat:'
write(*,*)'Mr = '
read(*,*)Mr
write(*,*)'Nilai Tc zat (Kelvin) = '
read(*,*)Tc
write(*,*)'Nilai Pc zat (Pa) = '
read(*,*)Pc
write(*,*)'Faktor aksentrik = '
read(*,*)w
write(*,*)'Iterasi maksimum = '
read(*,*)maxiter
write(*,*)'Epsilon = '
read(*,*)eps
write(*,*)
P = 8000000
C ***********************************************************************
C PROGRAM UTAMA
C ***********************************************************************

TR=T/TC
alfa=(1+((0.37464+(1.54226*w)-(0.26992*w*w))*(1-(TR**0.5))))**2
A=0.45724*R*R*TC*TC*alfa/PC
B=0.07779*R*TC/PC

iter = 0
flag = 0
vv = R*T/P

C ***********************************************************************
C MEMANGGIL SUBROUTINE VAP

CALL VAP(vv,vvfin,A,B,R,T,P,mr,iter,maxiter,flag,alfa)

iter = 0
flag = 0

vl = 1.1*B

C ***********************************************************************
C MEMANGGIL SUBROUTINE LIQ

CALL LIQ(vl,vlfin,A,B,R,T,P,mr,iter,maxiter,flag,alfa)

C ***********************************************************************
C MENGHITUNG FUGASITAS FASA UAP

zv=p*vvfin*0.001*mr/(r*t)
ASTAR=(A*P)/(R*T*R*T)
BSTAR=(B*P)/(R*T)
TEMP=ASTAR*ALOG((ZV+2.4142*BSTAR)/(ZV-0.4142*BSTAR))
*/(2.8284*BSTAR)
RLNPHIV=(ZV-1)-ALOG(ZV-BSTAR)-TEMP
PHIv=EXP(RLNPHIv)
fv=phiv*P

C ***********************************************************************
C MENGHITUNG FUGASITAS FASA CAIR

zl=p*vlfin*0.001*mr/(r*t)
ASTAR=(A*P)/(R*T*R*T)
BSTAR=(B*P)/(R*T)
TEMP=ASTAR*ALOG((ZL+2.4142*BSTAR)/(ZL-0.4142*BSTAR))
*/(2.8284*BSTAR)
RLNPHIL=(ZL-1)-ALOG(ZL-BSTAR)-TEMP
PHIl=EXP(RLNPHIl)
fl=phil*P

write(*,*)'phi liq = ',phil


write(*,*)'phi vap = ',phiv
write(*,*)'f liq (Pa) = ',fl
write(*,*)'f vap (Pa) = ',fv
write(*,*)'P (Pa) = ',p
write(*,*)
itnum=0
prflag = 0
do while(prflag .eq. 0)
pnew = p*fl/fv
if (abs(fl-fv) .LE. eps) then
prflag = 1
elseif (itnum .GT. maxiter) then
prflag = 2
else
itnum = itnum + 1
p=pnew
endif

iter = 0
flag = 0
vv = R*T/P

C ***********************************************************************
C MEMANGGIL SUBROUTINE VAP

CALL VAP(vv,vvfin,A,B,R,T,P,Mr,iter,maxiter,flag,alfa)

iter = 0
flag = 0
vl = 1.1*B

C ***********************************************************************
C MEMANGGIL SUBROUTINE LIQ

CALL LIQ(vl,vlfin,A,B,R,T,P,Mr,iter,maxiter,flag,alfa)

C ***********************************************************************
C MENGHITUNG FUGASITAS FASA UAP

zv=p*vvfin*0.001*mr/(r*t)
ASTAR=(A*P)/(R*T*R*T)
BSTAR=(B*P)/(R*T)
TEMP=ASTAR*ALOG((ZV+2.4142*BSTAR)/(ZV-0.4142*BSTAR))
*/(2.8284*BSTAR)
RLNPHIV=(ZV-1)-ALOG(ZV-BSTAR)-TEMP
PHIv=EXP(RLNPHIv)
fv=phiv*P

C ***********************************************************************
C MENGHITUNG FUGASITAS FASA CAIR

zl=p*vlfin*0.001*mr/(r*t)
ASTAR=(A*P)/(R*T*R*T)
BSTAR=(B*P)/(R*T)
TEMP=ASTAR*ALOG((ZL+2.4142*BSTAR)/(ZL-0.4142*BSTAR))
*/(2.8284*BSTAR)
RLNPHIL=(ZL-1)-ALOG(ZL-BSTAR)-TEMP
PHIl=EXP(RLNPHIl)
fl=phil*P

write(*,*)'phi liq = ',phil


write(*,*)'phi vap = ',phiv
write(*,*)'f liq (Pa) = ',fl
write(*,*)'f vap (Pa) = ',fv
write(*,*)'P (Pa) = ',p
write(*,*)
enddo

write(*,*)'Psat (Pa) = ',P


write(*,*)'prflag = ', prflag
write(*,*)'Jumlah iterasi = ',itnum

stop
end program psatpr

C ***********************************************************************
C AKHIR DARI PROGRAM UTAMA
C ***********************************************************************

C ***************************************************************************
C SUBROUTINE UNTUK MENDAPATKAN VOLUME UAP DARI PERSAMAAN KUBIK
C ***************************************************************************

SUBROUTINE VAP(vv,vvfin,A,B,R,T,P,mr,itnum,itmax,prflag,alfa)

real*16 vv,vvnew,vvfin,A,B,R,T,P,mr,alfa
integer prflag,itnum,itmax

itnum = 0
prflag = 0
do while(prflag .EQ. 0)
vvnew = (R*T/P) + B - ((A*alfa*(vv-B))/((P*vv*(vv+b))+
*(P*B*(vv-b)))
if (abs(vvnew - vv) .LE. 0.00000000001) then
prflag = 1
elseif (itnum .GT. itmax) then
prflag = 2
else
itnum = itnum + 1
vv = vvnew
endif

vvfin = vvnew/(Mr*0.001)

enddo

return
end

C ***************************************************************************
C SUBROUTINE UNTUK MENDAPATKAN VOLUME CAIRAN DARI PERSAMAAN KUBIK
C ***************************************************************************

SUBROUTINE LIQ(vl,vlfin,A,B,R,T,P,mr,itnum,itmax,prflag,alfa)

real*16 vl,vlnew,vlfin,A,B,R,T,P,mr,alfa
integer prflag,itnum,itmax

itnum = 0
prflag = 0
do while(prflag .EQ. 0)
vlnew = ((P*vl*((vl*vl)-(B*B)))+(P*B*((Vl-b)**2))-
*(R*T*Vl*(vl+b))-(A*alfa*b)+(R*T*B*B))/((R*T*B)-(A*alfa))
if (abs(vlnew - vl) .LE. 0.00000000001) then
prflag = 1
elseif (itnum .GT. itmax) then
prflag = 2
else
itnum = itnum + 1
vl = vlnew
endif
enddo

vlfin = vlnew/(Mr*0.001)

return
end

7. Peng-Robinson EOS for mixture


a. Mencari bubble point

Input
A,B,C,Z,P,T

NO

YES

OutputTnew

b. Koefisien fugasitas
liquid:

Vapor:
c. Listing program fortran untuk EOS Peng-Robinson Binary mixture

c
==================================================================
=====
c || Program Untuk Menghitung Tekanan Uap Jenuh dengan ||
c || Persamaan Keadaan PR ||
c
==================================================================
=====

program psatpr
implicit none
real*16 T,P,Tc,Pc,eps,a,b,R,zv,zl,rlnphiv,phil,phiv,TEMP,alfa
real*16 vv,vl,vlfin,vvfin,Mr,rlnphil,fl,fv,pnew,TR,w,ASTAR,BSTAR
parameter (R = 8.314)
integer flag,iter,maxiter,itnum,prflag

C
******************************************************************
*****
c INPUT SIFAT-SIFAT ZAT YANG DIGUNAKAN

write(*,*)'Program Tekanan Uap dengan EOS Peng-Robinson'


write(*,*)
write(*,*)'Masukkan nilai awal:'
write(*,*)'T (Kelvin) = '
read(*,*)T
write(*,*)'Masukkan data karakteristik zat:'
write(*,*)'Mr = '
read(*,*)Mr
write(*,*)'Nilai Tc zat (Kelvin) = '
read(*,*)Tc
write(*,*)'Nilai Pc zat (Pa) = '
read(*,*)Pc
write(*,*)'Faktor aksentrik = '
read(*,*)w
write(*,*)'Iterasi maksimum = '
read(*,*)maxiter
write(*,*)'Epsilon = '
read(*,*)eps
write(*,*)
P = 8000000
C
******************************************************************
*****
C PROGRAM UTAMA
C
******************************************************************
*****

TR=T/TC
alfa=(1+((0.37464+(1.54226*w)-(0.26992*w*w))*(1-(TR**0.5))))**2
A=0.45724*R*R*TC*TC*alfa/PC
B=0.07779*R*TC/PC

iter = 0
flag = 0

vv = R*T/P

C
******************************************************************
*****
C MEMANGGIL SUBROUTINE VAP

CALL VAP(vv,vvfin,A,B,R,T,P,mr,iter,maxiter,flag,alfa)

iter = 0
flag = 0

vl = 1.1*B

C
******************************************************************
*****
C MEMANGGIL SUBROUTINE LIQ

CALL LIQ(vl,vlfin,A,B,R,T,P,mr,iter,maxiter,flag,alfa)

C
******************************************************************
*****
C MENGHITUNG FUGASITAS FASA UAP

zv=p*vvfin*0.001*mr/(r*t)
ASTAR=(A*P)/(R*T*R*T)
BSTAR=(B*P)/(R*T)
TEMP=ASTAR*ALOG((ZV+2.4142*BSTAR)/(ZV-0.4142*BSTAR))
*/(2.8284*BSTAR)
RLNPHIV=(ZV-1)-ALOG(ZV-BSTAR)-TEMP
PHIv=EXP(RLNPHIv)
fv=phiv*P

C
******************************************************************
*****
C MENGHITUNG FUGASITAS FASA CAIR

zl=p*vlfin*0.001*mr/(r*t)
ASTAR=(A*P)/(R*T*R*T)
BSTAR=(B*P)/(R*T)
TEMP=ASTAR*ALOG((ZL+2.4142*BSTAR)/(ZL-0.4142*BSTAR))
*/(2.8284*BSTAR)
RLNPHIL=(ZL-1)-ALOG(ZL-BSTAR)-TEMP
PHIl=EXP(RLNPHIl)
fl=phil*P

write(*,*)'phi liq = ',phil


write(*,*)'phi vap = ',phiv
write(*,*)'f liq (Pa) = ',fl
write(*,*)'f vap (Pa) = ',fv
write(*,*)'P (Pa) = ',p
write(*,*)
itnum=0
prflag = 0
do while(prflag .eq. 0)
pnew = p*fl/fv
if (abs(fl-fv) .LE. eps) then
prflag = 1
elseif (itnum .GT. maxiter) then
prflag = 2
else
itnum = itnum + 1
p=pnew
endif

iter = 0
flag = 0
vv = R*T/P

C
******************************************************************
*****
C MEMANGGIL SUBROUTINE VAP

CALL VAP(vv,vvfin,A,B,R,T,P,Mr,iter,maxiter,flag,alfa)

iter = 0
flag = 0
vl = 1.1*B

C
******************************************************************
*****
C MEMANGGIL SUBROUTINE LIQ

CALL LIQ(vl,vlfin,A,B,R,T,P,Mr,iter,maxiter,flag,alfa)

C
******************************************************************
*****
C MENGHITUNG FUGASITAS FASA UAP

zv=p*vvfin*0.001*mr/(r*t)
ASTAR=(A*P)/(R*T*R*T)
BSTAR=(B*P)/(R*T)
TEMP=ASTAR*ALOG((ZV+2.4142*BSTAR)/(ZV-0.4142*BSTAR))
*/(2.8284*BSTAR)
RLNPHIV=(ZV-1)-ALOG(ZV-BSTAR)-TEMP
PHIv=EXP(RLNPHIv)
fv=phiv*P

C
******************************************************************
*****
C MENGHITUNG FUGASITAS FASA CAIR

zl=p*vlfin*0.001*mr/(r*t)
ASTAR=(A*P)/(R*T*R*T)
BSTAR=(B*P)/(R*T)
TEMP=ASTAR*ALOG((ZL+2.4142*BSTAR)/(ZL-0.4142*BSTAR))
*/(2.8284*BSTAR)
RLNPHIL=(ZL-1)-ALOG(ZL-BSTAR)-TEMP
PHIl=EXP(RLNPHIl)
fl=phil*P

write(*,*)'phi liq = ',phil


write(*,*)'phi vap = ',phiv
write(*,*)'f liq (Pa) = ',fl
write(*,*)'f vap (Pa) = ',fv
write(*,*)'P (Pa) = ',p
write(*,*)
enddo

write(*,*)'Psat (Pa) = ',P


write(*,*)'prflag = ', prflag
write(*,*)'Jumlah iterasi = ',itnum

stop
end program psatpr
C
******************************************************************
*****
C AKHIR DARI PROGRAM UTAMA
C
******************************************************************
*****

C
******************************************************************
*********
C SUBROUTINE UNTUK MENDAPATKAN VOLUME UAP DARI PERSAMAAN KUBIK
C
******************************************************************
*********

SUBROUTINE VAP(vv,vvfin,A,B,R,T,P,mr,itnum,itmax,prflag,alfa)

real*16 vv,vvnew,vvfin,A,B,R,T,P,mr,alfa
integer prflag,itnum,itmax

itnum = 0
prflag = 0
do while(prflag .EQ. 0)
vvnew = (R*T/P) + B - ((A*alfa*(vv-B))/((P*vv*(vv+b))+
*(P*B*(vv-b)))
if (abs(vvnew - vv) .LE. 0.00000000001) then
prflag = 1
elseif (itnum .GT. itmax) then
prflag = 2
else
itnum = itnum + 1
vv = vvnew
endif

vvfin = vvnew/(Mr*0.001)

enddo

return
end

C
******************************************************************
*********
C SUBROUTINE UNTUK MENDAPATKAN VOLUME CAIRAN DARI PERSAMAAN
KUBIK
C
******************************************************************
*********

SUBROUTINE LIQ(vl,vlfin,A,B,R,T,P,mr,itnum,itmax,prflag,alfa)

real*16 vl,vlnew,vlfin,A,B,R,T,P,mr,alfa
integer prflag,itnum,itmax

itnum = 0
prflag = 0
do while(prflag .EQ. 0)
vlnew = ((P*vl*((vl*vl)-(B*B)))+(P*B*((Vl-b)**2))-
*(R*T*Vl*(vl+b))-(A*alfa*b)+(R*T*B*B))/((R*T*B)-(A*alfa))
if (abs(vlnew - vl) .LE. 0.00000000001) then
prflag = 1
elseif (itnum .GT. itmax) then
prflag = 2
else
itnum = itnum + 1
vl = vlnew
endif
enddo

vlfin = vlnew/(Mr*0.001)

return
end

You might also like