Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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
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)
! 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 !
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
!!!!!!!!!!!!!!!!!!!
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
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
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
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 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
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
30
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)
11
228
12
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 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
21
RETURN END
230