| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
 145
 146
 147
 148
 149
 150
 151
 152
 153
 154
 155
 156
 157
 158
 159
 160
 161
 162
 163
 164
 165
 166
 167
 168
 169
 170
 171
 172
 173
 174
 175
 176
 177
 178
 179
 180
 181
 182
 183
 184
 185
 186
 187
 188
 189
 190
 191
 192
 193
 194
 195
 196
 197
 198
 199
 200
 201
 202
 203
 204
 205
 206
 207
 208
 209
 210
 211
 212
 213
 214
 215
 216
 217
 218
 219
 220
 221
 222
 223
 224
 225
 226
 227
 228
 229
 230
 231
 232
 233
 234
 235
 236
 237
 238
 239
 240
 241
 242
 243
 244
 245
 246
 247
 248
 249
 250
 251
 252
 253
 254
 255
 256
 257
 258
 259
 260
 261
 262
 263
 264
 265
 266
 267
 268
 269
 270
 271
 272
 273
 274
 275
 276
 277
 278
 279
 280
 281
 282
 283
 284
 285
 286
 287
 288
 289
 290
 291
 292
 293
 294
 295
 296
 297
 298
 299
 300
 301
 302
 303
 304
 305
 306
 307
 308
 309
 310
 311
 312
 313
 314
 315
 316
 317
 318
 319
 320
 321
 322
 323
 324
 325
 326
 327
 328
 329
 330
 331
 332
 333
 334
 335
 336
 337
 338
 339
 340
 341
 342
 343
 344
 345
 346
 347
 348
 349
 350
 351
 352
 353
 354
 355
 356
 357
 358
 359
 360
 361
 362
 363
 364
 365
 366
 367
 368
 369
 370
 371
 372
 373
 374
 375
 376
 377
 378
 379
 380
 381
 382
 383
 384
 385
 386
 387
 388
 389
 390
 391
 392
 393
 394
 395
 396
 397
 398
 399
 400
 401
 402
 403
 404
 405
 406
 407
 408
 409
 410
 411
 412
 413
 414
 415
 416
 417
 418
 419
 420
 421
 422
 423
 424
 425
 426
 427
 428
 429
 430
 431
 432
 433
 434
 435
 436
 437
 438
 439
 440
 441
 442
 443
 444
 445
 446
 447
 448
 449
 450
 451
 452
 453
 454
 455
 456
 457
 458
 459
 460
 461
 462
 463
 464
 465
 466
 467
 468
 469
 470
 471
 472
 473
 474
 475
 476
 477
 478
 479
 480
 481
 482
 483
 484
 485
 486
 487
 488
 489
 490
 491
 492
 493
 494
 495
 496
 497
 498
 499
 500
 501
 502
 503
 504
 505
 506
 507
 508
 509
 510
 511
 512
 513
 514
 515
 516
 517
 518
 519
 520
 521
 522
 523
 524
 525
 526
 527
 528
 529
 530
 531
 532
 533
 534
 535
 536
 537
 538
 539
 540
 541
 542
 543
 544
 545
 546
 547
 548
 549
 550
 551
 552
 553
 554
 555
 556
 557
 558
 559
 560
 561
 562
 563
 564
 565
 566
 567
 568
 569
 570
 571
 572
 573
 574
 575
 576
 577
 578
 579
 580
 581
 582
 583
 584
 585
 586
 587
 588
 589
 590
 591
 592
 593
 594
 595
 596
 597
 598
 599
 600
 601
 602
 603
 604
 605
 606
 607
 608
 609
 610
 611
 612
 613
 614
 615
 616
 617
 618
 619
 620
 621
 622
 623
 624
 625
 626
 627
 628
 629
 630
 631
 632
 633
 634
 635
 636
 637
 638
 639
 640
 641
 642
 643
 644
 645
 646
 647
 648
 649
 650
 651
 652
 653
 654
 655
 656
 657
 658
 659
 660
 661
 662
 663
 664
 665
 666
 667
 668
 669
 670
 671
 672
 673
 674
 675
 676
 677
 678
 679
 680
 681
 682
 683
 684
 685
 686
 687
 688
 689
 690
 691
 692
 693
 694
 695
 696
 697
 698
 699
 700
 701
 702
 703
 704
 705
 706
 707
 708
 709
 710
 711
 712
 713
 714
 715
 716
 717
 718
 719
 720
 721
 722
 723
 724
 725
 726
 727
 728
 729
 730
 731
 732
 733
 734
 735
 736
 737
 738
 739
 740
 741
 742
 743
 744
 745
 746
 747
 748
 749
 750
 751
 752
 753
 754
 755
 756
 757
 758
 759
 760
 761
 762
 763
 764
 765
 766
 767
 768
 769
 770
 771
 772
 773
 774
 775
 776
 777
 778
 779
 780
 781
 782
 783
 784
 785
 786
 787
 788
 789
 790
 791
 792
 793
 794
 795
 796
 797
 798
 799
 800
 801
 802
 803
 804
 805
 806
 807
 808
 809
 810
 811
 812
 813
 814
 815
 816
 817
 818
 819
 820
 821
 822
 823
 824
 825
 826
 827
 828
 829
 830
 831
 832
 833
 834
 835
 836
 837
 838
 839
 840
 841
 842
 843
 844
 845
 846
 847
 848
 849
 850
 851
 852
 853
 854
 855
 856
 857
 858
 859
 860
 861
 862
 863
 864
 865
 866
 867
 868
 869
 870
 871
 872
 873
 874
 875
 876
 877
 878
 879
 880
 881
 882
 883
 884
 885
 886
 887
 888
 889
 890
 891
 892
 893
 894
 895
 896
 897
 898
 899
 900
 901
 902
 903
 904
 905
 906
 907
 908
 909
 910
 911
 912
 913
 914
 915
 916
 917
 918
 919
 
 |  
10 ' **************************************************************************
11 ' *                         VLMU.BAS                                       *
12 ' * PENG-ROBINSON EQUATION OF STATE PHASE EQUILIBRIUM PROGRAM FOR MIXTURES *
13 ' *           FOR USE IN CHAPTER 8 OF THE SECOND EDITION OF                *
14 ' *     CHEMICAL AND ENGINEERING THERMODYNAMICS BY S. I. SANDLER           *
15 ' *            PUBLISHED BY J. WILEY & SONS, INC., N. Y.                   *
16 ' *               PROGRAM LAST REVISED 12/6/87                             *
17 ' *                                                                        *
18 ' **************************************************************************
19   KEY OFF: CLS
20 PRINT TAB(10);"***************************************************************"
21 PRINT TAB(10);"*  PROGRAM FOR CALCULATION OF PHASE EQUILIBRIUM IN MIXTURES   *"
22 PRINT TAB(10);"*       USING THE PENG-ROBINSON EQUATION OF STATE             *"
23 PRINT TAB(10);"*    BY STANLEY I. SANDLER, DEPT. OF CHEMICAL ENGINEERING     *"
24 PRINT TAB(10);"*      UNIVERSITY OF DELAWARE, NEWARK, DE 19716 U. S. A.      *"
25 PRINT TAB(10);"*       COPYRIGHT SEPTEMBER, 1987 BY STANLEY I. SANDLER       *"
26 PRINT TAB(10);"*                                                             *"
27 PRINT TAB(10);"*    DUPLICATION OR DISTRIBUTION IN ANY FORM WITHOUT THE      *"
28 PRINT TAB(10);"*    WRITTEN PERMISSION OF AUTHOR AND COPYRIGHT HOLDER IS     *"
29 PRINT TAB(10);"*   PROHIBITED AND IN VIOLATION OF FEDERAL COPYRIGHT LAWS.    *"
30 PRINT TAB(10);"***************************************************************"
31   L42$="####.##": L14$="#.####": L14E$="#.####^^^^": L24$="##.####"
32   L1$="-------------------------------------------------------------------"
33   L2$= "\       \     #.####           #.####^^^^        #.####^^^^"
34   L3$= "\       \     #.####        #.####        #.####^^^^"
35   L5$= "#.####        #.####"
36   L6$= "\       \     #.####        #.####         #.####    #.####^^^^"
37   L4$= "Phase compressibilities "
38   PI#=3.1415926541#
40   DIM KK1$(10),TC#(10),PC#(10),WC#(10),TB#(10)
45   DIM DEL#(10,10),X1#(10),X2#(10),Z#(10),ZX#(10),AC#(10)
50   DIM Y#(10),Y1#(10),Y2#(10),YY#(10),YZ#(10),ZZZ#(10),XX#(10),A#(10)
55   DIM C#(3),SA#(10),S#(2),D1#(10),B#(10),AIJ#(10,10)
60   DIM XLF#(10),XK1#(10),RAT1#(10),PS#(10)
70   DIM FOX#(10),F#(10),F1#(10),F2#(10)
80   R#=8.314#       'R = J/Mol K
90   RG#=.00008314#   'R = bar m^3/mol K
100  PRINT: PRINT: INPUT"Enter input device number, 0-keyboard, 1-diskfile";INPF
110  IF INPF=1 GOTO 330
120  PRINT "Enter disk filename to save critical properties"
130  INPUT "Example, a:co2&nc4.dat";FILEOUT$
140  PRINT "This file can be used for data input on rerunning program"
150  OPEN FILEOUT$ FOR OUTPUT AS 2
160  INPUT "Enter the number of components";NC
170  FOR I=1 TO NC
180  INPUT "Enter species name (alphabetic, 7 letters)";KK1$(I)
190  INPUT "Enter Tc(K),Pc(bar),wc, and Tboil(K)";TC#(I),PC#(I),WC#(I),TB#(I)
200  NEXT I
210  PRINT #2, NC
220  FOR I=1 TO NC
230  PRINT #2,KK1$(I)
240  PRINT #2,TC#(I),PC#(I),WC#(I),TB#(I)
250  NEXT I
260  CLOSE #2
270  FOR I=1 TO NC
280  FOR J=1 TO NC
290  DEL#(I,J)=0#
300  NEXT J
310  NEXT I
320  GOTO 410
330  INPUT "Enter input diskfile, ex. a:co2&nc4.dat";FILEIN$
340  OPEN FILEIN$ FOR INPUT AS 1
350  INPUT #1,NC
360  FOR I=1 TO NC
370  INPUT #1,KK1$(I)
380  INPUT #1,TC#(I),PC#(I),WC#(I),TB#(I)
390  NEXT I
400  CLOSE #1
410  IF NC=1 GOTO 600
420  PRINT "Type 0 for all binary interaction parameters equal to zero"
430  INPUT "     1 otherwise "; INTFLG
440  IF INTFLG=0 GOTO 530
450  FOR I=1 TO NC
460  FOR J=I TO NC
470  IF I=J GOTO 510
480  PRINT "k(";I;",";J;") = "
490  INPUT DEL#(I,J)
500  DEL#(J,I)=DEL#(I,J)
510  NEXT J
520  NEXT I
530  IF INTFLG=0 GOTO 600
540  PRINT "matrix of binary interaction parameters"
550  FOR I=1 TO NC
560  FOR J=I TO NC
570  PRINT DEL#(I,J)
580  NEXT J
590  NEXT I
600  PRINT:PRINT "Type 1 for compressibility calculation"
610  PRINT "     2 for species fugacity calculation"
620  PRINT "     3 for bubble point temperature calculation"
630  PRINT "     4 for dew point temperature calculation"
640  PRINT "     5 for bubble point pressure calculation"
650  PRINT "     6 for dew point pressure calculation"
660  PRINT "     7 for isothermal flash calculation"
670  PRINT "     0 to leave"
680  INPUT ICODE
690  IF ICODE=0 THEN END
700  PRINT
710  ON ICODE GOSUB 1950,3300,3630,4960,6250,7600,2260
720  GOTO 600
730  '=======================================================================
740  'subroutine prfuga
750  C1#=SQR(2#)
760  C2#=1#+C1#
770  C3#=C1#-1#
780  YMAX#=0#
790  YMIN#=0#
800  IF NC>1 GOTO 840
810  AA#=A#(1)
820  BB#=B#(1)
830  GOTO 1000
840  FOR I=1 TO NC
850  SA#(I)=0#
860  NEXT I
870  AA#=0#
880  BB#=0#
890  FOR I=1 TO NC
900  BB#=BB#+ZX#(I)*B#(I)
910  FOR M=1 TO NC
920  IF I=M GOTO 960
930  AA#=AA#+ZX#(I)*ZX#(M)*AIJ#(I,M)
940  SA#(M)=SA#(M)+ZX#(I)*AIJ#(I,M)
950  GOTO 980
960  AA#=AA#+ZX#(I)*ZX#(I)*A#(I)
970  SA#(M)=SA#(M)+ZX#(M)*A#(M)
980  NEXT M
990  NEXT I
1000 CA#=AA#*P#/((RG#*T#)^2)
1010 CB#=BB#*P#/(RG#*T#)
1020 C#(1)=CB#-1#
1030 C#(2)=CA#-CB#*(3#*CB#+2#)
1040 C#(3)=CB#*(CB#*CB#+CB#-CA#)
1050 SSA# = (3#*C#(2)-C#(1)*C#(1))/3#
1060 SB# = (2#*(C#(1)^3)-9#*C#(1)*C#(2)+27#*C#(3))/27#
1070 SR# = ((SSA#/3#)^3)+((SB#/2#)^2)
1080 IF SR#<0# THEN GOTO 1310
1090 IF SR#>0# THEN GOTO 1150
1100 AZ#=(-SB#/2#)^(1#/3#)
1110 YZ#(1)=AZ#+AZ#
1120 YZ#(2)=-YZ#(1)/2#
1130 YZ#(3)=YZ#(2)
1140 GOTO 1400
1150 XA#=(SQR(SR#))-(SB#/2#)
1160 IF XA#<0# GOTO 1170 ELSE 1200
1170 XA#=-XA#
1180 AZ#=-1#*((XA#)^(1#/3#))
1190 GOTO 1210
1200 AZ#=(XA#)^(1#/3#)
1210 XB#=-(SB#/2#)-SQR(SR#)
1220 IF XB#>0 GOTO 1260
1230 XB#=-XB#
1240 AB#=-(XB#^(1#/3#))
1250 GOTO 1270
1260 AB#=(XB#)^(1#/3#)
1270 YZ#(1)=AZ#+AB#
1280 YZ#(2)=YZ#(1)
1290 YZ#(3)=YZ#(1)
1300 GOTO 1400
1310 TEMP#=((SSA#/3#)^3#)
1320 TEMP#=SQR(-TEMP#)
1330 CSPHI#=-SB#/(2#*TEMP#)
1340 TANPHI#=(SQR(1#-CSPHI#^2))/CSPHI#
1350 PHI#=ATN(TANPHI#)
1360 T11# = 2#*SQR(-SSA#/3#)
1370 YZ#(1) = T11#*COS(PHI#/3#)
1380 YZ#(2) = T11#*COS((PHI# + 2#*PI#)/3#)
1390 YZ#(3) = T11#*COS((PHI# + 4#*PI#)/3#)
1400 FOR I = 1 TO 3
1410 YZ#(I) = YZ#(I)-C#(1)/3#
1420 NEXT I
1430 IF YZ#(1)>YZ#(2) THEN 1460
1440 IF YZ#(2)>YZ#(3) THEN YMAX#=YZ#(2) ELSE YMAX#=YZ#(3)
1450 GOTO 1470
1460 IF YZ#(1)>YZ#(3) THEN YMAX#=YZ#(1) ELSE YMAX#=YZ#(3)
1470 IF YZ#(1)<YZ#(2) THEN 1500
1480 IF YZ#(2)<YZ#(3) THEN YMIN#=YZ#(2) ELSE YMIN#=YZ#(3)
1490 GOTO 1510
1500 IF YZ#(1)<YZ#(3) THEN YMIN#=YZ#(1) ELSE YMIN#=YZ#(3)
1510 Z0#=YMAX#
1520 Z1#=YMIN#
1530 V1# = Z1#*RG#*T#/P#
1540 IF V1#<BB# THEN Z1#=Z0#
1550 ' 0 = VAPOR AND 1 = LIQUID
1580 IF ICOMP=0 THEN RETURN
1590 IF IFASE = 0 THEN ZZ# = Z0# ELSE ZZ# = Z1#
1600 AG1#=(ZZ#+C2#*CB#)/(ZZ#-C3#*CB#)
1610 AG1#=LOG(AG1#)
1620 AG2#=CA#/(2#*CB#*C1#)
1630 IF NC>1 GOTO 1680
1640 FOX#(1)=ZZ#-1#-LOG(ZZ#-CB#)-AG1#*AG2#
1650 FOX#(1)=EXP(FOX#(1))
1660 F#(1)=P#*FOX#(1)
1670 GOTO 1740
1680 FOR M=1 TO NC
1690 AG3#=(2#*SA#(M)/AA#)-(B#(M)/BB#)
1700 FOX#(M)=(B#(M)*(ZZ#-1#)/BB#)-LOG(ZZ#-CB#)-AG1#*AG2#*AG3#
1710 FOX#(M)=EXP(FOX#(M))
1720 F#(M)=ZX#(M)*P#*FOX#(M)
1730 NEXT M
1740 RETURN
1750 '========================================================================
1760 'subroutine prcons
1770 FOR I=1 TO NC
1780 AC#(I)=.457235529#*((RG#*TC#(I))^2)/PC#(I)
1790 B#(I)=.077796074#*RG#*TC#(I)/PC#(I)
1800 XK#=.37464#+(1.54226#-.26992#*WC#(I))*WC#(I)
1810 TR#=T#/TC#(I)
1820 ALSQR#=1#+XK#*(1#-SQR(TR#))
1830 ALPHA#=ALSQR#*ALSQR#
1840 A#(I)=ALPHA#*AC#(I)
1850 NEXT I
1860 IF NC=1 GOTO 1930
1870 FOR I=1 TO NC-1
1880 FOR J=I+1 TO NC
1890 AIJ#(I,J)=(1#-DEL#(I,J))*SQR(A#(I)*A#(J))
1900 AIJ#(J,I)=AIJ#(I,J)
1910 NEXT J
1920 NEXT I
1930 RETURN
1940 '=======================================================================
1950 'subroutine comp
1960 SUM#=0#
1970 INPUT "Enter feed temperature (K), pressure (bar)";T#,P#
1980 IF NC=1 THEN Z#(1)=1#
1990 IF NC=1 GOTO 2080
2000 FOR I=1 TO NC
2010 PRINT "Enter feed mole fraction of ";KK1$(I);
2020 INPUT Z#(I)
2030 SUM#=SUM#+Z#(I)
2040 NEXT I
2050 FOR I=1 TO NC
2060 Z#(I)=Z#(I)/SUM#
2070 NEXT I
2080 GOSUB 1760                      'call prcons
2090 FOR I=1 TO NC:ZX#(I)=Z#(I):NEXT I
2100 IFASE=0:ICOMP=0
2110 GOSUB  740            'call prfuga
2120 PRINT:PRINT L1$
2130 PRINT "Compressibility calculation using the Peng-Robinson EOS": PRINT
2140 PRINT "Temperature= ";:PRINT USING L42$;T#;:PRINT " K"
2150 PRINT "Pressure   = ";:PRINT USING L42$;P#;:PRINT " bar": PRINT
2160 PRINT,:PRINT"Compressibility",:PRINT"Specific volume (m^3/mol)"
2170 PRINT "Vapor",:PRINT USING L14$;Z0#;:PRINT,,:PRINT USING L14E$;Z0#*RG#*T#/P#
2180 PRINT "Liquid",:PRINT USING L14$;Z1#;:PRINT,,:PRINT USING L14E$;Z1#*RG#*T#/P#
2190 PRINT L1$
2200 PRINT
2210 PRINT "Type 1 to run again with same components and kijs"
2220 PRINT "     0 to return to main menu";:INPUT IENDFG
2230 IF IENDFG<>0 GOTO 1960
2240 RETURN
2250 '=======================================================================
2260 'subroutine flash
2270 ICOMP = 1
2280 IF NC<=1 THEN PRINT"Need 2 or more components to do an isothermal flash calculation"
2290 IF NC<=1 GOTO 3280
2300 EPS2#=.0001#
2310 KVALUE=0
2320 SUM#=0#:ICONV=0
2330 INPUT "Enter feed temperature (K) ";T#
2340 INPUT "Enter feed pressure (bar) ";P#
2350 FOR I=1 TO NC
2360 PRINT "Enter feed mole fraction of ";KK1$(I);
2370 INPUT Z#(I)
2380 SUM#=SUM#+Z#(I)
2390 NEXT I
2400 FOR I=1 TO NC
2410 Z#(I)=Z#(I)/SUM#
2420 NEXT I
2430 GOSUB  1760            'call prcons
2440  IF KVALUE=1 GOTO 2570
2450 FOR I=1 TO NC
2460 IF T#>(1.1#*TC#(I)) GOTO 2520
2470 DT1#=(1#/T#)-(1#/TB#(I))
2480 DT2#=(1#/TC#(I))-(1#/TB#(I))
2490 DLNP#=LOG(PC#(I))
2500 PS#(I)=EXP(DLNP#*DT1#/DT2#)
2510 GOTO 2550
2520 TR#=T#/TC#(I)
2530 AXP#=7.224#-2.598#*LOG(TR#)-7.534#/TR#
2540 PS#(I)=PC#(I)*EXP(AXP#)
2550 XK1#(I)=PS#(I)/P#
2560 NEXT I
2570 XLF#(1)=1#/2#
2580 K=0
2590 NLAP=0
2600 FOR I=1 TO NC
2610 D1#(I)=1#-XK1#(I)
2620 NEXT I
2630 NLAP=NLAP+1
2640 SXA#=0#
2650 SXV#=0#
2660 S1A#=0#
2670 FOR I=1 TO NC
2680 DENO#=XLF#(1)*D1#(I)+XK1#(I)
2690 X1#(I)=Z#(I)/DENO#
2700 Y#(I)=X1#(I)*XK1#(I)
2710 SXA#=SXA#+X1#(I)
2720 SXV#=SXV#+Y#(I)
2730 DS1A#=-X1#(I)*D1#(I)*D1#(I)/DENO#
2740 S1A#=S1A#+DS1A#
2750 NEXT I
2760 IF NLAP>20 GOTO 2840
2770 XMX#=SXA#-SXV#
2780 IF ABS(XMX#)<EPS2# GOTO 2840
2790 IF S1A#=0# GOTO 3070
2800 DA#=XMX#/S1A#
2810 XLF#(1)=XLF#(1)-DA#
2820 XLF#(2)=1#-XLF#(1)
2830 GOTO 2630
2840 K=K+1: IF K>75 GOTO 3210
2850 FOR I=1 TO NC:ZX#(I)=X1#(I):NEXT I
2860 IFASE=1
2870 GOSUB  740            'call prfuga
2880 FOR I=1 TO NC:F1#(I)=F#(I):NEXT I
2890 ZZ1#=ZZ#
2900 FOR I=1 TO NC:ZX#(I)=Y#(I):NEXT I
2910 IFASE=0
2920 GOSUB  740            'call prfuga
2930 FOR I=1 TO NC:F2#(I)=F#(I):NEXT I
2940 ZZ2#=ZZ#
2950 IFLAG=0
2970 FOR I=1 TO NC
2980 RAT1#(I)=F1#(I)/F2#(I)
2990 ZZZ#=ABS(RAT1#(I)-1#)
3000 IF ZZZ#<.0001# GOTO 3030
3010 XK1#(I)=XK1#(I)*RAT1#(I)
3020 IFLAG=IFLAG+1
3030 NEXT I
3040 IF IFLAG=0 GOTO 3060
3050 GOTO 2590
3060 IF (XLF#(1)<0#) OR (XLF#(1)>1#) GOTO 3210
3070 PRINT: PRINT L1$
3080 PRINT "Isothermal flash calculation using the PENG-ROBINSON equation of state"
3090 PRINT "Temperature = ";:PRINT USING L42$;T#;:PRINT" K"
3100 PRINT "Pressure    = ";:PRINT USING L42$;P#;:PRINT" bar":PRINT
3110 PRINT "Component      Feed         Liquid         Vapor          K"
3120 FOR I=1 TO NC
3130 PRINT USING L6$; KK1$(I), Z#(I), X1#(I), Y#(I), XK1#(I)
3140 NEXT I
3150 PRINT
3160 PRINT "Split",:PRINT,:PRINT USING L14$;XLF#(1);:PRINT,:PRINT USING L14$;XLF#(2)
3170 PRINT:PRINT L4$;:PRINT,:PRINT USING L14$;ZZ1#;:PRINT,:PRINT USING L14$;ZZ2#
3180 PRINT:PRINT" Number of iterations = " ;K
3190 PRINT L1$: PRINT: ICONV=1
3200 GOTO 3220
3210 PRINT "No flash calculation possibile at these conditions"
3220 PRINT "Type 1 to run again with same components and kijs"
3230 PRINT "     0 to return to main menu";:INPUT IENDFG
3240 IF IENDFG=0 GOTO 3280
3245 IF ICONV=0 GOTO 2320
3250 PRINT "Type 1 to use last K values as initial guess"
3260 INPUT "     0 to reinitialize K values ";KVALUE
3270 GOTO 2320
3280 RETURN
3290 '========================================================================
3300 'subroutine spfug
3310 ICOMP=1
3320 SUM#=0#
3330 INPUT "Enter feed temperature (K), pressure (bar)";T#,P#
3340 IF NC=1 THEN Z#(1)=1#
3350 IF NC=1 GOTO 3440
3360 FOR I=1 TO NC
3370 PRINT "Enter feed mole fraction of ";KK1$(I);
3380 INPUT Z#(I)
3390 SUM#=SUM#+Z#(I)
3400 NEXT I
3410 FOR I=1 TO NC
3420 Z#(I)=Z#(I)/SUM#
3430 NEXT I
3440 INPUT "Enter 0 for vapor fugacity, 1 for liquid";IFASE
3450 GOSUB 1760                 'call prcons
3460 FOR I=1 TO NC:ZX#(I)=Z#(I):NEXT I
3470 GOSUB 740                 'call prfuga
3480 PRINT:PRINT L1$
3490 PRINT "Fugacity calculation using the Peng-Robinson equation of state"
3500 PRINT "Temperature = ";:PRINT USING L42$;T#;:PRINT " K"
3510 PRINT "Pressure    = ";:PRINT USING L42$;P#;:PRINT" bar":PRINT
3520 PRINT "Component      Feed           Fugacity (bar)       (f/xP) "
3530 FOR I=1 TO NC
3540 PRINT USING L2$;KK1$(I), ZX#(I), F#(I), FOX#(I)
3550 NEXT I
3560 PRINT:PRINT L4$;:PRINT USING L14$;ZZ#
3570 PRINT L1$: PRINT
3580 PRINT "Type 1 to run again with same components and kijs"
3590 PRINT "     0 to return to main menu";:INPUT IENDFG
3600 IF IENDFG<>0 GOTO 3320
3610 RETURN
3620 '=======================================================================
3630 'subroutine bubptt
3640 K=0: ICOMP=1: KVALUE=0
3650 SUM#=0#: ICONV=0
3660 INPUT "Enter feed pressure (bar)";P#
3670 PRINT "Enter estimated bubble point temperature (K)"
3680 INPUT "      or 0 for default estimate";T#
3690 IF NC=1 THEN Z#(1)=1#
3700 IF NC=1 GOTO 3790
3710 FOR I=1 TO NC
3720 PRINT "Enter feed mole fraction of ";KK1$(I);
3730 INPUT Z#(I)
3740 SUM#=SUM#+Z#(I)
3750 NEXT I
3760 FOR I=1 TO NC
3770 Z#(I)=Z#(I)/SUM#
3780 NEXT I
3790 IF T#<>0 GOTO 3870
3800 TBG#=0
3810 TCG#=0
3820 FOR I=1 TO NC
3830 TBG#=TBG#+Z#(I)*TB#(I)
3840 TCG#=TCG#+Z#(I)*TC#(I)
3850 NEXT I
3860 T#=.5#*(TBG#+TCG#)
3870 IF K>30 GOTO 4880
3880 FOR I=1 TO NC
3890 IF KVALUE = 1 GOTO 3950
3900 DT1#=(1#/T#)-(1#/TB#(I))
3910 DT2#=(1#/TC#(I))-(1#/TB#(I))
3920 DLNP#=LOG(PC#(I))
3930 PS#(I)=EXP(DLNP#*DT1#/DT2#)
3940 XK1#(I)=PS#(I)/P#
3950 YY#(I)=Z#(I)*XK1#(I)
3960 NEXT I
3970 KKK=0
3980 NLOOP=1
3990 IF T#<50# GOTO 4590
4000 IF T#>1200# GOTO 4590
4010 K=K+1
4020 GOSUB 1760                 'call prcons
4030 FOR I=1 TO NC:ZX#(I)=Z#(I):NEXT I
4040 IFASE=1
4050 GOSUB 740                 'call prfuga
4060 FOR I=1 TO NC:F1#(I)=F#(I):NEXT I
4070 ZZ1#=ZZ#
4080 SUMY#=0#
4090 FOR I=1 TO NC
4100 Y2#(I)=YY#(I)
4110 SUMY#=SUMY#+YY#(I)
4120 NEXT I
4130 FOR I=1 TO NC
4140 YY#(I)=YY#(I)/SUMY#
4150 NEXT I
4160 SUMY#=0#
4170 KKK=KKK+1
4180 FOR I=1 TO NC:ZX#(I)=YY#(I):NEXT I
4190 IFASE=0
4200 GOSUB 740                 'call prfuga
4210 FOR I=1 TO NC:F2#(I)=F#(I):NEXT I
4220 ZZ2#=ZZ#
4230 FOR I=1 TO NC
4240 YY#(I)=F1#(I)*YY#(I)/F2#(I)
4250 Y1#(I)=YY#(I)
4260 SUMY#=SUMY#+YY#(I)
4270 NEXT I
4280 ITEST=0
4290 FOR I=1 TO NC
4300 TEST#=ABS(Y1#(I)-Y2#(I))
4310 IF TEST#>.0001# THEN ITEST=ITEST+1
4320 YY#(I)=YY#(I)/SUMY#
4330 NEXT I
4340 IF KKK>25 GOTO 4400
4350 IF ITEST<=0 GOTO 4400
4360 FOR I=1 TO NC
4370 Y2#(I)=Y1#(I)
4380 NEXT I
4390 GOTO 4160
4400 S#(NLOOP)=SUMY#
4410 KKK=0
4420 IF (NLOOP-1)>0 GOTO 4460
4430 NLOOP=2
4440 T#=T#-.005#
4450 GOTO 4020
4460 DSDT#=(S#(2)-S#(1))/(.005#)
4470 IF (ABS(DSDT#)<.00001#) GOTO 4590
4480 DLT#=(S#(1)-1#)/DSDT#
4490 IF ABS(DLT#)<.0026# GOTO 4670
4500 IF K>50 GOTO 4650
4510 IF K<11 THEN DD#=20#
4520 IF K>=11 THEN DD#=5#
4530 IF DLT#>DD# THEN T#=T#+DD#
4540 IF DLT#>DD# GOTO 3980
4550 IF DLT#<-DD# THEN T#=T#-DD#
4560 IF -DLT#>DD# GOTO 3980
4570 T#=T#+DLT#+.0025#
4580 GOTO 3980
4590 IF K>2 GOTO 4630
4600 IF ZZ1#>=.307# THEN T#=T#-10#
4610 IF ZZ2#<=.307# THEN T#=T#+10#
4620 GOTO 3980
4630 PRINT "Calculation not converging: one-phase region or poor initial guess"
4640 GOTO 4880
4650 PRINT:PRINT "Bubble point calculation did not converge":PRINT
4660 GOTO 4880
4670 YK#=K
4680 TTEST#=(ZZ1#-ZZ2#)^2
4690 IF TTEST#>.00001# GOTO 4730
4700 IF ZZ1#>=.307# THEN T#=T#-25#/SQR(YK#)
4710 IF ZZ1#<.307# THEN T#=T#+25#/SQR(YK#)
4720 KVALUE = 0:GOTO 3870
4730 FOR I=1 TO NC
4740 XK1#(I)=YY#(I)/Z#(I)
4750 NEXT I
4760 PRINT:PRINT L1$
4770 PRINT "Bubble point temperature calculation using the "
4780 PRINT "Peng Robinson equation of state"
4790 PRINT "Pressure = ";:PRINT USING L42$; P#;:PRINT" bar"
4800 PRINT "Calculated bubble point temperature = ";:PRINT USING L42$;T#;:PRINT" K":PRINT
4810 PRINT "Component      Feed         Vapor            K"
4820 FOR I=1 TO NC
4830 PRINT USING L3$; KK1$(I), Z#(I), YY#(I), XK1#(I)
4840 NEXT I
4850 PRINT:PRINT L4$:PRINT,:PRINT USING L5$; ZZ1#, ZZ2#: PRINT
4860 PRINT "Number of iterations = " ;K
4870 PRINT L1$: PRINT: ICONV=1
4880 PRINT "Type 1 to run again with same components and kijs"
4890 PRINT "     0 to return to main menu";:INPUT IENDFG
4900 IF IENDFG=0 GOTO 4940
4905 IF ICONV=0 GOTO 3640
4910 PRINT "Type 1 to use last K values as initial guess"
4920 INPUT "     0 to reinitialize K values ";KVALUE
4930 K = 0: GOTO 3650
4940  RETURN
4950 '========================================================================
4960 'subroutine dewptt
4970 ICOMP=1: KVALUE=0
4980 K=0
4990 SUM#=0#: ICONV=0
5000 INPUT "Enter feed pressure (bar)";P#
5010 PRINT "Enter estimated dew point temperature (K)"
5020 INPUT "      or 0 for default estimate";T#
5030 IF NC=1 THEN Z#(1)=1#
5040 IF NC=1 GOTO 5130
5050 FOR I=1 TO NC
5060 PRINT "Enter feed mole fraction of ";KK1$(I);
5070 INPUT Z#(I)
5080 SUM#=SUM#+Z#(I)
5090 NEXT I
5100 FOR I=1 TO NC
5110 Z#(I)=Z#(I)/SUM#
5120 NEXT I
5130 IF T#<>0 GOTO 5210
5140 TBG#=0
5150 TCG#=0
5160 FOR I=1 TO NC
5170 TBG#=TBG#+Z#(I)*TB#(I)
5180 TCG#=TCG#+Z#(I)*TC#(I)
5190 NEXT I
5200 T#=.5#*(TBG#+TCG#)
5210 IF K>30 GOTO 6180
5220 FOR I=1 TO NC
5230 IF KVALUE = 1 GOTO 5290
5240 DT1#=(1#/T#)-(1#/TB#(I))
5250 DT2#=(1#/TC#(I))-(1#/TB#(I))
5260 DLNP#=LOG(PC#(I))
5270 PS#(I)=EXP(DLNP#*DT1#/DT2#)
5280 XK1#(I)=PS#(I)/P#
5290 XX#(I)=Z#(I)/XK1#(I)
5300 NEXT I
5310 KKK=0
5320 NLOOP=1
5330 IF T#<100 GOTO 5930
5340 IF T#>1200 GOTO 5930
5350 K=K+1
5360 GOSUB 1760                 'call prcons
5370 FOR I=1 TO NC:ZX#(I)=Z#(I):NEXT I
5380 IFASE=0
5390 GOSUB 740                 'call prfuga
5400 FOR I=1 TO NC:F1#(I)=F#(I):NEXT I
5410 ZZ1#=ZZ#
5420 SUMX#=0#
5430 FOR I=1 TO NC
5440 X2#(I)=XX#(I)
5450 SUMX#=SUMX#+XX#(I)
5460 NEXT I
5470 FOR I=1 TO NC
5480 XX#(I)=XX#(I)/SUMX#
5490 NEXT I
5500 SUMX#=0#
5510 KKK=KKK+1
5520 FOR I=1 TO NC:ZX#(I)=XX#(I):NEXT I
5530 IFASE=1
5540 GOSUB 740                 'call prfuga
5550 FOR I=1 TO NC:F2#(I)=F#(I):NEXT I
5560 ZZ2#=ZZ#
5570 FOR I=1 TO NC
5580 XX#(I)=F1#(I)*XX#(I)/F2#(I)
5590 X1#(I)=XX#(I)
5600 SUMX#=SUMX#+XX#(I)
5610 NEXT I
5620 ITEST=0
5630 FOR I=1 TO NC
5640 TEST#=ABS(X1#(I)-X2#(I))
5650 IF TEST#>.0001# THEN ITEST=ITEST+1
5660 XX#(I)=XX#(I)/SUMX#
5670 NEXT I
5680 IF KKK>25 GOTO 5740
5690 IF ITEST<=0 GOTO 5740
5700 FOR I=1 TO NC
5710 X2#(I)=X1#(I)
5720 NEXT I
5730 GOTO 5500
5740 S#(NLOOP)=SUMX#
5750 KKK=0
5760 IF (NLOOP-1)>0 GOTO 5800
5770 NLOOP=2
5780 T#=T#-.005#
5790 GOTO 5360
5800 DSDT#=(S#(2)-S#(1))/.005#
5810 IF (ABS(DSDT#)<.00001#) GOTO 5930
5820 DLT#=(S#(1)-1#)/DSDT#
5830 IF K>50 GOTO 5950
5840 IF K<11 THEN DD#=50#
5850 IF K>=11 THEN DD#=10#
5860 IF DLT#>DD# THEN T#=T#+DD#
5870 IF DLT#>DD# GOTO 5320
5880 IF DLT#<-DD# THEN T#=T#-DD#
5890 IF DLT#<-DD# GOTO 5320
5900 IF ABS(DLT#)<.01# GOTO 5970
5910 T#=T#+DLT#+.0025#
5920 GOTO 5320
5930 PRINT "Calculation not converging: one-phase region or poor initial guess"
5940 GOTO 6180
5950 PRINT:PRINT "Dew point calculation did not converge": PRINT
5960 GOTO 6180
5970 YK#=K
5980 TTEST#=(ZZ1#-ZZ2#)^2
5990 IF TTEST#>.00001# GOTO 6030
6000 IF ZZ1#>=.307# THEN T#=T#-25#/SQR(YK#)
6010 IF ZZ1#<.307#  THEN T#=T#+25#/SQR(YK#)
6020 KVALUE = 0: GOTO 5210
6030 FOR I=1 TO NC
6040 XK1#(I)=Z#(I)/XX#(I)
6050 NEXT I
6060 PRINT:PRINT L1$
6070 PRINT "Dew point temperature calculation using the "
6080 PRINT "Peng Robinson equation of state"
6090 PRINT "Pressure = ";:PRINT USING L42$;P#;:PRINT" bar"
6100 PRINT "Calculated dew point temperature = ";:PRINT USING L42$;T#;:PRINT" K":PRINT
6110 PRINT "Component      Feed         Liquid           K"
6120 FOR I=1 TO NC
6130 PRINT USING L3$; KK1$(I), Z#(I), XX#(I), XK1#(I)
6140 NEXT I
6150 PRINT:PRINT L4$:PRINT,:PRINT USING L5$; ZZ1#, ZZ2#: PRINT
6160 PRINT "Number of iterations = " ;K
6170 PRINT L1$: PRINT: ICONV=1
6180 PRINT "Type 1 to run again with same components and kijs"
6190 PRINT "     0 to return to main menu";:INPUT IENDFG
6200 IF IENDFG=0 THEN RETURN
6205 IF ICONV=0 GOTO 4980
6210 PRINT "Type 1 to use last K values as initial guess"
6220 INPUT "     0 to reinitialize K values ";KVALUE
6230 GOTO 4980
6240 '========================================================================
6250 'subroutine bubptp
6260 ICOMP=1
6270 IENDFG=0
6280 KVALUE = 0
6290 PBG#=0#
6300 K=0
6310 SUM#=0#: ICONV=0
6320 INPUT "Enter feed temperature (K)";T#
6330 PRINT "Enter estimated bubble point pressure (bar)"
6340 INPUT "      or 0 for default estimate";P#
6350 IF NC=1 THEN Z#(1)=1#
6360 IF NC=1 GOTO 6450
6370 FOR I=1 TO NC
6380 PRINT "Enter feed mole fraction of ";KK1$(I);
6390 INPUT Z#(I)
6400 SUM#=SUM#+Z#(I)
6410 NEXT I
6420 FOR I=1 TO NC
6430 Z#(I)=Z#(I)/SUM#
6440 NEXT I
6450 GOSUB 1760         'call prcons
6460 IF KVALUE=1 AND P#>.0001 GOTO 6600
6470 FOR I=1 TO NC
6480 IF T#>(1.1#*TC#(I)) GOTO 6540
6490 DT1#=(1#/T#)-(1#/TB#(I))
6500 DT2#=(1#/TC#(I))-(1#/TB#(I))
6510 DLNP#=LOG(PC#(I))
6520 PS#(I)=EXP(DLNP#*DT1#/DT2#)
6530 GOTO 6570
6540 TR#=T#/TC#(I)
6550 AXP#=7.224#-2.598#*LOG(TR#)-7.534#/TR#
6560 PS#(I)=PC#(I)*EXP(AXP#)
6570 PBG#=PBG#+Z#(I)*PS#(I)
6580 NEXT I
6590 IF P#<.0001# THEN P#=PBG#
6600 FOR I=1 TO NC
6610 IF KVALUE = 1 GOTO 6630
6620 XK1#(I)=PS#(I)/P#
6630 YY#(I)=Z#(I)*XK1#(I)
6640 NEXT I
6650 KKK=0
6660 NLOOP=1
6670 IF P#<0# GOTO 7270
6680 IF P#>10000# GOTO 7270
6690 K=K+1
6700 IF K>150 GOTO 7290
6710 FOR I=1 TO NC:ZX#(I)=Z#(I):NEXT I
6720 IFASE=1
6730 GOSUB 740                 'call prfuga
6740 FOR I=1 TO NC:F1#(I)=F#(I):NEXT I
6750 ZZ1#=ZZ#
6760 SUMY#=0#
6770 FOR I=1 TO NC
6780 Y2#(I)=YY#(I)
6790 SUMY#=SUMY#+YY#(I)
6800 NEXT I
6810 FOR I=1 TO NC
6820 YY#(I)=YY#(I)/SUMY#
6830 NEXT I
6840 SUMY#=0#
6850 KKK=KKK+1
6860 FOR I=1 TO NC:ZX#(I)=YY#(I):NEXT I
6870 IFASE=0
6880 GOSUB 740                 'call prfuga
6890 FOR I=1 TO NC:F2#(I)=F#(I):NEXT I
6900 ZZ2#=ZZ#
6910 FOR I=1 TO NC
6920 YY#(I)=F1#(I)*YY#(I)/F2#(I)
6930 Y1#(I)=YY#(I)
6940 SUMY#=SUMY#+YY#(I)
6950 NEXT I
6960 ITEST=0
6970 FOR I=1 TO NC
6980 TEST#=ABS(Y1#(I)-Y2#(I))
6990 IF TEST#>.0001# THEN ITEST=ITEST+1
7000 YY#(I)=YY#(I)/SUMY#
7010 NEXT I
7020 IF KKK>25 GOTO 7080
7030 IF ITEST<=0 GOTO 7080
7040 FOR I=1 TO NC
7050 Y2#(I)=Y1#(I)
7060 NEXT I
7070 GOTO 6840
7080 S#(NLOOP)=SUMY#
7090 KKK=0
7100 IF (NLOOP-1)>0 GOTO 7140
7110 NLOOP=2
7120 P#=P#-.005#
7130 GOTO 6710
7140 DSDP#=(S#(2)-S#(1))/.005#
7150 IF (ABS(DSDP#)<.000001#) GOTO 7270
7160 DLP#=(S#(1)-1#)/DSDP#
7170 IF K>50 GOTO 7290
7180 IF K<11 THEN DD#=50#
7190 IF K>=11 THEN DD#=10#
7200 IF DLP#>DD# THEN P#=P#+DD#
7210 IF DLP#>DD# GOTO 6660
7220 IF DLP#<-DD# THEN P#=P#-DD#
7230 IF DLP#<-DD# GOTO 6660
7240 IF ABS(DLP#)<.01# GOTO 7310
7250 P#=P#+DLP#+.0025#
7260 GOTO 6660
7270 PRINT "Calculation not converging: one-phase region or poor initial guess"
7280 GOTO 7520
7290 PRINT:PRINT "Bubble point calculation did not converge":PRINT
7300 GOTO 7520
7310 YK#=K
7320 TTEST#=(ZZ1#-ZZ2#)^2
7330 IF TTEST#>.00001# GOTO 7370
7340 IF ZZ1#>=.307# THEN P#=P#+25#/SQR(YK#)
7350 IF ZZ1#<.307#  THEN P#=P#-25#/SQR(YK#)
7360 KVALUE = 0: GOTO 6600
7370 FOR I=1 TO NC
7380 XK1#(I)=YY#(I)/Z#(I)
7390 NEXT I
7400 PRINT:PRINT L1$
7410 PRINT "Bubble point pressure calculation using the "
7420 PRINT "Peng Robinson equation of state"
7430 PRINT "Temperature = ";:PRINT USING L42$;T#;:PRINT" K"
7440 PRINT "Calculated bubble point pressure = ";:PRINT USING L42$;P#;:PRINT" bar":PRINT
7450 PRINT "Component      Feed         Vapor            K"
7460 FOR I=1 TO NC
7470 PRINT USING L3$; KK1$(I),Z#(I), YY#(I), XK1#(I)
7480 NEXT I
7490 PRINT:PRINT L4$:PRINT,:PRINT USING L5$; ZZ1#, ZZ2#: PRINT
7500 PRINT "Number of iterations = ";K
7510 PRINT L1$: PRINT: ICONV=1
7520 PRINT "Type 1 to run again with same components and kijs"
7530 PRINT "     0 to return to main menu";:INPUT IENDFG
7540 TOLD#=T#
7550 IF IENDFG=0 THEN RETURN
7555 IF ICONV=0 GOTO 6290
7560 PRINT "Type 1 to use last K values as initial guess"
7570 INPUT "     0 to reinitialize K values ";KVALUE
7580 GOTO 6290
7590 '=========================================================================
7600 'subroutine dewptp
7610 ICOMP=1: KVALUE=0
7620 K=0
7630 SUM#=0#: PDG#=0#: ICONV=0
7640 INPUT "Enter feed temperature (K)";T#
7650 PRINT "Enter estimated dew point pressure (bar)"
7660 INPUT "      or 0 for default estimate";P#
7670 IF NC=1 THEN Z#(1)=1#
7680 IF NC=1 GOTO 7770
7690 FOR I=1 TO NC
7700 PRINT "Enter feed mole fraction of ";KK1$(I);
7710 INPUT Z#(I)
7720 SUM#=SUM#+Z#(I)
7730 NEXT I
7740 FOR I=1 TO NC
7750 Z#(I)=Z#(I)/SUM#
7760 NEXT I
7770 GOSUB 1760                'call prcons
7780 IF KVALUE=1 AND P#>.0001 GOTO 7920
7790 FOR I=1 TO NC
7800 DT1#=(1#/T#)-(1#/TB#(I))
7810 DT2#=(1#/TC#(I))-(1#/TB#(I))
7820 DLNP#=LOG(PC#(I))
7830 PS#(I)=EXP(DLNP#*DT1#/DT2#)
7840 PDG#=PDG#+.25#*Z#(I)*PS#(I)
7850 NEXT I
7860 IF P#<.0001# THEN P#=PDG#
7870 FOR I=1 TO NC
7880 IF KVALUE=1 GOTO 7900
7890 XK1#(I)=PS#(I)/P#
7900 XX#(I)=Z#(I)/XK1#(I)
7910 NEXT I
7920 KKK=0
7930 NLOOP=1
7940 IF P#<0# GOTO 8550
7950 IF P#>10000# GOTO 8550
7960 K=K+1
7970 IF K>30 GOTO 8800
7980 GOSUB 1760                 'call prcons
7990 FOR I=1 TO NC:ZX#(I)=Z#(I):NEXT I
8000 IFASE=0
8010 GOSUB 740                 'call prfuga
8020 FOR I=1 TO NC:F1#(I)=F#(I):NEXT I
8030 ZZ1#=ZZ#
8040 SUMX#=0#
8050 FOR I=1 TO NC
8060 X2#(I)=XX#(I)
8070 SUMX#=SUMX#+XX#(I)
8080 NEXT I
8090 FOR I=1 TO NC
8100 XX#(I)=XX#(I)/SUMX#
8110 NEXT I
8120 SUMX#=0#
8130 KKK=KKK+1
8140 FOR I=1 TO NC:ZX#(I)=XX#(I):NEXT I
8150 IFASE=1
8160 GOSUB 740                 'call prfuga
8170 FOR I=1 TO NC:F2#(I)=F#(I):NEXT I
8180 ZZ2#=ZZ#
8190 FOR I=1 TO NC
8200 XX#(I)=F1#(I)*XX#(I)/F2#(I)
8210 X1#(I)=XX#(I)
8220 SUMX#=SUMX#+XX#(I)
8230 NEXT I
8240 ITEST=0
8250 FOR I=1 TO NC
8260 TEST#=ABS(X1#(I)-X2#(I))
8270 IF TEST#>.0001# THEN ITEST=ITEST+1
8280 XX#(I)=XX#(I)/SUMX#
8290 NEXT I
8300 IF KKK>25 GOTO 8360
8310 IF ITEST<=0 GOTO 8360
8320 FOR I=1 TO NC
8330 X2#(I)=X1#(I)
8340 NEXT I
8350 GOTO 8120
8360 S#(NLOOP)=SUMX#
8370 KKK=0
8380 IF (NLOOP-1)>0 GOTO 8420
8390 NLOOP=2
8400 P#=P#-.005#
8410 GOTO 7980
8420 DSDP#=(S#(2)-S#(1))/.005#
8430 IF (ABS(DSDP#)<.000001#) GOTO 8550
8440 DLP#=(S#(1)-1#)/DSDP#
8450 IF K>50 GOTO 8570
8460 IF K<11 THEN DD#=50#
8470 IF K>=11 THEN DD#=10#
8480 IF DLP#>DD# THEN P#=P#+DD#
8490 IF DLP#>DD# GOTO 7930
8500 IF DLP#<-DD# THEN P#=P#-DD#
8510 IF DLP#<-DD# GOTO 7930
8520 IF ABS(DLP#)<.01# GOTO 8590
8530 P#=P#+DLP#+.0025#
8540 GOTO 7930
8550 PRINT "Calculation not converging: one-phase region or poor initial guess"
8560 GOTO 8800
8570 PRINT:PRINT "Dew point calculation did not converge":PRINT
8580 GOTO 8800
8590 YK#=K
8600 TTEST#=(ZZ1#-ZZ2#)^2
8610 IF TTEST#>.00001# GOTO 8650
8620 IF ZZ2#>=.307# THEN P#=P#+25#/SQR(YK#)
8630 IF ZZ2#<.307#  THEN P#=P#-25#/SQR(YK#)
8640 KVALUE = 0: GOTO 7870
8650 FOR I=1 TO NC
8660 XK1#(I)=Z#(I)/XX#(I)
8670 NEXT I
8680 PRINT:PRINT L1$
8690 PRINT "Dew point pressure calculation using the "
8700 PRINT "Peng Robinson equation of state"
8710 PRINT "Temperature = ";:PRINT USING L42$;T#;:PRINT" K"
8720 PRINT "Calculated dew point pressure = ";:PRINT USING L42$;P#;:PRINT" bar":PRINT
8730 PRINT "Component      Feed         Liquid          K"
8740 FOR I=1 TO NC
8750 PRINT USING L3$; KK1$(I), Z#(I), XX#(I), XK1#(I)
8760 NEXT I
8770 PRINT:PRINT L4$:PRINT,:PRINT USING L5$; ZZ1#, ZZ2#: PRINT
8780 PRINT "Number of iterations = ";K
8790 PRINT L1$: PRINT: ICONV=1
8800 PRINT "Type 1 to run again with same components and kijs"
8810 PRINT "     0 to return to main menu";:INPUT IENDFG
8820 IF IENDFG=0 THEN RETURN
8825 IF ICONV=0 GOTO 7620
8830 PRINT "Type 1 to use last K values as initial guess"
8840 INPUT "     0 to reinitialize K values ";KVALUE
8850 GOTO 7620
8860 END
8870 '========================================================================
 | 
Partager