Upload
jacob-h-jack-lashover
View
16
Download
4
Tags:
Embed Size (px)
DESCRIPTION
A supplement to "Monte Carlo Marching" which includes the QB64 computer code for all of the calculations presented.
Citation preview
REM COMPUTER CODE FOR MONTE CARLO MARCHING CALCULATIONS BY JACK LASHOVER 10/05/2012
DECLARE SUB DEW ()
DECLARE SUB VAPOR ()
DECLARE SUB BUBBLE ()
DECLARE SUB TEST ()
DECLARE SUB ENTHALPY ()
DECLARE SUB TEMPERATURE ()
DECLARE SUB PRESSURE ()
DECLARE SUB RK ()
DECLARE SUB WILSON ()
DECLARE SUB RACHFORD ()
DECLARE SUB CUBIC ()
DECLARE SUB ANTOINE ()
DECLARE SUB VANLAAR ()
DECLARE SUB MARGULES()
DECLARE SUB LLEFLASH()
1 CLS: ON ERROR GOTO 1000
DEFDBL A-Z
DEFINT I-K, N
DIM SHARED BRK(10, 10) AS DOUBLE, CRK(10, 10) AS DOUBLE, G(10) AS DOUBLE
DIM SHARED A(10) AS DOUBLE, B(10) AS DOUBLE, C(10) AS DOUBLE, X(10) AS DOUBLE, XX(10) AS DOUBLE
DIM SHARED COMPONENT(10) AS STRING, W(10, 10) AS DOUBLE, N AS INTEGER
DIM SHARED MW(10) AS DOUBLE, TC(10) AS DOUBLE, PC(10) AS DOUBLE, TK(10) AS DOUBLE
DIM SHARED AAL(10) AS DOUBLE, BB(10) AS DOUBLE, CC(10) AS DOUBLE
DIM SHARED AAH(10) AS DOUBLE, BBB(10) AS DOUBLE, CCC(10) AS DOUBLE
DIM SHARED AV(10) AS DOUBLE, BV(10) AS DOUBLE, CV(10) AS DOUBLE, BP(10) AS DOUBLE
DIM SHARED H AS DOUBLE
PRINT: PRINT " WELCOME TO MONTE CARLO MARCHING CALCULATIONS "
PRINT " THE TIME IS " + TIME$ + " AND THE DATE IS " + DATE$
PRINT " COMPONENTS ARE USED IN ORDER OF BOILING POINTS, LOWEST TO HIGHEST"
INPUT " NAME OF FILE TO STORE OUTPUT= ", FI$
OPEN "C:\QB64\" + FI$ + ".TXT" FOR OUTPUT AS #1
REM NUMBER OF COMPONENTS AND BOILING POINTS IN CENT.
BP(1) = 64.7: BP(2) = 82.5: BP(3) = 100!: N = 3
COMPONENT$(1) = "MEOH": COMPONENT$(2) = "IPA": COMPONENT$(3) = "H2O"
REM ANTOINE CONSTANTS FOR PRESSURE IN kPa
A(1) = 16.5725: B(1) = 3626.55: C(1) = 238.9
A(2) = 16.6779: B(2) = 3640.2: C(2) = 219.6
A(3) = 16.2886: B(3) = 3816.44: C(3) = 227!
REM WILSON CONSTANTS
W(1, 2) = 2.123: W(2, 1) = .369
W(1, 3) = .482: W(3, 1) = .959
W(2, 3) = .033: W(3, 2) = .768
W(1, 1) = 1: W(2, 2) = 1: W(3, 3) = 1
REM REDLICH-KISTER CONSTANTS
BRK(1, 2) = -.1931: BRK(2, 1) = -.1931: CRK(1, 2) = -.0363: CRK(2, 1) = 0.0363
BRK(1, 3) = .6204: BRK(3, 1) = .6204: CRK(1, 3) = -.0669: CRK(3, 1) = .0669
BRK(2, 3) = 1.4804: BRK(3, 2) = 1.4804: CRK(2, 3) = -.9372: CRK(3, 2) = .9372
BRK(1, 1) = 0!: BRK(2, 2) = 0!: BRK(3, 3) = 0!
CRK(1, 1) = 0!: CRK(2, 2) = 0!: CRK(3, 3) = 0!
C0 = 0!: C1 = 0!: C2 = 0! 'TERNARY CONSTANTS
REM ENERGY DATA FOR MEOH, IPA, AND H2O
MW(1) = 32.0422: MW(2) = 60.0959: MW(3) = 18.0153
REM MULTIPLY J/G BY 0.238846 TO GET CALORIES AND BY MW TO GET CAL/MOLE
AAL(1) = 2.33: BB(1) = .00782: CC(1) = .0000377# 'MEOH LIQ.CP J/G @T(C)
AAL(2) = 2.320857: BB(2) = .01242953#: CC(2) = 0! 'IPA LIQ CP J/G @T(C)
AAL(3) = 4.188: BB(3) = -.000569: CC(3) = .00000849# 'H2O LIQ CP J/G @T(C)
AAH(1) = 1218.4: BBB(1) = -1.3849: CCC(1) = -.006402 'HVAP MEOH J/G @T(C)
AAH(2) = 801.13: BBB(2) = -1.767583: CCC(2) = 0! 'HVAP IPA J/G @T(C)
AAH(3) = 2481.1: BBB(3) = -1.821: CCC(3) = -.004236 'HVAP H2O J/G @ T(C)
AV(1) = 42.63215: BV(1) = .07690246#: CV(1) = 0! / 32.0422 'MEOH VAP CP J/G @T(C)
AV(2) = 1.40664: BV(2) = .00353197#: CV(2) = 0! 'IPA VAP CP J/G @T(C)
AV(3) = 1.813: BV(3) = .0007439#: CV(3) = .0000001123# 'H2O VAP CP J/G @T(C)
TC(1) = 512.64: TC(2) = 508.3: TC(3) = 647.13: H = .238846# 'CONVERT JOULES TO CALORIES, TC IN KELVIN
PC(1) = 79.9112 * 101.325: PC(2) = 46.9973 * 101.325: PC(3) = 217.666 * 101.325 'PC IN kPa
5 CLS: DO
PRINT: PRINT: PRINT " QBVLE36--10/05/12"
PRINT " ENTER A LETTER CORRESPONDING TO YOUR CHOICE "
PRINT " A. TEST FOR TWO PHASES B. BUBBLE POINT"
PRINT " C. CUBIC EQUATION D. DEW POINT "
PRINT " H. ENTHALPY P. FLASH FOR P "
PRINT " T. FLASH FOR T V. FLASH FOR V "
PRINT " R. RACHFORD-RICE Q. QUIT "
PRINT " Z. TEST ANTOINE CONSTANTS L. LLE FLASH "
LINE INPUT CHOICE$
SELECT CASE CHOICE$
CASE "A", "a"
CALL TEST
CASE "B", "b"
CALL BUBBLE
CASE "C", "c"
CALL CUBIC
CASE "D", "d"
CALL DEW
CASE "H", "h"
CALL ENTHALPY
CASE "P", "p"
CALL PRESSURE
CASE "R", "r"
CALL RACHFORD
CASE "T", "t"
CALL TEMPERATURE
CASE "V", "v"
CALL VAPOR
CASE "Z", "z"
CALL ANTOINE
CASE "L", "l"
CALL LLEFLASH
CASE "Q", "q"
CLS: PRINT: PRINT: PRINT " SEE YA!": GOTO 99
CASE ELSE
CLS: PRINT: PRINT: PRINT: PRINT: PRINT " PLEASE ENTER CHOICE: A, B, C, D, H, P, T, V, OR Q"
END SELECT
LOOP UNTIL CHOICE$ = "Q" OR CHOICE$ = "q"
1000 PRINT "**********"; CHR$(7)
PRINT " ERROR NUMBER "; ERR; " HAS OCCURRED! ON LINE#= "; ERL
PRINT " PRESS ENTER TO ABORT OR ANY OTHER KEY TO CONTINUE: "
CHOICE$ = INPUT$(1)
IF ASC(CHOICE$) = 13 THEN
ON ERROR GOTO 0
ELSE
RESUME NEXT
END IF
CLS
GOTO 5
99 END
DEFINT N
SUB ANTOINE
CLS
DIM VP(10), TT(10)
PRINT: PRINT " SUBROUTINE TO TEST WHETHER ANTOINE CONSTANTS ARE COMPATIBLE WITH PRESSURE AND TEMPERATURE UNITS"
PRINT #1,: PRINT #1, " SUBROUTINE TO TEST WHETHER ANTOINE CONSTANTS ARE COMPATIBLE WITH PRESSURE AND TEMPERATURE UNITS"
REM NUMBER OF COMPONENTS AND BOILING POINTS IN CENT.
N = 3
REM BP(1) = 64.7: BP(2) = 82.50: BP(3) = 100!
COMPONENT$(1) = "MEOH": COMPONENT$(2) = "IPA": COMPONENT$(3) = "H2O"
REM ANTOINE CONSTANTS FOR PRESSURE IN kPa
A(1) = 16.5725: B(1) = 3626.55: C(1) = 238.9
A(2) = 16.6779: B(2) = 3640.2: C(2) = 219.6
A(3) = 16.2886: B(3) = 3816.44: C(3) = 227!
REM CHECK BPS OF PURE COMPONENTS
PRINT: PRINT " CHECK ANTOINE EQUATION AND CONSTANTS FOR EACH PURE COMPONENT."
PT = 101.325
FOR I = 1 TO N
TT(I) = -C(I) - B(I) / (LOG(PT) - A(I)) 'BOILING TEMPERATURES AT 101.325 kPa
BP(I) = TT(I)
PRINT: PRINT: PRINT COMPONENT$(I)
PRINT I; " PURE COMPONENT BOILING TEMPERATURE, C= "; TT(I)
PRINT #1,: PRINT #1,: PRINT #1, COMPONENT$(I)
PRINT #1, I; " PURE COMPONENT BOILING TEMPERATURE, C= "; TT(I)
VP(I) = 2.718282 ^ (A(I) - (B(I) / ((TT(I)) + C(I)))) 'VAPOR PRESSURE AT BOILING POINT = 101.325 kPa
PRINT " PURE COMPONENT VAPOR PRESSURE AT BP= "; VP(I)
PRINT #1, " PURE COMPONENT VAPOR PRESSURE AT BP= "; VP(I)
NEXT I
INPUT " PRESS ENTER TO CONTINUE", YES
CLS
END SUB
SUB BUBBLE
CLS
DIM AA(10), LL(10), UL(10), XP(10), XX(10), DELX(10), VP(10), EK(10), Y(10)
DIM ELAPSE AS DOUBLE
25 PRINT: PRINT " INPUT DATA FOR BUBBLE POINT CALCS."
INPUT " NUMBER OF COMPONENTS= ", N
INPUT " TOTAL SYSTEM PRESSURE IN kPa= ", PT
PRINT: SUMX = 0
FOR K = 1 TO N
PRINT COMPONENT$(K)
INPUT " MOLE FRACTION IN LIQUID PHASE= ", X(K)
SUMX = SUMX + X(K)
NEXT K
PRINT " SUMX= "; SUMX
OP1% = 0: INPUT " OP1=0 NO ERRORS CONTINUE, OP1=1 REDO, OP1= ", OP1%
IF OP1% = 1 THEN GOTO 25
26 OP2% = 0: INPUT " ENTER '1' TO USE REDLICH-KISTER, ENTER '2' TO USE WILSON AND '3' TO USE VAN LAAR: OP2= ", OP2%
IF OP2% = 0 OR OP2% > 3 THEN PRINT " ENTER '1', '2', OR '3' FOR ACTIVITY COEFFICIENT MODEL: REDO": GOTO 26
IF OP2% = 1 THEN CALL RK: GOTO 50 'USE RK ACTIVITY COEFFS.
IF OP2% = 2 THEN CALL WILSON: GOTO 50 'USE WILSON ACTIVITY COEFFS.
IF OP2% = 3 THEN CALL VANLAAR: GOTO 50 'USE VAN LAAR ACTIVITY COEFFICIENTS
TS# = TIMER(.001)
50 OPT = 1E30
COUNT&& = 0: COUNTI% = 0: COUNTJ% = 0: FIL% = -111: RANDOMIZE (FIL%)
AA(1) = 0 'COMPOSITION VARIABLES IN PCT AND TEMPERATURE FROM 0 TO 100 C WHERE AA(1) IS TEMPERATURE
FOR J = 1 TO 30
ZZZ = 500
FOR I = 1 TO ZZZ
COUNT&& = COUNT&& + 1
IF AA(1) - 100. / 2 ^ J < 0. THEN GOTO 250
GOTO 260
250 LL(K) = 0.
255 GOTO 265
260 LL(1) = AA(1) - 100 / 2 ^ J
265 IF AA(1) + 100 / 2 ^ J > 100 THEN GOTO 280
270 GOTO 290
280 UL(1) = 100 - LL(1)
285 GOTO 295
290 UL(1) = AA(1) + 100 / 2 ^ J - LL(1)
295 TB = LL(1) + RND * UL(1)
PRINT: PRINT " J= "; J; " I= "; I; " TEMPERATURE= "; TB
'INPUT " PRESS ENTER TO CONTINUE", YES
G1 = 0.0: SUMPT = 0.0
FOR II = 1 TO 3
VP(II) = 2.718282 ^ (A(II) - (B(II) / (TB + C(II)))): PRINT " VP(II)= "; VP(II)
EK(II) = VP(II) / PT
XP(II) = X(II) * G(II) * VP(II): PRINT " XP= "; XP(II): PRINT " PARTIAL PRESSURE(II)= "; XP(II)
G1 = G1 + XP(II): SUMPT = SUMPT + XP(II)
NEXT II
G1 = ABS(G1 - 101.325)
PRINT: PRINT " G1= "; G1; " TOTAL PRESSURE FOR THIS TEMPERATURE= "; SUMPT
G = G1: PRINT: PRINT " G= "; G; " TB= "; TB
'INPUT " PRESS ENTER TO CONTINUE", YES
IF G < OPT THEN GOTO 360
GOTO 370
360 AA(1) = TB
OPT = G
370 COUNTI% = COUNTI% + 1: PRINT: PRINT " COUNTI= "; COUNTI%
NEXT I
PRINT " SUMY= "; SUMY; " SUMXX= "; SUMXX; " SUMPT= "; SUMPT
PRINT " G= "; G; " G1= "; G1; " OPT= "; OPT
PRINT " TB= "; AA(1); " I= "; I; " J= "; J
PRINT " X(1)= "; X(1); " X(2)= "; X(2); " X(3)= "; X(3)
SUMY = 0.
FOR II = 1 TO 3: VP(II) = 2.718282 ^ (A(II) - (B(II) / (AA(1) + C(II)))): EK(II) = VP(II) / PT: Y(II) = EK(II) * G(II) * X(II): SUMY = SUMY + Y(II): NEXT II
PRINT " Y(1)= "; Y(1); " Y(2)= "; Y(2); " Y(3)= "; Y(3); " SUMY= "; SUMY
PRINT " G1= "; G(1); " G2= "; G(2); "G3= "; G(3)
PRINT " XP(1)= "; XP(1); " XP(2)= "; XP(2); " XP(3)= "; XP(3)
COUNTI% = 0
COUNTJ% = COUNTJ% + 1: PRINT: PRINT " COUNTJ= "; COUNTJ%
'INPUT " PRESS ENTER TO CONTINUE", YES
NEXT J
PRINT: PRINT " FINAL RESULTS FOR BUBBLE POINT TEMPERATURE CALCULATIONS!"
PRINT " G= "; G; " OPT= "; OPT; " TB= "; AA(1)
PRINT " G1= "; G1
PRINT " G1= "; G(1); " G2= "; G(2); "G3= "; G(3); " X(1)= "; X(1); " X(2)= "; X(2); " X(3)= "; X(3)
PRINT #1,: PRINT #1, " FINAL RESULTS FOR BUBBLE POINT TEMPERATURE CALCULATIONS!"
PRINT #1, " G= "; G; " OPT= "; OPT; " TB= "; AA(1)
PRINT #1, " G1= "; G1
PRINT #1, " G1= "; G(1); " G2= "; G(2); "G3= "; G(3); " X(1)= "; X(1); " X(2)= "; X(2); " X(3)= "; X(3)
SUMY = 0.
FOR II = 1 TO 3: VP(II) = 2.718282 ^ (A(II) - (B(II) / (TB + C(II)))): EK(II) = VP(II) / PT: Y(II) = EK(II) * G(II) * X(II): SUMY = SUMY + Y(II): NEXT II
PRINT " Y(1)= "; Y(1); " Y(2)= "; Y(2); " Y(3)= "; Y(3); " SUMY= "; SUMY
PRINT " COUNTJ= "; COUNTJ%; " OVERALL COUNT= "; COUNT&&
PRINT #1, " Y(1)= "; Y(1); " Y(2)= "; Y(2); " Y(3)= "; Y(3); " SUMY= "; SUMY
PRINT #1, " COUNTJ= "; COUNTJ%; " OVERALL COUNT= "; COUNT&&
TF# = TIMER(.001)
PRINT: PRINT " START TIME= "; TS#; " FINISH TIME= "; TF#
ELAPSE = (TF# - TS#) / 36000: PRINT " ELAPSED TIME= "; ELAPSE; " SECONDS"
PRINT #1, " ELAPSED TIME= "; ELAPSE; " SECONDS"
INPUT " PRESS ENTER TO CONTINUE", YES
CLS
END SUB
DEFINT N
SUB CUBIC
REM SOLVING CUBIC EQUATIONS BY JACK LASHOVER 8/29/2012 SOLVING NEWTON'S EXAMPLE FROM HIS ORIGINAL WORK
CLS: ON ERROR GOTO 1000
DEFDBL A-Z
DEFINT I-K
PRINT: PRINT " WELCOME TO SOLVING CUBIC EQUATIONS USING NEWTON'S EXAMPLE FROM HIS ORIGINAL WORK "
PRINT " NEWTON'S POLYNOMIAL WAS X^3 -2*X - 5 = 0"
PRINT " THE TIME IS " + TIME$ + " AND THE DATE IS " + DATE$
PRINT #1,: PRINT #1, " WELCOME TO SOLVING CUBIC EQUATIONS USING NEWTON'S EXAMPLE FROM HIS ORIGINAL WORK "
PRINT #1, NEWTON 'S POLYNOMIAL WAS X^3 -2*X - 5 = 0"
PRINT #1, " THE TIME IS " + TIME$ + " AND THE DATE IS " + DATE$
DIM AA(3), LL(3), UL(3), FLAG(3)
REM SOLUTION BY MONTE CARLO
TS# = TIMER
FIL% = -1111: RANDOMIZE (FIL%)
OPT = 1D+17: A(0) = 999999!: FLAG(1) = 0: FLAG(2) = 0: FLAG(3) = 0: X1 = 999999
REM INPUT COEFFICIENTS AS BELOW, THEN DETERMINE DISCRIMINANT TO SEE WHAT THE ROOTS WILL BE.
'A1 = 1: B1 = -1: C1 = 0.2163: D1 = -0.01451
A1 = 1: B1 = 0: C1 = -2!: D1 = -5!
DISCRIMINANT = 18 * A1 * B1 * C1 * D1 - 4 * B1 ^ 3 * D1 + B1 ^ 2 * C1 ^ 2 - 4 * A1 * C1 ^ 3 - 27 * A1 ^ 2 * D1 ^ 2
PRINT: PRINT " DISCRIMINANT= "; DISCRIMINANT
PRINT " IF THE DISCRIMINANT IS > 0 THEN THE EQUATION HAS THREE DISTINCT REAL ROOTS."
PRINT " IF THE DISCRIMINANT = 0 THEN THE EQUATION HAS A MULTIPLE ROOT AND ALL ITS ROOTS ARE REAL."
PRINT " IF THE DISCRIMINANT IS < 0 THEN THE EQUATION HAS ONE REAL ROOT AND TWO NONREAL COMPLEX CONJUGATE ROOTS."
PRINT " IF THE DISCRIMINANT = 0 AT LEAST TWO ROOTS COINCIDE AND THEY ARE ALL REAL."
PRINT " IT MAY BE THAT THE EQUATION HAS A DOUBLE REAL ROOT AND ANOTHER SINGLE REAL ROOT; ALTERNATIVELY, ALL_"
PRINT " THREE ROOTS COINCIDE YIELDING A TRIPLE REAL ROOT."
PRINT " NEWTON'S CUBIC EQUATION HAS ONE REAL AND A CONJUGATE PAIR OF COMPLEX ROOTS." 'ROOT = 2.094551430177863 FOR NEWTON AND 0.7314 FOR OTHER EXAMPLE FROM SEADER
PRINT #1,: PRINT #1, " DISCRIMINANT= "; DISCRIMINANT
PRINT #1, " IF THE DISCRIMINANT IS > 0 THEN THE EQUATION HAS THREE DISTINCT REAL ROOTS."
PRINT #1, " IF THE DISCRIMINANT = 0 THEN THE EQUATION HAS A MULTIPLE ROOT AND ALL ITS ROOTS ARE REAL."
PRINT #1, " IF THE DISCRIMINANT IS < 0 THEN THE EQUATION HAS ONE REAL ROOT AND TWO NONREAL COMPLEX CONJUGATE ROOTS."
PRINT #1, " IF THE DISCRIMINANT = 0 AT LEAST TWO ROOTS COINCIDE AND THEY ARE ALL REAL."
PRINT #1, " IT MAY BE THAT THE EQUATION HAS A DOUBLE REAL ROOT AND ANOTHER SINGLE REAL ROOT; ALTERNATIVELY, ALL_"
PRINT #1, " THREE ROOTS COINCIDE YIELDING A TRIPLE REAL ROOT."
PRINT #1, " NEWTON'S CUBIC EQUATION HAS ONE REAL AND A CONJUGATE PAIR OF COMPLEX ROOTS." 'ROOT = 2.094551430177863 FOR NEWTON AND 0.7314 FOR OTHER EXAMPLE FROM SEADER
INPUT " PRESS ENTER TO CONTINUE", YES
TS# = TIMER
COUNT& = 0: COUNTJ% = 0: COUNTI% = 0
AA(1) = 0
FOR J = 1 TO 40
COUNTJ% = COUNTJ% + 1
ZZZ = 200
FOR I = 1 TO ZZZ
COUNTI% = COUNTI% + 1: COUNT& = COUNT& + 1
10 K = 1
11 IF AA(K) - 10! / 2 ^ J < 0! THEN GOTO 50
GOTO 60
50 LL(K) = 0!
55 GOTO 65
60 LL(K) = AA(K) - 10! / 2 ^ J
65 IF AA(K) + 10! / 2 ^ J > 10! THEN GOTO 80
70 GOTO 90
80 UL(K) = 10! - LL(K)
85 GOTO 91
90 UL(K) = AA(K) + 10! / 2 ^ J - LL(K)
91 X1 = LL(K) + RND * UL(K)
13 PRINT: PRINT " J= "; J; " I= "; I
PRINT " X1= "; X1; " AA(1)= "; AA(1); " LL(1)= "; LL(1); " UL(1)= "; UL(1)
PRINT #1,: PRINT #1, " J= "; J; " I= "; I
PRINT #1, " X1= "; X1; " AA(1)= "; AA(1); " LL(1)= "; LL(1); " UL(1)= "; UL(1)
G = ABS(A1 * X1 ^ 3 + B1 * X1 ^ 2 + C1 * X1 + D1)
IF G = 0 THEN PRINT " G = 0.": PRINT #1, " G = 0.": GOTO 300
PRINT: PRINT " G= "; G: PRINT #1,: PRINT #1, " G= "; G
'INPUT " PRESS ENTER TO CONTINUE", YES
110 IF ABS(G) < .0000008# THEN PRINT " G WITHIN TOLERANCE.": PRINT #1, " G WITHIN TOLERANCE.": GOTO 300
120 IF G < OPT THEN GOTO 160
130 GOTO 170
160 ' SAVE BEST SO FAR X'S
AA(1) = X1: PRINT #1, " J= "; J; " I= "; I; " NEW LOCAL MINIMUM FOUND."
PRINT: PRINT " X1= "; X1: PRINT #1,: PRINT #1, " NEW X1= "; X1; " G= "; G; " OPT= "; OPT; " AA(1)= "; AA(1); " LL(1)= "; LL(1); " UL= "; UL
OPT = G: PRINT " OPT= "; OPT: PRINT #1, " NEW OPT NOW IN USE= "; OPT
INPUT " PRESS ENTER TO CONTINUE", YES
170 PRINT " COUNTI= "; COUNTI%: PRINT #1, " COUNTI= "; COUNTI%
NEXT I
PRINT: PRINT " G= "; G; " G1= "; G1
PRINT: PRINT " I= "; I; " J= "; J
PRINT: PRINT " X1= "; X1; " COUNTI= "; COUNTI%; " COUNTJ= "; COUNTJ%
PRINT #1,: PRINT #1, " G= "; G; " G1= "; G1; " OPT= "; OPT
PRINT #1,: PRINT #1, " I= "; I; " J= "; J
PRINT #1,: PRINT #1, " X1= "; X1; " COUNTI= "; COUNTI%; " COUNTJ= "; COUNTJ%
COUNTI% = 0
'INPUT " PRESS ENTER TO CONTINUE", YES
180 NEXT J
300 CLS: PRINT: PRINT " FINAL RESULTS FOR SOLVING NEWTON'S CUBIC!"
PRINT " NEWTON'S POLYNOMIAL WAS X^3 - 2*X - 5 = 0 "
PRINT: PRINT " X1= "; X1
PRINT: PRINT " COUNTJ= "; COUNTJ%; " TOTAL SOLUTIONS CONSIDERED= "; COUNT&
PRINT: PRINT " G= "; G; " OPT= "; OPT
PRINT #1,: PRINT #1, " FINAL RESULTS FOR SOLVING NEWTON'S CUBIC!"
PRINT #1, NEWTON 'S POLYNOMIAL WAS X^3 - 2*X - 5 = 0"
PRINT #1,: PRINT #1, " X1= "; X1
PRINT #1,: PRINT #1, " COUNTJ= "; COUNTJ%; " TOTAL SOLUTIONS CONSIDERED= "; COUNT&
PRINT #1,: PRINT #1, " G= "; G; " OPT= "; OPT
TF# = TIMER
PRINT: PRINT " START TIME= "; TS#; " FINISH TIME= "; TF#
ELAPSE# = (TF# - TS#): PRINT " ELAPSED TIME= "; ELAPSE#; " SECONDS"
PRINT #1, " ELAPSED TIME= "; ELAPSE#; " SECONDS"
INPUT " PRESS ENTER TO CONTINUE", YES
CLS
END SUB
DEFINT N
SUB DEW
CLS
DIM AA(10), LL(10), UL(10), XP(10), Y(10), VP(10), EK(10), DELY(10), YY(10)
600 PRINT: PRINT " INPUT DATA FOR DEW POINT CALCS."
PRINT: PRINT
INPUT " NUMBER OF COMPONENTS= ", N
INPUT " TOTAL SYSTEM PRESSURE IN kPa= ", PT
PRINT: SUMY = 0
FOR KK = 1 TO N
PRINT COMPONENT$(KK)
INPUT " MOLE FRACTION IN VAPOR PHASE= ", Y(KK)
SUMY = SUMY + Y(KK)
NEXT KK
PRINT " SUMY= "; SUMY
OP1% = 0: INPUT " OP1=0 NO ERRORS CONTINUE, OP1=1 REDO, OP1= ", OP1%
IF OP1% = 1 THEN GOTO 600
REM SOLUTION BY MONTE CARLO
405 OP2% = 0: INPUT " ENTER '1' TO USE REDLICH-KISTER, ENTER '2' TO USE WILSON, ENTER '3' TO USE VAN LAAR: OP2= ", OP2%
IF OP2% = 0 OR OP2% > 3 THEN PRINT " YOU MUST ENTER A '1', '2', OR '3' TO SELECT AN ACTIVITY COEFFICIENT MODEL: REDO": GOTO 405
TS# = TIMER
OPT = 1E+30
COUNTI% = 0: COUNTJ% = 0: COUNT& = 0
FOR I = 1 TO 4
AA(I) = 0 'COMPOSITION VARIABLES IN PCT AND TEMPERATURE FROM 0 TO 100 C WHERE AA(4) IS TEMPERATURE
NEXT I
FOR J = 1 TO 30
ZZZ = 500
FOR I = 1 TO ZZZ
COUNT& = COUNT& + 1
FOR K = 1 TO 4
IF AA(K) - 100! / 2 ^ J < 0 THEN GOTO 15
GOTO 17
15 LL(K) = 0!
GOTO 16
17 LL(K) = AA(K) - 100! / 2 ^ J
16 IF AA(K) + 100! / 2 ^ J > BP(N) THEN GOTO 18
GOTO 19
18 UL(K) = 100! - LL(K)
GOTO 20
19 UL(K) = AA(K) + 100! / 2 ^ J - LL(K)
20 X(K) = LL(K) + RND * UL(K)
NEXT K
PRINT: PRINT " J= "; J; " I= "; I
FOR K = 1 TO 3
X(K) = X(K) / 100!
PRINT " X= "; X(K)
NEXT K
TD = X(4): PRINT " TD= "; TD
'INPUT " PRESS ENTER TO CONTINUE", YES
IF OP2% = 1 THEN CALL RK: GOTO 410 'USE RK ACTIVITY COEFFS.
IF OP2% = 2 THEN CALL WILSON: GOTO 410 'USE WILSON ACTIVITY COEFFS.
IF OP2% = 3 THEN CALL VANLAAR: GOTO 410 'USE VAN LAAR ACTIVITY COEFFICIENTS
410 G1 = 0!: SUMPT = 0!
FOR II = 1 TO N
VP(II) = 2.718282 ^ (A(II) - (B(II) / (TD + C(II))))
EK(II) = VP(II) / PT
XP(II) = X(II) * G(II) * VP(II): PRINT " XP= "; XP(II)
G1 = G1 + XP(II): SUMPT = SUMPT + XP(II)
NEXT II
G1 = ABS(G1 - 101.325)
PRINT: PRINT " G1= "; G1; " SUMPT= "; SUMPT
G2 = 0!: SUMX = 0!
FOR II = 1 TO N
X(II) = X(II) * 100!
G2 = G2 + X(II): SUMX = SUMX + X(II)
NEXT II
G2 = ABS(G2 - 100!)
PRINT: PRINT " G2= "; G2; " SUMX= "; SUMX
G3 = 0!: SUMYY = 0!
FOR II = 1 TO 3
YY(II) = EK(II) * G(II) * X(II): PRINT " YY= "; YY(II)
DELY(II) = (YY(II) - Y(II) * 100!) ^ 2
G3 = G3 + DELY(II): SUMYY = SUMYY + YY(II)
NEXT II
PRINT " G3= "; G3; " SUMYY= "; SUMYY
G = G1 + G2 + G3: PRINT: PRINT " G= "; G
'INPUT " PRESS ENTER TO CONTINUE", YES
IF G < OPT THEN GOTO 21
GOTO 22
21 FOR II = 1 TO 4
AA(II) = X(II)
NEXT II
OPT = G
22 COUNTI% = COUNTI% + 1: PRINT: PRINT " COUNTI= "; COUNTI%
NEXT I
PRINT " SUMX= "; SUMX; " SUMPT= "; SUMPT
PRINT " G= "; G; " G1= "; G1; " G2= "; G2; " G3= "; G3; " OPT= "; OPT
PRINT " TD= "; AA(4); " I= "; I; " J= "; J
PRINT " AA(1)= "; AA(1); " AA(2)= "; AA(2); " AA(3)= "; AA(3); " AA(4)= "; AA(4)
PRINT " XP(1)= "; XP(1); " XP(2)= "; XP(2); " XP(3)= "; XP(3)
PRINT " X(1)= "; AA(1) / 100!; " X(2)= "; AA(2) / 100!; " X(3)= "; AA(3) / 100!; " TD= "; X(4)
PRINT " G1= "; G(1); " G2= "; G(2); "G3= "; G(3)
PRINT " EK(1)= "; EK(1); " EK(2)= "; EK(2); " EK(3)= "; EK(3)
PRINT " Y(1)= "; Y(1); " Y(2)= "; Y(2); " Y(3)= "; Y(3)
COUNTI% = 0
COUNTJ% = COUNTJ% + 1: PRINT: PRINT " COUNTJ= "; COUNTJ%
'INPUT " PRESS ENTER TO CONTINUE", YES
23 NEXT J
CLS: PRINT: PRINT " FINAL RESULTS FOR CALCULATING DEW TEMPERATURE!"
PRINT #1,: PRINT #1, " FINAL RESULTS FOR CALCULATING DEW TEMPERATURE!"
PRINT: PRINT " AA(1)= "; AA(1); " AA(2)= "; AA(2); " AA(3)= "; AA(3); " AA(4)= "; AA(4)
PRINT: PRINT " X(1)= "; AA(1) / 100.; " X(2)= "; AA(2) / 100.; " X(3)= "; AA(3) / 100.
PRINT #1,: PRINT #1, " AA(1)= "; AA(1); " AA(2)= "; AA(2); " AA(3)= "; AA(3); " AA(4)= "; AA(4)
PRINT #1,: PRINT #1, " X(1)= "; AA(1) / 100.; " X(2)= "; AA(2) / 100.; " X(3)= "; AA(3) / 100.
SUMX = 0.
FOR II = 1 TO 3: X(II) = X(II) / 100.: SUMX = SUMX + X(II): NEXT II: PRINT " SUMX= "; SUMX
IF OP2% = 1 THEN CALL RK: GOTO 227 'USE RK ACTIVITY COEFFS.
IF OP2% = 2 THEN CALL WILSON: GOTO 227 'USE WILSON ACTIVITY COEFFS.
IF OP2% = 3 THEN CALL VANLAAR: GOTO 227 'USE VAN LAAR ACTIVITY COEFFS.
227 SUMY = 0.
FOR II = 1 TO 3: Y(II) = EK(II) * G(II) * X(II): SUMY = SUMY + Y(II): NEXT II
PRINT: PRINT " Y(1)= "; Y(1); " Y(2)= "; Y(2); " Y(3)= "; Y(3); " SUMY= "; SUMY
PRINT: PRINT " G1= "; G1; " G2= "; G2; " G3= "; G3; " G4= "; G4
PRINT: PRINT " G1= "; G(1); " G2= "; G(2); "G3= "; G(3)
PRINT: PRINT " VP(1)= "; VP(1); " VP(2)= "; VP(2); " VP(3)= "; VP(3)
PRINT: PRINT " EK(1)= "; VP(1) / PT; " EK(2)= "; VP(2) / PT; " EK(3)= "; VP(3) / PT
PRINT: PRINT " COUNTJ= "; COUNTJ%; " OVERALL COUNT= "; COUNT&&
PRINT: PRINT " G= "; G; " OPT= "; OPT; " TD= "; AA(4)
PRINT #1,: PRINT #1, " Y(1)= "; Y(1); " Y(2)= "; Y(2); " Y(3)= "; Y(3); " SUMY= "; SUMY
PRINT #1,: PRINT #1, " G1= "; G1; " G2= "; G2; " G3= "; G3; " G4= "; G4
PRINT #1,: PRINT #1, " G1= "; G(1); " G2= "; G(2); "G3= "; G(3)
PRINT #1,: PRINT #1, " VP(1)= "; VP(1); " VP(2)= "; VP(2); " VP(3)= "; VP(3)
PRINT #1,: PRINT #1, " EK(1)= "; VP(1) / PT; " EK(2)= "; VP(2) / PT; " EK(3)= "; VP(3) / PT
PRINT #1,: PRINT #1, " COUNTJ= "; COUNTJ%; " OVERALL COUNT= "; COUNT&
PRINT #1,: PRINT #1, " G= "; G; " OPT= "; OPT; " TD= "; AA(4)
TF# = TIMER
PRINT: PRINT " START TIME= "; TS#; " FINISH TIME= "; TF#
ELAPSE# = (TF# - TS#): PRINT " ELAPSED TIME= "; ELAPSE#; " SECONDS"
PRINT #1, " ELAPSED TIME= "; ELAPSE#; " SECONDS"
INPUT " PRESS ENTER TO CONTINUE", YES
CLS
END SUB
SUB ENTHALPY
CLS
PRINT: PRINT: PRINT: PRINT " CALCULATE HEAT OF VAPORIZATION OF FEED AND FLASHQ-HEAT REQUIRED TO FLASH FEED TO TWO PHASE STATE"
PRINT " ENERGY NUMBERS ARE IN CALORIES FOR 100 MOLE/HR FEED"
PRINT #1,: PRINT #1,: PRINT #1,: PRINT #1, " CALCULATE HEAT OF VAPORIZATION OF FEED AND FLASHQ-HEAT REQUIRED TO FLASH FEED TO TWO PHASE STATE"
PRINT #1, " ENERGY NUMBERS ARE IN CALORIES FOR 100 MOLE/HR FEED"
PRINT #1,
DIM HL(10), HV(10), HLF(10), HVF(10), SUMHL(10), SUMHV(10)
DIM ENTHFV(10), ENTHFL(10), Y(10), Z(10)
'GOTO 2 'TEMP BYPASS FOR DEBUGGING
INPUT " NUMBER OF COMPONENTS= ", N
INPUT " FEED FLOW IN MOLES/HR= ", FF
INPUT " FEED PRESSURE IN kPa= ", PT
INPUT " FEED TEMPERATURE IN CENT.= ", TF
INPUT " FRACTION OF VAPOR FLASHED= ", V
INPUT " FEED BUBBLE POINT IN CENT.= ", FBP
INPUT " FEED DEW POINT IN CENT.= ", FDP
'2 PT = 101.325: TF = 74.57: V = 0.50: N = 3: FF = 100.: FBP = 72.78: FDP = 80.42
'Z(1) = 0.50: Z(2) = 0.15: Z(3) = 0.35
'Y(1) = 0.5827: Y(2) = 0.2876: Y(3) = 0.1297
'X(1) = 0.4368: X(2) = 0.3938: X(3) = 0.1694
'GOTO 4 'TEMP BYPASS FOR DEBUGGING
3 PRINT: SUMZ = 0
FOR KK = 1 TO N
PRINT COMPONENT$(KK)
INPUT " MOLE FRACT. IN FEED= ", Z(KK)
INPUT " MOLE FRACT. IN VAPOR PHASE= ", Y(KK)
INPUT " MOLE FRACT. IN LIQUID PHASE= ", X(KK)
SUMZ = SUMZ + Z(KK)
NEXT KK
PRINT " SUMZ= "; SUMZ
OP1% = 0: INPUT " OP1=0 NO ERRORS CONTINUE, OP1=1 REDO, OP1= ", OP1%
IF OP1% = 1 THEN GOTO 3
420 OP2% = 0: INPUT " ENTER '1' TO USE REDLICH-KISTER, ENTER '2' TO USE WILSON, ENTER '3' TO USE VAN LAAR: OP2= ", OP2%
IF OP2% = 0 OR OP2% > 3 THEN PRINT " YOU MUST ENTER A '1', '2', OR '3' TO SELECT AN ACTIVITY COEFFICIENT MODEL: REDO": GOTO 420
IF OP2% = 1 THEN CALL RK: GOTO 79 'USE RK ACTIVITY COEFFS.
IF OP2% = 2 THEN CALL WILSON: GOTO 79 'USE WILSON ACTIVITY COEFFS.
IF OP2% = 3 THEN CALL VANLAAR: GOTO 79 'USE VAN LAAR ACTIVITY COEFFICIENTS
REM CALCULATIONS BELOW ARE ONLY FOR TWO PHASE FEED
79 FOR I% = 1 TO N
HLF(I%) = (AAL(I%) * TF) + ((BB(I%) / 2!) * (TF ^ 2)) + ((CC(I%) / 3!) * (TF ^ 3))
HLF(I%) = HLF(I%) * H * MW(I%) 'CAL/MOLE
HVF(I%) = AAH(I%) + BBB(I%) * TF + CCC(I%) * TF ^ 2
HVF(I%) = HVF(I%) * H * MW(I%) 'CAL/MOLE
NEXT I%
SUMHLF = 0: SUMHVF = 0
FOR I% = 1 TO N
ENTHFL(I%) = (HLF(I%) * X(I%) * (1 - V) * FF)
ENTHFV(I%) = (HVF(I%) * Y(I%) * FF * V) + (FF * V * HLF(I%) * Y(I%))
SUMHLF = SUMHLF + ENTHFL(I%)
SUMHVF = SUMHVF + ENTHFV(I%)
PRINT " FOR COMPONENT= "; I%; " HLF= "; HLF(I%); " HVF= "; HVF(I%); " ENTHFL= "; ENTHFL(I%); " ENTHFV= "; ENTHFV(I%)
PRINT #1, " FOR COMPONENT= "; I%; " HLF= "; HLF(I%); " HVF= "; HVF(I%); " ENTHFL= "; ENTHFL(I%); " ENTHFV= "; ENTHFV(I%)
NEXT I%
QQF = SUMHLF + SUMHVF
PRINT " TOTAL FEED ENTHALPY= "; QQF
PRINT #1, " TOTAL FEED ENTHALPY= "; QQF
INPUT " PRESS ENTER TO CONTINUE", YES
REM DETERMINE HEAT OF VAPORIZATION OF FEED
REM GET ENTHALPY OF FEED LIQUID AT FEED BUBBLE POINT, FBP
T = FBP
FOR I% = 1 TO N
HLF(I%) = (AAL(I%) * T) + ((BB(I%) / 2!) * (T ^ 2)) + ((CC(I%) / 3!) * (T ^ 3))
HLF(I%) = HLF(I%) * H * MW(I%) 'CAL/MOLE
PRINT " FOR COMPONENT= "; I%; " HLF= "; HLF(I%)
PRINT #1, " FOR COMPONENT= "; I%; " HLF= "; HLF(I%)
NEXT I%
SUMHLF = 0
FOR I% = 1 TO N
ENTHFL(I%) = HLF(I%) * Z(I%) * FF
SUMHLF = SUMHLF + ENTHFL(I%)
NEXT I%
FHL = SUMHLF
PRINT " ENTHALPY FOR TOTAL LIQUID FEED AT FEED BP, FHL= "; FHL
PRINT #1, " ENTHALPY FOR TOTAL LIQUID FEED AT FEED BP, FHL= "; FHL
INPUT " PRESS ENTER TO CONTINUE", YES
REM THIRD, GET ENTHALPY OF FEED VAPOR AT FEED DEW POINT, FDP
T = FDP
FOR I% = 1 TO N
HLF(I%) = (AAL(I%) * T) + ((BB(I%) / 2!) * (T ^ 2)) + ((CC(I%) / 3!) * (T ^ 3))
HLF(I%) = HLF(I%) * H * MW(I%) 'CAL/MOLE
PRINT " FOR COMPONENT= "; I%; " HLF= "; HLF(I%)
PRINT #1, " FOR COMPONENT= "; I%; " HLF= "; HLF(I%)
HVF(I%) = AAH(I%) + BBB(I%) * T + CCC(I%) * T ^ 2
HVF(I%) = HVF(I%) * H * MW(I%) 'CAL/MOLE
NEXT I%
SUMHVF = 0
FOR I% = 1 TO N
ENTHFV(I%) = (HVF(I%) * Z(I%) * FF) + (HLF(I%) * Z(I%) * FF)
SUMHVF = SUMHVF + ENTHFV(I%)
NEXT I%
FHV = SUMHVF 'ENTHALPY IS A STATE FUNCTION. HERE WE HAVE TAKEN FEED AS LIQUID UP TO ITS DEW POINT THEN VAPORIZED IT ALL AT ITS DEW POINT.
PRINT " ENTHALPY FOR FEED VAPOR AT FEED DEW POINT, FHV= "; FHV
PRINT #1, " ENTHALPY FOR FEED VAPOR AT FEED DEW POINT, FHV= "; FHV
INPUT " PRESS ENTER TO CONTINUE", YES
REM COLLECT ENTHALPY DATA FOR CALCULATION OF Q-FEED, QF
REM FIRST, GET ENTHALPY OF FEED LIQUID AT FEED TEMPERATURE
FOR I% = 1 TO N
HLF(I%) = (AAL(I%) * TF) + ((BB(I%) / 2!) * (TF ^ 2)) + ((CC(I%) / 3!) * (TF ^ 3))
HLF(I%) = HLF(I%) * H * MW(I%) 'CAL/MOLE
PRINT " FOR COMPONENT= "; I%; " HLF= "; HLF(I%)
PRINT #1, " FOR COMPONENT= "; I%; " HLF= "; HLF(I%)
NEXT I%
SUMHLF = 0
FOR I% = 1 TO N
ENTHFL(I%) = HLF(I%) * Z(I%) * FF 'BASE TEMPERATURE IS ZERO
SUMHLF = SUMHLF + ENTHFL(I%)
NEXT I%
HF = SUMHLF 'ENTHALPY OF FEED LIQUID AT FEED TEMPERATURE
PRINT " ENTHALPY FOR TOTAL LIQUID FEED AT FEED TEMPERATURE, HF= "; HF
PRINT #1, " ENTHALPY FOR TOTAL LIQUID FEED AT FEED TEMPERATURE, HF= "; HF
REM CALCULATE QF AND HEAT OF VAPORIZATION
REM NOTE THAT FOR FEED AT ITS BP (SATURATED LIQUID), HF = FHL, SO QF = 1
QF = (FHV - HF) / (FHV - FHL)
PRINT " QF= "; QF; " V= "; V
PRINT #1, " QF= "; QF; " V= "; V
LAMDA = FHV - FHL 'HEAT OF VAPORIZATION OF FEED
PRINT " HEAT OF VAPORIZATION FOR TOTAL FEED MOLE/HR(100.)= "; LAMDA
REM CALCULATE FLASH Q-HEAT REQUIRED TO FLASH LIQUID FEED AT FEED TEMP. TO TWO PHASE FLASHED STATE
REM SUBTRACT ENTHALPY OF TOTAL LIQUID FEED, HF, AT TF FROM QQF, ENTHALPY OF FLASHED TWO PHASE FEED
FLASHQ = QQF - HF
PRINT: PRINT " QQF= "; QQF; " HF= "; HF; " FLASHQ= "; FLASHQ
PRINT #1,: PRINT #1, " QQF= "; QQF; " HF= "; HF; " FLASHQ= "; FLASHQ
INPUT " PRESS ENTER TO CONTINUE", YES
CLS
END SUB
SUB PRESSURE
CLS
DIM AA(10), LL(10), UL(10), XP(10), VP(10), EK(10), ZX(10), Z(10), Y(10)
PRINT: PRINT: PRINT: PRINT " SUBROUTINE TO CALCULATE FLASH PRESSURE WITH KNOWN V AND T"
PRINT #1,: PRINT #1,: PRINT #1,: PRINT #1, " SUBROUTINE TO CALCULATE FLASH PRESSURE WITH KNOWN V AND T"
PRINT #1,
800 PRINT: PRINT " INPUT DATA FOR FLASH WITH UNKNOWN PRESSURE CALCS."
INPUT " NUMBER OF COMPONENTS= ", N
INPUT " TEMPERATURE IN DEG. C= ", T
INPUT " FRACTION OF VAPOR FLASHED, V= ", V
PRINT: SUMZ = 0
FOR KK = 1 TO N
PRINT COMPONENT$(KK)
INPUT " MOLE FRACTION IN FEED= ", Z(KK)
SUMZ = SUMZ + Z(KK)
NEXT KK
PRINT " SUMZ= "; SUMZ
OP1% = 0: INPUT " OP1=0 NO ERRORS CONTINUE, OP1=1 REDO, OP1= ", OP1%
IF OP1% = 1 THEN GOTO 800
95 REM SOLUTION BY MONTE CARLO
430 OP2% = 0: INPUT " ENTER '1' TO USE REDLICH-KISTER, ENTER '2' TO USE WILSON, ENTER '3' TO USE VAN LAAR: OP2= ", OP2%
IF OP2% = 0 OR OP2% > 3 THEN PRINT " YOU MUST ENTER A '1', '2', OR '3' TO SELECT AN ACTIVITY COEFFICIENT MODEL: REDO": GOTO 430
TS# = TIMER
FIL% = -1111: RANDOMIZE (FIL%)
OPT = 1D+17
COUNT& = 0: COUNTI% = 0
FOR I = 1 TO 4
AA(I) = 0 'COMPOSITION VARIABLES IN PCT AND TEMPERATURE FROM 0 TO 100 C WHERE AA(5) IS TEMPERATURE
NEXT I
FOR J = 1 TO 20
ZZZ = 200
FOR I = 1 TO ZZZ
COUNT& = COUNT& + 1
FOR K = 1 TO 3
IF AA(K) - 100! / 2 ^ J < 0! THEN GOTO 35
GOTO 36
35 LL(K) = 0!
GOTO 37
36 LL(K) = AA(K) - 100! / 2 ^ J
37 IF AA(K) + 100! / 2 ^ J > 100! THEN GOTO 38
GOTO 39
38 UL(K) = 100! - LL(K)
GOTO 40
39 UL(K) = AA(K) + 100! / 2 ^ J - LL(K)
40 X(K) = LL(K) + RND * UL(K)
NEXT K
K = 4
IF AA(K) - 101.325 / 2 ^ J < 0! THEN GOTO 550
GOTO 560
550 LL(K) = 0!
555 GOTO 565
560 LL(K) = AA(K) - 101.325 / 2 ^ J
565 IF AA(K) + 101.325 / 2 ^ J > 101.325 THEN GOTO 580
570 GOTO 590
580 UL(K) = 101.325 - LL(K)
585 GOTO 591
590 UL(K) = AA(K) + 101.325 / 2 ^ J - LL(K)
591 PT = LL(K) + RND * UL(K)
PRINT: PRINT " J= "; J; " I= "; I 'FIRST THREE ARE LIQ. COMPS., FOURTH IS PRESSURE
FOR K = 1 TO 3
X(K) = X(K) / 100!
PRINT " X= "; X(K)
NEXT K
PRINT " PT= "; PT
'INPUT " PRESS ENTER TO CONTINUE", YES
IF OP2% = 1 THEN CALL RK: GOTO 12 'USE RK ACTIVITY COEFFS.
IF OP2% = 2 THEN CALL WILSON: GOTO 12 'USE WILSON ACTIVITY COEFFS.
IF OP2% = 3 THEN CALL VANLAAR: GOTO 12 'USE VAN LAAR ACTIVITY COEFFICIENTS
12 G1 = 0!: SUMPT = 0!
FOR II = 1 TO 3
VP(II) = 2.718 ^ (A(II) - (B(II) / ((T) + C(II)))): PRINT " VP= "; VP(II)
EK(II) = VP(II) / PT: PRINT " EK= "; EK(II)
XP(II) = X(II) * G(II) * VP(II): PRINT " XP= "; XP(II)
G1 = G1 + XP(II): SUMPT = SUMPT + XP(II)
NEXT II
G1 = ABS(G1 - 101.325)
PRINT: PRINT " G1= "; G1; " SUMPT= "; SUMPT
'INPUT " PRESS ENTER TO CONTINUE", YES
G2 = 0!: SUMY = 0!
FOR II = 1 TO 3
X(II) = X(II) * 100!
Y(II) = EK(II) * G(II) * X(II)
G2 = G2 + Y(II): SUMY = SUMY + Y(II)
NEXT II
G2 = ABS(G2 - 100!)
PRINT " G2= "; G2; " SUMY= "; SUMY
G3 = 0!: SUMX = 0!
FOR II = 1 TO 3
G3 = G3 + X(II): SUMX = SUMX + X(II)
NEXT II
G3 = ABS(G3 - 100!)
PRINT: PRINT " G3= "; G3; " SUMX= "; SUMX
G4 = 0!: SUMZX = 0!
FOR II = 1 TO 3
ZX(II) = ABS(Z(II) * 100! - (V * X(II) * G(II) * EK(II)) - (1! - V) * X(II)): PRINT " ZX(II)= "; ZX(II)
'ZX(II) = (V * EK(II) * G(II) * X(II)) + ((1.0 - V) * X(II)): PRINT " ZX(II)= "; ZX(II)
G4 = G4 + ZX(II): SUMZX = SUMZX + ZX(II)
NEXT II
PRINT " G4= "; G4; " SUMZX= "; SUMZX
G = G1 + G2 + G3 + G4: PRINT: PRINT " G= "; G; " PRESSURE= "; PT
'INPUT " PRESS ENTER TO CONTINUE", YES
IF G < OPT THEN GOTO 440
GOTO 43
REM SAVE BEST SO FAR X'S AND Y'S AND T
440 AA(1) = X(1): AA(2) = X(2): AA(3) = X(3): AA(4) = PT
SUMX = AA(1) + AA(2) + AA(3): PRINT " SUMX= "; SUMX
PRINT: PRINT " X(1)= "; AA(1) / 100!; " X(2)= "; AA(2) / 100!; " X(3)= "; AA(3) / 100!; " PT= "; AA(4)
OPT = G: PRINT " OPT= "; OPT
43 COUNTI% = COUNTI% + 1: PRINT: PRINT " COUNTI= "; COUNTI%
'INPUT " PRESS ENTER TO CONTINUE", YES
NEXT I
PRINT: PRINT " G= "; G; " G1= "; G1; " G2= "; G2; " G3= "; G3; " G4= "; G4; " OPT= "; OPT
PRINT: PRINT " PT= "; PT; " I= "; I; " J= "; J
PRINT: PRINT " X(1)= "; AA(1) / 100!; " X(2)= "; AA(2) / 100!; " X(3)= "; AA(3) / 100!; " PT= "; AA(4)
SUMX = AA(1) / 100! + AA(2) / 100! + AA(3) / 100!: PRINT " SUMX= "; SUMX
COUNTI% = 0
COUNTJ% = COUNTJ% + 1: PRINT: PRINT " COUNTJ= "; COUNTJ%
'INPUT " PRESS ENTER TO CONTINUE", YES
NEXT J
CLS: PRINT: PRINT " FINAL RESULTS FOR CALCULATION OF FLASH PRESSURE!"
PRINT #1,: PRINT #1, " FINAL RESULTS FOR CALCULATION OF FLASH PRESSURE!"
SUMX = 0!
FOR II = 1 TO 3
X(II) = AA(II) / 100!: SUMX = SUMX + X(II)
NEXT II
IF OP2% = 1 THEN CALL RK: GOTO 204 'USE RK ACTIVITY COEFFS.
IF OP2% = 2 THEN CALL WILSON: GOTO 204 'USE WILSON ACTIVITY COEFFS.
IF OP2% = 3 THEN CALL VANLAAR: GOTO 204 'USE VAN LAAR ACTIVITY COEFFICIENTS
204 PT = AA(4)
SUMY = 0!
FOR II = 1 TO 3
VP(II) = 2.718282 ^ (A(II) - (B(II) / ((T) + C(II))))
EK(II) = VP(II) / PT
Y(II) = EK(II) * G(II) * X(II): SUMY = SUMY + Y(II)
NEXT II
199 REM
PRINT: PRINT " Y(1)= "; Y(1); " Y(2)= "; Y(2); " Y(3)= "; Y(3)
PRINT: PRINT " X(1)= "; X(1); " X(2)= "; X(2); " X(3)= "; X(3)
PRINT: PRINT " G1= "; G1; " G2= "; G2; " G3= "; G3; " G4= "; G4
PRINT: PRINT " G1= "; G(1); " G2= "; G(2); "G3= "; G(3)
PRINT: PRINT " VP(1)= "; VP(1); " VP(2)= "; VP(2); " VP(3)= "; VP(3)
PRINT: PRINT " EK(1)= "; VP(1) / PT; " EK(2)= "; VP(2) / PT; " EK(3)= "; VP(3) / PT
PRINT: PRINT " COUNTJ= "; COUNTI%; " OVERALL COUNT= "; COUNT&
PRINT: PRINT " G= "; G; " OPT= "; OPT; " PT= "; PT
PRINT #1,: PRINT #1, " Y(1)= "; Y(1); " Y(2)= "; Y(2); " Y(3)= "; Y(3)
PRINT #1,: PRINT #1, " X(1)= "; X(1); " X(2)= "; X(2); " X(3)= "; X(3)
PRINT #1,: PRINT #1, " G1= "; G1; " G2= "; G2; " G3= "; G3; " G4= "; G4
PRINT #1,: PRINT #1, " G1= "; G(1); " G2= "; G(2); "G3= "; G(3)
PRINT #1,: PRINT #1, " VP(1)= "; VP(1); " VP(2)= "; VP(2); " VP(3)= "; VP(3)
PRINT #1,: PRINT #1, " EK(1)= "; VP(1) / PT; " EK(2)= "; VP(2) / PT; " EK(3)= "; VP(3) / PT
PRINT #1,: PRINT #1, " COUNTJ= "; COUNTJ%; " OVERALL COUNT= "; COUNT&
PRINT #1,: PRINT #1, " G= "; G; " OPT= "; OPT; " PT= "; PT
TF# = TIMER
PRINT: PRINT " START TIME= "; TS#; " FINISH TIME= "; TF#
ELAPSE# = (TF# - TS#): PRINT " ELAPSED TIME= "; ELAPSE#; " SECONDS"
PRINT #1, " ELAPSED TIME= "; ELAPSE#; " SECONDS"
INPUT " PRESS ENTER TO CONTINUE", YES
CLS
END SUB
SUB RACHFORD
CLS
PRINT: PRINT " DEMONSTRATE USE OF MONTE CARLO METHOD TO SOLVE RACHFORD-RICE EXAMPLE PROBLEM"
PRINT #1,: PRINT #1, " DEMONSTRATE USE OF MONTE CARLO METHOD TO SOLVE RACHFORD-RICE EXAMPLE PROBLEM"
DIM AA(10), LL(10), UL(10), Z(10)
DIM K(10) AS DOUBLE
PRINT: PRINT " PROBLEM TAKEN FROM EXAMPLE 4.1 ON PAGE 180 OF 'SEPARATION PROCESS PRINCIPLES' BY J. D. SEADER AND E. J. HENLEY, JOHN WILEY & SONS, 1998."
PRINT " A 100-KMOL/H FEED CONSISTING OF 10,20,30, AND 40 MOL % OF PROPANE(3), N-BUTANE(4), N-PENTANE(5), AND N-HEXANE(6), RESPECTIVELY, ENTERS"
PRINT " A DISTILLATION COLUMN AT 100 PSIA (689.5 kPa) AND 200 F (366.5 K). ASSUMING EQUILIBRIUM, WHAT MOLE FRACTION OF THE FEED ENTERS AS VAPOR,"
PRINT " TAKEN FROM S.T. HADDEN AND H.G. GRAYSON VLE DATA FOR HYDROCARBONS, AT FLASH CONDITIONS, K(1) = 4.2, K(2) = 1.75, K(3) = 0.74, AND K(4) = 0.34,"
PRINT " INDEPENDENT OF COMPOSITIONS. FROM RACHFORD-RICE, f(PHI) = THE SUM FROM I=1 TO 4 OF [Z(I)*(1 - K(I)] / [(1 + PHI*(K(I) - 1)] = 0 WHERE"
PRINT " PHI = V/F AND Z(I) = THE FEED COMPOSITION IN MOLE FRACTION FOR THE ITH COMPONENT, 0.1, 0.2, 0.3, AND 0.4, RESPECTIVELY. f(0) WAS CALCULATED TO"
PRINT " BE -0.128 AND f(1) WAS CALCULATED TO BE 0.720. SINCE f(0) < 0 THE MIXTURE IS ABOVE ITS BUBBLE POINT TEMPERATURE, AND SINCE f(1) > 0 THE MIXTURE"
PRINT " IS BELOW ITS DEW POINT MEANING THAT TWO PHASES EXIST. THE CALCULATION OF PHI USING MONTE CARLO INSTEAD OF NEWTON-RAPHSON FOLLOWS:"
PRINT #1,: PRINT #1, " PROBLEM TAKEN FROM EXAMPLE 4.1 ON PAGE 180 OF 'SEPARATION PROCESS PRINCIPLES' BY J. D. SEADER AND E. J. HENLEY, JOHN WILEY & SONS, 1998."
PRINT #1, " A 100-KMOL/H FEED CONSISTING OF 10,20,30, AND 40 MOL % OF PROPANE(3), N-BUTANE(4), N-PENTANE(5), AND N-HEXANE(6), RESPECTIVELY, ENTERS"
PRINT #1, " A DISTILLATION COLUMN AT 100 PSIA (689.5 kPa) AND 200 F (366.5 K). ASSUMING EQUILIBRIUM, WHAT MOLE FRACTION OF THE FEED ENTERS AS VAPOR,"
PRINT #1, " TAKEN FROM S.T. HADDEN AND H.G. GRAYSON VLE DATA FOR HYDROCARBONS, AT FLASH CONDITIONS, K(1) = 4.2, K(2) = 1.75, K(3) = 0.74, AND K(4) = 0.34,"
PRINT #1, " INDEPENDENT OF COMPOSITIONS. FROM RACHFORD-RICE, f(PHI) = THE SUM FROM I=1 TO 4 OF [Z(I)*(1 - K(I)] / [(1 + PHI*(K(I) - 1)] = 0 WHERE"
PRINT #1, " PHI = V/F AND Z(I) = THE FEED COMPOSITION IN MOLE FRACTION FOR THE ITH COMPONENT, 0.1, 0.2, 0.3, AND 0.4, RESPECTIVELY. f(0) WAS CALCULATED TO"
PRINT #1, " BE -0.128 AND f(1) WAS CALCULATED TO BE 0.720. SINCE f(0) < 0 THE MIXTURE IS ABOVE ITS BUBBLE POINT TEMPERATURE, AND SINCE f(1) > 0 THE MIXTURE"
PRINT #1, " IS BELOW ITS DEW POINT MEANING THAT TWO PHASES EXIST. THE CALCULATION OF PHI USING MONTE CARLO INSTEAD OF NEWTON-RAPHSON FOLLOWS:"
INPUT " PRESS ENTER TO CONTINUE", YES
REM SOLUTION BY MONTE CARLO
FIL% = -1111: RANDOMIZE (FIL%)
OPT = 1D+17
TS# = TIMER
COUNT& = 0: Z(1) = .1: Z(2) = .2: Z(3) = .3: Z(4) = .4
K(1) = 4.2: K(2) = 1.75: K(3) = .74: K(4) = .34
COUNTI% = 0: COUNTJ% = 0
AA(1) = 0
FOR J = 1 TO 10
ZZZ = 200
FOR I = 1 TO ZZZ
COUNT& = COUNT& + 1
IF AA(1) - 100! / 2 ^ J < 0! THEN GOTO 81
GOTO 83
81 LL(1) = 0!
GOTO 82
83 LL(1) = AA(1) - 100! / 2 ^ J
82 IF AA(1) + 100! / 2 ^ J > 100! THEN GOTO 84
GOTO 86
84 UL(1) = 100! - LL(1)
GOTO 87
86 UL(1) = AA(1) + 100! / 2 ^ J - LL(1)
87 V = LL(1) + RND * UL(1)
PRINT #1,: PRINT #1, " J= "; J; " I= "; I
PRINT #1, " AA(1)= "; AA(1); " LL(1)= "; LL(1); " UL(1)= "; UL(1)
PHI = V / 100!
PRINT #1, " PHI= "; PHI
G1 = 0!
FOR II = 1 TO 4: G1 = G1 + (Z(II) * (1 - K(II)) / (1 + PHI * (K(II) - 1))): NEXT II
'G1 = 0.3 * (7.0 - 1.) / (PHI * 7.0 + 1. - PHI) + 0.1 * (2.4 - 1.) / (PHI * 2.4 + 1. - PHI) + 0.15 * (0.8 - 1.) / (PHI * 0.8 + 1. - PHI) + 0.45 * (0.3 - 1) / (PHI * 0.3 - PHI + 1.)
G = ABS(G1)
PRINT #1,: ' PRINT #1, " G= "; G
'INPUT " PRESS ENTER TO CONTINUE", YES
IF G < OPT THEN GOTO 501
GOTO 502
REM SAVE BEST SO FAR X'S
501 AA(1) = PHI * 100!
PRINT #1,: PRINT #1, " NEW PHI= "; PHI
OPT = G: PRINT #1, " NEW OPT= "; OPT; " NEW G= "; G
COUNTI% = COUNTI% + 1: PRINT " COUNTI= "; COUNTI%; " COUNTJ= "; COUNTJ%
502 NEXT I
PRINT: PRINT " G= "; G; " G1= "; G1; " OPT= "; OPT
PRINT: PRINT " I= "; I; " J= "; J
PRINT: PRINT " FRACTION OF FEED CONVERTED TO VAPOR, PHI= "; PHI
PRINT #1,: PRINT #1, " G= "; G; " G1= "; G1; " OPT= "; OPT
PRINT #1,: PRINT #1, " I= "; I; " J= "; J
PRINT #1,: PRINT #1, " FRACTION OF FEED CONVERTED TO VAPOR, PHI= "; PHI
COUNTI% = 0
COUNTJ% = COUNTJ% + 1: PRINT: PRINT " COUNTJ= "; COUNTJ%
PRINT #1,: PRINT #1, " COUNTJ= "; COUNTJ%
'INPUT " PRESS ENTER TO CONTINUE", YES
NEXT J
CLS: PRINT: PRINT " FINAL RESULTS FOR RACHFORD-RICE CALCULATIONS!"
PRINT: PRINT " AA(1)= "; AA(1)
PRINT: PRINT " FRACTION OF FEED CONVERTED TO VAPOR, PHI= "; PHI
PRINT: PRINT " G1= "; G1
PRINT: PRINT " COUNTJ= "; COUNTJ%; " NUMBER OF SOLUTIONS EXAMINED= "; COUNT&
PRINT: PRINT " G= "; G; " OPT= "; OPT
PRINT #1,: PRINT #1, " FINAL RESULTS FOR RACHFORD-RICE CALCULATIONS!"
PRINT #1,: PRINT #1, " FRACTION OF FEED CONVERTED TO VAPOR, PHI= "; PHI
PRINT #1, " NUMBER OF SOLUTIONS EXAMINED= "; COUNT&
PRINT #1, " G= "; G
TF# = TIMER
PRINT: PRINT " START TIME= "; TS#; " FINISH TIME= "; TF#
ELAPSE# = (TF# - TS#): PRINT " ELAPSED TIME= "; ELAPSE#; " SECONDS"
PRINT #1, " ELAPSED TIME= "; ELAPSE#; " SECONDS"
INPUT " PRESS ENTER TO CONTINUE", YES
CLS
END SUB
SUB RK
SHARED G() AS DOUBLE
DIM AR(10) AS DOUBLE, PZX(10) AS DOUBLE, PAX(10, 10) AS DOUBLE
'N = 3
FOR JI = 1 TO N
PZX(JI) = 0
FOR KK = 1 TO N
S1 = BRK(KK, JI) * X(KK)
S2 = 2! * CRK(KK, JI) * X(KK) * (X(KK) - X(JI))
S3 = 2! * CRK(KK, JI) * X(KK) * X(JI)
PZX(JI) = PZX(JI) + S1 + S2 - S3
NEXT KK
NEXT JI
ZZ = 0
FOR KK = 1 TO N
AR(KK) = 0
FOR JI = 1 TO N
S4 = (BRK(KK, JI) + CRK(KK, JI) * (X(KK) - X(JI))) * X(JI)
S5 = CRK(KK, JI) * X(KK) * X(JI)
AR(KK) = AR(KK) + S4 + S5
S6 = BRK(KK, JI) * X(KK) * X(JI)
S7 = 2! * CRK(KK, JI) * X(KK) * X(JI) * (X(KK) - X(JI))
ZZ = ZZ + ((S6 + S7) / 2!)
NEXT JI
NEXT KK
REM CODE TO CALCULATE PARTIAL DERIVATIVES
FOR KK = 1 TO N
FOR KI = 1 TO N
PAX(KK, KI) = 0
FOR JI = 1 TO N
IF KK = KI THEN GOTO 661
PAX(KK, KI) = BRK(KK, KI) + (2! * CRK(KK, KI) * (X(KK) - X(KI)))
GOTO 665
661 PAX(KK, KI) = PAX(KK, KI) + 2! * CRK(KK, JI) * X(JI)
665 NEXT JI
NEXT KI
NEXT KK
FOR K = 1 TO N
G(K) = 2.718282 ^ (AR(K) - ZZ) ': PRINT " G= "; G(K); " ZZ= "; ZZ
NEXT K
'INPUT " PRESS ENTER TO CONTINUE", YES
END SUB
SUB TEMPERATURE
CLS
PRINT: PRINT: PRINT: PRINT " SUBROUTINE TO CALCULATE FLASH TEMPERATURE WITH KNOWN V AND P"
PRINT #1,: PRINT #1,: PRINT #1,: PRINT #1, " SUBROUTINE TO CALCULATE FLASH TEMPERATURE WITH KNOWN V AND P"
PRINT #1,
DIM Y(10), AA(10), Z(10), LL(10), UL(10), VP(10), XP(10), EK(10), ZX(10)
100 PRINT: PRINT " INPUT DATA FOR FLASH WITH UNKNOWN TEMPERATURE CALCS."
INPUT " NUMBER OF COMPONENTS= ", N
INPUT " TOTAL SYSTEM PRESSURE IN kPa= ", PT
INPUT " FRACTION OF VAPOR FLASHED, V= ", V
PRINT: SUMZ = 0
FOR KK = 1 TO N
PRINT COMPONENT$(KK)
INPUT " MOLE FRACTION IN FEED= ", Z(KK)
SUMZ = SUMZ + Z(KK)
NEXT KK
PRINT " SUMZ= "; SUMZ
OP1% = 0: INPUT " OP1=0 NO ERRORS CONTINUE, OP1=1 REDO, OP1= ", OP1%
IF OP1% = 1 THEN GOTO 100
REM SOLUTION BY MONTE CARLO
CALL ANTOINE
601 OP2% = 0: INPUT " ENTER '1' TO USE REDLICH-KISTER, ENTER '2' TO USE WILSON, ENTER '3' TO USE VAN LAAR: OP2= ", OP2%
IF OP2% = 0 OR OP2% > 3 THEN PRINT " YOU MUST ENTER A '1', '2', OR '3' TO SELECT AN ACTIVITY COEFFICIENT MODEL: REDO": GOTO 601
TS# = TIMER
FIL% = -1111: RANDOMIZE (FIL%)
OPT = 1D+17
COUNT& = 0: COUNTI% = 0: COUNTJ% = 0
FOR I = 1 TO 4
AA(I) = LOW 'COMPOSITION VARIABLES IN PCT AND TEMPERATURE FROM 0 TO 100 C WHERE AA(5) IS TEMPERATURE
NEXT I
FOR J = 1 TO 20
ZZZ = 500
FOR I = 1 TO ZZZ
COUNT& = COUNT& + 1
FOR K = 1 TO 3
IF AA(K) - 100! / 2 ^ J < 0! THEN GOTO 61
GOTO 62
61 LL(K) = 0!
GOTO 63
62 LL(K) = AA(K) - 100! / 2 ^ J
63 IF AA(K) + 100! / 2 ^ J > 100! THEN GOTO 64
GOTO 66
64 UL(K) = 100! - LL(K)
GOTO 67
66 UL(K) = AA(K) + 100! / 2 ^ J - LL(K)
67 X(K) = LL(K) + RND * UL(K)
NEXT K
K = 4
IF AA(K) - 100! / 2 ^ J < BP(1) THEN GOTO 68
GOTO 69
68 LL(K) = BP(1)
GOTO 71
69 LL(K) = AA(K) - 100! / 2 ^ J
71 IF AA(K) + BP(3) / 2 ^ J > BP(3) THEN GOTO 72
GOTO 73
72 UL(K) = BP(3) - LL(K)
GOTO 74
73 UL(K) = AA(K) + BP(3) / 2 ^ J - LL(K)
74 T = LL(K) + RND * UL(K)
PRINT: PRINT " J= "; J; " I= "; I
FOR K = 1 TO 3
X(K) = X(K) / 100!
PRINT " X= "; X(K)
NEXT K
PRINT " T= "; T
'INPUT " PRESS ENTER TO CONTINUE", YES
IF OP2% = 1 THEN CALL RK: GOTO 602 'USE RK ACTIVITY COEFFS.
IF OP2% = 2 THEN CALL WILSON: GOTO 602 'USE WILSON ACTIVITY COEFFS.
IF OP2% = 3 THEN CALL VANLAAR: GOTO 602 'USE VAN LAAR ACTIVITY COEFFICIENTS
602 G1 = 0!: SUMPT = 0!
FOR II = 1 TO 3
VP(II) = 2.718282 ^ (A(II) - (B(II) / ((T) + C(II)))): PRINT " VP(II)= "; VP(II)
XP(II) = X(II) * G(II) * VP(II): PRINT " XP= "; XP(II)
G1 = G1 + XP(II): SUMPT = SUMPT + XP(II)
NEXT II
G1 = ABS(G1 - 101.325)
PRINT: PRINT " G1= "; G1; " SUMPT= "; SUMPT
'INPUT " PRESS ENTER TO CONTINUE", YES
G2 = 0!: SUMX = 0!
FOR II = 1 TO 3
X(II) = X(II) * 100!
G2 = G2 + X(II): SUMX = SUMX + X(II)
NEXT II
G2 = ABS(G2 - 100!)
PRINT: PRINT " G2= "; G2; " SUMX= "; SUMX
G3 = 0!: SUMY = 0!
FOR II = 1 TO 3
EK(II) = VP(II) / PT
Y(II) = EK(II) * G(II) * X(II)
G3 = G3 + Y(II): SUMY = SUMY + Y(II)
NEXT II
G3 = ABS(G3 - 100!)
PRINT " G3= "; G3; " SUMY= "; SUMY
G4 = 0!: SUMZX = 0!
FOR II = 1 TO 3
ZX(II) = ABS(Z(II) * 100! - (V * X(II) * G(II) * EK(II)) - (1! - V) * X(II)): PRINT " ZX(II)= "; ZX(II)
'ZX(II) = (V * EK(II) * G(II) * X(II)) + ((1.0 - V) * X(II)): PRINT " ZX(II)= "; ZX(II)
G4 = G4 + ZX(II): SUMZX = SUMZX + ZX(II)
NEXT II
PRINT " G4= "; G4; " SUMZX= "; SUMZX
G = G1 + G2 + G3 + G4: PRINT: PRINT " G= "; G; " PRESSURE= "; PT
'INPUT " PRESS ENTER TO CONTINUE", YES
IF G < OPT THEN GOTO 77
GOTO 76
77 REM SAVE BEST SO FAR X'S AND Y'S AND T
AA(1) = X(1): AA(2) = X(2): AA(3) = X(3): AA(4) = T
SUMX = AA(1) + AA(2) + AA(3)
PRINT: PRINT " X(1)= "; AA(1) / 100!; " X(2)= "; AA(2) / 100!; " X(3)= "; AA(3) / 100!; " SUMX= "; SUMX
135 OPT = G: PRINT " OPT= "; OPT; " G= "; G; " T= "; AA(4)
76 COUNTI% = COUNTI% + 1: PRINT: PRINT " COUNTI= "; COUNTI%
'INPUT " PRESS ENTER TO CONTINUE", YES
NEXT I
PRINT: PRINT " G= "; G; " G1= "; G1; " G2= "; G2; " G3= "; G3; " G4= "; G4; " OPT= "; OPT
PRINT: PRINT " T= "; AA(4); " I= "; I; " J= "; J
PRINT: PRINT " XP(1)= "; XP(1); " XP(2)= "; XP(2); " XP(3)= "; XP(3)
PRINT: PRINT " X(1)= "; AA(1) / 100!; " X(2)= "; AA(2) / 100!; " X(3)= "; AA(3) / 100!
SUMX = X(1) + X(2) + X(3): PRINT " SUMX= "; SUMX
COUNTI% = 0
COUNTJ% = COUNTJ% + 1: PRINT: PRINT " COUNTJ= "; COUNTJ%
'INPUT " PRESS ENTER TO CONTINUE", YES
NEXT J
CLS: PRINT: PRINT " FINAL RESULTS FOR CALCULATING FLASH TEMPERATURE!"
PRINT #1,: PRINT #1, " FINAL RESULTS FOR CALCULATING FLASH TEMPERATURE!"
SUMX = 0!
FOR II = 1 TO 3
X(II) = AA(II) / 100!: SUMX = SUMX + X(II)
NEXT II
IF OP2% = 1 THEN CALL RK: GOTO 203 'USE RK ACTIVITY COEFFS.
IF OP2% = 2 THEN CALL WILSON: GOTO 203 'USE WILSON ACTIVITY COEFFS.
IF OP2% = 3 THEN CALL VANLAAR: GOTO 203 'USE VAN LAAR ACTIVITY COEFFICIENTS
203 T = AA(4)
SUMY = 0!
FOR II = 1 TO 3
VP(II) = 2.718282 ^ (A(II) - (B(II) / ((T) + C(II))))
EK(II) = VP(II) / PT
Y(II) = EK(II) * G(II) * X(II): SUMY = SUMY + Y(II)
NEXT II
PRINT: PRINT " Y(1)= "; Y(1); " Y(2)= "; Y(2); " Y(3)= "; Y(3)
PRINT: PRINT " X(1)= "; X(1); " X(2)= "; X(2); " X(3)= "; X(3)
PRINT: PRINT " G1= "; G1; " G2= "; G2; " G3= "; G3; " G4= "; G4
PRINT: PRINT " G1= "; G(1); " G2= "; G(2); "G3= "; G(3)
PRINT: PRINT " VP(1)= "; VP(1); " VP(2)= "; VP(2); " VP(3)= "; VP(3)
PRINT: PRINT " EK(1)= "; VP(1) / PT; " EK(2)= "; VP(2) / PT; " EK(3)= "; VP(3) / PT
PRINT: PRINT " COUNTJ= "; COUNTJ%; " COUNTI= "; COUNTI%; " OVERALL COUNT= "; COUNT&
PRINT: PRINT " G= "; G; " OPT= "; OPT; " T= "; T
PRINT #1,: PRINT #1, " Y(1)= "; Y(1); " Y(2)= "; Y(2); " Y(3)= "; Y(3)
PRINT #1,: PRINT #1, " X(1)= "; X(1); " X(2)= "; X(2); " X(3)= "; X(3)
PRINT #1,: PRINT #1, " G1= "; G1; " G2= "; G2; " G3= "; G3; " G4= "; G4
PRINT #1,: PRINT #1, " G1= "; G(1); " G2= "; G(2); "G3= "; G(3)
PRINT #1,: PRINT #1, " VP(1)= "; VP(1); " VP(2)= "; VP(2); " VP(3)= "; VP(3)
PRINT #1,: PRINT #1, " EK(1)= "; VP(1) / PT; " EK(2)= "; VP(2) / PT; " EK(3)= "; VP(3) / PT
PRINT #1,: PRINT #1, " COUNTJ= "; COUNTJ%; " OVERALL COUNT= "; COUNT&
PRINT #1,: PRINT #1, " G= "; G; " OPT= "; OPT; " T= "; T
TF# = TIMER
PRINT: PRINT " START TIME= "; TS#; " FINISH TIME= "; TF#
ELAPSE# = (TF# - TS#): PRINT " ELAPSED TIME= "; ELAPSE#; " SECONDS"
PRINT #1, " ELAPSED TIME= "; ELAPSE#; " SECONDS"
INPUT " PRESS ENTER TO CONTINUE", YES
CLS
END SUB
SUB TEST 'CALCS FOR BUBBLE AND DEW POINTS TO DETERMINE WHETHE TWO PHASES EXIST
CLS
PRINT: PRINT: PRINT " CHECK FOR TWO PHASES."
PRINT #1,: PRINT #1,: PRINT #1, " CHECK FOR TWO PHASES."
DIM PZX(10), AR(10), PAX(10, 10), CY(10), Z(10), Y(10), VP(10), EK(10)
PRINT #1,: PRINT #1,
INPUT " NUMBER OF COMPONENTS= ", N
INPUT " SYSTEM TEMPERATURE IN DEGREES C= ", T
INPUT " SYSTEM PRESSURE AT EQUILIBRIUM IN kPa= ", PT
605 OP2% = 0: INPUT " ENTER '1' TO USE REDLICH-KISTER, ENTER '2' TO USE WILSON, ENTER '3' TO USE VAN LAAR: OP2= ", OP2%
IF OP2% = 0 OR OP2% > 3 THEN PRINT: PRINT " YOU MUST ENTER A 1, 2, OR 3: REDO": GOTO 605
IF OP2% = 1 THEN CALL RK: GOTO 500 'USE RK ACTIVITY COEFFS.
IF OP2% = 2 THEN CALL WILSON: GOTO 500 'USE WILSON ACTIVITY COEFFS.
IF OP2% = 3 THEN CALL VANLAAR: GOTO 500 'USE VAN LAAR ACTIVITY COEFFICIENTS
500 SUMZ = 0!: FOR KK = 1 TO N
PRINT COMPONENT$(KK)
INPUT " MOLE FRACTION IN FEED= ", Z(KK)
X(KK) = Z(KK) ': Y(KK) = Z(KK)
SUMZ = SUMZ + Z(KK)
NEXT KK
PRINT: PRINT " SUMZ= "; SUMZ
OP1% = 0: INPUT " OP1=0 NO ERRORS CONTINUE, OP1=1 REDO, OP1= ", OP1%
IF OP1% = 1 THEN GOTO 500
505 FOR KK = 1 TO N
VP(KK) = (2.718282 ^ (A(KK) - (B(KK)) / (T + C(KK))))
EK(KK) = VP(KK) / PT
PRINT COMPONENT$(KK)
PRINT " PURE COMPONENT VP= "; VP(KK); " KEQ= "; EK(KK)
PRINT #1, COMPONENT$(KK)
PRINT #1, " PURE COMPONENT VP= "; VP(KK); " KEQ= "; EK(KK)
NEXT KK
PBUBL = 0: SUMY = 0!
FOR KK = 1 TO N
CY(KK) = X(KK) * G(KK) * EK(KK)
SUMY = SUMY + CY(KK)
PBUBL = PBUBL + (X(KK) * G(KK) * VP(KK))
NEXT KK
FOR KK = 1 TO N
Y(KK) = CY(KK) / SUMY: PRINT " Y= "; Y(KK): PRINT #1, " Y= "; Y(KK)
NEXT KK
PRINT: PRINT " BUBBLE PRESSURE= "; PBUBL
PRINT #1,: PRINT #1, " BUBBLE PRESSURE= "; PBUBL
INPUT " PRESS ENTER TO CONTINUE", YES
REM CALC DEW PRESSURE ASSUMING G'S DON'T CHANGE
PDEW = 1 / ((Z(1) / (VP(1) * G(1))) + (Z(2) / (VP(2) * G(2))) + (Z(3) / (VP(3) * G(3))))
PRINT: PRINT " DEW PRESSURE= "; PDEW
PRINT #1,: PRINT #1, " DEW PRESSURE= "; PDEW
REM ESTIMATE FRACTION VAPOR BY INTERPOLATION
'VB = (PBUBL - PT) / (PBUBL - PDEW)
'PRINT " ESTIMATE VB FOR PT= "; PT; " VB ESTIMATE= "; VB
'PRINT #1, " ESTIMATE VB FOR PT= "; PT; " VB ESTIMATE= "; VB
INPUT " PRESS ENTER TO CONTINUE", YES
CLS
END SUB
DEFINT N
SUB VANLAAR
CLS
SHARED G() AS DOUBLE
REM CALCULATE ACTIVITY COEFFICIENTS FROM NEW VAN LAAR MODEL JACK LASHOVER 09/08/12 VANLAAR1.BAS
DIM VLB(3), E(3, 3)
REM SHAPE FACTORS
VLB(1) = 28.559
VLB(2) = 41.44736
VLB(3) = 18.953
REM ENERGY FACTORS
E(1, 2) = -.00373: E(2, 1) = E(1, 2)
E(1, 3) = .0268: E(3, 1) = E(1, 3)
E(2, 3) = .059451: E(3, 2) = E(2, 3)
REM CALCULATE GERT WITH COMPUTER ALGEBRA
GERT1 = 0
FOR I = 1 TO N - 1
FOR J = I + 1 TO N
IF I = J THEN GOTO 92
GERT1 = GERT1 + (X(I) * X(J) * VLB(I) * VLB(J) * E(I, J))
92 NEXT J
NEXT I
'INPUT " PRESS ENTER TO CONTINUE", YES
SUMG = 0
FOR I = 1 TO N
SUMG = SUMG + (X(I) * VLB(I))
NEXT I
GERT = GERT1 / SUMG: PRINT #1, " GE/RT= "; GERT; " SUMG= "; SUMG
'INPUT " PRESS ENTER TO CONTINUE", YES
R1 = X(2) * VLB(1) * VLB(2) * E(1, 2) + X(3) * VLB(1) * VLB(3) * E(1, 3)
R2 = X(1) * VLB(1) * VLB(2) * E(1, 2) + X(3) * VLB(2) * VLB(3) * E(2, 3)
R3 = X(1) * VLB(1) * VLB(3) * E(1, 3) + X(2) * VLB(2) * VLB(3) * E(2, 3)
G(1) = 2.718282 ^ ((R1 - VLB(1) * GERT) / SUMG)
G(2) = 2.718282 ^ ((R2 - VLB(2) * GERT) / SUMG)
G(3) = 2.718282 ^ ((R3 - VLB(3) * GERT) / SUMG)
PRINT #1,
PRINT #1, " X(1)= "; X(1); " X(2)= "; X(2); " X(3)= "; X(3)
PRINT #1,
PRINT: PRINT " G(1)= "; G(1); " G(2)= "; G(2); " G(3)= "; G(3)
PRINT #1, " G(1)= "; G(1); " G(2)= "; G(2); " G(3)= "; G(3)
'INPUT " PRESS ENTER TO CONTINUE", YES
CLS
END SUB
DEFINT N
SUB VAPOR
CLS
PRINT: PRINT: PRINT " INPUT DATA FOR FLASH WITH UNKNOWN V"
DIM LL(10), UL(10), PP(10), Z(10), VP(10), Y(10), EK(10), ZX(10), R(10), XP(10) 'DIMENSION FOR TEN COMPONENTS
101 INPUT " NUMBER OF COMPONENTS= ", N
INPUT " TOTAL SYSTEM PRESSURE IN kPa= ", PT
INPUT " TEMPERATURE IN DEG. C, T= ", T
PRINT: SUMZ = 0
FOR K = 1 TO N
PRINT COMPONENT$(K)
INPUT " MOLE FRACTION IN FEED= ", Z(K)
SUMZ = SUMZ + Z(K)
NEXT K
PRINT " SUMZ= "; SUMZ
OP1% = 0: INPUT " OP1=0 NO ERRORS CONTINUE, OP1=1 REDO, OP1= ", OP1%
IF OP1% = 1 THEN GOTO 101
REM SOLUTION BY MONTE CARLO
615 OP2% = 0: INPUT " ENTER '1' TO USE REDLICH-KISTER, ENTER '2' TO USE WILSON, ENTER '3' TO USE VAN LAAR: OP2= ", OP2%
IF OP2% = 0 OR OP2% > 3 THEN PRINT: PRINT " YOU MUST ENTER A 1, 2, OR 3: REDO": GOTO 615
TS# = TIMER
FIL% = -1111: RANDOMIZE (FIL%)
OPT = 1E+30
COUNT& = 0: COUNTI% = 0: COUNTJ% = 0
XP(1) = 0.0: XP(2) = 0.0: XP(3) = 0.0: XP(4) = 0.0 'INITIAL VALUES OF X AND V
UL(1) = 100.: UL(2) = 100.: UL(3) = 100.: UL(4) = 100. 'UPPER LIMITS OF X'S AND V
LL(1) = 0: LL(2) = 0: LL(3) = 0: LL(4) = 0 'LOWER LIMITS OF X'S AND V
FOR J = 1 TO 30
COUNTJ% = COUNTJ% + 1
FOR I = 1 TO 500
COUNT& = COUNT& + 1: COUNTI% = COUNTI% + 1
FOR K = 1 TO 4
IF XP(K) - 100. / 2 ^ J < 1. THEN GOTO 350
GOTO 366
350 LL(K) = 1!
GOTO 365
366 LL(K) = XP(K) - UL(K) / 2 ^ J
365 IF XP(K) + UL(K) / 2 ^ J > UL(K) THEN GOTO 380
GOTO 390
380 R(K) = UL(K) - LL(K)
GOTO 391
390 R(K) = XP(K) + UL(K) / 2 ^ J - LL(K)
391 X(K) = LL(K) + RND * R(K)
NEXT K
X(1) = X(1) / 100!: X(2) = X(2) / 100!: X(3) = X(3) / 100!: V = X(4) / 100!
'INPUT " PRESS ENTER TO CONTINUE", YES
IF OP2% = 1 THEN CALL RK: GOTO 1213 'USE RK ACTIVITY COEFFS.
IF OP2% = 2 THEN CALL WILSON: GOTO 1213 'USE WILSON ACTIVITY COEFFS.
IF OP2% = 3 THEN CALL VANLAAR: GOTO 1213
1213 G1 = 0!: SUMPT = 0!
FOR II = 1 TO 3
VP(II) = 2.718282 ^ (A(II) - (B(II) / ((T) + C(II)))): 'PRINT #1, " VP(II)= "; VP(II)
PP(II) = X(II) * G(II) * VP(II): 'PRINT #1, " PP= "; PP(II)
G1 = G1 + PP(II): SUMPT = SUMPT + PP(II)
111 NEXT II
G1 = ABS(G1 - 101.325)
'PRINT #1,': PRINT #1, " G1= "; G1; " SUMPT= "; SUMPT
'INPUT " PRESS ENTER TO CONTINUE", YES
G2 = 0!: SUMX = 0!
FOR II = 1 TO 3
X(II) = 100! * X(II)
G2 = G2 + X(II): SUMX = SUMX + X(II)
NEXT II
G2 = ABS(G2 - 100!)
'PRINT #1,': PRINT #1, " G2= "; G2; " SUMX= "; SUMX
G3 = 0!: SUMY = 0!
FOR II = 1 TO 3
EK(II) = VP(II) / PT
Y(II) = EK(II) * G(II) * X(II)
G3 = G3 + Y(II): SUMY = SUMY + Y(II)
NEXT II
G3 = ABS(G3 - 100!)
'PRINT #1,': PRINT #1, " G3= "; G3; " SUMY= "; SUMY
G4 = 0!: SUMZX = 0!
FOR II = 1 TO 3
ZX(II) = ABS(Z(II) * 100! - (V * X(II) * G(II) * EK(II)) - (1! - V) * X(II)) ': PRINT " ZX(II)= "; ZX(II)
'ZX(II) = (V * EK(II) * G(II) * X(II)) + ((1.0 - V) * X(II))': PRINT " ZX(II)= "; ZX(II)
G4 = G4 + ZX(II): SUMZX = SUMZX + ZX(II)
NEXT II
'PRINT #1,': PRINT #1, " G4= "; G4; " SUMZX= "; SUMZX
G = G1 + G2 + G3 + G4: 'PRINT: 'PRINT " G= "; G; " V= "; V; " OPT= "; OPT
'PRINT #1,: 'PRINT #1, " G= "; G; " V= "; V; " OPT= "; OPT
'INPUT " PRESS ENTER TO CONTINUE", YES
IF G < OPT THEN GOTO 392
GOTO 393
REM SAVE BEST SO FAR X'S AND V
392 XP(1) = X(1): XP(2) = X(2): XP(3) = X(3): XP(4) = V * 100!
PRINT #1,: PRINT #1, " V= "; XP(4) / 100!
PRINT " G < OPT, SAVE BEST AND SET NEW OPT = G"
PRINT " OLD OPT= "; OPT; " G= "; G
PRINT #1, " OLD OPT= "; OPT; " G= "; G
OPT = G: PRINT " NEW OPT= "; OPT: PRINT #1, " NEW OPT= "; OPT
SUMX = 0: FOR II = 1 TO 3: X(II) = XP(II) / 100!: SUMX = SUMX + X(II): NEXT II
IF OP2% = 1 THEN CALL RK: GOTO 776 'USE RK ACTIVITY COEFFS.
IF OP2% = 2 THEN CALL WILSON: GOTO 776 'USE WILSON ACTIVITY COEFFS.
IF OP2% = 3 THEN CALL VANLAAR: GOTO 776
776 SUMY = 0!: SUMZX = 0
FOR II = 1 TO 3
ZX(II) = ABS(Z(II) * 100! - (V * X(II) * G(II) * EK(II)) - (1! - V) * X(II)): ZX(II) = ZX(II) / 100.
Y(II) = EK(II) * G(II) * X(II):
SUMY = SUMY + Y(II): SUMZX = SUMZX + ZX(II)
NEXT II
SUMPT = 0!
FOR II = 1 TO 3
PP(II) = X(II) * G(II) * VP(II)
SUMPT = SUMPT + PP(II)
NEXT II
PRINT #1,: PRINT #1, " SUMX= "; SUMX
PRINT #1,: PRINT #1, " SUMY= "; SUMY
PRINT #1,: PRINT #1, " SUMPT= "; SUMPT
PRINT #1,: PRINT #1, " SUMZX= "; SUMZX
PRINT #1,: PRINT #1, " G1= "; G1; " G2= "; G2; " G3= "; G3; " G4= "; G4; " G= "; G
PRINT #1,: PRINT #1, " X(1)= "; X(1); " X(2)= "; X(2); " X(3)= "; X(3)
PRINT #1,: PRINT #1, " Y(1)= "; Y(1); " Y(2)= "; Y(2); " Y(3)= "; Y(3)
PRINT #1,: PRINT #1, " LL(1)= "; LL(1); " LL(2)= "; LL(2); " LL(3)= "; LL(3); " LL(4)= "; LL(4)
PRINT #1,: PRINT #1, " UL(1)= "; UL(1); " UL(2)= "; UL(2); " UL(3)= "; UL(3); " UL(4)= "; UL(4)
PRINT #1,: PRINT #1, " R(1)= "; R(1); " R(2)= "; R(2); " R(3)= "; R(3); " R(4)= "; R(4)
PRINT #1,: PRINT #1, " ZX(1)= "; ZX(1); " ZX(2)= "; ZX(2); " ZX(3)= "; ZX(3)
PRINT #1,: PRINT #1, " PP(1)= "; PP(1); " PP(2)= "; PP(2); " PP(3)= "; PP(3)
PRINT: PRINT " COUNTI= "; COUNTI%; " COUNTJ= "; COUNTJ%
PRINT #1,: PRINT #1, " COUNTI= "; COUNTI%; " COUNTJ= "; COUNTJ%
INPUT " PRESS ENTER TO CONTINUE", YES
393 NEXT I
GOTO 777
PRINT #1,: PRINT #1, " G= "; G; " G1= "; G1; " G2= "; G2; " G3= "; G3; " G4= "; G4; " OPT= "; OPT
PRINT #1,: PRINT #1, " V= "; V; " I= "; I; " J= "; J
SUMX = 0: FOR II = 1 TO N: X(II) = XP(II) / 100!: SUMX = SUMX + X(II): NEXT II
IF OP2% = 1 THEN CALL RK: GOTO 695 'USE RK ACTIVITY COEFFS.
IF OP2% = 2 THEN CALL WILSON: GOTO 695 'USE WILSON ACTIVITY COEFFS.
IF OP2% = 3 THEN CALL VANLAAR: GOTO 695 'USE VANLAAR ACTIVITY COEFFS.
695 SUMY = 0!
FOR II = 1 TO N
Y(II) = EK(II) * G(II) * X(II)
SUMY = SUMY + Y(II)
NEXT II
PRINT #1,: PRINT #1, " V= "; XP(4) / 100!
PRINT #1,: PRINT #1, " X(1)= "; X(1); " X(2)= "; X(2); " X(3)= "; X(3); " SUMX= "; SUMX
PRINT #1,: PRINT #1, " Y(1)= "; Y(1); " Y(2)= "; Y(2); " Y(3)= "; Y(3); " SUMY= "; SUMY
PRINT #1,: PRINT #1, " LL(1)= "; LL(1); " LL(2)= "; LL(2); " LL(3)= "; LL(3); " LL(4)= "; LL(4)
PRINT #1,: PRINT #1, " UL(1)= "; UL(1); " UL(2)= "; UL(2); " UL(3)= "; UL(3); " UL(4)= "; UL(4)
PRINT #1,: PRINT #1, " R(1)= "; R(1); " R(2)= "; R(2); " R(3)= "; R(3); " R(4)= "; R(4)
SUMPT = 0!
FOR II = 1 TO 3
PP(II) = X(II) * G(II) * VP(II)
SUMPT = SUMPT + PP(II)
NEXT II
PRINT #1,: PRINT #1, " SUMPT= "; SUMPT
SUMZX = 0!
FOR II = 1 TO 3
ZX(II) = ABS(Z(II) * 100! - (V * X(II) * G(II) * EK(II) * 100.) - (1! - V) * X(II) * 100.): PRINT " ZX(II)= "; ZX(II)
SUMZX = SUMZX + ZX(II)
NEXT II
PRINT #1,: PRINT #1, " SUMZX= "; SUMZX
PRINT #1,: PRINT #1, " COUNTI= "; COUNTI%
COUNTI% = 0
PRINT #1,: PRINT #1, " COUNTJ= "; COUNTJ%
INPUT " PRESS ENTER TO CONTINUE", YES
777 NEXT J
CLS: PRINT: PRINT " FINAL RESULTS FOR FRACTION OF VAPOR FLASHED!"
PRINT #1,: PRINT #1, " FINAL RESULTS FOR FRACTION OF VAPOR FLASHED!"
X(1) = XP(1) / 100!: X(2) = XP(2) / 100!: X(3) = XP(3) / 100!: V = XP(4) / 100!
SUMX = 0!
FOR II = 1 TO 3: SUMX = SUMX + X(II): NEXT II
IF OP2% = 1 THEN CALL RK: GOTO 297 'USE RK ACTIVITY COEFFS.
IF OP2% = 2 THEN CALL WILSON: GOTO 297 'USE WILSON ACTIVITY COEFFS.
IF OP2% = 3 THEN CALL VANLAAR: GOTO 297 'USE VAN LAAR ACTIVITY COEFFS.
297 SUMY = 0!
FOR II = 1 TO 3: Y(II) = EK(II) * G(II) * X(II): SUMY = SUMY + Y(II): NEXT II
PRINT " X(1)= "; X(1); " X(2)= "; X(2); " X(3)= "; X(3); " SUMX= "; SUMX
PRINT " Y(1)= "; Y(1); " Y(2)= "; Y(2); " Y(3)= "; Y(3); " SUMY= "; SUMY
PRINT " G1= "; G1; " G2= "; G2; " G3= "; G3; " G4= "; G4
PRINT: PRINT " SUMPT= "; SUMPT; " SUMZX= "; SUMZX
PRINT " COUNTJ= "; COUNTJ%; " TOTAL FEASIBLE SOLUTIONS EXAMINED= "; COUNT&
PRINT " G= "; G; " OPT= "; OPT; " V= "; V
PRINT #1,: PRINT #1, " X(1)= "; X(1); " X(2)= "; X(2); " X(3)= "; X(3); " SUMX= "; SUMX
PRINT #1,: PRINT #1, " Y(1)= "; Y(1); " Y(2)= "; Y(2); " Y(3)= "; Y(3); " SUMY= "; SUMY
PRINT #1,: PRINT #1, " G1= "; G1; " G2= "; G2; " G3= "; G3; " G4= "; G4
PRINT #1,: PRINT #1, " SUMPT= "; SUMPT; " SUMZX= "; SUMZX
PRINT #1,: PRINT #1, " COUNTJ= "; COUNTJ%; " TOTAL FEASIBLE SOLUTIONS EXAMINED= "; COUNT&
PRINT #1,: PRINT #1, " G= "; G; " OPT= "; OPT; " V= "; V
TF# = TIMER
PRINT: PRINT " START TIME= "; TS#; " FINISH TIME= "; TF#
ELAPSE# = (TF# - TS#): PRINT " ELAPSED TIME= "; ELAPSE#; " SECONDS"
PRINT #1, " ELAPSED TIME= "; ELAPSE#; " SECONDS"
INPUT " PRESS ENTER TO CONTINUE", YES
CLS
END SUB
SUB WILSON
SHARED G() AS DOUBLE
PRINT " CALCULATE GAMMA'S FOR COMPONENTS"
'N = 3
333 FOR KI = 1 TO N
Q1 = 0
FOR JI = 1 TO N
Q1 = Q1 + X(JI) * W(KI, JI)
NEXT JI
Q2 = 0
FOR KK = 1 TO N
Q3 = 0
FOR JI = 1 TO N
Q3 = Q3 + X(JI) * W(KK, JI)
NEXT JI
Q2 = Q2 + (X(KK) * W(KK, KI)) / Q3
NEXT KK
G(KI) = 2.71828183# ^ (1 - LOG(Q1) - Q2)
PRINT " GAMMA= "; G(KI); " FOR COMPONENT= "; KI
NEXT KI
334 'INPUT " PRESS ENTER TO CONTINUE", YES
END SUB
SUB MARGULES
REM SUB TO CALCULATE ACTIVITY COEFFICIENTS
SHARED G() AS DOUBLE
DIM AVAL(10, 10) AS DOUBLE 'BINARY INTERACTION CONSTANTS
DIM ASTAR(10, 10, 10) AS DOUBLE 'THREE DIMENSIONAL ARRAY OF A* VALUES
DIM RHO(10) AS DOUBLE
DIM KMIN AS INTEGER
DIM JMAX AS INTEGER
DIM TAU AS DOUBLE
DIM THETA AS DOUBLE
DIM TSTO AS DOUBLE
DIM OMEGA AS DOUBLE
DIM PSI AS DOUBLE
DIM SUBRTG AS INTEGER
DIM MFMIN AS DOUBLE
AVAL(1, 1) = 0: AVAL(1, 2) = -6.1287274: AVAL(1, 3) = 4.51023124
AVAL(2, 1) = 1.52284992: AVAL(2, 2) = 0: AVAL(2, 3) = 1.52647
AVAL(3, 1) = 8.93688177: AVAL(3, 2) = -2.86937: AVAL(3, 3) = 0
MFMIN = 0.0000000001 'SMALLEST VALUE OF A MOLE FRACTIOB IS 0.0000000001
SUBRTG = 0
FOR II = 1 TO N
JMAX = N - 1
FOR JJ = 1 TO JMAX
IF (JJ - II) = 0 THEN GOTO 20 'NEXT JJ
KMIN = JJ + 1
FOR KK = KMIN TO N
IF (KK - II) = 0 THEN GOTO 10 'NEXT KK
ASTAR(II, JJ, KK) = 0.5 * (AVAL(II, JJ) + AVAL(JJ, II) + AVAL(II, KK) + AVAL(KK, II) + AVAL(JJ, KK) + AVAL(KK, JJ))
10 NEXT KK
20 NEXT JJ
30 NEXT II
SUBRTG = SUBRTG + 1
TAU = 0
FOR II = 1 TO N
RHO(II) = 0
JMAX = N - 1
FOR JJ = 1 TO JMAX
IF (JJ - II) = 0 THEN GOTO 50
KMIN = JJ + 1
FOR KK = KMIN TO N
IF (KK - II) = 0 THEN GOTO 40
RHO(II) = RHO(II) + (XX(JJ) + MFMIN) * (XX(KK) + MFMIN) * ASTAR(II, JJ, KK)
40 NEXT KK
50 NEXT JJ
TAU = TAU + (XX(II) + MFMIN) * RHO(II)
60 NEXT II
TAU = TAU / 3.0
THETA = 0.0
FOR II = 1 TO N
TSTO = 0.0
FOR JJ = 1 TO N
TSTO = TSTO + (XX(JJ) + MFMIN) * AVAL(JJ, II)
70 NEXT JJ
THETA = THETA + TSTO * (XX(II) + MFMIN) * (XX(II) + MFMIN)
80 NEXT II
FOR II = 1 TO N
OMEGA = 0.0
PSI = 0.0
FOR JJ = 1 TO N
OMEGA = OMEGA + (XX(JJ) + MFMIN) * AVAL(JJ, II)
PSI = PSI + (XX(JJ) + MFMIN) * (XX(JJ) + MFMIN) * AVAL(II, JJ)
90 NEXT JJ
PRINT: PRINT COMPONENT$(II)
G(II) = 2.71828183# ^ (2.0 * XX(II) * OMEGA + PSI + RHO(II) - 2.0 * THETA - 2.0 * TAU)
PRINT II, " GAMMA= "; G(II), " XX(II)= "; XX(II)
NEXT II
'INPUT " PRESS ENTER TO CONTINUE", YES
END SUB
SUB LLEFLASH
CLS
PRINT: PRINT: PRINT " INPUT DATA FOR LLE FLASH WITH UNKNOWN ALPHA"
DIM LL(10), UL(10), ZO(10), ZC(10), Y(10), EKA(10), EKX(10), ZX(10), R(10), XP(10), GO(10), GA(10), DELTAK(10) 'DIMENSION FOR TEN COMPONENTS
DIM GAB(10), GOB(10), EKAB(10), EKXB(10), YB(10), XB(10), Z(10)
1001 INPUT " NUMBER OF COMPONENTS= ", N
FOR K = 1 TO N
PRINT " COMPONENT NO.= "; K
INPUT " NAME OF COMPONENT= ", COMPONENT$(K)
NEXT K
REM WORK ON DISPERSED PHASE
PRINT: SUMZ = 0
FOR K = 1 TO N
PRINT COMPONENT$(K)
INPUT " MOLE FRACTION IN FEED= ", ZO(K): XX(K) = ZO(K)
SUMZ = SUMZ + ZO(K)
NEXT K
PRINT " SUMZ= "; SUMZ
OP1% = 0: INPUT " OP1=0 NO ERRORS CONTINUE, OP1=1 REDO, OP1= ", OP1%
IF OP1% = 1 THEN GOTO 1001
CALL MARGULES 'GET DISPERSED PHASE GAMMAS
GO(1) = G(1): GO(2) = G(2): GO(3) = G(3)
INPUT " PRESS ENTER TO CONTINUE", YES
REM WORK ON CONTINUOUS PHASE
1002 PRINT: SUMZ = 0
FOR K = 1 TO N
PRINT COMPONENT$(K)
INPUT " MOLE FRACTION IN SOLVENT= ", ZC(K): XX(K) = ZC(K)
SUMZ = SUMZ + ZC(K)
NEXT K
PRINT " SUMZ= "; SUMZ
OP1% = 0: INPUT " OP1=0 NO ERRORS CONTINUE, OP1=1 REDO, OP1= ", OP1%
IF OP1% = 1 THEN GOTO 1002
CALL MARGULES 'GET AQUEOUS GAMMAS
GA(1) = G(1): GA(2) = G(2): GA(3) = G(3)
INPUT " PRESS ENTER TO CONTINUE", YES
REM SAMPLE PROBLEM IS TERNARY SYSTEM USED IN UOLAB--H2O, IPA, AND n-NONANE, REPRESENTED BY ISOPAR-E
REM FEED IS 50 ML/MIN OF NONANE CONTAINING 6.0 WT. % OF IPA, SOLVENT IS 100 ML/MIN OF BR TAP WATER
REM COMPONENT(1) = WATER, COMPONENT(2) = IPA, AND COMPONENT(3) = n-NONANE
REM LLE DATA WAS FIT TO MARGULES ACTIVITY COEFFICIENT MODEL
REM FEED CONTAINS 0.03603 MOLES OF IPA AND 0.2645 MOLES OF NONANE FOR TOTAL MOLES = 0.3005/MIN
REM IPA MOLE FRACTION = 0.1199, NONANE MOLE FRACTION = 0.8801
REM SOLVENT IS 5.5349 MOLES OF WATER/MIN
REM MIXING POINT IN MOLE FRACTIONS IS 0.9485 OF H2O, 0.006175 OF IPA, AND 0.04533 OF NONANE
REM SOLVENT TO FEED RATIO, S/F, ON MOLAR SOLUTE FREE BASIS = 20.93
Z(1) = 0.9484988: Z(2) = 0.006174685: Z(3) = 0.04532658 'MIXING POINT COMPOSITION
REM SOLUTION BY MONTE CARLO MARCHING
TS# = TIMER
FIL% = -1111: RANDOMIZE (FIL%)
OPT = 1E+30
COUNT& = 0: COUNTI% = 0: COUNTJ% = 0
XP(1) = 1.: XP(2) = 0.5: XP(3) = 94.: XP(4) = 0.5
LL(1) = 0.0001: LL(2) = 0001.: LL(3) = 88.: LL(4) = 0.
UL(1) = 2.: UL(2) = 1.: UL(3) = 100.: UL(4) = 6.
FOR J = 1 TO 15
COUNTJ% = COUNTJ% + 1
FOR I = 1 TO 500
COUNT& = COUNT& + 1: COUNTI% = COUNTI% + 1
K = 1 'MOLE PCT OF WATER IN RAFFINATE IS 0. TO 2.0
IF XP(K) - 2. / 2 ^ J < 0. THEN GOTO 150
GOTO 166
150 LL(K) = 0.
GOTO 165
166 LL(K) = XP(K) - UL(K) / 2 ^ J
165 IF XP(K) + UL(K) / 2 ^ J > UL(K) THEN GOTO 180
GOTO 190
180 R(K) = UL(K) - LL(K)
GOTO 191
190 R(K) = XP(K) + UL(K) / 2 ^ J - LL(K)
191 X(K) = LL(K) + RND * R(K)
K = 2 'MOLE PCT OF IPA IN RAFFINATE IS 0. TO 12.0/20 = 0.6 OR SAY 1 BECAUSE IT IS DILUTED BY 20+ TO 1 S/F RATIO
IF XP(K) - 1. / 2 ^ J < 0. THEN GOTO 250
GOTO 266
250 LL(K) = 0.
GOTO 265
266 LL(K) = XP(K) - UL(K) / 2 ^ J
265 IF XP(K) + UL(K) / 2 ^ J > UL(K) THEN GOTO 280
GOTO 290
280 R(K) = UL(K) - LL(K)
GOTO 291
290 R(K) = XP(K) + UL(K) / 2 ^ J - LL(K)
291 X(K) = LL(K) + RND * R(K)
K = 3 'MOLE PCT OF NONANE IN RAFFINATE IS 88. TO 100., CAN'T BE LESS THAN MOL PCT IN FEED
IF XP(K) - 100. / 2 ^ J < 88. THEN GOTO 350
GOTO 366
350 LL(K) = 88.
GOTO 365
366 LL(K) = XP(K) - UL(K) / 2 ^ J
365 IF XP(K) + UL(K) / 2 ^ J > UL(K) THEN GOTO 380
GOTO 390
380 R(K) = UL(K) - LL(K)
GOTO 391
390 R(K) = XP(K) + UL(K) / 2 ^ J - LL(K)
391 X(K) = LL(K) + RND * R(K)
K = 4 'FRACTION FLASHED, ALPHA, IS 0.0001 TO 0.3001/(3001+5.5349)=0.051 SAY .06 OR 1
IF XP(K) - 1. / 2 ^ J < 0. THEN GOTO 450
GOTO 466
450 LL(K) = 0.
GOTO 465
466 LL(K) = XP(K) - UL(K) / 2 ^ J
465 IF XP(K) + UL(K) / 2 ^ J > UL(K) THEN GOTO 480
GOTO 490
480 R(K) = UL(K) - LL(K)
GOTO 491
490 R(K) = XP(K) + UL(K) / 2 ^ J - LL(K)
491 X(K) = LL(K) + RND * R(K)
FOR K = 1 TO 3
XX(K) = X(K) / 100.
NEXT K
CALL MARGULES 'GET DISPERSED PHASE GAMMAS
GO(1) = G(1): GO(2) = G(2): GO(3) = G(3)
ALPHA = X(4) / 100.
'IF ALPHA > 0.06 THEN G = 1E30: GOTO 1005
G1 = 0.: SUMX = 0.
FOR II = 1 TO N
G1 = G1 + X(II): SUMX = SUMX + X(II)
NEXT II
G1 = ABS(G1 - 100.)
' IF X(1) > 5. THEN G = 1E30: GOTO 1005
' IF X(2) > ZO(2)*100. THEN G = 1E30: GOTO 1005
' IF X(3) < (ZO(3)*100. - 10.) THEN G = 1E30: GOTO 1005
G2 = 0.: SUMY = 0. 'CALCULATE Y'S FROM COMPONENT MASS BALANCES
FOR II = 1 TO N
Y(II) = (Z(II) * 100. - X(II) * ALPHA) / (1 - ALPHA)
IF Y(II) >= 100.0 THEN GOTO 1005 'THROW OUT OBVIOUSLY UNFEASIBLE SOLUTION
IF Y(II) <= 0.0 THEN GOTO 1005 'THROW OUT OBVIOUSLY UNFEASIBLE SOLUTION
SUMY = SUMY + Y(II): G2 = G2 + Y(II)
NEXT II
G2 = ABS(G2 - 100.)
FOR II = 1 TO N
XX(II) = Y(II) / 100.
NEXT II
CALL MARGULES 'GET AQUEOUS GAMMAS
GA(1) = G(1): GA(2) = G(2): GA(3) = G(3)
G3 = 0.
G4 = 0. 'GAMMAX * X = GAMMAY * Y
FOR II = 1 TO N
ZX(II) = ABS((GO(II) * X(II) / 100) - (GA(II) * Y(II) / 100))
G4 = G4 + ZX(II)
NEXT II
G = G1 + G2 + G3 + G4: PRINT " G= "; G; " ALPHA= "; ALPHA; " OPT= "; OPT
PRINT: PRINT " G1= "; G1; " G2= "; G2; " G3= "; G3; " G4= "; G4
PRINT " SUMX= "; SUMX; " SUMY= "; SUMY
PRINT #1,: PRINT #1, " G= "; G; " ALPHA= "; ALPHA; " OPT= "; OPT
PRINT #1,: PRINT #1, " G1= "; G1; " G2= "; G2; " G3= "; G3; " G4= "; G4
PRINT #1, " SUMX= "; SUMX; " SUMY= "; SUMY
'INPUT " PRESS ENTER TO CONTINUE", YES
IF G < OPT THEN GOTO 392
GOTO 393
REM SAVE BEST SO FAR X'S AND V
392 XP(1) = X(1): XP(2) = X(2): XP(3) = X(3): XP(4) = ALPHA * 100.
YB(1) = Y(1): YB(2) = Y(2): YB(3) = Y(3): XB(1) = X(1): XB(2) = X(2): XB(3) = X(3): SUMY = YB(1) + YB(2) + YB(3): SUMX = XB(1) + XB(2) + XB(3)
OPT = G: ALPHAB = ALPHA: GB = G
PRINT: PRINT " XP(1)= "; XP(1); " XP(2)= "; XP(2); " XP(3)= "; XP(3); " XP(4)= "; XP(4)
PRINT: PRINT " GO(1)= "; GO(1); " GO(2)= "; GO(2); " GO(3)= "; GO(3); " GA(1)= "; GA(1); " GA(2)= "; GA(2); " GA(3)= "; GA(3)
PRINT: PRINT " Y(1)= "; Y(1); " Y(2)= "; Y(2); " Y(3)= "; Y(3); " SUMY= "; Y(1) + Y(2) + Y(3)
PRINT: PRINT " X(1)= "; XP(1); " X(2)= "; XP(2); " X(3)= "; XP(3); " SUMX= "; XP(1) + XP(2) + XP(3)
PRINT #1,: PRINT #1, " XP(1)= "; XP(1); " XP(2)= "; XP(2); " XP(3)= "; XP(3); " ALPHA= "; XP(4)
PRINT #1,: PRINT #1, " GO(1)= "; GO(1); " GO(2)= "; GO(2); " GO(3)= "; GO(3); " GA(1)= "; GA(1); " GA(2)= "; GA(2); " GA(3)= "; GA(3)
PRINT #1,: PRINT #1, " Y(1)= "; Y(1); " Y(2)= "; Y(2); " Y(3)= "; Y(3); " SUMY= "; Y(1) + Y(2) + Y(3)
PRINT #1,: PRINT #1, " X(1)= "; XP(1); " X(2)= "; XP(2); " X(3)= "; XP(3); " SUMX= "; XP(1) + XP(2) + XP(3)
PRINT #1,: PRINT #1, " LL(1)= "; LL(1); " LL(2)= "; LL(2); " LL(3)= "; LL(3); " LL(4)= "; LL(4)
PRINT #1,: PRINT #1, " UL(1)= "; UL(1); " UL(2)= "; UL(2); " UL(3)= "; UL(3); " UL(4)= "; UL(4)
PRINT " OPT= "; OPT; " G= "; G; " G1= "; G1; " G2= "; G2; " G3= "; G3; " G4= "; G4
PRINT #1, " OPT= "; OPT; " G= "; G; " G1= "; G1; " G2= "; G2; " G3= "; G3; " G4= "; G4
'INPUT " PRESS ENTER TO CONTINUE", YES
393 PRINT: PRINT " COUNTI= "; COUNTI%; " COUNTJ= "; COUNTJ%; " OVERALL COUNT= "; COUNT&
PRINT #1,: PRINT #1, " COUNTI= "; COUNTI%; " COUNTJ= "; COUNTJ%; " OVERALL COUNT= "; COUNT&
'INPUT " PRESS ENTER TO CONTINUE", YES
1005 NEXT I
PRINT #1,: PRINT #1, " G= "; GB; " OPT= "; OPT; " G1= "; G1; " G2= "; G2; " G3= "; G3; " G4= "; G4
PRINT #1,: PRINT #1, " ALPHA= "; ALPHAB; " I= "; I; " J= "; J
PRINT #1,: PRINT #1, " X(1)= "; XB(1); " X(2)= "; XB(2); " X(3)= "; XB(3); " SUMX= "; XB(1) + XB(2) + XB(3)
PRINT #1,: PRINT #1, " Y(1)= "; YB(1); " Y(2)= "; YB(2); " Y(3)= "; YB(3); " SUMY= "; YB(1) + YB(2) + YB(3)
PRINT #1,: PRINT #1, " LL(1)= "; LL(1); " LL(2)= "; LL(2); " LL(3)= "; LL(3); " LL(4)= "; LL(4)
PRINT #1,: PRINT #1, " UL(1)= "; UL(1); " UL(2)= "; UL(2); " UL(3)= "; UL(3); " UL(4)= "; UL(4)
PRINT #1,: PRINT #1, " R(1)= "; R(1); " R(2)= "; R(2); " R(3)= "; R(3); " R(4)= "; R(4)
PRINT #1,: PRINT #1, " GO(1)= "; GO(1); " GO(2)= "; GO(2); " GO(3)= "; GO(3); " GA(1)= "; GA(1); " GA(2)= "; GA(2); " GA(3)= "; GA(3)
PRINT #1,: PRINT #1, " COUNTI= "; COUNTI%; " OVERALL COUNT= "; COUNT&
COUNTI% = 0
PRINT #1,: PRINT #1, " COUNTJ= "; COUNTJ%; " OVERALL COUNT= "; COUNT&
'INPUT " PRESS ENTER TO CONTINUE", YES
NEXT J
CLS: PRINT: PRINT " FINAL RESULTS FOR LLE FLASH!"
PRINT #1,: PRINT #1, " FINAL RESULTS FOR LLE FLASH!"
X(1) = XP(1) / 100!: X(2) = XP(2) / 100!: X(3) = XP(3) / 100!: ALPHA = XP(4) / 100!
Y(1) = YB(1) / 100.: Y(2) = YB(2) / 100.: Y(3) = YB(3) / 100.: SUMY = Y(1) + Y(2) + Y(3)
FOR II = 1 TO 3: Y(II) = Y(II) / SUMY: NEXT II
PRINT " X(1)= "; X(1); " X(2)= "; X(2); " X(3)= "; X(3); " ALPHA= "; ALPHA
PRINT " Y(1)= "; Y(1); " Y(2)= "; Y(2); " Y(3)= "; Y(3)
PRINT " GO(1)= "; GO(1); " GO(2)= "; GO(2); " GO(3)= "; GO(3); " GA(1)= "; GA(1); " GA(2)= "; GA(2); " GA(3)= "; GA(3)
PRINT " G= "; G; " OPT= "; OPT; " ALPHA= "; ALPHA
PRINT: PRINT " G1= "; G1; " G2= "; G2; " G3= "; G3; " G4= "; G4
PRINT: PRINT " LL(1)= "; LL(1); " LL(2)= "; LL(2); " LL(3)= "; LL(3); " LL(4)= "; LL(4)
PRINT: PRINT " UL(1)= "; UL(1); " UL(2)= "; UL(2); " UL(3)= "; UL(3); " UL(4)= "; UL(4)
PRINT: PRINT " R(1)= "; R(1); " R(2)= "; R(2); " R(3)= "; R(3); " R(4)= "; R(4)
PRINT: PRINT " GO(1)= "; GO(1); " GO(2)= "; GO(2); " GO(3)= "; GO(3); " GA(1)= "; GA(1); " GA(2)= "; GA(2); " GA(3)= "; GA(3)
PRINT " COUNTJ= "; COUNTJ%; " TOTAL FEASIBLE SOLUTIONS EXAMINED= "; COUNT&
INPUT " PRESS ENTER TO CONTINUE", YES
PRINT #1,: PRINT #1, " X(1)= "; XB(1); " X(2)= "; XB(2); " X(3)= "; XB(3); " SUMX= "; XB(1) + XB(2) + XB(3)
PRINT #1,: PRINT #1, " Y(1)= "; YB(1); " Y(2)= "; YB(2); " Y(3)= "; YB(3); " SUMY= "; YB(1) + YB(2) + YB(3)
PRINT #1,: PRINT #1, " G1= "; G1; " G2= "; G2; " G3= "; G3; " G4= "; G4
PRINT #1,: PRINT #1, " G= "; G; " OPT= "; OPT; " ALPHA= "; ALPHA
PRINT #1,: PRINT #1, " LL(1)= "; LL(1); " LL(2)= "; LL(2); " LL(3)= "; LL(3); " LL(4)= "; LL(4)
PRINT #1,: PRINT #1, " UL(1)= "; UL(1); " UL(2)= "; UL(2); " UL(3)= "; UL(3); " UL(4)= "; UL(4)
PRINT #1,: PRINT #1, " R(1)= "; R(1); " R(2)= "; R(2); " R(3)= "; R(3); " R(4)= "; R(4)
PRINT #1,: PRINT #1, " GO(1)= "; GO(1); " GO(2)= "; GO(2); " GO(3)= "; GO(3)
PRINT #1,: PRINT #1, " GA(1)= "; GA(1); " GA(2)= "; GA(2); " GA(3)= "; GA(3)
PRINT #1,: PRINT #1, " EKA(1)= "; EKA(1); " EKA(2)= "; EKA(2); " EKA(3)= "; EKA(3)
PRINT #1,: PRINT #1, " EKX(1)= "; EKX(1); " EKX(2)= "; EKX(2); " EKX(3)= "; EKX(3)
PRINT #1,: PRINT #1, " COUNTJ= "; COUNTJ%; " TOTAL FEASIBLE SOLUTIONS EXAMINED= "; COUNT&
TF# = TIMER
PRINT: PRINT " START TIME= "; TS#; " FINISH TIME= "; TF#
ELAPSE# = (TF# - TS#): PRINT " ELAPSED TIME= "; ELAPSE#; " SECONDS"
PRINT #1, " ELAPSED TIME= "; ELAPSE#; " SECONDS"
INPUT " PRESS ENTER TO CONTINUE", YES
CLS
END SUB