Sei sulla pagina 1di 39

APPENDIX E E.

1 FORTRAN code for the process design for cross flow configuration

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.
! PROCESSDESIGN.F90 ! ! FUNCTIONS/SUBROUTINES EXPORTED FROM PROCESSDESIGN.DLL: ! PROCESSDESIGN - SUBROUTINE ! !DEC$OBJCOMMENT LIB:'C:\WINDOWS\SYSTEM32\MASSTRANSFERCORREL.LIB' !DEC$OBJCOMMENT LIB:'C:\ATHENA\BIN\DVFATHENA.LIB' !DEC$OBJCOMMENT LIB:'C:\WINDOWS\SYSTEM32\AVWSECURITY.LIB' !DEC$OBJCOMMENT LIB:'C:\WINDOWS\SYSTEM32\CONCPOL.LIB' !DEC$OBJCOMMENT LIB:'C:\WINDOWS\SYSTEM32\Y1CALCDLL.LIB' OPTIONS /EXTEND_SOURCE

SUBROUTINE PROCESSDESIGN(NCOMPO,R,Q,TAU,PARAM,THEORY,PPERM,PSAT,DIFFUS, & & GAMM,RHO,L, UINIT, X1INIT1, RMODEL, D, DH, MU, MTCCORREL, ROL, Y1,FINIT, A1, X1RET1, IDID) ! EXPOSE SUBROUTINE PROCESSDESIGN TO USERS OF THIS DLL ! !DEC$ ATTRIBUTES DLLEXPORT::PROCESSDESIGN !DEC$ ATTRIBUTES ALIAS:'PROCESSDESIGN'::PROCESSDESIGN ! VARIABLES ! BODY OF PROCESSDESIGN IMPLICIT REAL*8(A-H,O-Z) PARAMETER (NCMAX=10,ZERO=0.0D0,ONE=1.0D0,PI=3.141592653589793D0) PARAMETER (LEQ=3,LRW=50000,LIW=5000) PARAMETER (LPAR=0,LPTS=20) PARAMETER (LMOD=0,KMOD=0) PARAMETER (MPTS=LPTS+2) ! !:VARIABLE DECLARATIONS SECTION ! DIMENSION U(LEQ),UPRIME(LEQ) DIMENSION RWORK(LRW),IWORK(LIW),RPAR(0:LPAR),IPAR(0:LPAR)

192

DIMENSION INFO(50),TOUT(LPTS+2) DIMENSION TSTOP(0:LMOD),USTOP(0:KMOD) DIMENSION UINI(LEQ),FINI(LEQ),UFEED(LEQ) REAL F1INIT, F2INIT, NCOMPO1, R1(5), Q1(5), TAU1(5,5), THEORY1, RMODEL1, & & FINIT1, UINIT1, L1, X1INIT,PPERM1, D1, DH1, MU1, ROL1, MTCCORREL1, & & DIFFUS1(5), GAMM1(5), RHO1(5), PSAT1(5), MW1(5), P11,P21, H11, H21, X1RET REAL PPERM, D, DH, MU, ROL, MTCCORREL, DIFFUS(5),GAMM(5),RHO(5), & & PSAT(5), MW(5), TAU(5,5), R(5), Q(5), THEORY, NCOMPO, & & LTH, N(5), KBL, DPBYL, IERR, X1, Y1, PARAM(5,5),L,RIERR,PARAMET(6),FEEDVEL, XMEM, PPERMDUM,RMODEL, FINIT, UINIT, X1INIT1,A1,X1RET1 INTEGER IDID ! !:EXTERNAL DECLARATIONS, COMMON BLOCKS AND DATA STATEMENTS ! EXTERNAL FDSUB,EDSUB,JDSUB,BDSUB COMMON/USRR00D/ FINI,UINI,UFEED COMMON/USRI00D/ IOFSET COMMON/WEIGHTS/ PROOT(NCMAX),WQ(NCMAX),AX(NCMAX,NCMAX),BXX(NCMAX,NCMAX) COMMON/USRR01D/ F1INIT, F2INIT, NCOMPO1, R1 , Q1 , TAU1 , THEORY1, RMODEL1, FINIT1, & & UINIT1, L1, X1INIT,PPERM1, D1, DH1, MU1, ROL1, MTCCORREL1, DIFFUS1 , & & GAMM1 , RHO1 , PSAT1 , MW1 , P11,P21, H11, H21, X1RET ! !:PERFOM DIMENSIONAL INITIALIZATION ! NEQ = LEQ NPAR = LPAR NMOD = LMOD UMOD = KMOD NPTS = LPTS+2 IF(NPTS.LE.1)NPTS=2 NPTCON = 0 ! !:PREPARE ERROR MESSAGES FILE ! LUN = 6 LUNERR = 60 OPEN(UNIT=LUN,FILE='ASDFAS.RES',STATUS='UNKNOWN') REWIND(UNIT=LUN) OPEN(UNIT=LUNERR,FILE='ASDFAS.DBG',STATUS='UNKNOWN') REWIND(UNIT=LUNERR) ! !:USER DEFINED PROBLEM PARAMETERS ! NCOMPO1 = NCOMPO DO I = 1,5 R1(I) = R(I) Q1(I) = Q(I) DIFFUS1(I) = DIFFUS(I)

193

GAMM1(I) = GAMM(I) PSAT1(I) = PSAT(I) RHO1(I) = RHO(I) DO J = 1,5 TAU1(I,J) = TAU(I,J) ENDDO ENDDO PPERM1 = PPERM THEORY1 = THEORY RMODEL1 = RMODEL NCOMP=INT(NCOMPO1) UINIT1=UINIT L1=L X1INIT = X1INIT1 D1 = D DH1 = DH MU1 = MU MTCCORREL1 = MTCCORREL ROL1 = ROL FINIT1=FINIT A=A1 X1RET=X1RET1 F1INIT=FINIT1*X1INIT F2INIT=FINIT1*(1.-X1INIT) ! !:CALLING ARGUMENTS FOR DDAPLUS. SYSTEMS OF DIFFERENTIAL AND ALGEBRAIC EQUATIONS ! IOFSET = 0 TINI = 0 TEND = A DT = (TEND - TINI)/FLOAT(NPTS-1) DO J=1,NPTS TOUT(J)=TINI+DT*FLOAT(J-1) END DO IEFORM = 0 RTOL = 1.0E-6 ATOL = 1.0E-6 ! !:INFO(1..18) ARRAY ! INFO(01) = 0 INFO(02) = 0 INFO(03) = 0 INFO(04) = 0 INFO(05) = 0 INFO(06) = 0 INFO(07) = 0 INFO(08) = 0 RWORK(3) = 0 INFO(09) = 1 IWORK(3) = 5

194

INFO(10) = 0 INFO(11) = 1 RWORK(44) = 0 INFO(12) = NPAR INFO(13) = -1 INFO(14) = 1 INFO(15) = 0 INFO(16) = 0 INFO(17) = 0 INFO(18) = 0 INFO(26) = 0 INFO(28) = 0 INFO(29) = 0 INFO(30) = 2 INFO(31) = 0 IWORK(17) = 30 IWORK(18) = 5 IWORK(21) = 1000 ! !:INITIAL VALUES FOR THE STATE VARIABLES ! U(1)=F1INIT U(2)=F2INIT U(3)=F1INIT/(F1INIT+F2INIT) ! !: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 ! 100 CONTINUE DO I=1,NPTS ILOOP = I CALL DDAPLUS(TINI,TOUT(I),NEQ,U,UPRIME,RTOL,ATOL,INFO,RWORK, & & LRW,IWORK,LIW,RPAR,IPAR,IDID,LUNERR,IEFORM, & & FDSUB,EDSUB,JDSUB,BDSUB) ! !:PRINT MODELING RESULTS ! IF(I.EQ.1.AND.IEFORM.EQ.0)THEN ! WRITE(LUN,'(A45)')' TIME U(1) U(2) U(3)' ENDIF ! WRITE(*,'(1X,4(1PE12.5,1X))')TINI,(U(J),J=1,NEQ) IF(TINI.EQ.TEND) THEN X1RET1 = U(1)/(U(1)+U(2)) Y1 = (F1INIT-U(1))/(FINIT1-(U(1)+U(2))) ENDIF IF(IDID.LT.0)GOTO 60 IF(INFO(17).GT.0 .AND. IDID.EQ.4)GOTO 80 IF(INFO(04).GT.0 .AND. IDID.EQ.5)GOTO 90 END DO GOTO 60

195

80 CONTINUE 90 CONTINUE 60 CONTINUE ! !: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 STEPS TAKEN THUS FAR..................',IWORK(11) ! WRITE(LUN,'(A49,I5)')' NUMBER OF FUNCTION EVALUATIONS..................',IWORK(12) ! 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 PROCESSDESIGN 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) PARAMETER (LEQ=3) ! !:VARIABLE DECLARATION STATEMENTS SECTION ! DIMENSION F(NEQ),U(NEQ),RPAR(0:*),IPAR(0:*) DIMENSION UINI(LEQ),FINI(LEQ),UFEED(LEQ) REAL F1INIT, F2INIT, NCOMPO1, R1(5), Q1(5), TAU1(5,5), THEORY1, & & RMODEL1, FINIT1 & & , UINIT1, L1, X1INIT,PPERM1, D1, DH1, MU1, ROL1, & & MTCCORREL1, DIFFUS1(5) & & , GAMM1(5), RHO1(5), PSAT1(5), MW1(5), P11,P21, & & H11, H21, X1RET REAL PPERM, D, DH, MU, ROL, MTCCORREL, DIFFUS(5),GAMM(5),RHO(5), & & PSAT(5), MW(5), TAU(5,5), R(5), Q(5), THEORY, NCOMPO, & & LTH, N(5), KBL1, DPBYL, IERR, X1, Y1, PARAM(5,5),L,RIERR,PARAMET(6),FEEDVEL, XMEM,FINIT,UINIT,X1INIT1

!:EXECUTABLE CODE AND COMMON BLOCKS SECTION ! COMMON/USRR00D/ FINI,UINI,UFEED COMMON/USRI00D/ IOFSET COMMON/WEIGHTS/ PROOT(NCMAX),WQ(NCMAX),AX(NCMAX,NCMAX), & & BXX(NCMAX,NCMAX) COMMON/USRR01D/ F1INIT, F2INIT, NCOMPO1, R1 , Q1 , TAU1 , & & THEORY1, RMODEL1, FINIT1, & & UINIT1, L1, X1INIT,PPERM1, D1, DH1, MU1, ROL1, & & MTCCORREL1, DIFFUS1 , GAMM1 & & , RHO1 , PSAT1 , MW1 , P11,P21, H11, H21, X1RET

196

! !:ENTER THE MODEL EQUATIONS SECTION !:RETRIEVE THE SENSITIVITY PARAMETERS ! ! MYADDITION NCOMPO = NCOMPO1 DO I = 1,5 R(I) = R1(I) Q(I) = Q1(I) DIFFUS(I) = DIFFUS1(I) GAMM(I) = GAMM1(I) PSAT(I) = PSAT1(I) RHO(I) = RHO1(I) DO J = 1,5 TAU(I,J) = TAU1(I,J) ENDDO ENDDO PPERM = PPERM1 THEORY = THEORY1 MTCCORREL = MTCCORREL1 RMODEL = RMODEL1 FINIT=FINIT1 UINIT=UINIT1 L=L1 X1INIT1 = X1INIT D = D1 DH = DH1 MU = MU1 ROL = ROL1

L = L1 X1 = U(3) !U(1)/(U(1)+U(2)) ! ! ! CALL Y1CALCDLL(NCOMPO,R,Q,TAU,PARAM,THEORY,PPERM,PSAT,DIFFUS, & GAMM,RHO,L,RMODEL,X1INIT1, Y1,N,IDID)

Y1 = X1 !XMEM = U(3)

! PRINT*, X1 ! CALL DIFFUSION(NCOMPO,XMEM,R,Q,TAU,PARAM,THEORY,PPERM,PSAT,DIFFUS, ! *GAMM,RHO,L,N,Y1,RIERR) FEEDVEL=(U(1)+U(2))/FINIT1*UINIT1 LTH=T/2.0/(FINIT1/UINIT1/DH1) IERR = 0. CALL CONCPOL(NCOMPO,R,Q,TAU,PARAM,THEORY,PPERM,PSAT,DIFFUS, &

197

& GAMM,RHO,L, FEEDVEL, X1, RMODEL, D, DH, MU, MTCCORREL, LTH, & & ROL, Y1,XMEM, N, IDID) ! PRINT*, X1, Y1, XMEM, N(1), N(2)

! CALL MASSTRANSFERCORREL(FEEDVEL,MTCCORREL,D,DH,MU,ROL,KBL1,DPBYL,LTH,PARA MET,IERR) ! PRINT*, KBL1, N(1), RHO(1), 'KKK'

! END MY ADDITION; ALSO SEE ADDITIONAL VARIABLES DECLARED IN REAL IN THIS SUBRTINE F(1)=-N(1) F(2)=-N(2) F(3)= U(3)-U(1)/(U(1)+U(2)) !U(3)-X1+N(1)/(KBL1*RHO(1)-N(1)-N(2)) !U(3) N(1)/(N(1)+N(2)) ! F(3)= U(3) - N(1)/N(2) ! !:END OF SUBROUTINE FDSUB ! RETURN END SUBROUTINE EDSUB(T, NEQ, U, E, RPAR, IPAR, IEFORM, IRES) IMPLICIT REAL*8(A-H,O-Z) PARAMETER (NCMAX=10,ZERO=0.0D0,ONE=1.0D0,PI=3.141592653589793D0) PARAMETER (LEQ=3) ! !:VARIABLE DECLARATION STATEMENTS SECTION ! DIMENSION U(*),E(*),RPAR(0:*),IPAR(0:*) DIMENSION UINI(LEQ),FINI(LEQ),UFEED(LEQ) REAL F1INIT, F2INIT, NCOMPO1, R1(5), Q1(5), TAU1(5,5), THEORY1, RMODEL1, FINIT1 & & , UINIT1, L1, X1INIT,PPERM1, D1, DH1, MU1, ROL1, MTCCORREL1, DIFFUS1(5) & & , GAMM1(5), RHO1(5), PSAT1(5), MW1(5), P11,P21, H11, H21, X1RET ! !:EXECUTABLE CODE AND COMMON BLOCKS SECTION ! COMMON/USRR00D/ FINI,UINI,UFEED COMMON/USRI00D/ IOFSET COMMON/WEIGHTS/ PROOT(NCMAX),WQ(NCMAX),AX(NCMAX,NCMAX),BXX(NCMAX,NCMAX) COMMON/USRR01D/ F1INIT, F2INIT, NCOMPO1, R1 , Q1 , TAU1 , THEORY1, RMODEL1, FINIT1, & & UINIT1, L1, X1INIT,PPERM1, D1, DH1, MU1, ROL1, MTCCORREL1, DIFFUS1 , & & GAMM1 , RHO1 , PSAT1 , MW1 , P11,P21, H11, H21, X1RET ! !:INSERT THE ELEMENTS OF THE MATRIX E(NEQ) !:RETRIEVE THE SENSITIVITY PARAMETERS !

198

DO J=1,NEQ E(J)=0.0 END DO E(1)=1. E(2)=1. E(3)=0. ! !:END OF SUBROUTINE EDSUB ! RETURN END SUBROUTINE JDSUB(T, NEQ, U, DF, RPAR, IPAR, IEFORM, IRES) IMPLICIT REAL*8(A-H,O-Z) PARAMETER (NCMAX=10,ZERO=0.0D0,ONE=1.0D0,PI=3.141592653589793D0) PARAMETER (LEQ=3) ! !:VARIABLE DECLARATION STATEMENTS SECTION ! DIMENSION U(*),DF(NEQ,*),RPAR(0:*),IPAR(0:*) DIMENSION UINI(LEQ),FINI(LEQ),UFEED(LEQ) RETURN END SUBROUTINE BDSUB(T, NEQ, U, B, JSPAR, RPAR, IPAR, IEFORM, IRES) IMPLICIT REAL*8(A-H,O-Z) PARAMETER (NCMAX=10,ZERO=0.0D0,ONE=1.0D0,PI=3.141592653589793D0) PARAMETER (LEQ=3) ! !:VARIABLE DECLARATION STATEMENTS SECTION ! DIMENSION U(NEQ),B(NEQ),RPAR(0:*),IPAR(0:*) DIMENSION UINI(LEQ),FINI(LEQ),UFEED(LEQ) REAL F1INIT, F2INIT, NCOMPO1, R1(5), Q1(5), TAU1(5,5), THEORY1, RMODEL1, & & FINIT1, UINIT1, L1, X1INIT,PPERM1, D1, DH1, MU1, ROL1, MTCCORREL1, & & DIFFUS1(5), GAMM1(5), RHO1(5), PSAT1(5), MW1(5), P11,P21, H11, H21, X1RET ! !:EXECUTABLE CODE AND COMMON BLOCKS SECTION ! COMMON/USRR00D/ FINI,UINI,UFEED COMMON/USRI00D/ IOFSET COMMON/WEIGHTS/ PROOT(NCMAX),WQ(NCMAX),AX(NCMAX,NCMAX),BXX(NCMAX,NCMAX) COMMON/USRR01D/ F1INIT, F2INIT, NCOMPO1, R1 , Q1 , TAU1 , THEORY1, RMODEL1, FINIT1, & & UINIT1, L1, X1INIT,PPERM1, D1, DH1, MU1, ROL1, MTCCORREL1, DIFFUS1 , GAMM1 & & , RHO1 , PSAT1 , MW1 , P11,P21, H11, H21, X1RET ! !:COMPUTE THE PARTIAL DERIVATIVES !:RETRIEVE THE SENSITIVITY PARAMETERS ! IRES=0 ! !:END OF SUBROUTINE BDSUB !

199

RETURN END

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

200

! BODY OF CONCPOL IMPLICIT REAL*8(A-H,O-Z) PARAMETER (NCMAX=10,ZERO=0.0D0,ONE=1.0D0,PI=3.141592653589793D0) PARAMETER (LEQ=3,LRW=50000,LIW=5000) PARAMETER (LPAR=0,LPTS=0) PARAMETER (MPTS=LPTS+2) ! !:VARIABLE DECLARATIONS SECTION ! DIMENSION U(LEQ),UPRIME(LEQ) DIMENSION RWORK(LRW),IWORK(LIW),RPAR(0:LPAR),IPAR(0:LPAR) DIMENSION INFO(50),TOUT(LPTS+2) DIMENSION UINI(LEQ),FINI(LEQ),UFEED(LEQ) REAL*8 F1INIT, F2INIT, NCOMPO1, R1(5), Q1(5), TAU1(5,5), THEORY1, RMODEL1, FINIT1 & & , UINIT1, L1, X1INIT,PPERM1, D1, DH1, MU1, ROL1, MTCCORREL1, DIFFUS1(5) & & , GAMM1(5), RHO1(5), PSAT1(5), MW1(5), P11,P21, H11, H21, X1RET REAL PPERM, D, DH, MU, ROL, MTCCORREL, DIFFUS(5),GAMM(5),RHO(5), & & PSAT(5), MW(5), TAU(5,5), R(5), Q(5), THEORY, NCOMPO, & & LTH, N(5), KBL, DPBYL, IERR, X1, Y1, PARAM(5,5),L,RIERR,PARAMET(6),FEEDVEL, XMEM, PPERMDUM,RMODEL, FINIT, UINIT, X1INIT1 ! !:EXTERNAL DECLARATIONS, COMMON BLOCKS AND DATA STATEMENTS ! EXTERNAL FDSUB,EDSUB,JDSUB,BDSUB COMMON/USRR00D/ FINI,UINI,UFEED COMMON/WEIGHTS/ PROOT(NCMAX),WQ(NCMAX),AX(NCMAX,NCMAX),BXX(NCMAX,NCMAX) COMMON/USRR01D/ F1INIT, F2INIT, NCOMPO1, R1 , Q1 , TAU1 , THEORY1, RMODEL1, FINIT1, UINIT1 & & , L1, X1INIT,PPERM1, D1, DH1, MU1, ROL1, MTCCORREL1, DIFFUS1 , GAMM1 & & , RHO1 , PSAT1 , MW1 , P11,P21, H11, H21, X1RET, LTH1 ! !:PERFOM DIMENSIONAL INITIALIZATION ! NEQ = LEQ NPAR = LPAR NPTCON = 0 ! !:PREPARE ERROR MESSAGES FILE ! LUN = 6 LUNERR = 60 OPEN(UNIT=LUN,FILE='Y1CALC.RES',STATUS='UNKNOWN') REWIND(UNIT=LUN) OPEN(UNIT=LUNERR,FILE='Y1CALC.DBG',STATUS='UNKNOWN') REWIND(UNIT=LUNERR) ! !:USER DEFINED PROBLEM PARAMETERS ! NCOMPO1 = NCOMPO

201

DO I = 1,5 R1(I) = R(I) Q1(I) = Q(I) DIFFUS1(I) = DIFFUS(I) GAMM1(I) = GAMM(I) PSAT1(I) = PSAT(I) RHO1(I) = RHO(I) DO J = 1,5 TAU1(I,J) = TAU(I,J) ENDDO ENDDO PPERM1 = PPERM THEORY1 = THEORY RMODEL1 = RMODEL NCOMP=INT(NCOMPO1) UINIT1=UINIT L1=L X1INIT = X1INIT1 D1 = D DH1 = DH MU1 = MU MTCCORREL1 = MTCCORREL LTH1 = LTH ROL1 = ROL ! F1INIT=FINIT1*X1INIT ! F2INIT=FINIT1*(1.-X1INIT) ! !:CALLING ARGUMENTS FOR DDAPLUS: ALGEBRAIC EQUATIONS ONLY ! TINI = 0.0 TEND = 0.0 IEFORM = 0 RTOL = 1.0E-6 ATOL = 1.0E-6 ! !:INFO(1..18) ARRAY ! INFO(01) = 0 INFO(02) = 0 INFO(03) = 0 INFO(04) = 0 INFO(05) = 0 INFO(06) = 0 INFO(07) = 0 INFO(08) = 0 INFO(09) = 0 INFO(10) = 0 INFO(11) = 1 RWORK(44) = 0 INFO(12) = NPAR INFO(13) = -1 INFO(14) = 0 INFO(15) = 0

202

INFO(16) = 0 INFO(17) = 0 INFO(18) = 0 INFO(26) = 0 INFO(28) = 0 INFO(29) = 1 INFO(30) = 2 INFO(31) = 0 IWORK(17) = 30 IWORK(18) = 5 IWORK(21) = 1000 ! !:INITIAL VALUES FOR DDAPLUS ! !MY ADDITION + PLUS LOOK AT ABOVE DECLARED VARIABLES NCOMPO = NCOMPO1 DO I = 1,5 R(I) = R1(I) Q(I) = Q1(I) DIFFUS(I) = DIFFUS1(I) GAMM(I) = GAMM1(I) PSAT(I) = PSAT1(I) RHO(I) = RHO1(I) DO J = 1,5 TAU(I,J) = TAU1(I,J) ENDDO ENDDO PPERM = PPERM1 THEORY = THEORY1 RMODEL = RMODEL1 D = D1 DH = DH1 MU = MU1 MTCCORREL = MTCCORREL1 LTH = LTH1 ROL = ROL1 FEEDVEL=UINIT1

L = L1 X1 = X1INIT PPERMDUM = 0. CALL MASSTRANSFERCORREL(FEEDVEL,MTCCORREL,DIFFUS,DH,MU,RHO,KBL,DPBYL,LTH,P ARAMET,RIERR) CALL Y1CALCDLL(NCOMPO,R,Q,TAU,PARAM,THEORY,PPERM,PSAT,DIFFUS, & & GAMM,RHO,L, RMODEL, X1, Y1,N,IDID) !END MY ADDTION U(1)= (N(1)-KBL*RHO(1)*X1INIT)/(N(1) + N(2) - KBL*RHO(1)) !1.E-4

203

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)

204

PARAMETER (LEQ=3) ! !:VARIABLE DECLARATION STATEMENTS SECTION ! DIMENSION F(NEQ),U(NEQ),RPAR(0:*),IPAR(0:*) DIMENSION UINI(LEQ),FINI(LEQ),UFEED(LEQ) REAL*8 F1INIT, F2INIT, NCOMPO1, R1(5), Q1(5), TAU1(5,5), THEORY1, RMODEL1, FINIT1 & & , UINIT1, L1, X1INIT,PPERM1, D1, DH1, MU1, ROL1, MTCCORREL1, DIFFUS1(5) & & , GAMM1(5), RHO1(5), PSAT1(5), MW1(5), P11,P21, H11, H21, X1RET REAL PPERM, D, DH, MU, ROL, MTCCORREL, DIFFUS(5),GAMM(5),RHO(5), & & PSAT(5), MW(5), TAU(5,5), R(5), Q(5), THEORY, NCOMPO, & & LTH, N(5), KBL, DPBYL, IERR, X1, Y1, PARAM(5,5),L,RIERR,PARAMET(6),FEEDVEL, XMEM, RMODEL, FINIT, UINIT, X1INIT1 ! !:EXECUTABLE CODE AND COMMON BLOCKS SECTION ! COMMON/USRR00D/ FINI,UINI,UFEED COMMON/WEIGHTS/ PROOT(NCMAX),WQ(NCMAX),AX(NCMAX,NCMAX),BXX(NCMAX,NCMAX) COMMON/USRR01D/ F1INIT, F2INIT, NCOMPO1, R1 , Q1 , TAU1 , THEORY1, RMODEL1, FINIT1, UINIT1 & & , L1, X1INIT,PPERM1, D1, DH1, MU1, ROL1, MTCCORREL1, DIFFUS1 , GAMM1 & & , RHO1 , PSAT1 , MW1 , P11,P21, H11, H21, X1RET, LTH1 ! !:RETRIEVE THE SENSITIVITY PARAMETERS IF ANY !:ENTER THE ALGEBRAIC MODEL EQUATIONS SECTION ! NCOMPO = NCOMPO1 DO I = 1,5 R(I) = R1(I) Q(I) = Q1(I) DIFFUS(I) = DIFFUS1(I) GAMM(I) = GAMM1(I) PSAT(I) = PSAT1(I) RHO(I) = RHO1(I) DO J = 1,5 TAU(I,J) = TAU1(I,J) ENDDO ENDDO PPERM = PPERM1 THEORY = THEORY1 RMODEL = RMODEL1 MTCCORREL = MTCCORREL1 D = D1 DH = DH1 MU = MU1 ROL = ROL1 FEEDVEL = UINIT1

205

LTH = LTH1 L = L1 X1 = U(1) ! ! ! Y1 = U(3)

!!!!!!!!!!!!!!!!!!!

CALL DIFFUSION(NCOMPO,X1,R,Q,TAU,PARAM,THEORY,PPERM,PSAT,DIFFUS, & & GAMM,RHO,L,N,Y1,RIERR) CALL MASSTRANSFERCORREL(FEEDVEL,MTCCORREL,DIFFUS,DH,MU,RHO,KBL,DPBYL,LTH,P ARAMET,RIERR) CALL Y1CALCDLL(NCOMPO,R,Q,TAU,PARAM,THEORY,PPERM,PSAT,DIFFUS, & & GAMM,RHO,L, RMODEL, X1, Y1,N,IDID)

F(1)=U(1)-(N(1)-KBL*RHO(1)*X1INIT)/(N(1) + N(2) - KBL*RHO(1)) F(2)=U(2)-N(1) F(3)=U(3)-N(2) ! !:END OF SUBROUTINE FDSUB ! RETURN END SUBROUTINE JDSUB(T, NEQ, U, DF, RPAR, IPAR, IEFORM, IRES) IMPLICIT REAL*8(A-H,O-Z) PARAMETER (NCMAX=10,ZERO=0.0D0,ONE=1.0D0,PI=3.141592653589793D0) PARAMETER (LEQ=3) ! !:VARIABLE DECLARATION STATEMENTS SECTION ! DIMENSION U(*),DF(NEQ,*),RPAR(0:*),IPAR(0:*) DIMENSION UINI(LEQ),FINI(LEQ),UFEED(LEQ) RETURN END SUBROUTINE BDSUB(T, NEQ, U, B, JSPAR, RPAR, IPAR, IEFORM, IRES) IMPLICIT REAL*8(A-H,O-Z) PARAMETER (NCMAX=10,ZERO=0.0D0,ONE=1.0D0,PI=3.141592653589793D0) ! !:VARIABLE DECLARATION STATEMENTS SECTION: DUMMY SUBROUTINE ! DIMENSION U(*),B(*),RPAR(0:*),IPAR(0:*) RETURN END SUBROUTINE EDSUB(T, NEQ, U, E, RPAR, IPAR, IEFORM, IRES) IMPLICIT REAL*8(A-H,O-Z) PARAMETER (NCMAX=10,ZERO=0.0D0,ONE=1.0D0,PI=3.141592653589793D0) ! !:VARIABLE DECLARATION STATEMENTS SECTION: DUMMY SUBROUTINE ! DIMENSION U(*),E(*),RPAR(0:*),IPAR(0:*) RETURN END

206

SUBROUTINE MASSTRANSFERCORREL(U,RMTCCORREL,DIFF,H,MU,RHO,KBL,DPBYL,LMOD,PARAME T, 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 solve the various equations.
! Y1CALCDLL.F90 ! ! FUNCTIONS/SUBROUTINES EXPORTED FROM Y1CALCDLL.DLL: ! Y1CALCDLL - SUBROUTINE ! !DEC$OBJCOMMENT LIB:'C:\ATHENA\BIN\DVFATHENA.LIB' !DEC$OBJCOMMENT LIB:'C:\WINDOWS\SYSTEM32\AVWSECURITY.LIB' OPTIONS /EXTEND_SOURCE

211

SUBROUTINE Y1CALCDLL(NCOMPO,R,Q,TAU,PARAM,THEORY,PPERM,PSAT,DIFFUS, & & GAMM,RHO,L, RMODEL, X1, Y1,N, IDID) ! EXPOSE SUBROUTINE Y1CALCDLL TO USERS OF THIS DLL ! !DEC$ ATTRIBUTES DLLEXPORT::Y1CALCDLL ! VARIABLES ! BODY OF Y1CALCDLL IMPLICIT REAL*8(A-H,O-Z) PARAMETER (NCMAX=10,ZERO=0.0D0,ONE=1.0D0,PI=3.141592653589793D0) PARAMETER (LEQ=3,LRW=50000,LIW=5000) PARAMETER (LPAR=0,LPTS=0) PARAMETER (MPTS=LPTS+2) ! !:VARIABLE DECLARATIONS SECTION ! DIMENSION U(LEQ),UPRIME(LEQ) DIMENSION RWORK(LRW),IWORK(LIW),RPAR(0:LPAR),IPAR(0:LPAR) DIMENSION INFO(50),TOUT(LPTS+2) DIMENSION UINI(LEQ),FINI(LEQ),UFEED(LEQ) REAL*8 F1INIT, F2INIT, NCOMPO1, R1(5), Q1(5), TAU1(5,5), THEORY1, RMODEL1, FINIT1 & & , UINIT1, L1, X1INIT,PPERM1, D1, DH1, MU1, ROL1, MTCCORREL1, DIFFUS1(5) & & , GAMM1(5), RHO1(5), PSAT1(5), MW1(5), P11,P21, H11, H21, X1RET REAL PPERM, D, DH, MU, ROL, MTCCORREL, DIFFUS(5),GAMM(5),RHO(5), & & PSAT(5), MW(5), TAU(5,5), R(5), Q(5), THEORY, NCOMPO, & & LTH, N(5), KBL1, DPBYL, IERR, X1, Y1, PARAM(5,5),L,RIERR,PARAMET(6),FEEDVEL, XMEM, PPERMDUM,RMODEL, FINIT, UINIT, X1INIT1 ! !:EXTERNAL DECLARATIONS, COMMON BLOCKS AND DATA STATEMENTS ! EXTERNAL FDSUB,EDSUB,JDSUB,BDSUB COMMON/USRR00D/ FINI,UINI,UFEED COMMON/WEIGHTS/ PROOT(NCMAX),WQ(NCMAX),AX(NCMAX,NCMAX),BXX(NCMAX,NCMAX) COMMON/USRR01D/ F1INIT, F2INIT, NCOMPO1, R1 , Q1 , TAU1 , THEORY1, RMODEL1, FINIT1, UINIT1 & & , L1, X1INIT,PPERM1, D1, DH1, MU1, ROL1, MTCCORREL1, DIFFUS1 , GAMM1 & & , RHO1 , PSAT1 , MW1 , P11,P21, H11, H21, X1RET ! !:PERFOM DIMENSIONAL INITIALIZATION ! NEQ = LEQ NPAR = LPAR NPTCON = 0 ! !:PREPARE ERROR MESSAGES FILE ! LUN = 6

212

LUNERR = 60 ! OPEN(UNIT=LUN,FILE='Y1CALC.RES',STATUS='UNKNOWN') ! REWIND(UNIT=LUN) ! OPEN(UNIT=LUNERR,FILE='Y1CALC.DBG',STATUS='UNKNOWN') ! REWIND(UNIT=LUNERR) ! !:USER DEFINED PROBLEM PARAMETERS ! NCOMPO1 = NCOMPO DO I = 1,5 R1(I) = R(I) Q1(I) = Q(I) DIFFUS1(I) = DIFFUS(I) GAMM1(I) = GAMM(I) PSAT1(I) = PSAT(I) RHO1(I) = RHO(I) DO J = 1,5 TAU1(I,J) = TAU(I,J) ENDDO ENDDO PPERM1 = PPERM THEORY1 = THEORY RMODEL1 = RMODEL NCOMP=INT(NCOMPO1) L1=L X1INIT = X1 ! !:CALLING ARGUMENTS FOR DDAPLUS: ALGEBRAIC EQUATIONS ONLY ! TINI = 0.0 TEND = 0.0 IEFORM = 0 RTOL = 1.0E-6 ATOL = 1.0E-6 ! !:INFO(1..18) ARRAY ! INFO(01) = 0 INFO(02) = 0 INFO(03) = 0 INFO(04) = 0 INFO(05) = 0 INFO(06) = 0 INFO(07) = 0 INFO(08) = 0 INFO(09) = 0 INFO(10) = 0 INFO(11) = 1 RWORK(44) = 0 INFO(12) = NPAR INFO(13) = -1 INFO(14) = 0 INFO(15) = 0

213

INFO(16) = 0 INFO(17) = 0 INFO(18) = 0 INFO(26) = 0 INFO(28) = 0 INFO(29) = 1 INFO(30) = 2 INFO(31) = 0 IWORK(17) = 30 IWORK(18) = 5 IWORK(21) = 1000 ! !:INITIAL VALUES FOR DDAPLUS ! !MY ADDITION + PLUS LOOK AT ABOVE DECLARED VARIABLES NCOMPO = NCOMPO1 DO I = 1,5 R(I) = R1(I) Q(I) = Q1(I) DIFFUS(I) = DIFFUS1(I) GAMM(I) = GAMM1(I) PSAT(I) = PSAT1(I) RHO(I) = RHO1(I) DO J = 1,5 TAU(I,J) = TAU1(I,J) ENDDO ENDDO PPERM = PPERM1 THEORY = THEORY1 RMODEL = RMODEL1

L = L1 X1 = X1INIT PPERMDUM = 0. CALL DIFFUSION(NCOMPO,X1,R,Q,TAU,PARAM,THEORY,PPERMDUM,PSAT,DIFFUS, & & GAMM,RHO,L,N,Y1,RIERR) !END MY ADDTION U(1)= N(1)/(N(1)+N(2))!1.E-4 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 !

214

! 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 Y1 = 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 Y1CALCDLL

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) PARAMETER (LEQ=3) ! !:VARIABLE DECLARATION STATEMENTS SECTION ! DIMENSION F(NEQ),U(NEQ),RPAR(0:*),IPAR(0:*) DIMENSION UINI(LEQ),FINI(LEQ),UFEED(LEQ) REAL*8 F1INIT, F2INIT, NCOMPO1, R1(5), Q1(5), TAU1(5,5), THEORY1, RMODEL1, FINIT1 & & , UINIT1, L1, X1INIT,PPERM1, D1, DH1, MU1, ROL1, MTCCORREL1, DIFFUS1(5) & & , GAMM1(5), RHO1(5), PSAT1(5), MW1(5), P11,P21, H11, H21, X1RET REAL PPERM, D, DH, MU, ROL, MTCCORREL, DIFFUS(5),GAMM(5),RHO(5), & & PSAT(5), MW(5), TAU(5,5), R(5), Q(5), THEORY, NCOMPO, &

215

& LTH, N(5), KBL1, DPBYL, IERR, X1, Y1, PARAM(5,5),L,RIERR,PARAMET(6),FEEDVEL, XMEM, RMODEL ! !:EXECUTABLE CODE AND COMMON BLOCKS SECTION ! COMMON/USRR00D/ FINI,UINI,UFEED COMMON/WEIGHTS/ PROOT(NCMAX),WQ(NCMAX),AX(NCMAX,NCMAX),BXX(NCMAX,NCMAX) COMMON/USRR01D/ F1INIT, F2INIT, NCOMPO1, R1 , Q1 , TAU1 , THEORY1, RMODEL1, FINIT1, UINIT1 & & , L1, X1INIT,PPERM1, D1, DH1, MU1, ROL1, MTCCORREL1, DIFFUS1 , GAMM1 & & , RHO1 , PSAT1 , MW1 , P11,P21, H11, H21, X1RET ! !:RETRIEVE THE SENSITIVITY PARAMETERS IF ANY !:ENTER THE ALGEBRAIC MODEL EQUATIONS SECTION ! NCOMPO = NCOMPO1 DO I = 1,5 R(I) = R1(I) Q(I) = Q1(I) DIFFUS(I) = DIFFUS1(I) GAMM(I) = GAMM1(I) PSAT(I) = PSAT1(I) RHO(I) = RHO1(I) DO J = 1,5 TAU(I,J) = TAU1(I,J) ENDDO ENDDO PPERM = PPERM1 THEORY = THEORY1 RMODEL = RMODEL1 MTCCORREL = MTCCORREL1 D = D1 DH = DH1 MU = MU1 ROL = ROL1

L = L1 X1 = X1INIT Y1 = U(3) CALL DIFFUSION(NCOMPO,X1,R,Q,TAU,PARAM,THEORY,PPERM,PSAT,DIFFUS, & & GAMM,RHO,L,N,Y1,RIERR) F(1)=U(1)-N(1)/(N(1)+N(2)) F(2)=U(2)-N(1) F(3)=U(3)-N(2) ! !:END OF SUBROUTINE FDSUB ! RETURN

216

END SUBROUTINE JDSUB(T, NEQ, U, DF, RPAR, IPAR, IEFORM, IRES) IMPLICIT REAL*8(A-H,O-Z) PARAMETER (NCMAX=10,ZERO=0.0D0,ONE=1.0D0,PI=3.141592653589793D0) PARAMETER (LEQ=3) ! !:VARIABLE DECLARATION STATEMENTS SECTION ! DIMENSION U(*),DF(NEQ,*),RPAR(0:*),IPAR(0:*) DIMENSION UINI(LEQ),FINI(LEQ),UFEED(LEQ) RETURN END SUBROUTINE BDSUB(T, NEQ, U, B, JSPAR, RPAR, IPAR, IEFORM, IRES) IMPLICIT REAL*8(A-H,O-Z) PARAMETER (NCMAX=10,ZERO=0.0D0,ONE=1.0D0,PI=3.141592653589793D0) ! !:VARIABLE DECLARATION STATEMENTS SECTION: DUMMY SUBROUTINE ! DIMENSION U(*),B(*),RPAR(0:*),IPAR(0:*) RETURN END SUBROUTINE EDSUB(T, NEQ, U, E, RPAR, IPAR, IEFORM, IRES) IMPLICIT REAL*8(A-H,O-Z) PARAMETER (NCMAX=10,ZERO=0.0D0,ONE=1.0D0,PI=3.141592653589793D0) ! !:VARIABLE DECLARATION STATEMENTS SECTION: DUMMY SUBROUTINE ! DIMENSION U(*),E(*),RPAR(0:*),IPAR(0:*) RETURN END

SUBROUTINE DIFFUSION(NCOMPO,X,R,Q,TAU,PARAM,THEORY,PPERM,PSAT, & & DIFFUS,GAMM,RHO,MEMBTHICK,N,Y1,RIERR) INTEGER NC,I REAL NCOMPO, R(5), Q(5), TAU(5,5), X(5), THEORY, PPERM, PSAT(5), & & DIFFUS(5), GAMM(5), RHO(5), MEMBTHICK, N(5) REAL A(5),PHIF(5), PHIP(5),RIERR,Y1,Y(5),AP(5), PARAM(5,3) INTEGER IERR COMMON /ERROR/ IERR IERR = 0 NC = INT(NCOMPO) X(2) = 1. - X(1) Y(1) = Y1 Y(2) = 1.-Y1 !VALID FOR BINARY FEED ONLY CALL UNIQUAC(NCOMPO, A, R, Q, TAU, X) CALL UNIQPOLY(THEORY, NCOMPO, A, R, Q, TAU,PARAM, PHIF) DO 10 I = 1,(NC - 1)

217

AP(I) = Y(I)*PPERM / PSAT(I) !!*** IF(AP(I).LT.01*A(I)) AP(I) = 0. 10 ENDDO CALL UNIQPOLY(THEORY, NCOMPO, AP, R, Q, TAU,PARAM, PHIP) RIERR = FLOAT(IERR) 15 DO 20 I = 1,(NC - 1) IF(GAMM(I).EQ.0.) THEN N(I) = DIFFUS(I) * RHO(I) / MEMBTHICK *(PHIF(I)-PHIP(I)) ELSE N(I) = DIFFUS(I) * RHO(I) / MEMBTHICK * (EXP(GAMM(I) * & & PHIF(I)) / GAMM(I) - EXP(GAMM(I) * PHIP(I)) / GAMM(I)) ENDIF 20 ENDDO

END SUBROUTINE DIFFUSION

SUBROUTINE UNIQPOLY(THEORY,NCOMPO,A,R,Q,TAU,PARAM,PHI) IMPLICIT NONE INTEGER N,I,J,NCOMP,THEORYNO,NCOMPDUM REAL NCOMPO,THEORY REAL PHI(5), A(5), R(5), Q(5), TAU(5,5), PARAM(5,3) REAL PHIDUM(5), ADUM(5), RDUM(5),QDUM(5),TAUDUM(5,5),PARAMDUM(5,3) !! REAL F(5),W(5),SW,SWBYRO,RO(5) EXTERNAL NEWT LOGICAL CHECK INTEGER IERR COMMON /ERROR/ IERR

NCOMP = INT(NCOMPO) THEORYNO = INT(THEORY) N = NCOMP - 1 IERR = 0 DO 10 I = 1, 99 DO 20 J = 1,99 IERR = 0 CHECK = .TRUE. PHI(1) = .01*I IF (NCOMP.GT.2) THEN PHI(2) = .01*J IF((A(1).EQ.0.).AND.(A(2).EQ.0.))THEN PHI(1) = 0. PHI(2) = 0.

218

GOTO 30 ENDIF IF (A(1).EQ.0.) THEN NCOMPDUM = 2 RDUM(2) = R(3) QDUM(2) = Q(3) ADUM(1) = A(2) PHIDUM(1) = PHI(2) RDUM(1) = R(2) QDUM(1) = Q(2) TAUDUM(1,1) = 1.0 TAUDUM(2,2) = 1.0 TAUDUM(1,2) = TAU(2,3) TAUDUM(2,1) = TAU(3,2) PARAMDUM(1,1) = PARAMDUM(2,1) PARAMDUM(1,2) = PARAMDUM(2,2) PARAMDUM(1,3) = PARAMDUM(2,3) N = NCOMPDUM - 1 CALL NEWT(PHIDUM,N,CHECK, NCOMPDUM,THEORYNO, ADUM, RDUM,QDUM,TAUDUM,PARAMDUM,IERR) PHI(1) = 0.0 PHI(2) = PHIDUM(1) PHI(3) = PHIDUM(2) ENDIF IF (A(2).EQ.0.) THEN NCOMPDUM = 2 PHIDUM(1) = PHI(2) RDUM(2) = R(3) QDUM(2) = Q(3) TAUDUM(1,1) = 1.0 TAUDUM(2,2) = 1.0 TAUDUM(1,2) = TAU(1,3) TAUDUM(2,1) = TAU(3,1) N = NCOMPDUM - 1 CALL NEWT(PHIDUM,N,CHECK, NCOMPDUM,THEORYNO, ADUM, RDUM,QDUM,TAUDUM,PARAMDUM,IERR) PHI(1) = PHIDUM(1) PHI(2) = 0.0 PHI(3) = PHIDUM(2) ENDIF ENDIF IF ((A(1).NE.0.).AND.(A(2).NE.0.)) CALL NEWT(PHI,N,CHECK, NCOMP, THEORYNO, A, R,Q,TAU,PARAM,IERR) IF ((NOT(CHECK)).AND.(IERR.EQ.0)) GOTO 30 IF ((NCOMP.LE.2).AND.(A(1).EQ.0.)) THEN PHI(1) = 0. GOTO 30 ENDIF 20 ENDDO 10 ENDDO IERR = 5 30 END SUBROUTINE UNIQPOLY

219

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 CONTINUE

18

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

13

14

15

16

DO 13 I=1,N SLOPE=SLOPE+G(I)*P(I) 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 CONTINUE ALAMIN=TOLX/TEST ALAM=1. CONTINUE DO 15 I=1,N X(I)=XOLD(I)+ALAM*P(I) 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) 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

11

12

13 14

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) CONTINUE ELSE IF (SUM.NE.0.) THEN II=I ENDIF B(I)=SUM CONTINUE DO 14 I=N,1,-1 SUM=B(I) DO 13 J=I+1,N SUM=SUM-A(I,J)*B(J) CONTINUE B(I)=SUM/A(I,I) 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

15

16

17

18 19

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) CONTINUE A(I,J)=SUM DUM=VV(I)*ABS(SUM) IF (DUM.GE.AAMAX) THEN IMAX=I AAMAX=DUM ENDIF 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 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 CONTINUE ENDIF 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 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) CONTINUE ENDIF IF(THEORYNO.EQ.1) THEN SPQBYRI = 0.0 DO 11 I = 1, NCOMP-1 SPQBYRI = PHI(I)*Q(I)/R(I)+SPQBYRI CONTINUE SPQBYRI = SPQBYRI + PHI(NCOMP)*Q(NCOMP)/R(NCOMP)

11

14

DO 14 I = 1, NCOMP-1 THETA(I) = PHI(I)*Q(I)/R(I)/SPQBYRI S(I) = 0.0 STHTAUBYS (I) = 0.0 CONTINUE THETA(NCOMP) = PHI(NCOMP)*Q(NCOMP)/R(NCOMP)/SPQBYRI S(NCOMP) = 0.0 STHTAUBYS(NCOMP) = 0.0

16 15

DO 15 I = 1,NCOMP DO 16 J = 1, NCOMP S(I) = S(I) + THETA(J)*TAU(J,I) CONTINUE CONTINUE DO 17 I = 1,NCOMP DO 18 J = 1, NCOMP STHTAUBYS (I) = STHTAUBYS (I) + THETA(J)*TAU(I,J)/S(J) CONTINUE CONTINUE DO 24 I = 1, NCOMP L(I) = 5.0*(R(I)-Q(I))-(R(I)-1.0) CONTINUE SPHLBYR = 0.0

18 17

24

226

25

DO 25 I = 1, NCOMP SPHLBYR = SPHLBYR + PHI(I)*L(I)/R(I) 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-HUGGINSKONINGSVELD-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 100

CONTINUE 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 CONTINUE XNCOMP = 1 - SXI

SXIRI = 0.0 DO 11 I = 1, NCOMP-1 SXIRI = X(I)*R(I)+SXIRI CONTINUE

11

228

SXIRI = SXIRI + XNCOMP*R(NCOMP)

12

DO 12 I = 1, NCOMP-1 PHI(I) = X(I)*R(I)/SXIRI CONTINUE PHI(NCOMP) = XNCOMP*R(NCOMP)/SXIRI

SXIQI = 0.0 DO 13 I = 1, NCOMP-1 SXIQI = X(I)*Q(I)+SXIQI CONTINUE SXIQI = SXIQI + XNCOMP*Q(NCOMP)

13

14

DO 14 I = 1, NCOMP-1 THETA(I) = X(I)*Q(I)/SXIQI S(I) = 0.0 STHTAUBYS (I) = 0.0 CONTINUE THETA(NCOMP) = XNCOMP*Q(NCOMP)/SXIQI S(NCOMP) = 0.0 STHTAUBYS(NCOMP) = 0.0

16 15

DO 15 I = 1,NCOMP DO 16 J = 1, NCOMP S(I) = S(I) + THETA(J)*TAU(J,I) CONTINUE CONTINUE

DO 17 I = 1,NCOMP DO 18 J = 1, NCOMP STHTAUBYS (I) = STHTAUBYS (I) + THETA(J)*TAU(I,J)/S(J) CONTINUE 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)

18 17

229

19

CONTINUE DO 21 I = 1,NCOMP-1 A(I) = EXP(LNGAM(I))*X(I) CONTINUE

21

RETURN END

230

Potrebbero piacerti anche