App C-E Pages From My PhD Thesis-1

53
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

Transcript of App C-E Pages From My PhD Thesis-1

USE NUMERICAL_LIBRARIES IMPLICIT NONE C DECLARATION OF VARIABLES INTEGER NN, NP, IDO, NOUT PARAMETER (NN=18, NP=100) EXTERNAL FCN REAL ADUM, A, Y(NN),TOL, PARAM(50) C ADUM = MEMBRANE AREA, A = TOTAL MEMBRANE AREA OF MODULE C Y(1) = F1 = FEED-SIDE MOLAR FLOW RATE OF COMPONENT 1 C Y(2) = F = TOTAL FEED-SIDE MOLAR FLOW RATE OPEN (UNIT = 1, FILE = 'OUTCF.TXT') A = 100.0 C VALUES OF PARAMETERS RELATED TO THE NUMERICAL METHOD IDO = 1 TOL = 0.5 PARAM(4) = 50000 C INITIAL VALUES ADUM = 0.0 Y(1) = 0.1 Y(2) = 10.0 Y(3) = Y(2) Y(4) = 0.3 Y(5) = 0.4 Y(6) = 0.00025 Y(7) = 1.27E-7 Y(8) = 1.70E-7 Y(9) = 4.816 Y(10) = 23.0 Y(11) = 0.0011 Y(12) = 9.06E-4 Y(13) = 55.56 Y(14) = 9.96E-10 Y(15) = 0.57 Y(16) = 0.46 Y(17) = 0.33 Y(18) = 0.0 CALL IVPRK (IDO, NN, FCN, ADUM, A, TOL, PARAM, Y) WRITE (1,100) 100 FORMAT (2X, 'AREA', 9X, 'Y1', 11X, 'Y2') WRITE (1,'(3F12.3)') ADUM, Y(1), Y(2) END

178

Mitesh
Text Box
APPENDIX C FORTRAN PROGRAMS FOR VARIOUS FLOW CONFIGURATIONS 1. Crossflow

SUBROUTINE FCN(NN, ADUM, Y, YPRIME) REAL Y(18), YPRIME(18), ADUM C Y(1) = F1 = FEED-SIDE MOLAR FLOW RATE OF COMPONENT 1 C Y(2) = F = TOTAL FEED-SIDE MOLAR FLOW RATE INTEGER NN,I REAL L, P1, P2, H1, H2 C L = MEMBRANE THICKNESS, P1 = PERMEABILITY OF COMPONENT 1, C P2 = PERMEABILITY OF COMPONENT 2, C H1, H2 ARE REFERRED TO AS HENRY'S CONSTANTS REAL FINIT,UINIT,D, DH, LTH, MU, ROL, A1, B1,C1,D1,A11 C FINIT = TOTAL FEED-SIDE MOLAR FLOW RATE AT ENTRANCE C UINIT = FEED-SIDE VELOCITY AT ENTRANCE C D = DIFFUSIVITY OF COMPONENT 1 IN COMPONENT2 C DH = HYDRAULIC DIAMETER ON THE FEED-SIDE C LTH = LENGTH OF MEMBRANE MODULE C MU = VISCOSITY OF THE SOLUTION C ROL = DENSITY OF THE SOLUTION C A1,B1,C1,D1,A11 ARE COEFFICENTS FOR THE MASS TRANSFER CORRELATION REAL U, KBL1, X1, B, C, Z, Y1 C U = FEED-SIDE VELOCITY C KBL1 = BOUNDARY LAYER MASS TRANSFER COEFFICIENT C X1 = FEED-SIDE MOLE FRACTION C Y1 = PERMEATE SIDE MOLE FRACTION C B,C = COEFFICIENTS FOR THE QUADRATIC EQUATION OBTAINED FOR CROSS C FLOW C Z = DUMMY VARIABLE REAL PPERM, KOV1, KOV2 C PPERM = PERMEATE-SIDE PRESSURE C KOV1, KOV2 = OVERALL MASS TRANSFER COEFFICENTS FOR COMPONENTS 1 C AND 2 C EXPLICIT ALGEBRAIC EQUATIONS PPERM = Y(5) L = Y(6) P1 = Y(7) P2 = Y(8) H1 = Y(9) H2 = Y(10) FINIT = Y(3) UINIT = Y(4) C--------------------------------------------------------------------------------- C DATA REQD TO CALC MASS TRANSFER COEFF.

179

C CORREL FOR SPIRAL WOUND MODULE FROM HICKEY GOODING IS USED HERE C--------------------------------------------------------------------------------- D = Y(14) DH = Y(11) LTH = ADUM/2.0/(FINIT/UINIT/DH) C FOR HOLLOW FIBERS, LTH = ADUM/(3.1416*DH*NFIBERS), C WHERE NFIBERS=NO. OF HOLLOW FIBERS IN PARALLEL C = FINIT/UINIT/(3.1416*D**2/4) MU = Y(12) ROL = Y(13) A1 = Y(15) B1 = Y(16) C1 = Y(17) D1 = Y(18) A11 = D/DH*A1*(DH*ROL/MU)**B1*(MU/ROL/D)**C1*(DH/LTH)**D1 C Sh = KBL1*DH/D = A1*Re**B1*Sc**C1*(DH/LTH)**D1 C HENCE, KBL1= D/DH*A1*(DH*U*ROL/MU)**B1*(MU/ROL/D)**C1*(DH/LTH)**D1 C = A11*U**B1 C---------------------------------------------------------------------------------- C PERVAPORATION MODEL C---------------------------------------------------------------------------------- U = Y(2)/FINIT*UINIT KBL1 = A11*U**B1 KOV1 = 1.0/(L/P1 + 1.0/KBL1) KOV2 = P2/L X1 = Y(1)/Y(2) B = - ((KOV1 - KOV2)*X1 + KOV2 )/(KOV1*PPERM/H1 - KOV2*PPERM/H2) - 1 C = KOV1*X1/(KOV1*PPERM/H1 - KOV2*PPERM/H2) IF (C.GE.0) THEN Z = 1.0 ELSE Z = -1.0 ENDIF Y1 = (-B-Z*(B**2.0-4.0*C)**0.5)/2.0 YPRIME(1)=-(KOV1*ROL*(X1-Y1*PPERM/H1)) YPRIME(2)=-(KOV1*ROL*(X1-Y1*PPERM/H1) + 1KOV2*ROL*((1-X1)-(1-Y1)*PPERM/H2))

180

DO I = 3,18 YPRIME(I) = 0.0 ENDDO RETURN END

2. Cocurrent Flow USE NUMERICAL_LIBRARIES IMPLICIT NONE C DECLARATION OF VARIABLES INTEGER NN, NP, IDO, NOUT PARAMETER (NN=20, NP=100) EXTERNAL FCN REAL ADUM, A, Y(NN),TOL, PARAM(50) C ADUM = MEMBRANE AREA, A = TOTAL MEMBRANE AREA OF MODULE C Y(1) = F1 = FEED-SIDE MOLAR FLOW RATE OF COMPONENT 1 C Y(2) = F = TOTAL FEED-SIDE MOLAR FLOW RATE OPEN (UNIT = 1, FILE = 'OUTCF.TXT') A = 100.0 C VALUES OF PARAMETERS RELATED TO THE NUMERICAL METHOD IDO = 1 TOL = 0.5 PARAM(4) = 50000 C INITIAL VALUES ADUM = 0.0 Y(1) = 0.1 Y(2) = 10.0 Y(3) = 0.0 Y(4) = 1.0E-8 Y(5) = Y(2) Y(6) = 0.3 Y(7) = 0.4 Y(8) = 0.00025 Y(9) = 1.27E-7 Y(10) = 1.70E-7 Y(11) = 4.816 Y(12)= 23.0 Y(13) = 0.0011 Y(14) = 9.06E-4 Y(15) = 55.56 Y(16) = 9.96E-10

181

Y(17) = 0.57 Y(18) = 0.46 Y(19) = 0.33 Y(20) = 0.0 CALL IVPRK (IDO, NN, FCN, ADUM, A, TOL, PARAM, Y) WRITE (1,100) 100 FORMAT (2X, 'AREA', 9X, 'Y1', 11X, 'Y2') WRITE (1,'(3F12.3)') ADUM, Y(1), Y(2) END SUBROUTINE FCN(NN, ADUM, Y, YPRIME) REAL Y(20), YPRIME(20), ADUM C Y(1) = F1 = FEED-SIDE MOLAR FLOW RATE OF COMPONENT 1 C Y(2) = F = TOTAL FEED-SIDE MOLAR FLOW RATE INTEGER NN,I REAL L, P1, P2, H1, H2 C L = MEMBRANE THICKNESS, P1 = PERMEABILITY OF COMPONENT 1, C P2 = PERMEABILITY OF COMPONENT 2, C H1, H2 ARE REFERRED TO AS HENRY'S CONSTANTS REAL FINIT,UINIT,D, DH, LTH, MU, ROL, A1, B1,C1,D1,A11 C FINIT = TOTAL FEED-SIDE MOLAR FLOW RATE AT ENTRANCE C UINIT = FEED-SIDE VELOCITY AT ENTRANCE C D = DIFFUSIVITY OF COMPONENT 1 IN COMPONENT2 C DH = HYDRAULIC DIAMETER ON THE FEED-SIDE C LTH = LENGTH OF MEMBRANE MODULE C MU = VISCOSITY OF THE SOLUTION C ROL = DENSITY OF THE SOLUTION C A1,B1,C1,D1,A11 ARE COEFFICENTS FOR THE MASS TRANSFER CORRELATION REAL U, KBL1, X1, B, C, Z, Y1 C U = FEED-SIDE VELOCITY C KBL1 = BOUNDARY LAYER MASS TRANSFER COEFFICIENT C X1 = FEED-SIDE MOLE FRACTION C Y1 = PERMEATE SIDE MOLE FRACTION C B,C = COEFFICIENTS FOR THE QUADRATIC EQUATION OBTAINED FOR CROSS FLOW C Z = DUMMY VARIABLE REAL PPERM, KOV1, KOV2 C PPERM = PERMEATE-SIDE PRESSURE

182

C KOV1, KOV2 = OVERALL MASS TRANSFER COEFFICENTS FOR COMPONENTS 1 AND 2 C EXPLICIT ALGEBRAIC EQUATIONS PPERM = Y(7) L = Y(8) P1 = Y(9) P2 = Y(10) H1 = Y(11) H2 = Y(12) FINIT = Y(5) UINIT = Y(6) C--------------------------------------------------------------------------------- C DATA REQD TO CALC MASS TRANSFER COEFF. C CORREL FOR SPIRAL WOUND MODULE FROM HICKEY GOODING IS USED HERE C--------------------------------------------------------------------------------- D = Y(16) DH = Y(13) LTH = ADUM/2.0/(FINIT/UINIT/DH) C FOR HOLLOW FIBERS, LTH = ADUM/(3.1416*DH*NFIBERS), C WHERE NFIBERS=NO. OF HOLLOW FIBERS IN PARALLEL = FINIT/UINIT/(3.1416*D**2/4) MU = Y(14) ROL = Y(15) A1 = Y(17) B1 = Y(18) C1 = Y(19) D1 = Y(20) A11 = D/DH*A1*(DH*ROL/MU)**B1*(MU/ROL/D)**C1*(DH/LTH)**D1 C Sh = KBL1*DH/D = A1*Re**B1*Sc**C1*(DH/LTH)**D1 C KBL1 = D/DH*A1*(DH*U*ROL/MU)**B1*(MU/ROL/D)**C1*(DH/LTH)**D1 C = A11*U**B1 C---------------------------------------------------------------------------------- C PERVAPORATION MODEL C---------------------------------------------------------------------------------- U = Y(2)/FINIT*UINIT KBL1 = A11*U**B1 KOV1 = 1.0/(L/P1 + 1.0/KBL1) KOV2 = P2/L

183

B = - ((KOV1 - KOV2)*Y(1)/Y(2) + KOV2 )/(KOV1*PPERM/H1 - KOV2*PPERM/H2) - 1 C = KOV1*Y(1)/Y(2)/(KOV1*PPERM/H1 - KOV2*PPERM/H2) IF (C.GE.0) THEN Z = 1.0 ELSE Z = -1.0 ENDIF YPRIME(1)=-(KOV1*ROL*(Y(1)/Y(2)-Y(3)/Y(4)*PPERM/H1)) YPRIME(2)=-(KOV1*ROL*(Y(1)/Y(2)-Y(3)/Y(4)*PPERM/H1) + 1KOV2*ROL*((1-Y(1)/Y(2))-(1-Y(3)/Y(4))*PPERM/H2)) YPRIME(3)=(KOV1*ROL*(Y(1)/Y(2)-Y(3)/Y(4)*PPERM/H1)) YPRIME(4)=(KOV1*ROL*(Y(1)/Y(2)-Y(3)/Y(4)*PPERM/H1) + 1KOV2*ROL*((1-Y(1)/Y(2))-(1-Y(3)/Y(4))*PPERM/H2)) DO I = 5,20 YPRIME(I) = 0.0 ENDDO RETURN END

APPENDIX D

INCORPORATION OF THE FORTRAN PROGRAMS INTO ASPEN PLUS

184

Mitesh
Stamp

The code for incorporating the Fortran program for the cross flow

configuration is given below. The Fortran for other flow configurations as well as

other membrane processes may be incorporated into Aspen Plus in a similar manner.

C User Unit Operation Model , Subroutine for process design of crossflow C pervaporation using the USER2 module in Aspen Plus C SUBROUTINE PERVAP (NMATI, SIN, NINFI, SINFI, NMATO, 2 SOUT, NINFO, SINFO, IDSMI, IDSII, 3 IDSMO, IDSIO, NTOT, NSUBS, IDXSUB, 4 ITYPE, NINT, INT, NREAL, REAL, 5 IDS, NPO, NBOPST, NIWORK, IWORK, 6 NWORK, WORK, NSIZE, SIZE, INTSIZ, 7 LD ) C USE NUMERICAL_LIBRARIES IMPLICIT NONE C C DECLARE VARIABLES USED IN DIMENSIONING C INTEGER NMATI, NINFI, NMATO, NINFO, NTOT, + NSUBS, NINT, NPO, NIWORK,NWORK, + NSIZE C #include "ppexec_user.cmn" #include "dms_ncomp.cmn" #include "dms_plex.cmn" real B(1) equivalence (B(1),IB(1)) C C DECLARE ARGUMENTS C INTEGER IDSMI(2,NMATI), IDSII(2,NINFI), + IDSMO(2,NMATO), IDSIO(2,NINFO), + IDXSUB(NSUBS),ITYPE(NSUBS), INT(NINT), + IDS(2,3), NBOPST(6,NPO), + IWORK(NIWORK),INTSIZ(NSIZE),NREAL, LD !INTEGER KH2O REAL SIN(NTOT,NMATI), SINFI(NINFI), + SOUT(NTOT,NMATO), SINFO(NINFO), + WORK(NWORK), SIZE(NSIZE), REAL(NREAL) C

185

Mitesh
Text Box
APPENDIX D INCORPORATION OF THE FORTRAN PROGRAMS INTO ASPEN PLUS

C DECLARE LOCAL VARIABLES C INTEGER IMISS, DMS_KFORMC, KFORM REAL P(10), L, U, DH, PPERM, H1,H2,A1,B1,C1,D1 REAL C1, C2, C3 REAL D(10), MU, ROL REAL VMX,DVMX REAL KBL(10), KOV(10), N(10), X(10), FLOW, MW(10) INTEGER NCP, IDX(10) INTEGER I, J, K, IERR, KDIAG, KV, IFAIL, INDEX INTEGER USRUTL_GET_REAL_PARAM, USRUTL_GET_INT_PARAM, 1 USRUTL_SET_REAL_PARAM C DECLARE VARIABLES RELATED TO THE NUMERICAL METHOD INTEGER NN, NP, IDO, NOUT PARAMETER (NN=18, NP=100) EXTERNAL FCN REAL ADUM, Y(NN),TOL, PARAM(50) C ADUM = MEMBRANE AREA, A = TOTAL MEMBRANE AREA OF MODULE C Y(1) = F1 = FEED-SIDE MOLAR FLOW RATE OF COMPONENT 1 C Y(2) = F = TOTAL FEED-SIDE MOLAR FLOW RATE C----------------------------------------------------------------------------------------------------------------- WRITE(USER_NHSTRY,*) '###########################################' C GET INPUT PARAMETERS FROM ASPEN PLUS IFAIL = 0 INDEX = 0 IERR = USRUTL_GET_REAL_PARAM('U',INDEX,U) IF(IERR.NE.0) THEN WRITE(USER_NHSTRY,*)'ERROR FETCHING FEED SIDE VELOCITY' IFAIL = 1 ENDIF IERR = USRUTL_GET_REAL_PARAM('L',INDEX,L) IF(IERR.NE.0) THEN WRITE(USER_NHSTRY,*)'ERROR FETCHING MEMBRANE THICKNESS' IFAIL = 1 ENDIF IERR = USRUTL_GET_REAL_PARAM('DH',INDEX,DH) IF(IERR.NE.0) THEN WRITE(USER_NHSTRY,*)'ERROR FETCHING HYDRAULIC DIAMETER' IFAIL = 1 ENDIF IERR = USRUTL_GET_REAL_PARAM('A',INDEX,A) IF(IERR.NE.0) THEN

186

WRITE(USER_NHSTRY,*)'ERROR FETCHING MEMBRANE AREA' IFAIL = 1 ENDIF IERR = USRUTL_GET_REAL_PARAM('P1',INDEX,P(1)) IF(IERR.NE.0) THEN WRITE(USER_NHSTRY,*)'ERROR FETCHING P1' IFAIL = 1 ENDIF IERR = USRUTL_GET_REAL_PARAM('P2',INDEX,P(2)) IF(IERR.NE.0) THEN WRITE(USER_NHSTRY,*)'ERROR FETCHING P2' IFAIL = 1 ENDIF IERR = USRUTL_GET_REAL_PARAM('PPERM',INDEX,PPERM) IF(IERR.NE.0) THEN WRITE(USER_NHSTRY,*)'ERROR FETCHING PERMEATE PRESSURE' IFAIL = 1 ENDIF c GET PHYSICAL PROPERTIES (viscosity, molar volume and diffusivities) C FROM ASPEN PLUS C---------------------------------------------------------------------- CALL SHS_CPACK(SIN(1,1),NCP,IDX,X,FLOW) KDIAG = 4 CALL PPMON_VISCL(SIN(NCOMP_NCC+2,1),SIN(NCOMP_NCC+3,1),X,NCP,IDX, 1NBOPST,KDIAG,MU,IERR) IF(IERR.NE.0) THEN WRITE(USER_NHSTRY,*)'ERROR FETCHING VISCOSITY' IFAIL = 1 ENDIF KV = 1 CALL PPMON_VOLL(SIN(NCOMP_NCC+2,1),SIN(NCOMP_NCC+3,1),X,NCP,IDX, 1NBOPST,KDIAG,KV,VMX,DVMX,IERR) IF(IERR.NE.0) THEN WRITE(USER_NHSTRY,*)'ERROR FETCHING MOLAR VOLUME' IFAIL = 1 ENDIF ROL = 1.0/VMX !ROL IS MOLAR DENSITY OF THE MIXTURE CALL PPMON_DIFCOL(SIN(NCOMP_NCC+2,1),SIN(NCOMP_NCC+3,1),X,NCP,IDX, 1NBOPST,KDIAG,D,IERR) IF(IERR.NE.0) THEN WRITE(USER_NHSTRY,*)'ERROR FETCHING DIFFUSIVITIES' IFAIL = 1

187

ENDIF c STOP PROGRAM IF THERE IS AN ERROR IN GETTING THE ABOVE PARAMETERS IF(IFAIL.EQ.1) RETURN C----------------------------------------------------------------------- C BEGIN EXECUTABLE CODE C----------------------------------------------------------------------- OPEN (UNIT = 1, FILE = 'OUTCF.TXT') A = 100.0 C VALUES OF PARAMETERS RELATED TO THE NUMERICAL METHOD IDO = 1 TOL = 0.5 PARAM(4) = 50000 C INITIAL VALUES ADUM = 0.0 Y(1) = SIN(1,1) Y(2) = SIN(NCOMP_NCC+1,1) Y(3) = Y(2) Y(4) = U Y(5) = PPERM Y(6) = L Y(7) = P1 Y(8) = P2 Y(9) = H1 Y(10)= H2 Y(11) = DH Y(12) = MU Y(13) = ROL Y(14) = D(1) Y(15) = A1 Y(16) = B1 Y(17) = C1 Y(18) = D1 CALL IVPRK (IDO, NN, FCN, ADUM, A, TOL, PARAM, Y) C--------------------------------------------------------------------------------------------- C COMPONENT BALANCES ACROSS MODULE C--------------------------------------------------------------------------------------------- SOUT(1,1) = Y(2)*Y(1) SOUT(2,1) = Y(2)*(1 - Y(1)) SOUT(1,2) = SIN(1,1) - SOUT(1,1) SOUT(2,2) = SIN(2,1) - SOUT(2,1) WRITE(USER_NHSTRY,*) '############################################'

188

C 999 RETURN END C---------------------------------------------------------------------------------------------- C SUBROUTINE INCLUDING THE PERVAPORATION MODEL C---------------------------------------------------------------------------------------------- SUBROUTINE FCN(NN, ADUM, Y, YPRIME) REAL Y(18), YPRIME(18), ADUM C Y(1) = F1 = FEED-SIDE MOLAR FLOW RATE OF COMPONENT 1 C Y(2) = F = TOTAL FEED-SIDE MOLAR FLOW RATE INTEGER NN,I REAL L, P1, P2, H1, H2 C L = MEMBRANE THICKNESS, P1 = PERMEABILITY OF COMPONENT 1, C P2 = PERMEABILITY OF COMPONENT 2, C H1, H2 ARE REFERRED TO AS HENRY'S CONSTANTS REAL FINIT,UINIT,D, DH, LTH, MU, ROL, A1, B1,C1,D1,A11 C FINIT = TOTAL FEED-SIDE MOLAR FLOW RATE AT ENTRANCE C UINIT = FEED-SIDE VELOCITY AT ENTRANCE C D = DIFFUSIVITY OF COMPONENT 1 IN COMPONENT2 C DH = HYDRAULIC DIAMETER ON THE FEED-SIDE C LTH = LENGTH OF MEMBRANE MODULE C MU = VISCOSITY OF THE SOLUTION C ROL = DENSITY OF THE SOLUTION C A1,B1,C1,D1,A11 ARE COEFFICENTS FOR THE MASS TRANSFER CORRELATION REAL U, KBL1, X1, B, C, Z, Y1 C U = FEED-SIDE VELOCITY C KBL1 = BOUNDARY LAYER MASS TRANSFER COEFFICIENT C X1 = FEED-SIDE MOLE FRACTION C Y1 = PERMEATE SIDE MOLE FRACTION C B,C = COEFFICIENTS FOR THE QUADRATIC EQUATION OBTAINED FOR CROSS C FLOW C Z = DUMMY VARIABLE REAL PPERM, KOV1, KOV2 C PPERM = PERMEATE-SIDE PRESSURE C KOV1, KOV2 = OVERALL MASS TRANSFER COEFFICENTS FOR COMPONENTS 1 C AND 2 C EXPLICIT ALGEBRAIC EQUATIONS PPERM = Y(5) L = Y(6) P1 = Y(7) P2 = Y(8)

189

H1 = Y(9) H2 = Y(10) FINIT = Y(3) UINIT = Y(4) C--------------------------------------------------------------------------------- C DATA REQD TO CALC MASS TRANSFER COEFF. C CORREL FOR SPIRAL WOUND MODULE FROM HICKEY GOODING IS USED HERE C--------------------------------------------------------------------------------- D = Y(14) DH = Y(11) LTH = ADUM/2.0/(FINIT/UINIT/DH) C FOR HOLLOW FIBERS, LTH = ADUM/(3.1416*DH*NFIBERS), C WHERE NFIBERS=NO. OF HOLLOW FIBERS IN PARALLEL C = FINIT/UINIT/(3.1416*D**2/4) MU = Y(12) ROL = Y(13) A1 = Y(15) B1 = Y(16) C1 = Y(17) D1 = Y(18) A11 = D/DH*A1*(DH*ROL/MU)**B1*(MU/ROL/D)**C1*(DH/LTH)**D1 C Sh = KBL1*DH/D = A1*Re**B1*Sc**C1*(DH/LTH)**D1 C HENCE, KBL1 = D/DH*A1*(DH*U*ROL/MU)**B1*(MU/ROL/D)**C1*(DH/LTH)**D1 C = A11*U**B1 C---------------------------------------------------------------------------------- C PERVAPORATION MODEL C---------------------------------------------------------------------------------- U = Y(2)/FINIT*UINIT KBL1 = A11*U**B1 KOV1 = 1.0/(L/P1 + 1.0/KBL1) KOV2 = P2/L X1 = Y(1)/Y(2) B = - ((KOV1 - KOV2)*X1 + KOV2 )/(KOV1*PPERM/H1 - KOV2*PPERM/H2) - 1 C = KOV1*X1/(KOV1*PPERM/H1 - KOV2*PPERM/H2) IF (C.GE.0) THEN Z = 1.0 ELSE Z = -1.0 ENDIF

190

Y1 = (-B-Z*(B**2.0-4.0*C)**0.5)/2.0 YPRIME(1)=-(KOV1*ROL*(X1-Y1*PPERM/H1)) YPRIME(2)=-(KOV1*ROL*(X1-Y1*PPERM/H1) + 1KOV2*ROL*((1-X1)-(1-Y1)*PPERM/H2)) DO I = 3,18 YPRIME(I) = 0.0 ENDDO RETURN END

APPENDIX E

E.1 FORTRAN code for the process design for cross flow configuration

191

Mitesh
Stamp

In this subroutine, the overall process design is carried out for the crossflow

configuration after taking into account the variation of the flux due to variation of

feed concentration and velocity along the length of the membrane module, as

described in Section 5.5.3.2.1. The FORTRAN code provided below is compiled into

a dynamic-link library which is then used in Microsoft Excel. This subroutine in turn

uses the subroutines, ‘concpol’, which accounts for the feed-side concentration

polarization, and ‘y1calcdll’, which accounts for the variation in flux and permeate

concentration with feed concentration and permeate pressure.

! 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

Mitesh
Text Box
APPENDIX E E.1 FORTRAN code for the process design for cross flow configuration

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

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

230