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
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
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
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
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,PARAMET,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,PARAMET,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,PARAMET,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,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
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 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