This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
USE NUMERICAL_LIBRARIES IMPLICIT NONE C DECLARATION OF VARIABLES INTEGER NN, NP, IDO, NOUT PARAMETER (NN=18, NP=100) EXTERNAL FCN REAL ADUM, A, Y(NN),TOL, PARAM(50) C ADUM = MEMBRANE AREA, A = TOTAL MEMBRANE AREA OF MODULE C Y(1) = F1 = FEED-SIDE MOLAR FLOW RATE OF COMPONENT 1 C Y(2) = F = TOTAL FEED-SIDE MOLAR FLOW RATE OPEN (UNIT = 1, FILE = 'OUTCF.TXT') A = 100.0 C VALUES OF PARAMETERS RELATED TO THE NUMERICAL METHOD IDO = 1 TOL = 0.5 PARAM(4) = 50000 C INITIAL VALUES ADUM = 0.0 Y(1) = 0.1 Y(2) = 10.0 Y(3) = Y(2) Y(4) = 0.3 Y(5) = 0.4 Y(6) = 0.00025 Y(7) = 1.27E-7 Y(8) = 1.70E-7 Y(9) = 4.816 Y(10) = 23.0 Y(11) = 0.0011 Y(12) = 9.06E-4 Y(13) = 55.56 Y(14) = 9.96E-10 Y(15) = 0.57 Y(16) = 0.46 Y(17) = 0.33 Y(18) = 0.0 CALL IVPRK (IDO, NN, FCN, ADUM, A, TOL, PARAM, Y) WRITE (1,100) 100 FORMAT (2X, 'AREA', 9X, 'Y1', 11X, 'Y2') WRITE (1,'(3F12.3)') ADUM, Y(1), Y(2) END
178
Mitesh
Text Box
APPENDIX C FORTRAN PROGRAMS FOR VARIOUS FLOW CONFIGURATIONS 1. Crossflow
SUBROUTINE FCN(NN, ADUM, Y, YPRIME) REAL Y(18), YPRIME(18), ADUM C Y(1) = F1 = FEED-SIDE MOLAR FLOW RATE OF COMPONENT 1 C Y(2) = F = TOTAL FEED-SIDE MOLAR FLOW RATE INTEGER NN,I REAL L, P1, P2, H1, H2 C L = MEMBRANE THICKNESS, P1 = PERMEABILITY OF COMPONENT 1, C P2 = PERMEABILITY OF COMPONENT 2, C H1, H2 ARE REFERRED TO AS HENRY'S CONSTANTS REAL FINIT,UINIT,D, DH, LTH, MU, ROL, A1, B1,C1,D1,A11 C FINIT = TOTAL FEED-SIDE MOLAR FLOW RATE AT ENTRANCE C UINIT = FEED-SIDE VELOCITY AT ENTRANCE C D = DIFFUSIVITY OF COMPONENT 1 IN COMPONENT2 C DH = HYDRAULIC DIAMETER ON THE FEED-SIDE C LTH = LENGTH OF MEMBRANE MODULE C MU = VISCOSITY OF THE SOLUTION C ROL = DENSITY OF THE SOLUTION C A1,B1,C1,D1,A11 ARE COEFFICENTS FOR THE MASS TRANSFER CORRELATION REAL U, KBL1, X1, B, C, Z, Y1 C U = FEED-SIDE VELOCITY C KBL1 = BOUNDARY LAYER MASS TRANSFER COEFFICIENT C X1 = FEED-SIDE MOLE FRACTION C Y1 = PERMEATE SIDE MOLE FRACTION C B,C = COEFFICIENTS FOR THE QUADRATIC EQUATION OBTAINED FOR CROSS C FLOW C Z = DUMMY VARIABLE REAL PPERM, KOV1, KOV2 C PPERM = PERMEATE-SIDE PRESSURE C KOV1, KOV2 = OVERALL MASS TRANSFER COEFFICENTS FOR COMPONENTS 1 C AND 2 C EXPLICIT ALGEBRAIC EQUATIONS PPERM = Y(5) L = Y(6) P1 = Y(7) P2 = Y(8) H1 = Y(9) H2 = Y(10) FINIT = Y(3) UINIT = Y(4) C--------------------------------------------------------------------------------- C DATA REQD TO CALC MASS TRANSFER COEFF.
179
C CORREL FOR SPIRAL WOUND MODULE FROM HICKEY GOODING IS USED HERE C--------------------------------------------------------------------------------- D = Y(14) DH = Y(11) LTH = ADUM/2.0/(FINIT/UINIT/DH) C FOR HOLLOW FIBERS, LTH = ADUM/(3.1416*DH*NFIBERS), C WHERE NFIBERS=NO. OF HOLLOW FIBERS IN PARALLEL C = FINIT/UINIT/(3.1416*D**2/4) MU = Y(12) ROL = Y(13) A1 = Y(15) B1 = Y(16) C1 = Y(17) D1 = Y(18) A11 = D/DH*A1*(DH*ROL/MU)**B1*(MU/ROL/D)**C1*(DH/LTH)**D1 C Sh = KBL1*DH/D = A1*Re**B1*Sc**C1*(DH/LTH)**D1 C HENCE, KBL1= D/DH*A1*(DH*U*ROL/MU)**B1*(MU/ROL/D)**C1*(DH/LTH)**D1 C = A11*U**B1 C---------------------------------------------------------------------------------- C PERVAPORATION MODEL C---------------------------------------------------------------------------------- U = Y(2)/FINIT*UINIT KBL1 = A11*U**B1 KOV1 = 1.0/(L/P1 + 1.0/KBL1) KOV2 = P2/L X1 = Y(1)/Y(2) B = - ((KOV1 - KOV2)*X1 + KOV2 )/(KOV1*PPERM/H1 - KOV2*PPERM/H2) - 1 C = KOV1*X1/(KOV1*PPERM/H1 - KOV2*PPERM/H2) IF (C.GE.0) THEN Z = 1.0 ELSE Z = -1.0 ENDIF Y1 = (-B-Z*(B**2.0-4.0*C)**0.5)/2.0 YPRIME(1)=-(KOV1*ROL*(X1-Y1*PPERM/H1)) YPRIME(2)=-(KOV1*ROL*(X1-Y1*PPERM/H1) + 1KOV2*ROL*((1-X1)-(1-Y1)*PPERM/H2))
180
DO I = 3,18 YPRIME(I) = 0.0 ENDDO RETURN END
2. Cocurrent Flow USE NUMERICAL_LIBRARIES IMPLICIT NONE C DECLARATION OF VARIABLES INTEGER NN, NP, IDO, NOUT PARAMETER (NN=20, NP=100) EXTERNAL FCN REAL ADUM, A, Y(NN),TOL, PARAM(50) C ADUM = MEMBRANE AREA, A = TOTAL MEMBRANE AREA OF MODULE C Y(1) = F1 = FEED-SIDE MOLAR FLOW RATE OF COMPONENT 1 C Y(2) = F = TOTAL FEED-SIDE MOLAR FLOW RATE OPEN (UNIT = 1, FILE = 'OUTCF.TXT') A = 100.0 C VALUES OF PARAMETERS RELATED TO THE NUMERICAL METHOD IDO = 1 TOL = 0.5 PARAM(4) = 50000 C INITIAL VALUES ADUM = 0.0 Y(1) = 0.1 Y(2) = 10.0 Y(3) = 0.0 Y(4) = 1.0E-8 Y(5) = Y(2) Y(6) = 0.3 Y(7) = 0.4 Y(8) = 0.00025 Y(9) = 1.27E-7 Y(10) = 1.70E-7 Y(11) = 4.816 Y(12)= 23.0 Y(13) = 0.0011 Y(14) = 9.06E-4 Y(15) = 55.56 Y(16) = 9.96E-10
181
Y(17) = 0.57 Y(18) = 0.46 Y(19) = 0.33 Y(20) = 0.0 CALL IVPRK (IDO, NN, FCN, ADUM, A, TOL, PARAM, Y) WRITE (1,100) 100 FORMAT (2X, 'AREA', 9X, 'Y1', 11X, 'Y2') WRITE (1,'(3F12.3)') ADUM, Y(1), Y(2) END SUBROUTINE FCN(NN, ADUM, Y, YPRIME) REAL Y(20), YPRIME(20), ADUM C Y(1) = F1 = FEED-SIDE MOLAR FLOW RATE OF COMPONENT 1 C Y(2) = F = TOTAL FEED-SIDE MOLAR FLOW RATE INTEGER NN,I REAL L, P1, P2, H1, H2 C L = MEMBRANE THICKNESS, P1 = PERMEABILITY OF COMPONENT 1, C P2 = PERMEABILITY OF COMPONENT 2, C H1, H2 ARE REFERRED TO AS HENRY'S CONSTANTS REAL FINIT,UINIT,D, DH, LTH, MU, ROL, A1, B1,C1,D1,A11 C FINIT = TOTAL FEED-SIDE MOLAR FLOW RATE AT ENTRANCE C UINIT = FEED-SIDE VELOCITY AT ENTRANCE C D = DIFFUSIVITY OF COMPONENT 1 IN COMPONENT2 C DH = HYDRAULIC DIAMETER ON THE FEED-SIDE C LTH = LENGTH OF MEMBRANE MODULE C MU = VISCOSITY OF THE SOLUTION C ROL = DENSITY OF THE SOLUTION C A1,B1,C1,D1,A11 ARE COEFFICENTS FOR THE MASS TRANSFER CORRELATION REAL U, KBL1, X1, B, C, Z, Y1 C U = FEED-SIDE VELOCITY C KBL1 = BOUNDARY LAYER MASS TRANSFER COEFFICIENT C X1 = FEED-SIDE MOLE FRACTION C Y1 = PERMEATE SIDE MOLE FRACTION C B,C = COEFFICIENTS FOR THE QUADRATIC EQUATION OBTAINED FOR CROSS FLOW C Z = DUMMY VARIABLE REAL PPERM, KOV1, KOV2 C PPERM = PERMEATE-SIDE PRESSURE
182
C KOV1, KOV2 = OVERALL MASS TRANSFER COEFFICENTS FOR COMPONENTS 1 AND 2 C EXPLICIT ALGEBRAIC EQUATIONS PPERM = Y(7) L = Y(8) P1 = Y(9) P2 = Y(10) H1 = Y(11) H2 = Y(12) FINIT = Y(5) UINIT = Y(6) C--------------------------------------------------------------------------------- C DATA REQD TO CALC MASS TRANSFER COEFF. C CORREL FOR SPIRAL WOUND MODULE FROM HICKEY GOODING IS USED HERE C--------------------------------------------------------------------------------- D = Y(16) DH = Y(13) LTH = ADUM/2.0/(FINIT/UINIT/DH) C FOR HOLLOW FIBERS, LTH = ADUM/(3.1416*DH*NFIBERS), C WHERE NFIBERS=NO. OF HOLLOW FIBERS IN PARALLEL = FINIT/UINIT/(3.1416*D**2/4) MU = Y(14) ROL = Y(15) A1 = Y(17) B1 = Y(18) C1 = Y(19) D1 = Y(20) A11 = D/DH*A1*(DH*ROL/MU)**B1*(MU/ROL/D)**C1*(DH/LTH)**D1 C Sh = KBL1*DH/D = A1*Re**B1*Sc**C1*(DH/LTH)**D1 C KBL1 = D/DH*A1*(DH*U*ROL/MU)**B1*(MU/ROL/D)**C1*(DH/LTH)**D1 C = A11*U**B1 C---------------------------------------------------------------------------------- C PERVAPORATION MODEL C---------------------------------------------------------------------------------- U = Y(2)/FINIT*UINIT KBL1 = A11*U**B1 KOV1 = 1.0/(L/P1 + 1.0/KBL1) KOV2 = P2/L
183
B = - ((KOV1 - KOV2)*Y(1)/Y(2) + KOV2 )/(KOV1*PPERM/H1 - KOV2*PPERM/H2) - 1 C = KOV1*Y(1)/Y(2)/(KOV1*PPERM/H1 - KOV2*PPERM/H2) IF (C.GE.0) THEN Z = 1.0 ELSE Z = -1.0 ENDIF YPRIME(1)=-(KOV1*ROL*(Y(1)/Y(2)-Y(3)/Y(4)*PPERM/H1)) YPRIME(2)=-(KOV1*ROL*(Y(1)/Y(2)-Y(3)/Y(4)*PPERM/H1) + 1KOV2*ROL*((1-Y(1)/Y(2))-(1-Y(3)/Y(4))*PPERM/H2)) YPRIME(3)=(KOV1*ROL*(Y(1)/Y(2)-Y(3)/Y(4)*PPERM/H1)) YPRIME(4)=(KOV1*ROL*(Y(1)/Y(2)-Y(3)/Y(4)*PPERM/H1) + 1KOV2*ROL*((1-Y(1)/Y(2))-(1-Y(3)/Y(4))*PPERM/H2)) DO I = 5,20 YPRIME(I) = 0.0 ENDDO RETURN END
APPENDIX D
INCORPORATION OF THE FORTRAN PROGRAMS INTO ASPEN PLUS
184
Mitesh
Stamp
The code for incorporating the Fortran program for the cross flow
configuration is given below. The Fortran for other flow configurations as well as
other membrane processes may be incorporated into Aspen Plus in a similar manner.
C User Unit Operation Model , Subroutine for process design of crossflow C pervaporation using the USER2 module in Aspen Plus C SUBROUTINE PERVAP (NMATI, SIN, NINFI, SINFI, NMATO, 2 SOUT, NINFO, SINFO, IDSMI, IDSII, 3 IDSMO, IDSIO, NTOT, NSUBS, IDXSUB, 4 ITYPE, NINT, INT, NREAL, REAL, 5 IDS, NPO, NBOPST, NIWORK, IWORK, 6 NWORK, WORK, NSIZE, SIZE, INTSIZ, 7 LD ) C USE NUMERICAL_LIBRARIES IMPLICIT NONE C C DECLARE VARIABLES USED IN DIMENSIONING C INTEGER NMATI, NINFI, NMATO, NINFO, NTOT, + NSUBS, NINT, NPO, NIWORK,NWORK, + NSIZE C #include "ppexec_user.cmn" #include "dms_ncomp.cmn" #include "dms_plex.cmn" real B(1) equivalence (B(1),IB(1)) C C DECLARE ARGUMENTS C INTEGER IDSMI(2,NMATI), IDSII(2,NINFI), + IDSMO(2,NMATO), IDSIO(2,NINFO), + IDXSUB(NSUBS),ITYPE(NSUBS), INT(NINT), + IDS(2,3), NBOPST(6,NPO), + IWORK(NIWORK),INTSIZ(NSIZE),NREAL, LD !INTEGER KH2O REAL SIN(NTOT,NMATI), SINFI(NINFI), + SOUT(NTOT,NMATO), SINFO(NINFO), + WORK(NWORK), SIZE(NSIZE), REAL(NREAL) C
185
Mitesh
Text Box
APPENDIX D INCORPORATION OF THE FORTRAN PROGRAMS INTO ASPEN PLUS
C DECLARE LOCAL VARIABLES C INTEGER IMISS, DMS_KFORMC, KFORM REAL P(10), L, U, DH, PPERM, H1,H2,A1,B1,C1,D1 REAL C1, C2, C3 REAL D(10), MU, ROL REAL VMX,DVMX REAL KBL(10), KOV(10), N(10), X(10), FLOW, MW(10) INTEGER NCP, IDX(10) INTEGER I, J, K, IERR, KDIAG, KV, IFAIL, INDEX INTEGER USRUTL_GET_REAL_PARAM, USRUTL_GET_INT_PARAM, 1 USRUTL_SET_REAL_PARAM C DECLARE VARIABLES RELATED TO THE NUMERICAL METHOD INTEGER NN, NP, IDO, NOUT PARAMETER (NN=18, NP=100) EXTERNAL FCN REAL ADUM, Y(NN),TOL, PARAM(50) C ADUM = MEMBRANE AREA, A = TOTAL MEMBRANE AREA OF MODULE C Y(1) = F1 = FEED-SIDE MOLAR FLOW RATE OF COMPONENT 1 C Y(2) = F = TOTAL FEED-SIDE MOLAR FLOW RATE C----------------------------------------------------------------------------------------------------------------- WRITE(USER_NHSTRY,*) '###########################################' C GET INPUT PARAMETERS FROM ASPEN PLUS IFAIL = 0 INDEX = 0 IERR = USRUTL_GET_REAL_PARAM('U',INDEX,U) IF(IERR.NE.0) THEN WRITE(USER_NHSTRY,*)'ERROR FETCHING FEED SIDE VELOCITY' IFAIL = 1 ENDIF IERR = USRUTL_GET_REAL_PARAM('L',INDEX,L) IF(IERR.NE.0) THEN WRITE(USER_NHSTRY,*)'ERROR FETCHING MEMBRANE THICKNESS' IFAIL = 1 ENDIF IERR = USRUTL_GET_REAL_PARAM('DH',INDEX,DH) IF(IERR.NE.0) THEN WRITE(USER_NHSTRY,*)'ERROR FETCHING HYDRAULIC DIAMETER' IFAIL = 1 ENDIF IERR = USRUTL_GET_REAL_PARAM('A',INDEX,A) IF(IERR.NE.0) THEN
186
WRITE(USER_NHSTRY,*)'ERROR FETCHING MEMBRANE AREA' IFAIL = 1 ENDIF IERR = USRUTL_GET_REAL_PARAM('P1',INDEX,P(1)) IF(IERR.NE.0) THEN WRITE(USER_NHSTRY,*)'ERROR FETCHING P1' IFAIL = 1 ENDIF IERR = USRUTL_GET_REAL_PARAM('P2',INDEX,P(2)) IF(IERR.NE.0) THEN WRITE(USER_NHSTRY,*)'ERROR FETCHING P2' IFAIL = 1 ENDIF IERR = USRUTL_GET_REAL_PARAM('PPERM',INDEX,PPERM) IF(IERR.NE.0) THEN WRITE(USER_NHSTRY,*)'ERROR FETCHING PERMEATE PRESSURE' IFAIL = 1 ENDIF c GET PHYSICAL PROPERTIES (viscosity, molar volume and diffusivities) C FROM ASPEN PLUS C---------------------------------------------------------------------- CALL SHS_CPACK(SIN(1,1),NCP,IDX,X,FLOW) KDIAG = 4 CALL PPMON_VISCL(SIN(NCOMP_NCC+2,1),SIN(NCOMP_NCC+3,1),X,NCP,IDX, 1NBOPST,KDIAG,MU,IERR) IF(IERR.NE.0) THEN WRITE(USER_NHSTRY,*)'ERROR FETCHING VISCOSITY' IFAIL = 1 ENDIF KV = 1 CALL PPMON_VOLL(SIN(NCOMP_NCC+2,1),SIN(NCOMP_NCC+3,1),X,NCP,IDX, 1NBOPST,KDIAG,KV,VMX,DVMX,IERR) IF(IERR.NE.0) THEN WRITE(USER_NHSTRY,*)'ERROR FETCHING MOLAR VOLUME' IFAIL = 1 ENDIF ROL = 1.0/VMX !ROL IS MOLAR DENSITY OF THE MIXTURE CALL PPMON_DIFCOL(SIN(NCOMP_NCC+2,1),SIN(NCOMP_NCC+3,1),X,NCP,IDX, 1NBOPST,KDIAG,D,IERR) IF(IERR.NE.0) THEN WRITE(USER_NHSTRY,*)'ERROR FETCHING DIFFUSIVITIES' IFAIL = 1
187
ENDIF c STOP PROGRAM IF THERE IS AN ERROR IN GETTING THE ABOVE PARAMETERS IF(IFAIL.EQ.1) RETURN C----------------------------------------------------------------------- C BEGIN EXECUTABLE CODE C----------------------------------------------------------------------- OPEN (UNIT = 1, FILE = 'OUTCF.TXT') A = 100.0 C VALUES OF PARAMETERS RELATED TO THE NUMERICAL METHOD IDO = 1 TOL = 0.5 PARAM(4) = 50000 C INITIAL VALUES ADUM = 0.0 Y(1) = SIN(1,1) Y(2) = SIN(NCOMP_NCC+1,1) Y(3) = Y(2) Y(4) = U Y(5) = PPERM Y(6) = L Y(7) = P1 Y(8) = P2 Y(9) = H1 Y(10)= H2 Y(11) = DH Y(12) = MU Y(13) = ROL Y(14) = D(1) Y(15) = A1 Y(16) = B1 Y(17) = C1 Y(18) = D1 CALL IVPRK (IDO, NN, FCN, ADUM, A, TOL, PARAM, Y) C--------------------------------------------------------------------------------------------- C COMPONENT BALANCES ACROSS MODULE C--------------------------------------------------------------------------------------------- SOUT(1,1) = Y(2)*Y(1) SOUT(2,1) = Y(2)*(1 - Y(1)) SOUT(1,2) = SIN(1,1) - SOUT(1,1) SOUT(2,2) = SIN(2,1) - SOUT(2,1) WRITE(USER_NHSTRY,*) '############################################'
188
C 999 RETURN END C---------------------------------------------------------------------------------------------- C SUBROUTINE INCLUDING THE PERVAPORATION MODEL C---------------------------------------------------------------------------------------------- SUBROUTINE FCN(NN, ADUM, Y, YPRIME) REAL Y(18), YPRIME(18), ADUM C Y(1) = F1 = FEED-SIDE MOLAR FLOW RATE OF COMPONENT 1 C Y(2) = F = TOTAL FEED-SIDE MOLAR FLOW RATE INTEGER NN,I REAL L, P1, P2, H1, H2 C L = MEMBRANE THICKNESS, P1 = PERMEABILITY OF COMPONENT 1, C P2 = PERMEABILITY OF COMPONENT 2, C H1, H2 ARE REFERRED TO AS HENRY'S CONSTANTS REAL FINIT,UINIT,D, DH, LTH, MU, ROL, A1, B1,C1,D1,A11 C FINIT = TOTAL FEED-SIDE MOLAR FLOW RATE AT ENTRANCE C UINIT = FEED-SIDE VELOCITY AT ENTRANCE C D = DIFFUSIVITY OF COMPONENT 1 IN COMPONENT2 C DH = HYDRAULIC DIAMETER ON THE FEED-SIDE C LTH = LENGTH OF MEMBRANE MODULE C MU = VISCOSITY OF THE SOLUTION C ROL = DENSITY OF THE SOLUTION C A1,B1,C1,D1,A11 ARE COEFFICENTS FOR THE MASS TRANSFER CORRELATION REAL U, KBL1, X1, B, C, Z, Y1 C U = FEED-SIDE VELOCITY C KBL1 = BOUNDARY LAYER MASS TRANSFER COEFFICIENT C X1 = FEED-SIDE MOLE FRACTION C Y1 = PERMEATE SIDE MOLE FRACTION C B,C = COEFFICIENTS FOR THE QUADRATIC EQUATION OBTAINED FOR CROSS C FLOW C Z = DUMMY VARIABLE REAL PPERM, KOV1, KOV2 C PPERM = PERMEATE-SIDE PRESSURE C KOV1, KOV2 = OVERALL MASS TRANSFER COEFFICENTS FOR COMPONENTS 1 C AND 2 C EXPLICIT ALGEBRAIC EQUATIONS PPERM = Y(5) L = Y(6) P1 = Y(7) P2 = Y(8)
189
H1 = Y(9) H2 = Y(10) FINIT = Y(3) UINIT = Y(4) C--------------------------------------------------------------------------------- C DATA REQD TO CALC MASS TRANSFER COEFF. C CORREL FOR SPIRAL WOUND MODULE FROM HICKEY GOODING IS USED HERE C--------------------------------------------------------------------------------- D = Y(14) DH = Y(11) LTH = ADUM/2.0/(FINIT/UINIT/DH) C FOR HOLLOW FIBERS, LTH = ADUM/(3.1416*DH*NFIBERS), C WHERE NFIBERS=NO. OF HOLLOW FIBERS IN PARALLEL C = FINIT/UINIT/(3.1416*D**2/4) MU = Y(12) ROL = Y(13) A1 = Y(15) B1 = Y(16) C1 = Y(17) D1 = Y(18) A11 = D/DH*A1*(DH*ROL/MU)**B1*(MU/ROL/D)**C1*(DH/LTH)**D1 C Sh = KBL1*DH/D = A1*Re**B1*Sc**C1*(DH/LTH)**D1 C HENCE, KBL1 = D/DH*A1*(DH*U*ROL/MU)**B1*(MU/ROL/D)**C1*(DH/LTH)**D1 C = A11*U**B1 C---------------------------------------------------------------------------------- C PERVAPORATION MODEL C---------------------------------------------------------------------------------- U = Y(2)/FINIT*UINIT KBL1 = A11*U**B1 KOV1 = 1.0/(L/P1 + 1.0/KBL1) KOV2 = P2/L X1 = Y(1)/Y(2) B = - ((KOV1 - KOV2)*X1 + KOV2 )/(KOV1*PPERM/H1 - KOV2*PPERM/H2) - 1 C = KOV1*X1/(KOV1*PPERM/H1 - KOV2*PPERM/H2) IF (C.GE.0) THEN Z = 1.0 ELSE Z = -1.0 ENDIF
190
Y1 = (-B-Z*(B**2.0-4.0*C)**0.5)/2.0 YPRIME(1)=-(KOV1*ROL*(X1-Y1*PPERM/H1)) YPRIME(2)=-(KOV1*ROL*(X1-Y1*PPERM/H1) + 1KOV2*ROL*((1-X1)-(1-Y1)*PPERM/H2)) DO I = 3,18 YPRIME(I) = 0.0 ENDDO RETURN END
APPENDIX E
E.1 FORTRAN code for the process design for cross flow configuration
191
Mitesh
Stamp
In this subroutine, the overall process design is carried out for the crossflow
configuration after taking into account the variation of the flux due to variation of
feed concentration and velocity along the length of the membrane module, as
described in Section 5.5.3.2.1. The FORTRAN code provided below is compiled into
a dynamic-link library which is then used in Microsoft Excel. This subroutine in turn
uses the subroutines, ‘concpol’, which accounts for the feed-side concentration
polarization, and ‘y1calcdll’, which accounts for the variation in flux and permeate
concentration with feed concentration and permeate pressure.
E.2 Effect of feed-side concentration polarization
This subroutine ‘concpol’ includes the effect of the feed-side concentration
polarization on the flux through the membrane as described in Section 5.5.3.2.3. This
includes the effect of diffusion and convection through the liquid boundary layer on
the feed side of the membrane. Twelve mass transfer correlations for different
membrane modules have been included to determine the effect of the diffusion
through the boundary layer. This subroutine uses the subroutine ‘y1calc’ in order to
calculate the flux though the membrane on the basis of the feed concentration at the
surface of the membrane and the permeate pressure. It is, in turn, compiled into the
form of a dynamic-link library and used in the subroutine ‘processdesign’.
! CONCPOL.F90 ! ! FUNCTIONS/SUBROUTINES EXPORTED FROM CONCPOL.DLL: ! CONCPOL - SUBROUTINE ! !DEC$OBJCOMMENT LIB:'C:\ATHENA\BIN\DVFATHENA.LIB' !DEC$OBJCOMMENT LIB:'C:\WINDOWS\SYSTEM32\AVWSECURITY.LIB' !DEC$OBJCOMMENT LIB:'Y1CALCDLL.LIB' OPTIONS /EXTEND_SOURCE SUBROUTINE CONCPOL(NCOMPO,R,Q,TAU,PARAM,THEORY,PPERM,PSAT,DIFFUS, & & GAMM,RHO,L, UINIT, X1INIT1, RMODEL, D, DH, MU, MTCCORREL, LTH, ROL, Y1,XMEM, N, IDID) !UINIT AND X1INIT ARE ACTUALLY JUST U AND X - THE VARIABLES ARE SO DEFINED SOTHAT THE COMMON STATEMEENTS DO NOT HAVE BE CHANGED ! EXPOSE SUBROUTINE CONCPOL TO USERS OF THIS DLL ! !DEC$ ATTRIBUTES DLLEXPORT::CONCPOL ! VARIABLES
U(2)=N(1) !1.E-4 U(3)=N(2) !1.E-4 ! !:SAVE THE SOLVER INITIAL GUESS FOR LATER PRINTING ! DO J=1,NEQ UINI(J)=U(J) END DO ! !:PRINT SOME INPUT INFORMATION ! ! WRITE(LUN,'(A35,I5)')' NUMBER OF STATE EQUATIONS.........',NEQ ! WRITE(LUN,'(A35,I5)')' NUMBER OF SENSITIVITY PARAMETERS..',NPAR ! WRITE(LUN,'(A35,I5)')' NUMBER OF CONTINUATION POINTS.....',NPTCON ! WRITE(LUN,'(A1)')' ' ! !:CALL DDAPLUS INTEGRATOR AND PRINT THE RESULTS ! CALL DDAPLUS(TINI,TEND,NEQ,U,UPRIME,RTOL,ATOL,INFO,RWORK, & & LRW,IWORK,LIW,RPAR,IPAR,IDID,LUNERR,IEFORM, & & FDSUB,EDSUB,JDSUB,BDSUB) ! !:PRINT MODELING RESULTS ! CALL FDSUB(TINI, NEQ, U, UPRIME, RPAR, IPAR, IEFORM, IRES) ! WRITE(LUN,'(A38)')' UINI(1:NEQ) F(1:NEQ) U(1:NEQ)' DO J=1,NEQ ! WRITE(LUN,'(1X,3(1PE12.5,2X))')UINI(J),UPRIME(J),U(J) END DO XMEM = U(1) N(1) = U(2) N(2) = U(3) ! !:EXIT CODE AND INTEGRATION RUN TIME STATISTICS ! WRITE(LUN,'(A1)')' ' ! IF(IDID.GE.0)WRITE(LUN,'(A49,I5)')' EXIT DDAPLUS: SOLUTION SUCCESSFUL WITH IDID.....',IDID ! IF(IDID.LT.0)WRITE(LUN,'(A49,I5)')' EXIT DDAPLUS: SOLUTION HAS FAILED WITH IDID.....',IDID ! WRITE(LUN,'(A49,I5)')' NUMBER OF NEWTON ITERATIONS.....................',IWORK(12)-1 ! WRITE(LUN,'(A49,I5)')' NUMBER OF JACOBIAN EVALUATIONS..................',IWORK(13) ! WRITE(LUN,'(A49,I5)')' NUMBER OF JACOBIAN FACTORIZATIONS...............',IWORK(23) ! !:END OF MAIN PROGRAM ! END SUBROUTINE CONCPOL SUBROUTINE FDSUB(T, NEQ, U, F, RPAR, IPAR, IEFORM, IRES) IMPLICIT REAL*8(A-H,O-Z) PARAMETER (NCMAX=10,ZERO=0.0D0,ONE=1.0D0,PI=3.141592653589793D0)
SUBROUTINE MASSTRANSFERCORREL(U,RMTCCORREL,DIFF,H,MU,RHO,KBL,DPBYL,LMOD,PARAMET, RIERR) IMPLICIT NONE REAL U,DIFF,H,MU,RHO,KBL,DPBYL,LMOD,DH,RE,SC,SH,A,B,C,E,AA,BB,RMTCCORREL, PARAMET(6), RIERR INTEGER MTCCORREL,IERR MTCCORREL = INT(RMTCCORREL) SC = MU/RHO/DIFF ! DECLARE VARIABLES SELECT CASE (MTCCORREL) !PLATE AND FRAME-NO SPACERS CASE(1) DH = 2*H RE = DH*U*RHO/MU IF (RE.LT.2300) THEN A = 1.62 B = 0.33 C = 0.33 E = 0.33 DPBYL = 32.*MU*U*LMOD/DH**2 ELSE A = 0.026 B = 0.8 C = 0.33 E = 0.0 DPBYL = A*RE**(B-1)*(RHO*U**2/DH*4) !CHECK ENDIF CASE(2) DH = H RE = DH*U*RHO/MU IF (RE.LT.2300) THEN A = 1.62 B = 0.33 C = 0.33 E = 0.33 DPBYL = 32.*MU*U*LMOD/DH**2 ELSE A = 0.026 B = 0.8 C = 0.33 E = 0.0
207
DPBYL = A*RE**(B-1)*(RHO*U**2/DH*4) !CHECK ENDIF !SCHOCK -MICHEL CASE(3) DH = 0.72E-3 RE = DH*U*RHO/MU A = 0.065 B = .875 C = 0.25 E = 0 AA = 6.23 BB = -0.3 DPBYL = AA*U**BB*(RHO*U**2/DH/2) IF(RE.LT.100) IERR = 2 !LIMIT 100<RE<1000 IF(RE.GT.1000) IERR = 3 CASE(4) DH = 0.96E-3 RE = DH*U*RHO/MU A = 0.065 B = .875 C = 0.25 E = 0 AA = 6.23 BB = -0.3 DPBYL = AA*U**BB*(RHO*U**2/DH/2) IF(RE.LT.100) IERR = 2 !LIMIT 100<RE<1000 IF(RE.GT.1000) IERR = 3 CASE(5) DH = 0.97E-3 RE = DH*U*RHO/MU A = 0.065 B = .875 C = 0.25 E = 0 AA = 6.23 BB = -0.3 DPBYL = AA*U**BB*(RHO*U**2/DH/2) IF(RE.LT.100) IERR = 2 !LIMIT 100<RE<1000 IF(RE.GT.1000) IERR = 3 CASE(6) DH = 0.95E-3 RE = DH*U*RHO/MU A = 0.065 B = .875 C = 0.25 E = 0 AA = 6.23 BB = -0.3 DPBYL = AA*U**BB*(RHO*U**2/DH/2) IF(RE.LT.100) IERR = 2 !LIMIT 100<RE<1000 IF(RE.GT.1000) IERR = 3
208
CASE(7) DH = 1.39E-3 RE = DH*U*RHO/MU A = 0.065 B = .875 C = 0.25 E = 0 AA = 6.23 BB = -0.3 DPBYL = AA*U**BB*(RHO*U**2/DH/2) IF(RE.LT.100) IERR = 2 !LIMIT 100<RE<1000 IF(RE.GT.1000) IERR = 3 !HICKEY-GOODING CASE(8) DH = 2*H RE = DH*U*RHO/MU A = 0.894 B = .413 C = 0.33 E = 0 AA = 3.21E-6 BB = 1.755 DPBYL = AA*U**BB IF(U*DH.LT.6.7E-5) IERR = 2 !LIMIT 100<RE<1000 IF(U*DH.GT.6.67E-4) IERR = 3 CASE(9) DH = 2*H RE = DH*U*RHO/MU A = 0.808 B = .405 C = 0.33 E = 0 AA = 0.482E-6 BB = 1.484 DPBYL = AA*U**BB IF(U*DH.LT.6.7E-5) IERR = 2 !LIMIT 100<RE<1000 IF(U*DH.GT.6.67E-4) IERR = 3 CASE(10) DH = 2*H RE = DH*U*RHO/MU A = 0.322 B = .435 C = 0.33 E = 0 AA = 0.561E-6 BB = 1.585 DPBYL = AA*U**BB IF(U*DH.LT.6.7E-5) IERR = 2 !LIMIT 100<RE<1000 IF(U*DH.GT.6.67E-4) IERR = 3 CASE(11) DH = 2*H
209
RE = DH*U*RHO/MU A = 0.474 B = .408 C = 0.33 E = 0 AA = 0.552E-6 BB = 1.481 DPBYL = AA*U**BB IF(U*DH.LT.6.7E-5) IERR = 2 !LIMIT 100<RE<1000 IF(U*DH.GT.6.67E-4) IERR = 3 CASE(12) DH = H RE = DH*U*RHO/MU A = PARAMET(1) B = PARAMET(2) C = PARAMET(3) E = PARAMET(4) AA = PARAMET(5) BB = PARAMET(6) DPBYL = AA*U**BB*(RHO*U**2/H/2) CASE(13) DH = H RE = DH*U*RHO/MU A = PARAMET(1) B = PARAMET(2) C = PARAMET(3) E = PARAMET(4) AA = PARAMET(5) BB = PARAMET(6) DPBYL = AA*U**BB CASE(14) DH = H RE = DH*U*RHO/MU A = PARAMET(1) B = PARAMET(2) AA = PARAMET(5) BB = PARAMET(6) DPBYL = AA*U**BB*(RHO*U**2/H/2) CASE(15) DH = H RE = DH*U*RHO/MU A = PARAMET(1) B = PARAMET(2) AA = PARAMET(5) BB = PARAMET(6) DPBYL = AA*U**BB END SELECT SELECT CASE (MTCCORREL) CASE (1:13) SH = A*RE**B*SC**C*(DH/LMOD)**E KBL = SH*DIFF/DH
210
CASE(14,15) KBL = A*U**B END SELECT RIERR = FLOAT(IERR) END SUBROUTINE MASSTRANSFERCORREL E.3 Effect of the feed concentration and permeate pressure on the flux
The subroutine ‘y1calcdll’ is used to include the effect of the feed concentration and
the permeate pressure on the flux through the membrane and the permeate
concentration as described in Section 5.5.3.2.2. The subroutine consists of four parts,
viz. the main body and three subroutines ‘uniquac’, ‘uniqpoly’ and ‘diffusion’. The
subroutine ‘uniquac’ is used to calculate the feed activity for a given concentration;
‘uniqpoly’ is used to calculate the sorption in the membrane for a given feed and
permeate activity and ‘diffusion’ is used to calculate the flux though the membrane
for the given values of the sorption on the feed and permeate side. As explained in
Section 5.5.3.2.2, the permeate concentration depends on the flux through the
membrane and the flux, in turn, depends on the permeate concentration.
Determination of the permeate concentration therefore requires the solution of a set of
nonlinear algebraic equations. This is achieved in the main body of the subroutine
‘y1calcdll’. The remaining subroutines in the below correspond to the numerical
methods used from ‘Numerical Recipes’ and ‘Athena Visual Workbench’ in order to
SUBROUTINE NEWT(X,N,CHECK, NCOMP, THEORYNO, A, R,Q,TAU,PARAM,IERR) INTEGER N,NN,NP,MAXITS, NCOMP,THEORYNO LOGICAL CHECK REAL X(N),FVEC,TOLF,TOLMIN,TOLX,STPMX, A(5), R(5), Q(5), TAU(5,5) REAL PARAM(5,3) PARAMETER (NP=5,MAXITS=200,TOLF=1.E-4,TOLMIN=1.E-6,TOLX=1.E-7, & & STPMX=100.) COMMON /NEWTV/ FVEC(NP),NN SAVE /NEWTV/ ! USES FDJAC,FMIN,LNSRCH,LUBKSB,LUDCMP INTEGER I,ITS,J,INDX(NP) REAL D,DEN,F,FOLD,STPMAX,SUM,TEMP,TEST,FJAC(NP,NP),G(NP),P(NP),XOLD(NP),FMIN INTEGER IERR EXTERNAL FMIN NN=N F=FMIN(X,NCOMP,THEORYNO,A, R,Q,TAU,PARAM,IERR) TEST=0. DO 11 I=1,N IF(ABS(FVEC(I)).GT.TEST)TEST=ABS(FVEC(I)) 11 CONTINUE IF(TEST.LT..01*TOLF)THEN CHECK=.FALSE. RETURN ENDIF SUM=0. DO 12 I=1,N SUM=SUM+X(I)**2 12 CONTINUE STPMAX=STPMX*MAX(SQRT(SUM),FLOAT(N)) DO 21 ITS=1,MAXITS CALL FDJAC(N,X,FVEC,NP,FJAC, NCOMP, THEORYNO, A, R,Q,TAU, & & PARAM,IERR) DO 14 I=1,N SUM=0. DO 13 J=1,N SUM=SUM+FJAC(J,I)*FVEC(J) 13 CONTINUE G(I)=SUM 14 CONTINUE DO 15 I=1,N XOLD(I)=X(I) 15 CONTINUE FOLD=F DO 16 I=1,N P(I)=-FVEC(I) 16 CONTINUE CALL LUDCMP(FJAC,N,NP,INDX,D,IERR) CALL LUBKSB(FJAC,N,NP,INDX,P)
220
CALL LNSRCH(N,XOLD,FOLD,G,P,X,F,STPMAX,CHECK,FMIN, NCOMP, THEORYNO,A, R,Q,TAU,PARAM,IERR) TEST=0. DO 17 I=1,N IF(ABS(FVEC(I)).GT.TEST)TEST=ABS(FVEC(I)) 17 CONTINUE IF(TEST.LT.TOLF)THEN CHECK=.FALSE. RETURN ENDIF IF(CHECK)THEN TEST=0. DEN=MAX(F,.5*N) DO 18 I=1,N TEMP=ABS(G(I))*MAX(ABS(X(I)),1.)/DEN IF(TEMP.GT.TEST)TEST=TEMP 18 CONTINUE IF(TEST.LT.TOLMIN)THEN CHECK=.TRUE. ELSE CHECK=.FALSE. ENDIF RETURN ENDIF TEST=0. DO 19 I=1,N TEMP=(ABS(X(I)-XOLD(I)))/MAX(ABS(X(I)),1.) IF(TEMP.GT.TEST)TEST=TEMP 19 CONTINUE IF(TEST.LT.TOLX)RETURN 21 CONTINUE IERR = 1 RETURN ! PAUSE 'MAXITS EXCEEDED IN NEWT' END SUBROUTINE FDJAC(N,X,FVEC,NP,DF,NCOMP,THEORYNO,A,R,Q,TAU, & & PARAM,IERR) INTEGER N,NP,NMAX, NCOMP, THEORYNO REAL DF(NP,NP),FVEC(N),X(N),EPS, A(5), R(5), Q(5), TAU(5,5) REAL PARAM(5,3) PARAMETER (NMAX=5,EPS=1.E-4) ! USES FUNCV INTEGER I,J,IERR REAL H,TEMP,F(NMAX) DO 12 J=1,N TEMP=X(J) H=EPS*ABS(TEMP)
221
IF(H.EQ.0.)H=EPS X(J)=TEMP+H H=X(J)-TEMP CALL FUNCV(N,X,F, NCOMP, THEORYNO, A, R,Q,TAU,PARAM,IERR) X(J)=TEMP DO 11 I=1,N DF(I,J)=(F(I)-FVEC(I))/H 11 CONTINUE 12 CONTINUE RETURN END FUNCTION FMIN(X, NCOMP, THEORYNO, A, R,Q,TAU,PARAM,IERR) INTEGER N,NP,NCOMP,THEORYNO,IERR REAL FMIN,X(*),FVEC,A(5), R(5),Q(5),TAU(5,5),PARAM(5,3) PARAMETER (NP=5) COMMON /NEWTV/ FVEC(NP),N SAVE /NEWTV/ ! USES FUNCV INTEGER I REAL SUM CALL FUNCV(N,X,FVEC, NCOMP, THEORYNO, A, R,Q,TAU,PARAM,IERR) SUM=0. DO 11 I=1,N SUM=SUM+FVEC(I)**2 11 CONTINUE FMIN=0.5*SUM RETURN END SUBROUTINE LNSRCH(N,XOLD,FOLD,G,P,X,F,STPMAX,CHECK,FMIN,NCOMP, & & THEORYNO,AA, R,Q,TAU,PARAM,IERR) INTEGER N LOGICAL CHECK REAL F,FOLD,STPMAX,G(N),P(N),X(N),XOLD(N),FMIN,ALF,TOLX,AA(5), & & R(5),Q(5),TAU(5,5),PARAM(5,3) PARAMETER (ALF=1.E-4,TOLX=1.E-7) EXTERNAL FMIN ! USES FUNC INTEGER I,NCOMP, THEORYNO, IERR REAL A,ALAM,ALAM2,ALAMIN,B,DISC,F2,RHS1,RHS2,SLOPE,SUM,TEMP, & & TEST,TMPLAM CHECK=.FALSE. SUM=0. DO 11 I=1,N SUM=SUM+P(I)*P(I) 11 CONTINUE SUM=SQRT(SUM) IF(SUM.GT.STPMAX)THEN DO 12 I=1,N P(I)=P(I)*STPMAX/SUM 12 CONTINUE ENDIF SLOPE=0.
222
DO 13 I=1,N SLOPE=SLOPE+G(I)*P(I) 13 CONTINUE IF(SLOPE.GE.0.) THEN !PAUSE 'ROUNDOFF PROBLEM IN LNSRCH' !THEN IERR = 2 ENDIF ! PAUSE 'ROUNDOFF PROBLEM IN LNSRCH' TEST=0. DO 14 I=1,N TEMP=ABS(P(I))/MAX(ABS(XOLD(I)),1.) IF(TEMP.GT.TEST)TEST=TEMP 14 CONTINUE ALAMIN=TOLX/TEST ALAM=1. 1 CONTINUE DO 15 I=1,N X(I)=XOLD(I)+ALAM*P(I) 15 CONTINUE F=FMIN(X, NCOMP, THEORYNO, AA, R,Q,TAU,PARAM,IERR) IF(ALAM.LT.ALAMIN)THEN DO 16 I=1,N X(I)=XOLD(I) 16 CONTINUE CHECK=.TRUE. RETURN ELSE IF(F.LE.FOLD+ALF*ALAM*SLOPE)THEN RETURN ELSE IF(ALAM.EQ.1.)THEN TMPLAM=-SLOPE/(2.*(F-FOLD-SLOPE)) ELSE RHS1=F-FOLD-ALAM*SLOPE RHS2=F2-FOLD-ALAM2*SLOPE A=(RHS1/ALAM**2-RHS2/ALAM2**2)/(ALAM-ALAM2) B=(-ALAM2*RHS1/ALAM**2+ALAM*RHS2/ALAM2**2)/(ALAM-ALAM2) IF(A.EQ.0.)THEN TMPLAM=-SLOPE/(2.*B) ELSE DISC=B*B-3.*A*SLOPE IF(DISC.LT.0.)THEN TMPLAM=.5*ALAM ELSE IF(B.LE.0.)THEN TMPLAM=(-B+SQRT(DISC))/(3.*A) ELSE TMPLAM=-SLOPE/(B+SQRT(DISC)) ENDIF ENDIF IF(TMPLAM.GT..5*ALAM)TMPLAM=.5*ALAM ENDIF ENDIF ALAM2=ALAM F2=F ALAM=MAX(TMPLAM,.1*ALAM) GOTO 1 END
223
SUBROUTINE LUBKSB(A,N,NP,INDX,B) INTEGER N,NP,INDX(N) REAL A(NP,NP),B(N) INTEGER I,II,J,LL REAL SUM II=0 DO 12 I=1,N LL=INDX(I) SUM=B(LL) B(LL)=B(I) IF (II.NE.0)THEN DO 11 J=II,I-1 SUM=SUM-A(I,J)*B(J) 11 CONTINUE ELSE IF (SUM.NE.0.) THEN II=I ENDIF B(I)=SUM 12 CONTINUE DO 14 I=N,1,-1 SUM=B(I) DO 13 J=I+1,N SUM=SUM-A(I,J)*B(J) 13 CONTINUE B(I)=SUM/A(I,I) 14 CONTINUE RETURN END SUBROUTINE LUDCMP(A,N,NP,INDX,D,IERR) INTEGER N,NP,INDX(N),NMAX REAL D,A(NP,NP),TINY PARAMETER (NMAX=500,TINY=1.0E-20) INTEGER I,IMAX,J,K REAL AAMAX,DUM,SUM,VV(NMAX) INTEGER IERR D=1. DO 12 I=1,N AAMAX=0. DO 11 J=1,N IF (ABS(A(I,J)).GT.AAMAX) AAMAX=ABS(A(I,J)) 11 CONTINUE IF (AAMAX.EQ.0.) THEN IERR = 3 ENDIF ! PAUSE 'SINGULAR MATRIX IN LUDCMP' VV(I)=1./AAMAX 12 CONTINUE DO 19 J=1,N DO 14 I=1,J-1 SUM=A(I,J) DO 13 K=1,I-1 SUM=SUM-A(I,K)*A(K,J) 13 CONTINUE A(I,J)=SUM
224
14 CONTINUE AAMAX=0. DO 16 I=J,N SUM=A(I,J) DO 15 K=1,J-1 SUM=SUM-A(I,K)*A(K,J) 15 CONTINUE A(I,J)=SUM DUM=VV(I)*ABS(SUM) IF (DUM.GE.AAMAX) THEN IMAX=I AAMAX=DUM ENDIF 16 CONTINUE IF (J.NE.IMAX)THEN DO 17 K=1,N DUM=A(IMAX,K) A(IMAX,K)=A(J,K) A(J,K)=DUM 17 CONTINUE D=-D VV(IMAX)=VV(J) ENDIF INDX(J)=IMAX IF(A(J,J).EQ.0.)A(J,J)=TINY IF(J.NE.N)THEN DUM=1./A(J,J) DO 18 I=J+1,N A(I,J)=A(I,J)*DUM 18 CONTINUE ENDIF 19 CONTINUE RETURN END SUBROUTINE FUNCV(N,PHI,F,NCOMP, THEORYNO, A, R,Q,TAU,PARAM,IERR) IMPLICIT NONE INTEGER N, NCOMP, THEORYNO, I, J,IERR REAL X(N), F(N), A(5), R(5), Q(5), TAU(5,5), PARAM(5,3),XNCOMP REAL SPHII, SPQBYRI, SPHIBYRI, PHI(5), THETA(5),S(5),STHTAUBYS(5) REAL LNAC(5), LNAR(5), LNA(5), L(5), SPHLBYR,CHI(5) SPHII = 0.0 DO 5 I = 1, NCOMP-1 SPHII = PHI(I)+SPHII IF(PHI(I).LE.0.0) THEN IERR = 4 GOTO 100 ENDIF 5 CONTINUE PHI(NCOMP) = 1.0 - SPHII
225
IF(PHI(NCOMP).LE.0.0) THEN IERR = 4 GOTO 100 ENDIF IF(THEORYNO.NE.1) THEN DO 8 I = 1, NCOMP-1 R(I) = PARAM(I,1) Q(I) = PARAM(I,2) TAU(I,1) = PARAM(I,3) 8 CONTINUE ENDIF IF(THEORYNO.EQ.1) THEN SPQBYRI = 0.0 DO 11 I = 1, NCOMP-1 SPQBYRI = PHI(I)*Q(I)/R(I)+SPQBYRI 11 CONTINUE SPQBYRI = SPQBYRI + PHI(NCOMP)*Q(NCOMP)/R(NCOMP) DO 14 I = 1, NCOMP-1 THETA(I) = PHI(I)*Q(I)/R(I)/SPQBYRI S(I) = 0.0 STHTAUBYS (I) = 0.0 14 CONTINUE THETA(NCOMP) = PHI(NCOMP)*Q(NCOMP)/R(NCOMP)/SPQBYRI S(NCOMP) = 0.0 STHTAUBYS(NCOMP) = 0.0 DO 15 I = 1,NCOMP DO 16 J = 1, NCOMP S(I) = S(I) + THETA(J)*TAU(J,I) 16 CONTINUE 15 CONTINUE DO 17 I = 1,NCOMP DO 18 J = 1, NCOMP STHTAUBYS (I) = STHTAUBYS (I) + THETA(J)*TAU(I,J)/S(J) 18 CONTINUE 17 CONTINUE DO 24 I = 1, NCOMP L(I) = 5.0*(R(I)-Q(I))-(R(I)-1.0) 24 CONTINUE SPHLBYR = 0.0
226
DO 25 I = 1, NCOMP SPHLBYR = SPHLBYR + PHI(I)*L(I)/R(I) 25 CONTINUE DO 19 I = 1,NCOMP-1 LNAC(I) = LOG(PHI(I)) - 5.0*Q(I)*LOG(PHI(I)/THETA(I))+ & & L(I)-R(I)*SPHLBYR LNAR(I) = Q(I)*(1-LOG(S(I))- STHTAUBYS(I) ) LNA(I) = LNAC(I) + LNAR(I) 19 CONTINUE ELSEIF (THEORYNO.EQ.2) THEN !FLORY HUGGINS-CONSTANT CHI - ASSUMING PSEUDOBINARY SYSTEM DO 30 I = 1,NCOMP-1 LNA(I) = LOG(PHI(I))+PHI(NCOMP)+R(I)*PHI(NCOMP)**2 !R(I) = CHI = CONSTANT 30 CONTINUE ELSEIF (THEORYNO.EQ.3) THEN !FLORY-HUGGINS-KONINGSVELD-KLEINTJENS - ASSUMING PSEUDOBINARY SYSTEM DO 40 I = 1,NCOMP-1 CHI(I) = R(I)+Q(I)*(1.-TAU(I,1))/(1.-TAU(I,1)*PHI(NCOMP))**2 !R= ALPHA, Q = BETA, TAU(I,1) = GAMMA(I) LNA(I) = LOG(PHI(I))+PHI(NCOMP)+CHI(I)*PHI(NCOMP)**2 40 CONTINUE ELSEIF (THEORYNO.EQ.4) THEN !FLORY-HUGGINS-LINEAR - ASSUMING PSEUDOBINARY SYSTEM DO 50 I = 1,NCOMP-1 CHI(I) = R(I)+Q(I)*PHI(NCOMP) !R= CHI0, Q = CHI1 LNA(I) = LOG(PHI(I))+PHI(NCOMP)+CHI(I)*PHI(NCOMP)**2 50 CONTINUE ELSEIF (THEORYNO.EQ.5) THEN !FLORY-HUGGINS-QUADRATIC - ASSUMING PSEUDOBINARY SYSTEM DO 60 I = 1,NCOMP-1 CHI(I) = R(I)+Q(I)*PHI(NCOMP)+TAU(I,1)*PHI(NCOMP)**2 !R= CHI0, Q = CHI1, TAU(I,1) = CHI2(I) LNA(I) = LOG(PHI(I))+PHI(NCOMP)+CHI(I)*PHI(NCOMP)**2 60 CONTINUE ELSEIF (THEORYNO.EQ.6) THEN !ENSIC - EXTENSION FROM BINARY TO TERNARY NOT VALID DO 70 I = 1,NCOMP-1 LNA(I) = LOG(1./(R(I)-Q(I))*LOG(1+PHI(I)*(R(I)-Q(I))/Q(I))) !R = KS, Q = KP 70 CONTINUE ENDIF DO 90 I = 1,NCOMP-1 F(I) = EXP(LNA(I)) - A(I)
227
90 CONTINUE 100 RETURN END SUBROUTINE UNIQUAC(NCOMPO,A,R,Q,TAU,X) IMPLICIT NONE INTEGER N,I,NCOMP REAL NCOMPO REAL X(5), A(5), R(5), Q(5), TAU(5,5) REAL F(5),W(5),SW,SWBYRO,RO(5) LOGICAL CHECK INTEGER IERR NCOMP = INT(NCOMPO) N = NCOMP - 1 500 IERR = 0 CALL FUNCV1(NCOMP, X, A, R,Q,TAU,IERR) 30 END SUBROUTINE UNIQUAC SUBROUTINE FUNCV1(NCOMP, X, A, R,Q,TAU,IERR) INTEGER NCOMP, I, J, K, NITS REAL X(5), A(5), R(5), Q(5), TAU(5,5), XNCOMP REAL SXI, SXIRI, SXIQI, PHI(5), THETA(5), S(5), STHTAUBYS (5) REAL LNGAMC(5), LNGAMR(5), LNGAM(5), H, GAM(5) SXI = 0.0 DO 5 I = 1, NCOMP-1 SXI = X(I)+SXI 5 CONTINUE XNCOMP = 1 - SXI SXIRI = 0.0 DO 11 I = 1, NCOMP-1 SXIRI = X(I)*R(I)+SXIRI 11 CONTINUE
228
SXIRI = SXIRI + XNCOMP*R(NCOMP) DO 12 I = 1, NCOMP-1 PHI(I) = X(I)*R(I)/SXIRI 12 CONTINUE PHI(NCOMP) = XNCOMP*R(NCOMP)/SXIRI SXIQI = 0.0 DO 13 I = 1, NCOMP-1 SXIQI = X(I)*Q(I)+SXIQI 13 CONTINUE SXIQI = SXIQI + XNCOMP*Q(NCOMP) DO 14 I = 1, NCOMP-1 THETA(I) = X(I)*Q(I)/SXIQI S(I) = 0.0 STHTAUBYS (I) = 0.0 14 CONTINUE THETA(NCOMP) = XNCOMP*Q(NCOMP)/SXIQI S(NCOMP) = 0.0 STHTAUBYS(NCOMP) = 0.0 DO 15 I = 1,NCOMP DO 16 J = 1, NCOMP S(I) = S(I) + THETA(J)*TAU(J,I) 16 CONTINUE 15 CONTINUE DO 17 I = 1,NCOMP DO 18 J = 1, NCOMP STHTAUBYS (I) = STHTAUBYS (I) + THETA(J)*TAU(I,J)/S(J) 18 CONTINUE 17 CONTINUE DO 19 I = 1,NCOMP-1 LNGAMC(I) = 1 - PHI(I)/X(I) + ALOG(PHI(I)/X(I)) - & & 5*Q(I)*(1-PHI(I)/THETA(I) + ALOG(PHI(I)/THETA(I))) LNGAMR(I) = Q(I)*(1-ALOG(S(I))- STHTAUBYS(I) ) LNGAM(I) = LNGAMC(I) + LNGAMR(I)
229
19 CONTINUE DO 21 I = 1,NCOMP-1 A(I) = EXP(LNGAM(I))*X(I) 21 CONTINUE RETURN END