C ******************************************************************* C * * C * PROGRAM GASWORKS * C * (386 PC AND VAX VERSION 1.1) * C * * C * THIS COPY SENT TO _______________________ * C ******************************************************************* C ******************************************************************* C This program evolved from program chiller, originally written by C M. Reed, U.C. Berkeley, 1976. C Chiller was further developed by N. Spycher and M. Reed C (1980-1988) then adapted to GASWORKS in late 1988 by M. Reed, C M. Hirschmann, R. Symonds, and N. Spycher C ******************************************************************* C This program needs data file GASTHERM to run C ******************************************************************* C This version designed to run with GASTHERM which contains C regression coefficients as well as log K'S. C individual log K'S are not used in GASWORKS. C ****************************************************************** C GASWORKS is used to calculate properties of overall equilibrium in C solid-liquid-gas systems upon: C 1. Heating or cooling a gas (or fluid-solid-gas mixture) at C constant composition. C 2. Heating or cooling, as in (1.), but with solid fractionatio C (bulk composition change). C 3. Mixing of two gases of different temperature and/or C composition. C 4. Reaction of a gas with a solid (e.g. rock), C causing a chemical reaction. C ****************************************************************** C ****************************************************************** C Revised: C Dec 88 M.R. reorganized real and integer statements to C eliminate a tropical cockroach ghost that munched on FO2. Also C corrected OXY and made numerous changes in main for constant C FO2 calculations C Dec 88 M.R. fixed output formats; tried new oxy form (failed, C so far); squished underflow bugs involving output of ALA. C 22 Feb 89. This version sent to Symonds C 28 Feb 89. LOOC = 3 to stop execution. MR C 25 April 89. Gave the FO2 bees their honey (changed PF to PFLUID) C and changed OXY back to the old format C Jan-Feb 90: (RS) Converted K'S to log K'S for minerals. Changed C arrays to handle 60 components. IPUNCH = 2 to plot log(moles) C for gases, otherwise log(fugacities) are plotted. C Mar-April 90: (RS) updated GASWORKS to handle the new GASTHERM. C Changes size of the mineral arrays and added a new POWERK C subroutine to calculate log K as F(T). C Oct 90 (RS) reset mintry of kicked out mineral to zero (just C after 777 statement in main and 195 statement in MINSAT) C modified 407 statement so LOOC=3 print plotting file C Nov 90 (RS) fixed the "DO 319" loop so that MTRY's of derived C species are set correctly before first iteration C Dec 90 (RS) converted GASWORKS to Fortran 77. Changed C convergence criteria. C March 91 (RS) converted GASWORKS to compile with Lahey Fortran C compiler. C May 91 (JD) adjustable dimensions for some some arrays C May 91 (MR) adjusted output to 80-column width from chiller C August 91 (RS) added GASTOT to matrix and to the WORKRUN file, C shortened the 313 to 358 zone C Oct 91 (RS) modified convergence criteria for FO2 equation C Oct 91 (MR,JD) input formats for SINC and TOTMIX changed to allow C exponential notation. added new switches and separate C routines for Symonds' and Reed's (MINPLOT) plotting programs C (see IPUNCH comment). Bufout now eliminates arrays (ALGG, C ALGM, etc.). BG3 parameter installed to adjust MAXSAQ. C Jan 92 (RS) added BG4 parameter and some documentation on BG C parameters. Corrected error in mole fraction & partial C pressure output C Mar 92 (RS) corrected error in the calculation of MTOT(H2) if FO2 C is input. Also corrected a precision-related error in C calculating AQM(NS) values (in the DO 350 loop). C May 02 (MR) change I/O unit numbers for IOUT1 and IOUT2 C ****************************************************************** C Program GASWRK Implicit double precision (A-H,O-Z) C C---------------------------------------------------------------------| C BG1 = parameter to scale MAXNM (minerals) | C BG2 = parameter to scale MAXNS (total species) | C BG3 = parameter to scale MAXSAQ (component species) | C MAXIN, AND MAXOX | C BG4 = parameter to scale MAXN = BG3 + BG3 + 1 | C BG5 = parameter to scale the size of the SATMIN array | C see box below for more definitions | C---------------------------------------------------------------------| C Integer BG1,BG2,BG3,BG4,BG5 Parameter(BG1=450,BG2=650,BG3=42,BG4=85) Parameter(BG5=BG3+1) Double precision LGK,MTRY,MTOT,LGKM,MINTRY,LOGACT Integer SAQ, QAS, SAQTOT, SPECOX,OFLAG Integer ERLOOP, SPEC, BSTOT, SEQ, BSTP1, SPECM,SOLS,QES,BSTP2 Character*1 BLNK,SUP Character*8 AMOLE,BLANK,DUMMY,ETOIL,MIN,NAME,NOMOX,SATMIN,SUPNAM Character*8 TEXT,TYP,TITLE1,TITLE2 Character*80 BUFOUT(BG3) Dimension name(BG2),TITLE1(10),TITLE2(10),IT(BG2),DENS(BG1), 1 W(BG3),X(BG4),SUPNAM(20),FOLD(BG4), 2 FACT(BG4),CONV(BG4), SATMIN(BG5),COX(8),ISPOX(8) C* Dimension ACTM(20) Common/MAXSIZ/ MAXSAQ,MAXNS,MAXNM,MAXSTO,MAXSSL,MAXN,MAXMEM,MAXIN Common/PRECIS/ RMIN, RLOGMN, RLOGMX Common /George/ AZERO(BG2),XI, NS, NST Common/Morsel/ GAMIN(BG1),B(BG1),SUMSOL(15),SOLTRY(15), 1 DGDN(BG3,20),SOLS(15,20),ISOLS(BG1),LIMSOL,JSOLS(BG1),IST(15) Common/Morris/ MIN(BG1),COEFM(BG1,8),MINTRY(BG1),XMOLW 1 (BG1), tempK,NMT,MINCT,SPECM(BG1,8),ITM(BG1),SEQ(BG1),QES(BG1) Common/Mort/MTRY(BG2),GAMMA(BG2),WATM,FO2,FO2log,TERMLN,KK 1,OFLAG Common/Trix/ TMIN(BG3) Common/Oxen/ MTOT(BG3),COEF(BG2,8),SPEC(BG2,8) Common/Bull/ BSTOT,BSTP1,JGSTOT Common/Turnip/ SAQ(BG3), QAS(BG3), SAQTOT Common/Slough/ A(BG4,BG4),F(BG4), T(BG4,BG4),IV(BG4), N,ITREF Common/Froid/ SINC,BIT,SLIM,AKLOG,APFCL(BG2,5), 1 BPFCL(BG1,5),XPFC(11,5), XF(11), COE(5), ALG(4), 2 XDH(4),ALK(5),LGK(BG2),temp,tempC, HEATC,COMTOT(BG3), HEATM, 3 TOTMIX,CFH(5),CFT(5),VBCOE(20,3),VCCOE(20,3),CVBCF(3,3), 4 CVCCF(7,3), IFRAC Common/Minnie/ AQM(BG3),ACT(BG2),LGKM(BG1),SCALE(BG1),PFLUID,Plog 1,GASTOT,NMTT,LOOC C* Common/Fuga/GASlog(20),Y(20),VB(20),VC(20),CVB(3),CVC(7),W1,W2,W3, C* 1 NGAS,IMIX,IDEAL,ITGAS Common/Io/ INP1,INP2,INP3,INP4,IOUT1,IOUT2,IPUN,ISTEP,IPUNCH Common/PP/ TS(200),PS(200),NPP,INCP Common/Bess/ WTPC(BG3), COEFOX(BG3,8), XMW(BG3), 1 NOMOX(BG3),ITOX(BG3),NOOX, SPECOX(BG3,8),MINSOL Common/Val/BVAL(20), CVAL(20) data ETOIL/'********'/, BLNK/' '/, BLANK/' '/ data SUPNAM/20*' '/, SATMIN/BG5*' '/, 1 TYP/'grams '/,AMOLE/'moles '/,BUFOUT/BG3*' '/ data fact/BG4*1./, fold/BG4*1.D+65/ C C=====================================================================| C ASSIGNMENTS OF DEVICE NUMBERS FOR I/O OPERATIONS | C INP1 : WORKRUN (data specific to each run, including new | C data after each loop | C INP2 : GASTHERM (thermochemical data for gases, solids, and | C liquids) | C* INP3 : INPUTS PRESSURE CURVE DATA. *AT PRESENT THIS FILE DOES | C* NOT EXIST* THE PROGRAM DOES NOT LOOK FOR THIS FILE AND | C* IT SHOULD NOT BE ASSIGNED IN THE WORKEX EXEC(IBM) OR | C* .COM (VAX) FILE. | C INP4 : oxide or solid data for MINSOL option | C IPUN : plot file | C IOUT1: main output | C IOUT2: terminal remarks | C IOUT3: pickup file written after a mineral is added or | C subtracted from the matrix | C-------------------------------------------------------------------- | C INP1 = 4 INP2 = 1 C* INP3 = 7 INP4 = 3 IOUT1 = 9 IOUT2 = 6 IOUT3 = 8 IPUN = 2 C C---------------------------------------------------------------------| C OPEN FILES INTERNALLY | C---------------------------------------------------------------------| C OPEN(UNIT=1,FILE='GASTHERM.DAT',STATUS='OLD') OPEN(UNIT=2,FILE='WORKPLOT.DAT',STATUS='UNKNOWN') OPEN(UNIT=3,FILE='WORKOX.DAT',STATUS='OLD') OPEN(UNIT=4,FILE='WORKRUN.DAT',STATUS='OLD') OPEN(UNIT=9,FILE='WORKOUT.DAT',STATUS='UNKNOWN') C* OPEN(UNIT=7,FILE='CURVE.DAT',STATUS='OLD') OPEN(UNIT=8,FILE='WORKRUN.SAV',STATUS='UNKNOWN') C C---------------------------------------------------------------------| C ARRAY MAXIMUM SIZES: | C MAXSAQ = component species | C MAXNS = derived gas species | C MAXMN = solids + liquids | C MAXTO = stoichimetric components | C MAXN = matrix size | C MAXSSL = solid solutions | C MAXMEM = solid solution end memembers | C MAXIN = maximum number of phases or phase end members | C (solids + liquids) in matrix | C MAXOX = oxides | C---------------------------------------------------------------------| C MAXSAQ = BG3 MAXNS = BG2 MAXNM = BG1 MAXSTO = 8 MAXN = BG4 MAXSSL = 15 MAXMEM = 20 MAXIN = BG3 MAXOX = BG3 C C---------------------------------------------------------------------| C COMPUTER PRECISION LIMITS TO AVOID OVERFLOWS, UNDERFLOWS ETC. | C For 386 PCS, smallest double precision number is about | C 10**-300 AMD ABOUT 10**300. For IBM mainframes, these are | C lower. | C RlogMN = minimum log10 | C RlogMX = maximum log10 | C RMIN = minimum real | C---------------------------------------------------------------------| C RMIN = 1.D-300 RlogMN = -300. RlogMX = 300. C ERLOOP= 0 MINCT= 0 NNMT = 0 NST = 0 NMT = 0 NDUMP= 0 JSTOP = 0 GRAMSO = 0. IDEAL = 0 OFLAG = 0 FO2 = 0. BIT = 0. BASE = 10. TERMLN = 1./Dlog(BASE) DO 10 I = 1,MAXOX NOMOX(I) = BLANK WTPC(I) = 0. 10 XMW(I) = 0. DO 15 I = 1,MAXSAQ TMIN(I) = 0. W(I) = 0. COMTOT(I) = 0. MTOT(I) = 0. SAQ(I) = 0 AQM(I) = 0. 15 QAS(I) = 0 DO 16 NS = 1,MAXNS DO 6 N = 1,5 6 APFCL(NS,N) = 0. DO 8 I = 1,MAXSTO SPEC(NS,I) = 0 8 COEF(NS,I) = 0. NAME(NS) = BLANK AZERO(NS) = 0. IT(NS) = 0 MTRY(NS) = 0. LGK(NS) = 0. ACT(NS) = 0. 16 GAMMA(NS) = 0. DO 17 I = 1,MAXMEM CVAL(I) = 0. 17 BVAL(I) = 0. DO 27 NM = 1, MAXNM DO 23 N = 1,5 23 BPFCL(NM,N) = 0. DENS(NM) = 0. SCALE(NM) = 0. GAMIN(NM) = 1.0 QES(NM) = 0 LGKM(NM) = 0. SEQ(NM) = 0 B(NM) = 0. ISOLS(NM) = 0 ITM(NM) = 0 XMOLW(NM) = 0. MIN(NM) = BLANK JSOLS(NM) = 0 27 MINTRY(NM) = 0. C C READ(INP1,870) TITLE1 READ(INP1,870) TITLE2 C ************** C C---------------------------------------------------------------------| C TITLE IN TWO, 80-CHARACTER LINES | C---------------------------------------------------------------------| C READ(INP1,816) READ(INP1,834) ERPC, FO2log,PFLUID, temp, SINC,SLIM,GASTOT READ(INP1,816) READ(INP1,836) tempC,TOTMIX,SOLMIN,RM,GASGRM, SUPRNT C ************** IF (FO2log.NE.0.) FO2 = 10.**FO2log C C---------------------------------------------------------------------| C ERPC IS THE FRACTIONAL CONVERGENCE LIMIT ON IONIC STRENGTH. C IF IT IS NOT SPECIFICALLY INPUT A VALUE OF 1D-12 IS USED C IF FO2log EQUALS NOT ZERO, FO2 IS FIXED AT SPECIFIED VALUE. USUALL C FO2log IS SET TO ZERO, IN WHICH CASE THE SPECIFIED MTOT(H2) C WILL BE USED IN H2 MASS BALANCE EQUATION AND FO2 IS CALCULATED. C THE INITIAL MTOT(H2) IS USUALLY DRAWN FROM AN EARLIER SOLVGAS C RUN ON THE DESIRED WATER COMPOSITION. C PFLUID , IN ATM, IS THE INITIAL PRESSURE OF THE SYSTEM. C* IF USING WITH NON IDEAL GASES, CHECK FOR PRESSURE LIMITS C* FOR COMPUTATION OF FUGACITY COEFFICIENTS (SUBROUTINE PHI). C SLIM IS THE LAST STEP AFTER WHICH C WE WANT TO STOP THE CALCULATION. DEFAULT IS 0 C C IF COOLING, 1227 C IF HEATING. C Temp IS THE INITIAL tempERATURE FOR THE UNMIXED/UNCOOLED C SOLUTION. INPUT IN DEGREES C. C SINC CAN BE (+) OR (-), AND IS THE STEP INCREMENT (T, P, GRAMS, OR C* MIX FRACTION). TYPICALLY SINC = -16 DEG.C IS A WORKABLE C MAXIMUM STEP. C IF USING GASMIX, SINC IS THE FRACTIONAL C TITRATION FACTOR, E.G. .01. THE CHANGE OF MTOTS IS C SINC * COMTOT, AS CALCULATED IN MIXER. C SINC CANNOT BE ZERO! IF ZERO, IT IS DEFAULTED TO -5 FOR C T CHANGE, OR 0.1 IF MIXING C tempC IS THE tempERATURE OF THE PHASE TO BE TITRATED IN C (USUALLY THE COOLER ONE, BUT NOT NECESSARILY) WHEN USING C GASMIX. IF NOT USING GASMIX, SET tempC = 0 !!, THIS IS THE C TEST FOR ACTIVATING THE GASMIX OPTION. C TOTMIX IS THE TOTAL FRACTION OF MIXING GAS OR OTHER SUBSTANCE C (E.G. GAS, ROCK) ADDED WHEN USING MIXING (tempC OR MINSOL C NON ZERO). FOR AN INITIAL RUN,TOTMIX=0; THEREAFTER, TOTMIX C IS SIMPLY THE SUM OF ALL PREVIOUS C MIXING INCREMENTS (SINCS). NOTICE THAT TOTMIX (AND SINC, WHEN C USING THE MIXING OPTION, BECAUSE TOTMIX IS A SUMMATION OF C SINCS) IS SIMPLY A DIMENSIONLESS NUMBER THAT DETERMINES THE C TITRATION STEP SIZE FOR GAS-GAS MIXING OR ROCK-GAS MIXING. C THE ACTUAL QUANTITY OF TITRATED MATERIAL (IN MOLES OR GRAMS) IS C FIXED BY THE VALUES OF COMTOT(I) (SEE BELOW) USED. C SOLMIN MINIMUM MINTRY VALUE ALLOWED FOR GASES OR MINERALS C DURING ITERATION. IF COMPUTED MINTRY GETS SMALLER DURING C ITERATIONS, THE MINERAL OR GAS WILL BE KICKED OUT OF THE C MATRIX DURING THE ITERATION PROCESS (SAVES TIME, EASES CONVER- C GENCE). MUST BE 0 OR NEGATIVE. DURING ITERATION, A NEGATIVE C MINTRY GENERALLY MEANS THE PHASE DOES NOT BELONG ANYMORE. THIS I C NOT ALWAYS THE CASE HOWEVER, AND A TOO LARGE SOLMIN MIGHT RESULT C IN SWAPPING A PHASE IN, AND OUT OF THE MATRIX INDEFINITELY. IF C SET TO A LARGE NEGATIVE VALUE, EQUILIBRATION WITH NEGATIVE MINTRY C IS ALLOWED, REQUIRING ONE MORE EQUILIBRATION STEP TO REMOVE C THE PHASE WITH NEGATIVE MINTRY (OLD METHOD). SOLID SOLUTIONS ARE C KICKED OUT IF MINTRY IS LESS THAN ZERO. C SET SOLMIN > 0 TO SKIP THIS OPTION (EQUILIBRATION W/ NEGATIVE C AMOUNTS ALLOWED); SOLMIN > 0 WILL KEEP SOLID SOLUTIONS IN C MATRIX, HOWEVER. IN THE EVENT ONE SOL-SOL SHOULD UNDERSATURATE, C CONVERGENCE WILL FAIL W/ SOLMIN > 0. C RM IS NUMBER BETWEEN 0 AND 1 TO MULTIPLY F'S TO HELP CONVERGENCE. C SET TO 0 UNLESS THERE ARE CONVERGENCE PROBLEMS. C GASGRM GRAMS OF STARTING GAS PHASE, TO COMPUTE WATER/GAS C RATIO IF MINSOL OPTION IS SELECTED C SUPRNT DERIVED SPECIES MINIMUM MOLE NUMBER FOR OUTPUT. ONLY C SPECIES WITH MOLE NUMBER GREATER OR EQUAL TO SUPRNT WILL PRINT C DEFAULT IS 1.D-10 C---------------------------------------------------------------------| C IF(SUPRNT.EQ.0.) SUPRNT = 1.D-10 C C---------------------------------------------------------------------| C PMAX IS USED IN CHILLER TO SET UPPER PRESSURE LIMITS FOR TREATMENT C OF NON-IDEAL GASES. NOT IN USE HERE SO SET TO 10 KB. C---------------------------------------------------------------------| C PMAX = 10000. C IF(PFLUID.EQ.0.) PFLUID = 1. IF(ERPC.EQ.0.) ERPC = 1.0D-12 READ(INP1,816) C COLUMN 5 10 15 20 25 READ(INP1,800) BSTOT, IFRAC, IPUNCH, NLOOP, ISTEP C ************** 1, LIMSOL, LOOC, ITREF, IDEAL, INCREM, INCP, MINSOL, OFLAG C COL 30 35 40 45 50 55 60 65 C IF(IPUNCH.EQ.1.OR.IPUNCH.EQ.2) THEN WRITE(IPUN,870) TITLE1 WRITE(IPUN,870) TITLE2 END IF C C---------------------------------------------------------------------| C BSTOT IS THE NUMBER OF COMPONENT SPECIES IN GASTHERM (E.G. 35). C IFRAC = 0 RESULTS IN NO FRACTIONATION DURING COOLING C IFRAC = 1 RESULTS IN FRACTIONATION OF MINERALS. C IPUNCH NOT ZERO RESULTS IN CREATING A PLOT FILE, BELOW. C There are two basic plotting options controlled by the value of C IPUNCH. Each option has two internal variations, thus four C non-zero values of IPUNCH are used to control plotting, C as follows: C IPUNCH Routine Effect C ------ ------- ------ C 1 Symonds PLOT FILE WILL HAVE log(FUGACITIES) C FOR GAS SPECIES C 2 Symonds PLOT FILE WILL CONTAIN log (MOLES) C 3 Minplot Use 3 only for very first equilibration C of very first run. It puts the header C on the plot file, then IPUNCH is reset C to 4. C 4 Minplot Use for all "pickup" runs, after the C first plot file segment has been C written. C NLOOP = 0 NO CALCULATIONS ARE PERFORMED. PROGRAM STOPS AFTER C ECHOING ALL INPUT DATA, ALL SELECTED INPUT PARAMETERS, AND AN C INDEXED LIST OF ALL GAS SPECIES, AND MINERALS. USEFUL TO C GET MINERAL INDEXES (SEQ), AND CHECK ALL INPUT DATA. C NLOOP > 0 LIMIT ON THE NUMBER OF NEWTON ITERATIONS ALLOWED C BEFORE ARBITRARILY STOPPING. 70 IS A GOOD LIMIT. USUALLY 8-20 C LOOPS ARE USED. SOMETIMES MORE THAN 70 ARE NEEDED, EVEN FOR C A SOLVABLE CASE, E.G., 120 MIGHT SOMETIMES BE NEEDED AND MAY BE C TRIED ON OCCASSION TO WORK THROUGH A COMPUTATIONAL KNOT. C ISTEP NOT ZERO RESULTS IN PRINTING OF EXTRA OUTPUT FOR CLOSER C FOLLOWING OF CALCULATION PROGRESS (USE ONLY FOR DEBUGGING). C LIMSOL NOT ZERO ALLOWS INCLUSION OF SOLID SOLUTIONS (OR MIXED C GASES). IF LIMSOL = 0, THE AQUEOUS PHASE ONLY IS OF VARIABLE C COMPOSITION (THEREFORE ENDMEMBERS ARE TREATED AS REGULAR PURE C MINERALS). C LIMSOL = 2 RESULTS IN KICKING OUT OF THE MATRIX ENDMEMBERS C WITH CALCULATED AMOUNTS LESS THAN 0. THIS IS THE ONLY WAY TO C THROW OUT A SOLSOL THAT BECOMES UNDERSATURATED, BUT MIGHT C RESULT IN KICKING OUT SOLSOLS THAT ARE STILL SATURATED. C LIMSOL = 1 WILL KEEP SOLSOL IN, AND CONVERGENCE WILL FAIL IF C A SOLSOL BECOME UNDERSAT. C LOOC DETERMINES MINERAL SELECTION METHOD IF MORE THAN ONE C MINERAL SUPERSATURATE. LOOC = 0 RESULTS IN SELECTION OF MOST C SUPERSATURATED MINERAL. LOOC NOT 0 AND NOT 3 C RESULTS IN BACK STEPPING C (REVERSE T INCREMENT OR "BACK-MIX") TO THE POINT WHERE ONLY ONE C MINERAL SUPERSATURATES. C LOOC = 3 CAUSES EXECUTION TO STOP AFTER THE FIRST EQUILIBRATION. C ITREF = 0 NO ITERATIVE REFINEMENT IS USED WHEN SOLVING C THE EQUATIONS. THIS SHOULD ALMOST ALWAYS WORK. C = 1 NO ITERATIVE REFINEMENT IS USED, BUT THE C RESIDUAL ERRORS ARE CALCULATED. ISTEP SHOULD C BE SET TO 1 TO PRINT THESE VALUES. C > 1 THE RESIDUAL ERRORS ARE CALCULATED AND MINIMISED C BY ONE OR MORE ITERATIVE REFINEMENTS. THIS C OPTION SHOULD BE USED ONLY IN CASES WHEN CONVER- C GENCE DOES NOT OCCUR DUE TO MACHINE PRECISION. C IDEAL = 0 NON IDEAL GASES AND NON IDEAL MIXING ASSUMED C = 1 NON IDEAL GASES AND IDEAL MIXING ASSUMED C = 2 IDEAL GASES AND IDEAL MIXING ASSUMED C INCREM NOT ZERO PRODUCES IMMEDIATE TITRATION OF SINC-SIZED CHUNK C OF REACTANT, BEFORE ANY EQUILIBRATIONS. RELEVANT ONLY C IF tempC IS NON ZERO. USE TO JUMP AHEAD IN TITRATION. C CANNOT BE USED WITH FRACTIONATION, AND WILL RESET IFRAC TO 0 C INCP = 1: P DECREASE AT CONSTANT T. USE SINC AND SLIM WITH C P VALUES INSTEAD OF T. THIS OPTION IS OVERWRITTEN BY OTHER P C VARIATIONS OPTIONS (SEE COOLER). C MINSOL: USED TO ENABLE SOLID TITRATION FOR WATER/ROCK REACTIONS C tempC MUST BE SET TO ZERO FOR THIS OTION C = 0 DISABLED C = 1 TITRATE SINC AMOUNT OF SOLIDS IN GRAMS C = 2 SAME AS 1, BUT STOPS TITRATING A MINERAL IF EQUILIBRATED C = 3 TITRATE SINC AMOUNT OF SOLIDS IN MOLES C = 4 SAME AS 3, BUT STOPS TITRATING A MINERAL IF EQUILIBRATED C C OFLAG: DETERMINES WHETHER FO2 IS ALLOWED TO CHANGE AFTER FIRST C EQUILIBRATION. C >0 FO2 DOES NOT CHANGE C =0 FO2 IS CALCULATED AFTER EACH tempERATURE CHANGE OR C TITRATION C THERE ARE 4 POSSIBILITIES: C 1. OFLAG> 0 AND FO2 IS GIVEN IN WORKRUN. C 2. OFLAG> 0 AND FO2 IS NOT GIVEN IN WORKRUN. C 3. OFLAG= 0 AND FO2 IS GIVEN IN WORKRUN. C 4. OFLAG= 0 AND FO2 IS NOT GIVEN IN WORKRUN. C THE RESULTS OF WHICH WILL BE: C 1. FO2 IS HELD AT GIVEN VALUE THROUGHOUT RUN. C 2. FO2 IS CALCULATED DURING FIRST EQUILIBRATON AND HELD C AT THAT VALUE FOR THE REST OF THE RUN. C 3. FO2 IS AT GIVEN VALUE DURING FIRST EQUILIBRATION, BUT C ALLOWED TO VARY DURING REST OF RUN. C 4. FO2 IS ALWAYS RECALCULATED. C----------------------------------------------------------------------| C IF(SINC.NE.0.) GO TO 22 SINC = -5. IF(tempC.NE.0..OR.MINSOL.NE.0) SINC = 0.1 22 IF(SLIM.NE.0.) GO TO 25 IF(MINSOL.EQ.0.AND.tempC.EQ.0..AND.SINC.LT.0.) SLIM = 25. IF(MINSOL.EQ.0.AND.tempC.EQ.0..AND.SINC.GT.0.) SLIM = 1227. 25 CONTINUE IF(MINSOL.GT.2) TYP = AMOLE IF(INCREM.GT.0) IFRAC = 0 IMINT=BSTOT LIMSS=LIMSOL C tempC NON ZERO GASMIX OPTION ON, CANNOT HAVE MINSOL ON TOO IF(tempC.NE.0.) MINSOL = 0 24 CONTINUE C C NOW WE READ DATA RELATED TO THE CHEMICAL COMPOSITION OF THE SYSTEM C READ(INP1,816) I = 1 100 READ(INP1,803) SAQ(I), MTOT(I), MTRY(I), GAMMA(I), COMTOT(I) C ********************* C SAQ SPECIFIES THE SEQUENCE POSITIONS OF THE COMPONENT SPECIES C TO BE DRAWN FROM GASTHERM FOR THIS CALCULATION. E.G., IF YOU C WANT H2,H2O,CO2,H2S,HCL,HF,HBR,NACL,KCL,FECL3,CD,ALF3,CUCL2,ETC. C PUT IN 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, ETC. C THESE NUMBERS ARE PICKED FROM THE ORDER OF COMPONENT C SPECIES LISTED IN SOLTHERM. H2 AND H2O (1, AND 2) MUST BE C ENTERED FIRST, IN THAT ORDER FOR PRESENT VERSION OF GASTHERM. C OTHER SPECIES MAY BE ENTERED IN ANY ORDER. C MTOT IS THE TOTAL NUMBER OF MOLES OF EACH BASIS SPECIES IN THE C STARTING GAS OR IN STARTING (GAS PLUS SOLIDS). C MTRY (I) CONTAINS TRIAL MOLE NUMBERS FOR COMPONENT SPECIES. USUALL C THESE ARE KNOWN FROM AN EARLIER SOLVGAS RUN. C GAMMA ARE FUGACITY COEFFICIENTS. IF 0 THEY ARE RESET TO 1. C IN SOME CASES WHERE NUMERICAL STABILITY IS A PROBLEM, GAMMA(I) C NOT EQUAL TO 1 MAY BE NEEDED FOR INITIAL VALUES. C COMTOT CONTAINS TOTAL MOLES OF COMPONENT SPECIES IN MIXER C PHASE (THE ONE TO BE TITRATED IN), FOR USE IN GASMIX. C* COMTOT MAY ALTERNATIVELY BE USED TO SPECIFY COMPOSITION OF ANY C* REACTANT TO BE TITRATED IN. E.G. TO REACT SOLUTION WITH ONE C* KILOGRAM OF DOLOMITE, SPECIFY C* COMTOT (1) = -10.8454 (NEGATIVE 10.8454 MOLES OF H+ IN ONE C* KILOGRAM OF DOLOMITE) C* " (2) = 0 (NO H20 IN DOLOMITE) C* " (3) = 0 (NO CL- IN DOLOMITE) C* " (4) = 0 (ETC. FOR ZERO VALULES OF COMTOT(I)) C* " (5) = 10.8454 (POSITIVE 10.8454 MOLES OF BICARBONATE IN C* ONE KILOGRAM OF DOLOMITE) C* " (6) = 0 C* " (7) = 0 C* " (8) = 0 C* " (9) = 5.4227 (POSITIVE 5.4227 MOLES OF CALCIUM IN ONE C* KILOGRAM OF DOLOMITE) C* " (10) = 5.4227 (POSITIVE 5.4227 MOLES OF MAGNESIUM IN ONE C* KILOGRAM OF DOLOMITE) C* " (11 - 29) = 0 C* I.E. 1 KG. OF DOLOMITE CONTAINS -10.8454 MOLES OF H+, +10.454 C* MOLES OF HCO3-, +5.4227 MOLES OF CA++ AND MG++. THE LIMSOL C* OPTION, HOWEVER, IS A LOT EASIER TO USE FOR THIS TYPE OF C* REACTION. C C READS UNTIL BLANK LINE IF(SAQ(I).EQ.0) GO TO 144 IF(SAQ(I).GT.MAXSAQ) GO TO 143 J = SAQ(I) QAS(J) = I C SET DEFAULT VALUES IF(GAMMA(I).LE.0.) GAMMA(I) = 1. IF(MTRY(I).LE.0.) MTRY(I) = 1.D-10 I = I + 1 IF(I.LE.MAXSAQ) GO TO 100 READ(INP1,805) IDUM C (IN CASE WE HAVE EXACTLY MAXSAQ COMPONENTS) IF(IDUM.EQ.0) GO TO 144 WRITE(IOUT1,630) MAXSAQ WRITE(IOUT2,630) MAXSAQ 630 FORMAT(//5X,'WARNING! THE NUMBER OF COMPONENTS GIVEN IN WORKRUN 1 EXCEEDS THE'/5X,'CURRENT ARRAY DIMENSION (',I2,'). CHECK', 2 ' WORKRUN DATA FILE.'/) STOP 143 WRITE(IOUT1,631) I, SAQ(I), MAXSAQ WRITE(IOUT2,631) I, SAQ(I), MAXSAQ 631 FORMAT(//5X,'WARNING! SAQ(',I2,') = ',I4,'; MAXIMUM VALUE' 1 ,' ALLOWED IS ', I3/) STOP C************************************* C THE DO 123 LOOP THAT FOLLOWS IS TO ESTIMATE THE INITIAL NUMBER C OF MOLES OF GAS. GASTOT IS THE TOTAL NUMBER OF MOLES OF GAS. 144 SAQTOT = I - 1 IF(GASTOT.NE.0.) GO TO 124 GASTOT=0.0 DO 123 I=1, SAQTOT 123 GASTOT = GASTOT +MTOT(I) 124 GSTOLD = GASTOT C************************************* tempK = temp + 273.15 C C READS EQUILIBRIUM ASSEMBLAGE (MINERALS AND OR GASES) AND AMOUNTS C ACT IS USED HERE AS A DUMMY INPUT VARIALBLE FOR MINTRY, AFTER C STATEMENT 165 MINTRY IS SET = ACT C MINTRY CONTAINS THE NUMBER OF MOLES OF MINERALS CURRENTLY IN C EQUILIBRIUM AT P, T, AND X. IF THIS IS THE INITIAL RUN, NORMALLY C NO MINERALS ARE KNOWN TO BE IN EQUILIBRIUM. IN ANY CASE, EVEN C IF CERTAIN MINERALS ARE WRONGLY INCLUDED, GASWORKS WILL THROW C THEM OUT. C READ(INP1,817) I = 1 153 READ(INP1,823) SATMIN(I), ACT(I) C **************** IF(ACT(I).EQ.0.) ACT(I) = 1.D-9 IF(SATMIN(I).EQ.BLANK) GO TO 154 I = I + 1 IF(I.LE.MAXIN) GO TO 153 READ(INP1,823) DUMMY IF(DUMMY.EQ.BLANK) GO TO 154 WRITE(IOUT1,652) MAXIN WRITE(IOUT2,652) MAXIN 652 FORMAT(/5X,'TOO MANY SATURATED MINERALS SPECIFIED IN WORKRUN.' $ ,' LIMIT =' ,I3//) STOP 154 NMT= I-1 C C READS NAMES AND AMOUNTS OF SOLID REACTANT FOR MINSOL OPTION. C MAXOX SOLIDS MAXIMUM. IF NONE, INPUT 3 BLANK LINES. C WTPC IN WEIGHT % IF MINSOL IS 1 OR 2, IN MOLES % IF MINSOL IS 3,4 I = 1 READ(INP1,817) 133 READ(INP1,823) NOMOX(I), WTPC(I) C *************** IF(NOMOX(I).EQ.BLANK) GO TO 132 I = I + 1 IF(I.LE.MAXOX) GO TO 133 READ(INP1,823) DUMMY IF(DUMMY.EQ.BLANK) GO TO 132 WRITE(IOUT1,654) MAXOX WRITE(IOUT2,654) MAXOX 654 FORMAT(/5X,'TOO MANY SOLID REACTANTS SPECIFIED IN WORKRUN.' $ ,' LIMIT =' ,I3//) STOP 132 NOOX = I-1 C C NOW WE READ NAMES OF SPECIES, GASES OR MINERALS TO BE SUPPRESSED C READS UNTIL BLANK OR EOF READ(INP1,817) DO 70 NSUP = 1,20 READ(INP1,822,END=72) SUPNAM(NSUP) C ********************* 70 IF(SUPNAM(NSUP).EQ.BLANK) GO TO 72 72 IF(NSUP.NE.20) NSUP = NSUP-1 C C IF THE MINSOL OPTION IS SELECTED, THE OXIDE OR SOLID DATA C FILE IS READ BELOW, AND THE NAMES OF SOLIDS GIVEN ABOVE ARE C MATCHED. THE COMPOSITIONS OF NOMOX (REACTANTS) ARE ARBITRARY. USE C MINERALS, OXIDES, ETC. WILL READ UNTIL ALL NAMES MATCH OR EOF. C *** WARNING: A REACTANT CANNOT BE ENTERED TWICE IN THE OXIDE DATA C FILE. IF IT IS, THIS MIGHT RESULT IN SKIPPING READING OF FURTHER C OXIDE DATA (MESSES UP ICOUNT !). IF(MINSOL.EQ.0) GO TO 161 ICOUNT = 0 152 READ(INP4,854,END=156) DUMMY,SUP,WTX,ITOT, 1 (COX(J),ISPOX(J), J = 1, ITOT) C ********** IF(ITOT.LE.MAXSTO) GO TO 150 WRITE(IOUT1,659) DUMMY, ITOT, MAXSTO 659 FORMAT(/5X,'SOLID ',A8,' IN MINOX HAS TOO MANY COMPONENTS' $ /5X,'ITOT FOR THAT SOLID IS ',I3,' ; MAXIMUM IS ',I3//) STOP 150 CONTINUE DO 155 I = 1,NOOX 155 IF(NOMOX(I).EQ.DUMMY) GO TO 158 GO TO 152 C IF EOF REACHED, WE CHECK WHICH SOLIDS WERE NOT FOUND IN MINOX 156 CONTINUE DO 157 I = 1,NOOX IF(XMW(I).NE.0.) GO TO 157 WRITE(IOUT1,658) NOMOX(I) WRITE(IOUT2,658) NOMOX(I) 658 FORMAT(/5X,'SOLID: ',A8,' NOT FOUND IN MINOX DATA FILE'/) 157 CONTINUE STOP C 158 ICOUNT = ICOUNT + 1 XMW(I) = WTX ITOX(I) = ITOT DO 159 J = 1, ITOT COEFOX(I,J) = COX(J) JS = ISPOX(J) IF(QAS(JS).GT.0) GO TO 159 WRITE(IOUT1,661) NOMOX(I), JS WRITE(IOUT2,661) NOMOX(I), JS 661 FORMAT(/5X,'REACTANT ',A8, ' CONTAINS SPECIES NUMBER ',I2, 1 ' WHICH IS NOT',/5X,'INCLUDED IN THE LIST OF COMPONENT SPECIES', 2 ' FOR THIS RUN.'//) STOP 159 SPECOX(I,J) = QAS(JS) IF(ICOUNT.LT.NOOX) GO TO 152 C 161 NPP=0 C* IF THERE IS A FILE CONTAINING A P-T CURVE, TO BE USED FOR A C* BOILING PATH, PFLUID WILL BE CALCULATED FROM THE C* PRESSURE CURVE GIVEN IN INP3. C* THE CORRESPONDING PRESSURE WILL BE INTERPOLATED BETWEEN THE C* TWO CLOSEST GIVEN T-P POINTS. C ** AT PRESENT THERE IS NO SUCH INPUT FILE FOR GASWORKS ** C THERE IS ANOTHER WAY TO GET A P-T CURVE AFTER STATEMENT 160 C* DO 60 I=1,200 C* READ(INP3,835,ERR=65) TS(I),PS(I) C ********************* C* NPP=NPP+1 C* 60 CONTINUE C 65 CONTINUE BSTP1 = BSTOT + 1 C ********************************************************************* WRITE(IOUT1,999) C C STARTS READING GASTHERM DATA FILE. INDIVIDUAL log K'S ARE C SKIPPED (SECOND ENTRY FOR GASES AND MINERALS, C FIRST ENTRY FOR OTHERS.) THESE ARE READ AS DUM OR SKIPPED C BY A SLASH IN READ FORMATS. C THE FOLLOWING SKIPS THE COMMENTS AT THE TOP OF THE GASTHERM C DATA FILE UNTIL A LINE OF STARS IS REACHED (8 STARS MINIMUM, C FROM 1ST COL.) C 62 READ(INP2,822) TEXT IF(TEXT.NE.ETOIL) GO TO 62 C C* DO 160 J = 1, 9 C* IF(J.LT.9) READ(INP2,822) DUM C* READ(INP2,817) (XPFC(J,I),I=1,5) C* DO 162 I = 1, 5 C*162 COE(I) = XPFC(J,I) C* CALL POWER(COE,temp,AKLOG) C ********** C* XF(J) = AKLOG C*160 CONTINUE C THE LINES BELOW FORTRAN LINE 62 ARE PRESENTLY DISABLED, BUT CAN C BE USED IN THE FUTURE TO FILL ARRAY XF FROM GASTHERM. C THE ARRAY XF CONTAINS 11 ENTRIES WHICH ARE USED IN *CHILLER* C PRIMARILY FOR DEBYE-HUCKLE PARAMETERS AND TO SPECIFY GAMMAS FOR C DISSOLVED CO2. THESE ARE UNUSED IN THE PRESENT VERSION OF C *GASWORKS*, BUT MAY IN THE FUTURE BE USED FOR NON-IDEAL TREATMENT C OF GASES. XF(9) IS DESIGNATED FOR A POWER FUNCTION GIVING C P(FLUID) AS A FUNCTION OF T, THOUGH NONE IS PRESENTLY INSTALLED. C ALL DATA DESTINED FOR XF SHOULD BE ADDED TO GASTHERM BELOW THE C LINE OF STARS BUT BELOW THE LIST OF COMPONENT SPECIES. C C C* IF(XF(9).NE.0.) PFLUID=XF(9) C IF(NPP.NE.0) CALL PRESS(PFLUID,temp) C ********** Plog = Dlog10(PFLUID) DO 110 NJ = 1, BSTOT C C DO 110 LOOP READS COMPONENT SPECIES FROM GASTHERM, SKIPPING THOSE C NOT SPECIFIED BY SAQ, ABOVE. C IF(QAS(NJ).NE.0)GO TO 103 READ(INP2,820) C GO TO 110 103 CONTINUE NS = QAS(NJ) READ(INP2,822) NAME(NS), W(NS) C **************** C W CONTAINS THE MOLECULAR WEIGHT OF THE BASIS SPECIES C 110 CONTINUE NS = SAQTOT C C READS PROPERTIES OF DERIVED SPECIES FROM GASTHERM. NAME IS C AS ABOVE. 113 CONTINUE NS = NS + 1 IF(NS.LE.MAXNS) GO TO 114 NS = NS-1 WRITE(IOUT1,660) MAXNS, NAME(NS), NS 660 FORMAT(/5X,'NUMBER OF SPECIES READ IN GASTHERM EXCEEDS MAXIMUM' $ ,' OF ',I3, /5X,'LAST NAME READ IS: ',A8,' (NS=',I3,')'//) STOP C 114 READ(INP2,820) NAME(NS),SUP,ITOT,(COEF(NS,I), 1 SPEC(NS,I), I = 1,ITOT) C SUP- SEE COMMENTS BELOW, SUP = NOT BLANK SUPPRESSES SPECIES. C ITOT CONTAINS NUMBER OF COMPONENT SPECIES IN THE DERIVED SPECIES, C PLUS ONE. C COEF(NS,I) CONTAINS STOICHIOMETRIC COEFFICIENT FOR SPECIES "SPEC C (NS,I)" IN THE DERIVED SPECIES. C SPEC(NS,I) IDENTIFIES COMPONENT SPECIES IN THE DERIVED SPECIES. C C THE I = 1 POSITION IS LEFT BLANK. C IF H2 IS IN THE DERIVED GAS, IT SHOULD BE IN THE I=2 POSITION. C C TEST FOR END OF DERIVED SPECIES LIST BY BLANK LINE. IF(NAME(NS).NE.BLANK) GO TO 115 NST = NS - 1 GO TO 120 115 CONTINUE IT(NS) = ITOT IF(ITOT.LE.MAXSTO) GO TO 112 WRITE(IOUT1,662) NAME(NS), ITOT, MAXSTO 662 FORMAT(/5X,'SPECIES ',A8,' IN GASTHERM HAS TOO MANY COMPONENTS' $ /5X,'ITOT FOR THAT SPECIES IS ',I3,' ; MAXIMUM IS ',I3//) STOP C C THE I = 1 POSITION IS LEFT BLANK C IF H2 IS IN THE COMPLEX, IT SHOULD BE IN THE I=2 POSITION C 112 READ(INP2,818) (COE(I),I = 1, 5) C ***************** C COE CONTAINS POWER FUNCTION COEFFICIENTS TO GENERATE log K AS F(T) C DO 121 I = 1,5 121 APFCL(NS,I) = COE(I) CALL POWERK(COE,tempK,AKLOG) C C GASTHERM CONTAINS ONE SET OF COEFFICIENTS TO CALCULATE log K AS C F (T) WHERE T IS IN DEGREES KELVIN. THE ABOVE STATEMENTS C STORE THE POWER FUNCTION COEFFICIENTS THAT WILL BE NEEDED LATER C IN ARRAYS APFCL. C 119 LGK(NS) = AKLOG C C ALL GAS SPECIES LISTED WITH A NON BLANK CHARACTER IN COL 16 (SUP) C WILL BE SUPPRESSED FROM THE CALCULATION, DISPLAYED ON THE SCREEN C AND PRINTED ON THE OUTPUT. C IF(SUP.EQ.BLNK) GO TO 117 WRITE(IOUT2,885) NAME(NS) WRITE(IOUT1,885) NAME(NS) GO TO 114 117 CONTINUE C C WE ALSO SUPPRESS THE GASES MENTIONED IN THE INPUT FILE DO 130 I = 1,NSUP IF(SUPNAM(I).NE.NAME(NS)) GO TO 130 WRITE(IOUT2,886) NAME(NS) WRITE(IOUT1,886) NAME(NS) GO TO 114 130 CONTINUE C C SORT OUT GASES CONTAINING COMPONENTS BEING USED C AND REDEFINE GAS COMPONENT INDICIES, C ALSO SUMS UP ALL THE GAS SPECIES COEFFICIENTS (COSUM) C COSUM = 0. DO 118 I = 2, ITOT JN = SPEC(NS,I) IF(QAS(JN).EQ.0) GO TO 114 SPEC(NS,I) = QAS(JN) COSUM = COSUM + COEF(NS,I) 118 CONTINUE COEF(NS,1) = -1. SPEC(NS,1) = NS GAMMA(NS) = 1.0 AZERO(NS) = COSUM - 1. GO TO 113 C 120 CONTINUE read (inp2,*) DO 126 I = 1, SAQTOT AQM(I)=MTOT(I) 126 TMIN(I) = 0. C C* CALL HELHUC C *********** NM = 0 DO 26 I = 1,MAXSSL 26 SUMSOL(I) = 0.0 C* C* HERE WE READ COEFFICIENTS TO COMPUTE CROSS VIRIAL COEFFICIENTS FOR C* H2O-CO2-CH4 GAS MIXTURE. B12 IS FOR B(H2O-CO2), B13 FOR B(H2O-CH4 C* B23 FOR B(CO2-CH4), C112 FOR C(H2O-H2O-CO2) ETC. SEE SUBROUTINE C* PHI. THESE COEFFICIENTS ARE ASSIGNED AS FOLLOW: C* C* CVB(1) : B12 C* CVB(2) : B13 C* CVB(3) : B23 C* CVC(1) : C112 C* CVC(2) : C122 C* CVC(3) : C113 C* CVC(4) : C133 C* CVC(5) : C223 C* CVC(6) : C233 C* CVC(7) : C123 C* C* AS OF FEB. 86 WE DO NOT HAVE DATA FOR C113, C133 AND C123. THESE C* VALUES ARE ASSUMED TO BE ZERO. THIS SEEMS TO BE A BETTER C* ASSUMPTION THAN TO CALCULATE THEM WITH A MIXING RULE (LIKE C* A GEOMETRIC AVERAGE). C* C* DO 28 I=1,3 C* READ(INP2,817) (CVBCF(I,J), J=1,3) C* *************** C* 28 CVB(I) = CVBCF(I,1)/tempK/tempK + CVBCF(I,2)/tempK + CVBCF(I,3) C* DO 29 I=1,7 C* READ(INP2,817) (CVCCF(I,J), J=1,3) C* *************** C* 29 CVC(I) = CVCCF(I,1)/tempK/tempK + CVCCF(I,2)/tempK + CVCCF(I,3) C* C* 33 CONTINUE NM = NM + 1 IF(NM.LE.MAXNM) GO TO 30 NM = NM-1 WRITE(IOUT1,664) MAXNM, MIN(NM) 664 FORMAT(/5X,'NUMBER OF MINERALS READ IN SOLTHERM EXCEEDS MAXIMUM' $ ,' OF ',I3,/5X,'LAST NAME READ IS: ',A8//) STOP C 30 READ(INP2,854) MIN(NM),SUP,XMOLW(NM),ITOT,(COEFM(NM,I),SPECM(NM,I) 1 ,I = 1, ITOT), B(NM), JSOLS(NM) C *************** C READ MINERAL CHARACTERISTICS FROM GASTHERM. C IF SUP NOT BLANK OR NOT 'G' = SUPPRESS MINERAL. SUP = 'G' FOR C GASES (WILL CAUSE CHILLER TO COMPUTE AND OUTPUT FUGACITY). C XMOLW = MOLECULAR WEIGHT. C COEFM & SPECM ARE AS FOR DERIVED SPECIES, ABOVE. C B(NM) CONTAINS EXPONENT FOR MINERAL END MEMBER TO BE USED TO C CALCULATE ACTIVITY USING IDEAL MULTI-SITE MIXING. C JSOLS(NM) IDENTIFIES THE PARTICULAR SOLID SOLUTION, IF ANY, THAT C THIS MINERAL BELONGS TO. ITM(NM) = ITOT C BLANK LINE IN GASTHERM ENDS READING OF MINERALS. IF(MIN(NM).EQ.BLANK) GO TO 165 C IF(ITOT.LE.MAXSTO) GO TO 34 WRITE(IOUT1,666) MIN(NM), ITOT, MAXSTO 666 FORMAT(/5X,'MINERAL ',A8,' IN GASTHERM HAS TOO MANY COMPONENTS' $ /5X,'ITOT FOR THAT MINERAL IS ',I3,' ; MAXIMUM IS ',I3//) STOP C C SPECIES LISTED WITH CHARACTER OTHER THAN BLANK IN COL 9 C ARE SUPPRESSED FROM THE CALCULATION. THESE MINERALS ARE DISPLAYED C ON THE SCREEN AND PRINTED ON OUTPUT. C 34 IF(SUP.EQ.BLNK) GO TO 35 WRITE(IOUT2,885) MIN(NM) WRITE(IOUT1,885) MIN(NM) READ(INP2,815) GO TO 30 35 CONTINUE C WE ALSO SUPPRESS THE SPECIES MENTIONED IN THE INPUT FILE DO 135 I = 1,NSUP IF(SUPNAM(I).NE.MIN(NM)) GO TO 135 WRITE(IOUT2,886) MIN(NM) WRITE(IOUT1,886) MIN(NM) READ(INP2,815) GO TO 30 135 CONTINUE C C DETERMINES IF MINERAL WAS GIVEN IN SATURATED MINERAL LIST C AND SET SEQ NUMBERS C SEQ CONTAINS THE SEQUENCE POSITIONS OF MINERALS CURRENTLY C INCLUDED IN EQUILIBRIUM ASSEMBLAGE. THESE INTEGERS ARE NOT C SIMPLY SEQUENCE POSITIONS IN SOLTHERM, BUT SEQUENCE POSITIONS C IN THE RELEVANT MINERAL LIST (AS SORTED BY GASWORKS FROM C GASTHERM ACCORDING TO THE COMPOSITION OF THIS PARTICULAR RUN). IF(NMT.EQ.0) GO TO 38 DO 37 I = 1, NMT IF(MIN(NM).NE.SATMIN(I)) GO TO 37 SEQ(I) = NM GO TO 38 37 CONTINUE C 38 SCALE(NM)=0. DO 40 I = 1, ITOT JS = SPECM(NM,I) C SKIP IF STOICHIOMETRY INCLUDES SPECIES THAT WERE NOT GIVEN IF(QAS(JS).NE.0) GO TO 42 READ(INP2,815) GO TO 30 42 SPECM(NM,I) = QAS(JS) SCALE(NM)=SCALE(NM)+DABS(COEFM(NM,I)) C C SCALE(NM) IS USED IN MINSAT TO SCALE THE log Q/K VALUES FOR MINERAL C ACCORDING TO THE NUMBER OF COMPONENT SPECIES IN THE MINERAL. C 40 CONTINUE C READ(INP2,818) (COE(I),I = 1,5) C ********************* C COE CONTAINS POWER FUNCTION COEFFICIENTS FOR GENERATING log K=F(T) C DO 41 I = 1,5 41 BPFCL(NM,I)=COE(I) CALL POWERK(COE,tempK,AKLOG) C ********** C BPFCL STORES POWER FUNCTION COEFFICIENTS FOR LATER RE-USE C THE ABOVE SEQUENCE OF GO TO STATEMENTS DO FOR MINERALS WHAT LINES C 121 AND 122 DO FOR GASES ABOVE. C 45 CONTINUE IF(LIMSOL.EQ.0) JSOLS(NM) = 0 C TURNS OFF SOLID SOLUTIONS IF ALL ARE TURNED OFF BY LIMSOL = 0. C LGKM(NM) = AKLOG J = 0 GO TO 33 165 CONTINUE IF(IDEAL.GT.2) IDEAL = 2 C NMTT = NM - 1 IF(NMT.EQ.0) GO TO 175 DO 48 I = 1, NMT C C DO 48 SORTS OUT MINERALS CURRENTLY INCLUDED, AS SPECIFIED IN C WORKRUN WHERE MINERAL NAMES ARE INPUT C NM = SEQ(I) IF(NM.NE.0) GO TO 49 WRITE(IOUT1,656) SATMIN(I) WRITE(IOUT2,656) SATMIN(I) 656 FORMAT(/3X,A8,', SPECIFIED IN WORKRUN,' , $ ' WAS NOT FOUND IN GASTHERM. CHECK SPELLING.'//) STOP 49 QES(NM)=I MINTRY(NM)=ACT(I) C C SETS TRIAL MOLES OF MINERALS AS INPUT IN ACT ARRAY IN CHILLRUN. C 48 CONTINUE C 175 CONTINUE C BSTOT = SAQTOT BSTP1 = SAQTOT + 1 JSTOP = 0 C C C ****************************************************************** C END INPUT BEGIN DATA ECHO C ****************************************************************** C ****************************************************************** C C WRITE(IOUT1,970) WRITE(IOUT1,943) WRITE(IOUT1,960) TITLE1 WRITE(IOUT1,960) TITLE2 WRITE(IOUT1,943) WRITE(IOUT1,970) WRITE(IOUT1,923) WRITE(IOUT1,940) WRITE(IOUT1,945) (NAME(I),I,MTOT(I), MTRY(I), GAMMA(I), 1 COMTOT(I), I=1,BSTOT) C 50 WRITE(IOUT1,611) ERPC, FO2log, PFLUID, SLIM, temp,SINC,tempC, 1 TOTMIX, SOLMIN, RM, GASGRM,SUPRNT,GASTOT WRITE(IOUT2,611) ERPC, FO2log, PFLUID, SLIM, temp,SINC,tempC, 1 TOTMIX, SOLMIN, RM,GASGRM,SUPRNT,GASTOT 611 FORMAT(//4X,'THE FOLLOWING PARAMETERS WERE GIVEN:' 1 /6X,'ERPC = ',D10.4,' FO2log = ',F10.5,' PFLUID = ',F10.5, 2 /6X,'SLIM = ',G10.4,' temp = ',F10.5,' SINC = ',G10.4, 3 /6X,'tempC = ',F10.5,' TOTMIX = ',G10.4,' SOLMIN = ',D10.4, 4 /6X,'RM = ',F10.5,' GASGRM = ',F10.5,' SUPRNT = ',D10.4, 5 /6X,'GASTOT= ',F10.5) WRITE(IOUT1,612) IFRAC, IPUNCH, NLOOP, ISTEP 1, LIMSS, LOOC, ITREF, IDEAL,INCREM,INCP,MINSOL,OFLAG WRITE(IOUT2,612) IFRAC, IPUNCH, NLOOP, ISTEP 1, LIMSS, LOOC, ITREF, IDEAL, INCREM,INCP,MINSOL,OFLAG 612 FORMAT(//4X,'THE FOLLOWING OPTIONS WERE SELECTED:' 1 /6X,'IFRAC =',I5,' IPUNCH =',I5,' NLOOP =',I5,' ISTEP =',I5, 2 /6X,'LIMSOL=',I5,' LOOC =',I5,' ITREF =',I5,' IDEAL =',I5, 3 /6X,'INCREM=',I5,' INCP =',I5,' MINSOL =',I5,' OFLAG =',I5) IF(NPP.NE.0) WRITE(IOUT1,614) NPP 614 FORMAT(6X,'GIVEN PRESSURE GRID. ',I3,' T-P POINTS READ'/) WRITE(IOUT1,923) WRITE(IOUT1,617) SUPRNT 617 FORMAT(2X,'OF THE DERIVED SPECIES LISTED BELOW, ONLY THOSE WITH' 1 ,/2X,'MOLE NUMBERS ABOVE ', D10.4,' WILL APPEAR ON THE OUTPUT'/) WRITE(IOUT1,950) C DOUBLE COLUMN ECHO OF DERIVED SPECIES AND MINERALS FROM CHILLER C IMPORTED HERE NSTMBS = NST - BSTOT K = NSTMBS/2 IF(MOD(NSTMBS,2).NE.0) K = K + 1 WRITE(IOUT1,955) (NAME(I), I, LGK(I), NAME(I+K), 1 I+K, LGK(I+K), I = BSTP1,BSTOT+K) IF(NMTT.EQ.0) GO TO 176 WRITE(IOUT1,900) L = NMTT/2 IF(MOD(NMTT,2).NE.0) L = (NMTT+1)/2 WRITE(IOUT1,910) (MIN(I), I, LGKM(I), MINTRY(I), MIN(I+L), 1 I+L, LGKM(I+L), MINTRY(I+L), I = 1,L) C IF(MINSOL.EQ.0) GO TO 176 IF(MINSOL.LE.2) WRITE(IOUT1,974) IF(MINSOL.GT.2) WRITE(IOUT1,976) WRITE(IOUT1,975) (NOMOX(I), WTPC(I), I = 1, NOOX) GRMLG = -100. IF(TOTMIX .GT.0.) GRMLG = Dlog10(TOTMIX) WRITE(IOUT1,971) TOTMIX, TYP, GRMLG WR = 0. IF(TOTMIX.NE.0.) WR = GASGRM/TOTMIX WRITE(IOUT1,973) GASGRM, WR C ****************************************************************** C 176 CONTINUE IF(JSTOP.EQ.1) GO TO 388 C CALL SQUOMP C *********** C IF(NLOOP.NE.0) GO TO 170 WRITE(IOUT2, 616) WRITE(IOUT1, 616) 616 FORMAT(/6X,'END DATA ECHO. SET NLOOP > 0 TO START CALCULATIONS'/) STOP 170 CONTINUE C C* TO EASE CONVERGENCE W/ PICKUP RUN, WE CALCULATE GAMMAS SOLID SOL. C* NM = SOLS(10,1) C* JS = ISOLS(NM) C ******** 189 IF(INCREM.NE.0) GO TO 560 C C STEP STARTS HERE C =============================================================== C 190 CONTINUE C N IS THE TOTAL NUMBER OF UNKNOWNS 191 CONTINUE ERLOOP = 0 NDUMP= 0 MINCT= 0 JSTOP= 0 C GASTOT EQUATION IS IN THE BSTOT + 1 POSITION IN THE MATRIX JGSTOT = BSTOT + 1 N = BSTOT + NMT + 1 IF(N.LE.MAXN) GO TO 192 WRITE(IOUT1,668) N, MAXN 668 FORMAT(/5X,'SIZE OF MATRIX REACHED LIMIT. N = ',I3,' MAXIMUM' $ ,' SIZE IS ',I3//) STOP 192 IF(NMT.LE.MAXIN) GO TO 193 WRITE(IOUT1,670) NMT, MAXIN 670 FORMAT(/5X,'TOO MANY PHASES IN MATRIX (',I3,'); MAXIMUM' $ ,' NUMBER ALLOWED IS ',I3//) STOP C C THE PRECEDING "IF" SETS AN APPROXIMATE FH2, ASSUMING THAT H20 IS C THE OVERWHELMINGLY DOMINANT GAS C HERE, WE CALCULATE CONVERGENCE LIMITS FOR F'S BELOW C ERPC SHOULD BE D-12 OR LARGER (32 BIT MACHINE) 193 DO 194 I = 1,N IF (I.EQ.JGSTOT) THEN CONV(I)=ERPC*GSTOLD ELSE IF (I.GT.JGSTOT) THEN II = I-JGSTOT NM = SEQ(II) CONV(I) = ERPC*DABS(LGKM(NM)) IF(DABS(LGKM(NM)).EQ.0.) CONV(I) = ERPC*10. ELSE IF (I.EQ.1.AND.FO2.NE.0.) THEN CONV(1) = ERPC*DABS(LGK(BSTP1)) ELSE IF (DABS(MTRY(I)).GT.DABS(MTOT(I))) THEN CONV(I) = ERPC*DABS(MTRY(I)) ELSE IF (MTOT(I).EQ.0.) THEN CONV(I) = ERPC ELSE CONV(I) = ERPC*DABS(MTOT(I)) ENDIF 194 CONTINUE C C ****************************************************************** C C HERE WE GO TO 313 IN FIRST LOOP TO COMPUTE MTRYS OF DERIVED C SPECIES BEFORE SETTING THE MATRIX GO TO 313 C C >>>>> ITERATIONS START HERE <<<<< C ================================================== C 200 CONTINUE C 202 ERLOOP = ERLOOP + 1 NSTOP = 0 IF(FO2log.EQ.0.) GO TO 210 C ABOVE IF SKIPS SUMMATION OF H2-BEARING SPECIES TO GET MTOT(H2) IF C FO2 IS INPUT IF(ERLOOP.EQ.1) GO TO 225 H2TOT = MTRY(1) C C SUMS H2 SPECIES FOR MTOT OF H2 IF FO2 IS INPUT DO 204 NS = BSTP1, NST IF(SPEC(NS,2).NE.1) GO TO 204 H2TOT = H2TOT + MTRY(NS)*COEF(NS,2) 204 CONTINUE H2TOT = H2TOT + TMIN(1) C MTOT(1) = H2TOT 210 CONTINUE 225 CONTINUE C C ****************************************************************** C DO 250 I = 1,N DO 245 J = 1,N A(I,J) = 0.0 245 CONTINUE F(I) = 0. A(I,I) = 1. 250 CONTINUE C INITIALIZE THE MATRIX VALUES FOR THE GASTOT EQUATION A(JGSTOT,JGSTOT)=-1. F(JGSTOT)=-GASTOT DO 300 KK = 1, BSTOT F(JGSTOT) = F(JGSTOT) + MTRY(KK) A(JGSTOT,KK) = 1. C C C THE FOLLOWING IF'S CONTROL PRODUCTION OF MATRIX ENTRIES C FOR O2 IF(KK.EQ.1.AND.FO2log.NE.0.) GO TO 300 C C C F(KK) = -MTOT(KK) + MTRY(KK) DO 290 NS = BSTP1, NST C THE DO 290 LOOP THROUGH ALL DERIVED SPECIES FOR INCLUSION IN C APPROPRIATE MASS BALANCE EQUATIONS. ITOT = IT(NS) DO 265 IC = 2,ITOT IF(SPEC(NS,IC).EQ.KK) GO TO 267 265 CONTINUE GO TO 290 267 CONTINUE CFF = COEF(NS,IC) A(KK,JGSTOT) = A(KK,JGSTOT) - CFF*MTRY(NS)*AZERO(NS)/GASTOT A(JGSTOT,KK) = A(JGSTOT,KK) + CFF*MTRY(NS)/MTRY(KK) DO 288 II = 2, ITOT J = SPEC(NS,II) C DTERM IS THE DERIVATIVE OF MOLALITY EXPRESSION FOR DERIVED SPECIES C WITH RESPECT TO COMPONENT SPECIES J (= SPEC(NS,II) DTERM = COEF(NS,II) * MTRY(NS)/MTRY(J) A(KK,J) = A(KK,J) + CFF*DTERM 288 CONTINUE F(KK) = F(KK) + CFF*MTRY(NS) 290 CONTINUE 300 CONTINUE DO 301 NS = BSTP1,NST F(JGSTOT) = F(JGSTOT) + MTRY(NS) A(JGSTOT,JGSTOT) = A(JGSTOT,JGSTOT) - AZERO(NS)* 1 MTRY(NS)/GASTOT 301 CONTINUE C MINERA WILL SET UP MASS ACTION EQS. FOR MINERALS IF(NMT.NE.0) CALL MINERA C *********** IF(FO2log.NE.0.) CALL OXY C ******** C PROCEDURE TO HELP CONVERGENCE (SUPPOSEDLY !!). SKIP IF RM=0 OR 1 C TRY ONLY IF THERE ARE CONVERGENCE PROBLEMS (LAST RESOURCE). C ASSURES THAT ALL F'S DECREASE AFTER EACH ITERATION BY MULTIPLYING C F'S BY POWERS OF RM (GENERALLY RM IS BETWEEN .1 AND .9). IF(RM.EQ.0..OR.RM.GE.1.) GO TO 297 DO 292 I = 1,N FFF = F(I) IF(DABS(F(I)).LT.DABS(FOLD(I))) GO TO 296 FACT(I) = FACT(I) * RM F(I) = FFF * FACT(I) IF(FACT(I).LT.1.D-4) FACT(I) = 1.D-4 GO TO 294 296 FACT(I) = 1.0 294 FOLD(I) = FFF 292 CONTINUE C C 297 IF(ERLOOP.LE.5) GO TO 365 C CONVERGENCE CRITERION. SEES THAT ALL F(I) < CONV(I) DEFINED C AFTER STATEMENT 191 DIFTOT = GASTOT DO 360 NS = 1, NST DIFTOT = DIFTOT - MTRY(NS) 360 CONTINUE IF(DABS(DIFTOT).GT.ERPC) GO TO 365 DO 363 I = 1,N IF(DABS(F(I)).GT.CONV(I)) GO TO 365 363 CONTINUE GO TO 410 C 365 IF(ISTEP.EQ.0) GO TO 308 IF(ERLOOP.NE.2) GO TO 308 306 NSTOP = 1 GO TO 388 307 NSTOP = 0 NDUMP = 1 CALL DUMP C ********* 308 CONTINUE IF(ERLOOP.EQ.1.AND.ISTEP.EQ.1) CALL DUMP CALL SLUD C ********* CALL SIR(X) C ******** IF(ERLOOP.EQ.1.AND.ISTEP.EQ.1) THEN WRITE(IOUT1,977) (X(I), I = 1, N) ENDIF IF(NDUMP.EQ.1.AND.ISTEP.EQ.1) CALL DUMP2 C ********** NDUMP = 0 FMAX = PFLUID * GSTOLD PlogP1 = Dlog10(FMAX) DO 310 KK = 1, BSTOT COLD = MTRY(KK) MTRY(KK) = MTRY(KK) + X(KK) C LIMIT SIZE OF MTRY VALUES TO AID CONVERGENCE IF(MTRY(KK).GT.FMAX) MTRY(KK) = COLD XX = X(KK) 309 CONTINUE IF(MTRY(KK).GT.0.) GO TO 320 XX = XX/2. MTRY(KK) = COLD + XX GO TO 309 320 CONTINUE IF(MTRY(KK).GT.RMIN) GO TO 310 WRITE(IOUT2,676) NAME(KK), RMIN 676 FORMAT(5X,'** WARNING ! MOLALITY OF ',A8,' LESS THAN ', D10.3) MTRY(KK) = RMIN 310 CONTINUE C BRACKETS GASTOT TO EASE CONVERGENCE GASTOT = GASTOT + X(JGSTOT) GASMAX = GSTOLD*10. GASMIN = GSTOLD/10. IF (GASTOT.GT.GASMAX) GASTOT = GASMAX IF (GASTOT.LT.GASMIN) GASTOT = GASMIN NNMT = NMT IF(NMT.EQ.0) GO TO 313 IF(PFLUID.GT.PMAX) PFLUID = PMAX C Plog = Dlog10(PFLUID) DO 414 I = 1,MAXSSL 414 SOLTRY(I) = 0.0 IQ = 0 DO 314 I = 1, NMT IQ = IQ + 1 NM = SEQ(IQ) M = BSTOT + I + 1 MINTRY(NM) = MINTRY(NM) + X(M) C IF(ISOLS(NM).EQ.0) GO TO 417 JU = ISOLS(NM) IF(MINTRY(NM).LE.0.) GO TO 311 SOLTRY(JU) = SOLTRY(JU) + MINTRY(NM) GO TO 314 C WE KICK OUT SOLSOL IF LE 0 AND LIMSS = 2 311 IF(ERLOOP.GT.6.AND.LIMSS.GT.1) GO TO 420 C WE RESET NEGATIVE SOL SOL TO POSITIVE IF NO KICK OUT MINTRY(NM) = 1.D-20 SOLTRY(JU) = SOLTRY(JU) + MINTRY(NM) GO TO 314 C C PURE MINERAL: WE KICK OUT MINERAL IF MINTRY LT SOLMIN 417 IF(ERLOOP.LE.4.OR.SOLMIN.GE.0.) GO TO 314 IF(MINTRY(NM).GE.SOLMIN) GO TO 314 C C MINERAL KICK OUT SCHEME BELOW 420 WRITE(IOUT2,777) MIN(NM), MINTRY(NM) WRITE(IOUT1,777) MIN(NM), MINTRY(NM) 777 FORMAT(5X,A8,' MINTRY= ',D10.3,' MINERAL REMOVED FROM MATRIX') SEQ(IQ) = 0 QES(NM) = 0 MINTRY(NM) = 1.D-300 C SORT QES AND SEQ AND CONV WITHOUT CURRENT NM MINERAL NNMT = NNMT - 1 C IF NO MINERALS ARE LEFT IN MATRIX, WE SKIP RESORTING IF(NNMT.EQ.0) GO TO 314 DO 418 L = IQ,NNMT LL = L+1 J = BSTOT + L + 1 JJ = J + 1 SEQ(L) = SEQ(LL) CONV(J) = CONV(JJ) F(J) = F(JJ) 418 QES(SEQ(L)) = L IQ = IQ - 1 IF(ISOLS(NM).EQ.0) GO TO 314 C C IF WE KICKED OUT A SOLID SOLUTION ENDMEMBER ISOLS(NM) = 0 JS = JSOLS(NM) IS = IST(JS) ISTOT = 0 C WE COUNT HOW MANY ENDMEMBERS LEFT IN SOLID SOLUTION (ISTOT) DO 336 IL = 1,IS LS = SOLS(JS,IL) IF(QES(LS).EQ.0) GO TO 336 ISTOT = ISTOT + 1 LSBR = LS 336 CONTINUE C C IF ONLY ONE END MEMBER LEFT, WE BREAK SOLID SOLUTION C BY SETTING ISOLS TO 0 IF(ISTOT.NE.1) GO TO 314 WRITE(IOUT1,778) MIN(LSBR) WRITE(IOUT2,778) MIN(LSBR) 778 FORMAT(5X,A8,' NOT IN SOLID SOLUTION ANYMORE') ISOLS(LSBR) = 0 C 314 CONTINUE C C C NMT AND N HAVE TO BE RESET IN CASE WE KICKED OUT MINERALS NMT = NNMT N = NNMT + BSTOT + 1 313 CONTINUE C C* HERE WE COMPUTE ACTIVITY COEFFICIENTS FOR C* NON IDEAL SOLID SOLUTIONS THAT ARE SATURATED (CURRENTLY IN C* MATRIX). WE HAVE ONLY GOLD SO FAR SOL.SOL ID NO. 10 C* C* NM = SOLS(10,1) C* JS = ISOLS(NM) C* IF(JS.NE.0) CALL ELECTR C* *********** BSTP2 = BSTP1 JK = 1 IF(FO2.EQ.0.) GO TO 315 MTRY(BSTP1) = FO2 * GASTOT/(GAMMA(BSTP1) * PFLUID) ACT(BSTP1) = GAMMA(BSTP1) * MTRY(BSTP1) * PFLUID/GASTOT ACT(1) = MTRY(1)*GAMMA(1)*PFLUID/GASTOT JK = 2 BSTP2 = BSTP1 + 1 315 DO 319 NS=BSTP2,NST CSAVE= -Dlog10(GAMMA(NS)) - LGK(NS) ITOT = IT(NS) DO 321 I = 2, ITOT J = SPEC(NS,I) CSAVE2 = (Dlog10(GAMMA(J) * MTRY(J))) * COEF(NS,I) CSAVE= CSAVE + CSAVE2 321 CONTINUE PTERM=AZERO(NS) * Dlog10(PFLUID/GASTOT) RSL=CSAVE + PTERM ATERM = RSL + Dlog10(GAMMA(NS) * PFLUID/GASTOT) IF(RSL.LT.PlogP1) GO TO 316 RSL = PlogP1 ATERM = PlogP1 316 IF(RSL.GT.RlogMN) GO TO 317 RSL = RlogMN ATERM = RlogMN 317 MTRY(NS)=10.**RSL ACT(NS) = 10.**ATERM 319 CONTINUE IF(ERLOOP.EQ.0) GO TO 200 C C ****************************************************************** WRITE(IOUT2,650) ERLOOP, GASTOT 650 FORMAT(5X,'LOOP NO.',I4,' GASTOT: ',D15.7) IF(ERLOOP.EQ.NLOOP) GO TO 410 C COMPUTE THE FUGACITIES (ACT) OF THE COMPONENT SPECIES 352 DO 358 NS = JK, BSTOT FTERM = DLOG10(MTRY(NS)) ATERM = FTERM + DLOG10(GAMMA(NS) * PFLUID/GASTOT) ACT(NS) = 10.**ATERM 358 CONTINUE IF(ISTEP.EQ.1) WRITE(IOUT1,905) ERLOOP,GASTOT IF(ISTEP.EQ.0) GO TO 366 DO 362 NS = 1, BSTOT 362 WRITE(IOUT1,920) NS, NAME(NS), MTRY(NS) WRITE(IOUT1,977) (X(I), I = 1, N) 366 CONTINUE C WE COMPUTE AQM, THE QUANTITY OF GASEOUS COMPONENTS DO 350 I=1,SAQTOT AQM(I) = MTRY(I) DO 370 NS = BSTP1, NST ITOT = IT(NS) DO 364 IC = 2,ITOT IF(SPEC(NS,IC).EQ.I) GO TO 367 364 CONTINUE GO TO 370 367 CONTINUE CFF = COEF(NS,IC) AQM(I) = AQM(I) + CFF*MTRY(NS) 370 CONTINUE 350 CONTINUE GO TO 200 C C 410 CONTINUE GSTOLD = GASTOT C SUM H2-BEARING SPECIES IF FO2 IS INPUT IF (FO2log.EQ.0.) GO TO 412 H2TOT = MTRY(1) ACT(1) = MTRY(1)*GAMMA(1)*PFLUID/GASTOT DO 411 NS=BSTP1,NST IF(SPEC(NS,2).NE.1) GO TO 411 H2TOT = H2TOT + COEF(NS,2)*MTRY(NS) 411 CONTINUE H2TOT = H2TOT + TMIN(1) MTOT(1) = H2TOT 412 JSTOP = 1 388 CONTINUE WRITE(IOUT1,999) WRITE(IOUT1,960) TITLE1 WRITE(IOUT1,960) TITLE2 WRITE(IOUT1,943) WRITE(IOUT1,970) WRITE(IOUT1,946) ERLOOP,NLOOP WRITE(IOUT1,943) WRITE(IOUT1,933) temp, PFLUID, TOTMIX WRITE(IOUT1,927) GASTOT WRITE(IOUT1,944) WRITE(IOUT1,914) WRITE(IOUT1,915) GRT=0. DO 400 NS = 1, NST IF(NS.LE.BSTOT) GRT=GRT+ AQM(NS)*W(NS) IF(NS.GT.BSTOT) GO TO 396 ALA = Dlog10(ACT(NS)) C* ALGAM = Dlog10(GAMMA(NS)) C ALM IS THE PARTIAL PRESSURE ALM = ACT(NS)/GAMMA(NS) C ALMF IS THE MOLE FRACTION ALMF = ALM/PFLUID WRITE(IOUT1,920) NS,NAME(NS),MTRY(NS),ALMF,ALM,ACT(NS),ALA, 1 GAMMA(NS) GO TO 400 396 IF(MTRY(NS).LT.SUPRNT.AND.NS.NE.BSTP1) GO TO 400 ALA = Dlog10(ACT(NS)) C* ALGAM = Dlog10(GAMMA(NS)) ALM = ACT(NS)/GAMMA(NS) ALMF = ALM/PFLUID WRITE(IOUT1,920) NS,NAME(NS),MTRY(NS),ALMF,ALM,ACT(NS),ALA, 1 GAMMA(NS) 400 CONTINUE GRAMSO = GRT C 402 WRITE(IOUT1,923) GRT = 0. IF(NMT.EQ.0) GO TO 398 WRITE(IOUT1,957) DO 404 NS = 1, BSTOT TMOLAL = AQM(NS)/GASTOT PPM=1.D06 * AQM(NS) * W(NS)/GRAMSO C GRAMSO CONTAINS GRT, WHICH IS TOTAL MASS OF GAS PHASE, C THUS PPM IS PPM IN GAS PHASE OF GIVEN COMPONENT GAS SPECIES C TMOLAL CONTAINS A BULK MOLE FRACTION (OF SORTS) WRITE(IOUT1,962) NS, NAME(NS), MTRY(NS), TMOLAL, PPM 404 CONTINUE WRITE(IOUT1,965) GRAMSO IF(GASGRM.EQ.0.) GASGRM = GRAMSO WRITE(IOUT1,961) DO 405 NS = 1, BSTOT C TMIN WAS COMPUTED IN MINERAL. IT IS THE TOTAL NUMBER C OF MOLES OF COMPONENTS PRESENT IN SOLIDS WRITE(IOUT1,962) NS, NAME(NS), MTOT(NS), AQM(NS), TMIN(NS) 405 CONTINUE WRITE(IOUT1,923) WRITE(IOUT1,930) WRITE(IOUT2,923) WRITE(IOUT2,930) GRT = 0. DO 427 I = 1, NMT NM = SEQ(I) GRT = GRT + MINTRY(NM) * XMOLW(NM) 427 CONTINUE VOLMIN = 0. DO 395 I = 1, NMT NM = SEQ(I) GRAMS = MINTRY(NM) * XMOLW(NM) ALGG=1. ALGM=1. IF(MINTRY(NM).LT.0.) GO TO 429 ALGM = Dlog10(MINTRY(NM)) ALGG = Dlog10(GRAMS) 429 CONTINUE XMIN = 1.0 JS = ISOLS(NM) IF(JS.NE.0) XMIN = MINTRY(NM)/SOLTRY(JS) ACTMIN = GAMIN(NM)*XMIN IF(JS.NE.0) ACTMIN = ACTMIN**B(NM) LOGACT = Dlog10(ACTMIN) IF(GRT.NE.0.) PCMIN = GRAMS/GRT * 100. C* IF(NM.GT.ITGAS) GO TO 435 C* PI = XMIN*PFLUID C* FI = Dlog10(PI*GAMIN(NM)) C* CALCULATES VOLUME FROM PV/RT = Z, Z CALCULATED FROM BVAL AND C* AND CVAL IN SUBROUTINE PHI C* ZGAS = 1 + BVAL(NM)*PFLUID + CVAL(NM)*PFLUID*PFLUID C* CM3 = tempK * 83.1432 * ZGAS * MINTRY(NM) / PFLUID C WRITES SATURATED MINERALS DATA 435 IF(DENS(NM).EQ.0.) DENS(NM) = 2.5 CM3 = GRAMS/DENS(NM) VOLMIN = VOLMIN + CM3 WRITE(IOUT1,935) MIN(NM), MINTRY(NM), ALGM, GRAMS, 1 ALGG,PCMIN,CM3 WRITE(BUFOUT(I),937) MIN(NM),XMIN,ACTMIN,GAMIN(NM),LOGACT C TERMINAL OVERLOOK 395 WRITE(IOUT2,935) MIN(NM), MINTRY(NM), ALGM, GRAMS, 1 ALGG,PCMIN,CM3 WRITE(IOUT1,931) WRITE(IOUT1,'(A80)') (BUFOUT(I),I=1,NMT) 408 WRITE(IOUT1,943) C 398 IF(tempC.NE.0.) WRITE(IOUT1,936) TOTMIX WRITE(IOUT1,972) GRT, VOLMIN WRITE(IOUT1,968) IF(tempC.EQ.0.) GO TO 382 C COMPUTE WEIGHT OF MIXING SOLUTION TOTWT = 0. DO 383 I = 1, BSTOT 383 TOTWT = TOTWT + TOTMIX * COMTOT(I) * W(I) IF(TOTMIX.NE.0.) WR = GASGRM/TOTWT GO TO 380 C 382 IF(MINSOL.EQ.0) GO TO 380 GRMLG = -100. IF(TOTMIX.GT.0.) GRMLG=Dlog10(TOTMIX) WRITE(IOUT1,971) TOTMIX, TYP, GRMLG IF(TOTMIX.NE.0.) WR = GASGRM/TOTMIX WRITE(IOUT1,973) GASGRM, WR 380 IF(NSTOP.EQ.1) GO TO 307 C* C* NON IDEAL SOLID SOLUTIONS. WE NEED TO COMPUTE ACTIVITIES BEFORE C* CALL TO MINSAT, EVEN IF MINSAT WILL RECOMPUTE THESE ACTIVITIES. C* THIS STEP IS ONLY FOR PHASES THAT ARE NOT YET SATURATED. C* WE NEED ALL END MEMBERS ACTIVITIES TO CHECK IF THE SOLID C* SOLUTION SHOULD BE SUPERSATURATED. C* SO FAR, WE HAVE ONLY ELECTRUM SOL-SOL NO. = 10 C* SILVER SHOULD BE ENTERED AFTER GOLD IN SOLTHERM IS=1 AU, =2 AG C* NM = SOLS(10,1) C* LS = IST(10) C* GOLD NOT IN THE CALCULATION, OR ALREADY SATURATED => SKIP C* IF(NM.EQ.0.OR.QES(NM).NE.0) GO TO 515 C* DO 500 IS = 1,LS C* NM = SOLS(10,IS) C* CSAVE = 0. C* ITOT=ITM(NM) C* DO 505 I=1,ITOT C* CFM = COEFM(NM,I) C* SPM = SPECM(NM,I) C* CSAVE1 = CFM*Dlog10(ACT(SPM)) C*505 CSAVE = CSAVE + CSAVE1 C* ACTM(IS) = CSAVE - LGKM(NM) C*500 CONTINUE C* CALL ELSAT(ACTM(1),ACTM(2),tempK) C* ********** C*515 CONTINUE C* NOW WE NEED TO COMPUTE GAS FUGACITIES, SATURATION PRESSURE AND C* FUGACTITY COEFFICIENTS, IF GASES ARE NOT SUPERSATURATED, C* BEFORE WE CALL MINSAT. WE TEST IF GASES ARE SUPERSATURATED C* (THAT MEANS IN THE MATRIX) ON H2O GAS. IF H2O GAS IS NOT IN C* THE MATRIX (QES(1)=0) THEN GASES ARE NOT SUPERSATURATED. C* WE REPEAT SOME OF THE ABOVE W/ SOLID SOL, BUT IT IS CLEANER C* IF (QES(1).NE.0.OR.IPSAT.EQ.0) GO TO 399 C* DO 438 NM=1,NGAS C* CSAVE = 0. C* ITOT=ITM(NM) C* DO 440 I=1,ITOT C* CFM = COEFM(NM,I) C* SPM = SPECM(NM,I) C* CSAVE1 = CFM*Dlog10(ACT(SPM)) C*440 CSAVE = CSAVE + CSAVE1 C* GASlog(NM) = CSAVE - AKGASL(NM) C*438 CONTINUE C* CALL PSAT C ********* C IF(LOOC.EQ.3) GO TO 406 CALL MINSAT C *********** WRITE(IOUT1,944) IF(ERLOOP.LT.NLOOP) GO TO 406 WRITE(IOUT1,620) NLOOP WRITE(IOUT2,620) NLOOP 620 FORMAT(//5X,'NUMBER OF ITERATIONS REACHED THE GIVEN LIMIT (',I4, 1 ')',/5X,'NON-CONVERGENCE ASSUMED. EXECUTION ABORTED.'//) STOP C 406 IF(IPUNCH.EQ.0) GO TO 407 IF(BIT.NE.SINC.AND.LOOC.NE.3) GO TO 407 C C WRITE PLOTTING FILE ON OPTION C IF(IPUNCH.EQ.1.OR.IPUNCH.EQ.2) THEN C SYMONDS PLOT FILE WRITE(IPUN,832) WRlog = 0. IF(TOTMIX.NE.0.) WRlog = Dlog10(WR) ALA1=Dlog10(ACT(BSTP1)) DO 409 NS = 1,NST ALA = Dlog10(ACT(NS)) C PLOT log MOLES IF INPUNCH EQUALS 2 IF(IPUNCH.EQ.2) ALA = Dlog10(MTRY(NS)) WRITE(IPUN,832) NAME(NS),ALA,temp,PFLUID,ALA1,WRlog 409 CONTINUE DO 413 I = 1, NMTT C+ XMIN=1. C+ JS=ISOLS(SEQ(I)) C+ IF(JS.NE.0) XMIN=MINTRY(SEQ(I))/SOLTRY(JS) C+ GRAMS = MINTRY(SEQ(I)) * XMOLW(SEQ(I)) C+ IF(GRT.NE.0.) PCMIN=GRAMS/GRT*100. ALA = MINTRY(I) IF(ALA.EQ.0.) ALA = 1.D-300 ALA = Dlog10(ALA) WRITE(IPUN,832) MIN(I),ALA,temp,PFLUID,ALA1,WRlog 413 CONTINUE C ELSE IF(IPUNCH.EQ.3.OR.IPUNCH.EQ.4) THEN C C New plotting code inserted here, modified from CHILLER. This will C allow GASWORKS to run with MINPLOT plotting program. C C CONTROL WRITING OF TITLE AND NST, BSTOT and space holder (1) AT C TOP OF FIRST PLOT SEGMENT IF(IPUNCH.EQ.4) GO TO 415 IPUNCH = 4 WRITE(IPUN,800) BSTOT,NST,1 WRITE(IPUN,870) TITLE1 WRITE(IPUN,870) TITLE2 415 TOT = TOTMIX WRITE(IPUN,833) temp,PFLUID,ACT(BSTP1),TOT WRITE(IPUN,830) (MTRY(I), I=1,NST) WRITE(IPUN,830) (MTOT(I), I=1,BSTOT) WRITE(IPUN,830) (AQM(I), I=1,BSTOT) WRITE(IPUN,838) 1,'bogus', 0. DO 416 I = 1, NMT XMIN=1. JS=ISOLS(SEQ(I)) IF(JS.NE.0) XMIN=MINTRY(SEQ(I))/SOLTRY(JS) GRAMS = MINTRY(SEQ(I)) * XMOLW(SEQ(I)) IF(GRT.NE.0.) PCMIN=GRAMS/GRT*100. WRITE(IPUN,837) SEQ(I), MIN(SEQ(I)), MINTRY(SEQ(I)), 1 GRAMS, PCMIN, XMIN 416 CONTINUE WRITE (IPUN, 943) END IF C 407 IF(LOOC.EQ.3) STOP INP=IOUT3 IF(BIT.EQ.SINC) INP=INP1 C C A PICKUP FILE IS CREATED AFTER EACH EQUILIBRATION AND IS WRITTEN C IN THE FILE IOUT3 (E.G. EACH TIME WE PUT A NEW MINERAL IN, OR C KICK A MINERAL OUT). HOWEVER, WHEN WE FINALLY TRUELY EQUILIBRATE, C (NO MORE MINERALS ARE SUPER- OR UNDERSATURATED, AND WE ARE C READY FOR NEXT COOLING OR MIXING STEP), THE PICKUP FILE IS C WRITEN OVER THE LAST PICKUP FILE FOR THE LAST COMPLETED STEP. C THEREFORE, IOUT3 IS CREATED ONLY WHEN MINERALS ARE ADDED OR C OR KICKED OUT IN A GIVEN STEP. THE FOLLOWING CREATES PICKUP C FILES. REWIND INP WRITE(INP,870) TITLE1 WRITE(INP,870) TITLE2 WRITE(INP,801) WRITE(INP,834) ERPC,FO2log,PFLUID,temp,SINC,SLIM,GASTOT WRITE(INP,802) WRITE(INP,836) tempC,TOTMIX,SOLMIN, RM,GASGRM,SUPRNT WRITE(INP,810) WRITE(INP,800) IMINT,IFRAC,IPUNCH,NLOOP,ISTEP, 1 LIMSS,LOOC,ITREF,IDEAL,INCREM,INCP,MINSOL,OFLAG WRITE(INP,804) DO 520 I = 1,BSTOT 520 WRITE(INP,805) SAQ(I),NAME(I),MTOT(I),MTRY(I),GAMMA(I),COMTOT(I) WRITE(INP,806) IF(NMT.EQ.0) GO TO 525 WRITE(INP,823) (MIN(SEQ(I)), MINTRY(SEQ(I)), I=1,NMT) 525 WRITE(INP,807) IF(NOOX.EQ.0) GO TO 535 DO 530 I = 1, NOOX 530 WRITE(INP,823) NOMOX(I), WTPC(I) 535 WRITE(INP,808) DO 540 I = 1,NSUP 540 WRITE(INP,822) SUPNAM(I) WRITE(IOUT2,952) C IF(BIT.EQ.0.) GO TO 190 C TERMINAL OVERLOOK OF CALCULATIONS C% FO2=ACT(BSTP1) FO2LGP=Dlog10(ACT(BSTP1)) WRITE(IOUT2,841) FO2LGP 560 WRITE(IOUT2,840) temp,PFLUID IF(INCREM.NE.0) BIT = SINC C 598 CALL COOLER C *********** C C STOPS ARE BUILT IN COOLER WHENEVER SLIM IS REACHED C MIXER, BULK CALLED FROM COOLER C GO TO 190 C STOP IN COOLER C 800 FORMAT (16I5) 801 FORMAT(/'< ERPC >< logFO2 >< PFLUID >< temp >< SINC >' 1 ,'< SLIM >< GASTOT >') 802 FORMAT(/'< tempC >< TOTMIX >< SOLMIN >< RM >< GASGRM >' 1 ,'< SUPRNT >') 803 FORMAT(I5,1X,8X,4X,2D16.9,F8.4,2X,D10.4) 804 FORMAT(/,' saq> < name > < mtot >< mtry >' 1 ,' < comtot >') 805 FORMAT(I5,1X,A8,4X,2D16.9,F8.4,2X,D10.4) 806 FORMAT(/'< min > < mintry >') 807 FORMAT(/' < wtpc >') 808 FORMAT(/'') 810 FORMAT(/' bsto ifra ipun nloo iste lims looc itre idea' 1 ,' incr incp mins ofla') 815 FORMAT (//) 816 FORMAT (/,A80) 817 FORMAT (8X, 6D12.5) 818 FORMAT (//8X, 5D14.7) 820 FORMAT (A8,7X,A1,I1, 7(F6.3,I2),F5.3,I2) 822 FORMAT (A8, 5X,F9.4) 823 FORMAT (A8, 2X,D10.4) 830 FORMAT (8D10.4) 832 FORMAT(A8,5F10.5) 833 FORMAT(2F10.5,2D10.4,2F10.5) 834 FORMAT(D10.4,3F10.5,2G10.4,2F10.5) 836 FORMAT(F10.5,G10.4,D10.4,2F10.5,D10.4) 835 FORMAT(5D16.9) 837 FORMAT (I3,2X,A8,2X,7D10.5) 838 FORMAT(I3,2X,A8,2X,F10.5) 840 FORMAT(/1X,'CALCULATIONS DONE FOR ',F8.3,' DEG.C.;' 1 ,1X,F8.3,' ATM') 841 FORMAT(/5X,'THE log(FO2) IS: ',F7.2) 854 FORMAT (A8,A1,1X,F7.2,I2,1X,7(F6.3,I2),F4.3,I2,F6.3,I2,F6.3) 870 FORMAT (10A8) 885 FORMAT(5X,A8,' IS SUPPRESSED IN GASTHERM DATA FILE') 886 FORMAT(5X,A8,' IS SUPPRESSED IN THIS RUN') 900 FORMAT (/1X, 'MINERAL NO. log K TRIAL MOLES', 1' MINERAL NO. log K TRIAL MOLES'/) 905 FORMAT (2H ,'NO. OF LOOPS = ',I3,5X,'MOLES OF GAS=',D12.7) 906 FORMAT (2H , 'MOLES OF GAS=',D12.7) 910 FORMAT (2(1X, A8, 1X, I3, 3X, F8.3, 3X, D10.4, 4X)) 914 FORMAT (2H , ' MOLE ' 1,'PARTIAL') 915 FORMAT (2H , 'SPECIES MOLE NUMBER FRACTION ' 1,'PRESSURE FUGACITY log(F) GAMMA'/) 920 FORMAT (1X,I3,1X,A8,1X,4(D11.5,1X),F9.4,1X,F8.5) 923 FORMAT (/) 924 FORMAT (1X,I3, 1X, A8, 24X, 2(D11.5,1X,F10.4,1X), D11.5) 927 FORMAT (2H , 7X, 'TOTAL MOLES OF GAS = ',D12.7) 930 FORMAT (2H ,'MINERAL MOLES log MOLES GRAMS ', 1'log GRAMS WT PERCENT VOL (CM3)',/) 931 FORMAT (//2H ,'MINERAL MOLE FRACTION',6X,'ACTIVITY ' 1 ,3X,'ACTIVITY COEF',2X,'log ACTIVITY',/) 933 FORMAT (1H , 'tempERATURE = ',F8.3,' C.; P(FLUID) =',F8.3, 1' ATM; MIXER FRACTION = ',G10.4,/) 935 FORMAT (2X , A8 ,3X, 2(D10.4,2X,F7.3, 3X), 2(D10.4,3X)) 936 FORMAT(/2X,'TOTAL FRACTION OF MIXING SOLUTION ADDED: ',F12.6) 937 FORMAT (2X , A8 ,7X,2(D10.4,6X),F7.4,8X,F7.3) 940 FORMAT (2H ,'SPECIES NO. TOT.MOLES MTRY ', 1' GAMMA MIXING SOLUTION',/) 943 FORMAT (/) 944 FORMAT (/) 945 FORMAT (2H , A8, I5, 4X, 2D12.5, F10.4,3X,D10.4) 946 FORMAT(' NUMBER OF LOOPS USED = ',I4,' LOOP LIMIT = ',I4) 950 FORMAT (2H ,' SPECIES NO. log K', 1 ' SPECIES NO. log K',/) 952 FORMAT(10X,'PICKUP FILE WRITTEN ON DISK') 955 FORMAT (4X, A8, 3X, I4, 3X, F10.4, 11X, A8, 3X, I4, 3X, F10.4) 957 FORMAT (1X, ' COMPONENT MOLE NUMBER MOLE FRACTION', 1' PPM',/, 35X,'(TOTAL)'/) 960 FORMAT (2H , 10A8) 961 FORMAT (1X, ' COMPONENT TOTAL MOLES GAS PHASE MOLES', 1' SOLID MOLES'/) 962 FORMAT (1X, I2, 1X, A8, 2X, 3(D15.9, 2X)) 965 FORMAT(/16X,'WEIGHT OF GASEOUS SOLUTION: ',F12.6,' GRAMS'//) 968 FORMAT(2X,'IF UNKNOWN, MINERAL DENSITIES ARE ASSUMED TO BE 2.5'/) 970 FORMAT (2H , 78('+')) 971 FORMAT (2H ,'AMOUNT OF SOLID REACTANT CONSUMED:', F12.6,1X,A8 1 ,' log=',F9.4) 972 FORMAT (1H ,'AMOUNT OF SOLID PRODUCTS PRODUCED:', F12.6, 1' GRAMS;',1X,'VOLUME:',F14.8,' CM3') 973 FORMAT (2H ,'AMOUNT OF ORIGINAL SOLUTION: ',F12.6,' GRAMS' 1 /,2X,'ORIGINAL SOLUTION / ROCK ADDED = ',F14.4,' (= GAS/ROCK)'/) 974 FORMAT (/1H , 'INITIAL COMPOSITION OF SOLID PHASE (WT%):') 976 FORMAT (/1H , 'INITIAL COMPOSITION OF SOLID PHASE (MOLE%):') 975 FORMAT (/20(3(2X,A8,' = ',D10.4, ',')/)) 977 FORMAT (2H , 7D11.4) 999 FORMAT (1H1) END SUBROUTINE OXY IMPLICIT DOUBLE PRECISION (A-H,O-Z) INTEGER BG1,BG2,BG3,BG4 PARAMETER(BG1=450,BG2=650,BG3=42,BG4=85) DOUBLE PRECISION MTRY,MTOT,LGK,LGKM INTEGER BSTP1, BSTOT,OFLAG,SPEC COMMON/SLOUGH/ A(BG4,BG4),F(BG4),T(BG4,BG4),IV(BG4), N,ITREF COMMON/FROID/ SINC,BIT,SLIM,AKLOG,APFCL(BG2,5), 1 BPFCL(BG1,5),XPFC(11,5), XF(11), COE(5), ALG(4), 2 XDH(4),ALK(5),LGK(BG2),temp,tempC, HEATC,COMTOT(BG3), HEATM, 3 TOTMIX,CFH(5),CFT(5),VBCOE(20,3),VCCOE(20,3),CVBCF(3,3), 4 CVCCF(7,3), IFRAC COMMON /GEORGE/ AZERO(BG2),XI, NS, NST COMMON/MORT/MTRY(BG2),GAMMA(BG2),WATM,FO2,FO2log,TERMLN,KK 1,OFLAG COMMON/MINNIE/ AQM(BG3),ACT(BG2),LGKM(BG1),SCALE(BG1),PFLUID,Plog 1,GASTOT,NMTT,LOOC COMMON/OXEN/ MTOT(BG3),COEF(BG2,8),SPEC(BG2,8) COMMON/BULL/BSTOT,BSTP1,JGSTOT COMMON/IO/ INP1,INP2,INP3,INP4,IOUT1,IOUT2,IPUN,ISTEP,IPUNCH IF(ISTEP.EQ.1) WRITE(IOUT1,911) 911 FORMAT (2H , 40X, 'SUBROUTINE OXY WAS USED') C C C C PSEUDO SUBROUTINE FH2CALC. C NO PF/GASTOT TERM IN "F" EQUATION BECAUSE OF FO2log CANCELS IT. F(1) = -.5*LGK(BSTP1)+Dlog10(GAMMA(2)*MTRY(2)) 1 -Dlog10(GAMMA(1)*MTRY(1))-0.5*FO2log C DERIVATIVES W/R H2 AND H2O A(1,1) = -1./MTRY(1)*TERMLN A(1,2) = 1./MTRY(2)*TERMLN DO 57 J = 3,N 57 A(1,J) = 0.0 DO 100 NS = BSTP1,NST CFF=0. IF(SPEC(NS,2).NE.1) GO TO 100 CFF=COEF(NS,2) A(JGSTOT,1) = A(JGSTOT,1) + CFF*MTRY(NS)/MTRY(1) 100 CONTINUE RETURN END C SUBROUTINE MINERA IMPLICIT DOUBLE PRECISION (A-H,O-Z) INTEGER BG1,BG2,BG3,BG4 PARAMETER(BG1=450,BG2=650,BG3=42,BG4=85) DOUBLE PRECISION MSL ,MTRY, MINTRY,MTOT,LGKM CHARACTER*8 MIN INTEGER SOLS, QES,OFLAG INTEGER SPM, SPECM, BSTOT,BSTP1 INTEGER SPEC, SEQ C THIS SUBROUTINE SETS UP ALL PARTIAL DERIVATIVE MATRIX ELEMENTS FOR C MINERALS AND SOLID SOLUTIONS C EQUATIONS BSTP1 THROUGH BSTP1 + NMT ARE HYDROLYSIS Q EXPRESSIONS C IN log FORM E.G. F = -log K + log Q COMMON/MAXSIZ/ MAXSAQ,MAXNS,MAXNM,MAXSTO,MAXSSL,MAXN,MAXMEM,MAXIN COMMON/MORRIS/ MIN(BG1),COEFM(BG1,8),MINTRY(BG1),XMOLW 1 (BG1), tempK,NMT,MINCT,SPECM(BG1,8),ITM(BG1),SEQ(BG1),QES(BG1) COMMON/TRIX/ TMIN(BG3) COMMON/MINNIE/ AQM(BG3),ACT(BG2),LGKM(BG1),SCALE(BG1),PFLUID,Plog 1,GASTOT,NMTT,LOOC COMMON/IO/ INP1,INP2,INP3,INP4,IOUT1,IOUT2,IPUN,ISTEP,IPUNCH COMMON/OXEN/ MTOT(BG3),COEF(BG2,8),SPEC(BG2,8) COMMON/BULL/BSTOT,BSTP1,JGSTOT COMMON/SLOUGH/ A(BG4,BG4),F(BG4), T(BG4,BG4),IV(BG4), N,ITREF COMMON/MORT/MTRY(BG2),GAMMA(BG2),WATM,FO2,FO2log,TERMLN,KK 1,OFLAG COMMON/MORSEL/ GAMIN(BG1),B(BG1),SUMSOL(15),SOLTRY(15), 1 DGDN(BG3,20),SOLS(15,20),ISOLS(BG1),LIMSOL,JSOLS(BG1),IST(15) C* COMMON/FUGA/GASlog(20),Y(20),VB(20),VC(20),CVB(3),CVC(7),W1,W2,W3, C* 1 NGAS,IMIX,IDEAL,ITGAS COMMON/PRECIS/ RMIN, RlogMN, RlogMX C N = BSTOT + NMT + 1 MINCT = MINCT + 1 DO 76 I = 1, MAXSAQ 76 TMIN(I) = 0.0 DO 101 M = 1, NMT NM = SEQ(M) IF(NM.EQ.0) GO TO 105 NMA = M + BSTOT + 1 ITOT = ITM(NM) MSL = 0. DO 90 I = 1, ITOT SPM = SPECM(NM,I) CFM = COEFM(NM,I) C ADD MOLES OF MINERAL TO MASS BALANCE EQUATION F(SPM) = F(SPM) + CFM * MINTRY(NM) A(SPM,NMA) = CFM C COMPUTE Q FOR MINERAL CHARACTERISTIC REACTION C ACT CONTAINS FUGACITY OF GASES CHK=CFM * Dlog10(MTRY(SPM)*GAMMA(SPM)*PFLUID/GASTOT) MSL = MSL + CHK C FOR MASS ACTION EQS IN log FORM, DERIVATIVES ARE SAME FOR GASEOUS C AND AQUEOUS FORMS A(NMA,SPM) = CFM * TERMLN/MTRY(SPM) C DERIVATIVE OF MINERAL MASS ACTION EQUATION W/R TO GASTOT A(NMA,JGSTOT) = A(NMA,JGSTOT) - CFM*TERMLN/GASTOT C TMIN CONTAINS MOLES OF COMPONENTS IN SOLIDS 92 TMIN(SPM) = TMIN(SPM) + CFM * MINTRY(NM) 90 CONTINUE IF (MSL.LT.RlogMN.OR.MSL.GT.RlogMX) WRITE(IOUT1,201) MIN(NM),MSL IF(ISOLS(NM).EQ.0) GO TO 95 JU = ISOLS(NM) JS = JSOLS(NM) C COMPUTE Q FOR MINERAL SOLID SOLUTIONS. NEGATIVE MINTRY NOT ALLOWED C SEE MAIN. IF B IS USED, GAMIN MUST BE 1, IF GAMIN IS NOT 1, B MUST C BE 1, THUS WE CAN PUT ALL THE EXPRESSION INTO ONE Dlog10. ACM = Dlog10 (MINTRY(NM)/SOLTRY(JU) *GAMIN(NM))*B(NM) IF (ACM.LT.RlogMN.OR.ACM.GT.RlogMX) WRITE(IOUT1,202) MIN(NM),ACM, 1MINTRY(NM),SOLTRY(JU) MSL = MSL - ACM 95 CONTINUE C F(NMA) IS MASS ACTION EQUATION FOR MINERAL (IN log FORM) F(NMA) = -LGKM(NM) + MSL A(NMA,NMA) = 0.0 IF(ISOLS(NM).EQ.0) GO TO 101 C BELOW FOR SOLID SOLUTIONS ONLY C NOW WE COMPUTE PARTIAL DERIVATIVES OF MASS ACTION EQ. W/ REPECT C TO MOLES OF MINERAL FOR SOLID SOLUTIONS. A(NMA,NMA) = -B(NM)*TERMLN*(1./MINTRY(NM) - 1./SOLTRY(JU)) IS = IST(JS) DO 110 I = 1, IS LS = SOLS(JS,I) C HERE WE INCLUDE DERIVATIVE OF GAMIN(NM) W/ RESPECT TO MOLES OF C NM. THIS IS TO EASE CONVERGENCE IF NEEDED. DGDN ARE COMPUTED IN C THE ROUTINES THAT COMPUTE GAMIN. THESE CAN BE ZERO IN MOST CASES. IF(LS.NE.NM) GO TO 99 A(NMA,NMA) = A(NMA,NMA) - TERMLN/GAMIN(NM)*DGDN(QES(NM),I) GO TO 110 C 99 CONTINUE DO 111 KI = 1, NMT C WE SKIP IF END MEMBER NOT IN MATRIX IF(SEQ(KI).EQ.0) GO TO 112 IF(LS.EQ.SEQ(KI)) NMD = KI + BSTOT + 1 IF(LS.EQ.SEQ(KI)) A(NMA,NMD) = B(NM)*TERMLN/SOLTRY(JU) . - TERMLN/GAMIN(NM)*DGDN(QES(NM),I) C ABOVE LINE CONTAINS DERIVATIVE OF GAMIN(NM) W/ REPECT TO C MOLES OF ENDMEMBER DIFFERENT THAN NM. SEE COMMENTS ABOVE. 111 CONTINUE 112 CONTINUE 110 CONTINUE 101 CONTINUE 105 CONTINUE C 201 FORMAT (/1X,'log Q FOR ',A8,' IS ',F7.3) 202 FORMAT (1X,'log A FOR ',A8,'IS',F7.3/1X,'MINTRY=',D12.5,'SOLTRY= 1',D12.5) RETURN END SUBROUTINE MINSAT IMPLICIT DOUBLE PRECISION (A-H,O-Z) INTEGER BG1,BG2,BG3,BG4 PARAMETER(BG1=450,BG2=650,BG3=42,BG4=85) DOUBLE PRECISION MSL,MTRY,MINTRY, MTOT, LGKM ,LGK CHARACTER*8 MIN INTEGER SOLS, QES,OFLAG INTEGER SPM, SPECM, BSTOT,BSTP1,SPEC, SEQ C SUBROUTINE MINSAT DETERMINES WHETHER THERE IS SUPERSATURATION OF C THE PRESENT SOLUTION WITH ANY MINERALS OR SOLID SOLUTIONS. C IF MORE THAN ONE MINERAL IS SUPERSATURATED, IT ADDS THE ONE WITH C THE LOWEST AFFINITY TO THE MATRIX. IT ALSO REMOVES ANY MINERALS C PREVIOUSLY IN MATRIX THAT ARE NOW UNDERSATURATED DIMENSION NMSAV(BG3),XLGQM(BG1), MTOSS(5),XM(15,20) COMMON/MAXSIZ/ MAXSAQ,MAXNS,MAXNM,MAXSTO,MAXSSL,MAXN,MAXMEM,MAXIN COMMON/OXEN/ MTOT(BG3),COEF(BG2,8),SPEC(BG2,8) COMMON/BULL/BSTOT,BSTP1,JGSTOT COMMON/SLOUGH/ A(BG4,BG4),F(BG4), T(BG4,BG4),IV(BG4), N,ITREF COMMON/MORT/MTRY(BG2),GAMMA(BG2),WATM,FO2,FO2log,TERMLN,KK 1,OFLAG COMMON/MINNIE/ AQM(BG3),ACT(BG2),LGKM(BG1),SCALE(BG1),PFLUID,Plog 1,GASTOT,NMTT,LOOC COMMON/FROID/ SINC,BIT,SLIM,AKlog,APFCL(BG2,5), 1 BPFCL(BG1,5),XPFC(11,5), XF(11), COE(5), ALG(4), 2 XDH(4),ALK(5),LGK(BG2),temp,tempC, HEATC,COMTOT(BG3), HEATM, 3 TOTMIX,CFH(5),CFT(5),VBCOE(20,3),VCCOE(20,3),CVBCF(3,3), 4 CVCCF(7,3), IFRAC COMMON/MORRIS/ MIN(BG1),COEFM(BG1,8),MINTRY(BG1),XMOLW 1 (BG1), tempK,NMT,MINCT,SPECM(BG1,8),ITM(BG1),SEQ(BG1),QES(BG1) COMMON/MORSEL/ GAMIN(BG1),B(BG1),SUMSOL(15),SOLTRY(15), 1 DGDN(BG3,20),SOLS(15,20),ISOLS(BG1),LIMSOL,JSOLS(BG1),IST(15) C* COMMON/FUGA/GASlog(20),Y(20),VB(20),VC(20),CVB(3),CVC(7),W1,W2,W3, C* 1 NGAS,IMIX,IDEAL,ITGAS COMMON/IO/ INP1,INP2,INP3,INP4,IOUT1,IOUT2,IPUN,ISTEP,IPUNCH COMMON/PRECIS/ RMIN, RlogMN, RlogMX RT = 1.98719 * tempK AFOLD = 0. LREAP = 0 MCNT = 0 NEWCT = 0 NMT = 0 JACK=0 DO 57 I = 1, MAXIN 57 SEQ(I) = 0 DO 201 NM = 1, NMTT MSL = 0.0 ITOT = ITM(NM) C WE COMPUTE log Q DO 93 I = 1,ITOT CFM = COEFM(NM,I) SPM = SPECM(NM,I) CSAVE=CFM*Dlog10(ACT(SPM)) MSL = MSL + CSAVE 93 CONTINUE JS = JSOLS(NM) IF(JS.EQ.0) GO TO 96 GAMlog = Dlog10(GAMIN(NM)) IF(ISOLS(NM).NE.0) GO TO 94 C C GASES OR MINERALS NOT YET SUPERSATURATED C COMPUTES SUM OF MOLE FRACTIONS FOR SOLID SOLUTIONS THAT ARE NOT C YET SUPERSATURATED. IF SUMM ADDS TO 1 OR GREATER, WE WILL SUPERSAT QTERM = (MSL - LGKM(NM))/B(NM) - GAMlog IF (QTERM.LE.RlogMN) QTERM=RlogMN IF (QTERM.GE.RlogMX) QTERM=RlogMX QTERM =10.**QTERM SUMSOL(JS) = SUMSOL(JS) + QTERM IS = IST(JS) JACK=1 DO 73 J=1,IS IF(SOLS(JS,J).EQ.NM) XM(JS,J) = QTERM 73 CONTINUE GO TO 96 C C COMPUTE Q FOR SATURATED SOLID SOLUTIONS 94 JU = ISOLS(NM) ACM = Dlog10(DABS(MINTRY(NM)/SOLTRY(JU)))*B(NM) + GAMlog MSL = MSL - ACM C 96 XLGQM(NM) = MSL DIFM = XLGQM(NM) - LGKM(NM) C REMOVE UNDERSATURATED MINERALS FROM MATRIX C ================================================ C IF SINGLE MINERAL WAS PREVIOUSLY IN MATRIX BUT GOT UNDERSATURATED C (NEGATIVE AMOUNT OF MOLES WERE COMPUTED) WE REMOVE IT IF(QES(NM).EQ.0) GO TO 97 IF(MINTRY(NM).LT.0.) GO TO 195 C C IN CASE MASS BALANCE CONVERGES, BUT MASS ACTION FAILS (SHOULD NOT C HAPPEN WITH ERPC SUFFICIENTLY LOW), THE AFFINITY (-RTLN Q/K ) C WILL BE TOO LARGE => MINERAL MIGHT NOT BELONG, OR PROBLEM. WE C KICK MINERAL OUT (USEFUL TO DUMP TOO SMALL SOL-SOL ENDMEMBERS) AF = -RT*DIFM*2.303 IF(DABS(AF).LT.1.D-6) GO TO 101 WRITE(IOUT1,800) MIN(NM), AF 800 FORMAT(/5X,A8,' DOES NOT SATISFY ANYMORE THE MASS ACTION EQUATION' . ,/13X,' WE REMOVE IT FROM MATRIX. AFFINITY =', D10.4) GO TO 195 C C CHECK FOR SUPERSATURATION OF SINGLE MINERALS C ============================================ 97 CONTINUE DIFM=DIFM/SCALE(NM) C IF UNDERSATURATED, GO TO 201 IF(DIFM.LT.1.D-10) GO TO 201 C NOW, WE SELECT ONLY ONE MINERAL WITH SMALLEST AFFINITY IF C SEVERAL MINERALS ARE SUPERSATURATED IF(DIFM.LT.AFOLD) GO TO 99 AFOLD = DIFM MSTORE = NM 99 NEWCT = NEWCT + 1 GO TO 201 C C 101-195, RE-COUNT SATURATED MINERALS 101 MCNT = MCNT + 1 NMSAV(MCNT) = NM SEQ(MCNT) = NM QES(NM) = MCNT NMT = MCNT GO TO 201 C C HERE WE KICK MINERALS OUT OF THE MATRIX 195 LREAP = LREAP + 1 MASH = NM MTOSS(LREAP)= NM QES(NM) = 0 MINTRY(NM) = 1.D-300 C 201 CONTINUE C IF MINERALS WERE REMOVED FROM MATRIX IF(LREAP.NE.0) GO TO 107 C IF NO NEW MINERALS SUPERSATURATE, AFOLD = 0 IF(AFOLD.EQ.0.) GO TO 207 C MORE THAN ONE NEW SUPERSAT MINERAL: TAKE THE MOST SUPERASTURATED IF(LOOC.EQ.0) GO TO 105 C MORE THAN ONE NEW SUPERSAT MINERAL: BACK TITRATE IF(NEWCT.GE.2) GO TO 107 C C WE PUT IN THE MOST SUPERSAT. MINERAL (INDEX = MSTORE) 105 MCNT = MCNT + 1 NM = MSTORE SEQ(MCNT) = MSTORE QES(MSTORE) = MCNT NMSAV(MCNT) = MSTORE NMT = MCNT IF(JSOLS(NM).EQ.0) GO TO 107 C IF WE JUST PUT IN A MINERAL WHICH BELONG TO A SOLID SOLUTION, THEN C WE NEED TO PUT IN THE REMAINING END MEMBERS. JS = JSOLS(NM) IS = IST(JS) MINTRY(NM) = 1. D-7 DO 106 J = 1, IS M = SOLS(JS,J) C IF OTHER ENDMEMBERS WERE ALREADY IN MATRIX, WE SKIP IF(QES(M).NE.0) GO TO 106 IF(M.NE.NM) MINTRY(M) = MINTRY(NM)*XM(JS,J)/SUMSOL(JS) IF(M.EQ.NM) GO TO 106 MCNT = MCNT + 1 SEQ(MCNT) = M QES(M) = MCNT NMSAV(MCNT) = M NMT = MCNT 106 CONTINUE GO TO 107 C C NOW IN CASE A SOLID SOLUTION, WITH ALL END MEMBERS C INDEPENDENTLY UNDERSATURATED, SUPERSATURATES, WE PUT IT IN 207 JSAV = 0 IF(JACK.EQ.0) GO TO 107 SOLQ = 1.0 DO 213 NM = 1, NMTT JS = JSOLS(NM) IF(JS.EQ.0) GO TO 213 IS = IST(JS) DO 210 J = 1, IS JK = SOLS(JS,J) IF(QES(JK).NE.0) GO TO 213 210 CONTINUE IF(SUMSOL(JS).LT.SOLQ) GO TO 213 SOLQ = SUMSOL(JS) JSAV = JS 213 CONTINUE IF(JSAV.EQ.0) GO TO 107 NEWCT = NEWCT + 1 IS = IST(JSAV) DO 225 J = 1, IS M = SOLS(JSAV,J) MCNT = MCNT + 1 SEQ(MCNT) = M QES(M) = MCNT NMSAV(MCNT) = M MINTRY(M) = 1.D-8*XM(JSAV,J)/SUMSOL(JSAV) NMT = MCNT 225 CONTINUE C 107 CONTINUE LBOTH = LREAP + NEWCT IF(LBOTH.GE.2) GO TO 233 IF(LREAP.NE.1) GO TO 311 MINTRY(MASH) = 1.D-300 GO TO 311 233 IF(LOOC.EQ.0) GO TO 311 IF(BIT.EQ.0.) BIT = SINC BIT =-(BIT/2.) C IF MORE THAN TWO MINERALS ARE UNDER OR SUPER SATURATED (LBOTH.GE. C 2) THEN MUST REPLACE UNDERSAT ONES AND BACK UP IF(LREAP.EQ.0) GO TO 108 DO 237 I = 1, LREAP NM = MTOSS(I) MCNT = MCNT + 1 SEQ(MCNT) = NM QES(NM) = MCNT NMSAV(MCNT) = NM 237 NMT = MCNT GO TO 108 C 311 IF(LBOTH.NE.0) BIT = 0. IF(LBOTH.EQ.0) BIT = SINC 108 CONTINUE CALL SQUIMP WRITE(IOUT1,923) WRITE(IOUT1,970) WRITE(IOUT1,923) IF(MCNT.EQ.0) GO TO 110 WRITE(IOUT1,975) WRITE(IOUT1,980) DO 109 I = 1, MCNT NM = NMSAV(I) XLK = LGKM(NM) AF = (XLK - XLGQM(NM)) * RT * 2.303 QKlog = XLGQM(NM) - XLK QKSlog=QKlog/SCALE(NM) WRITE(IOUT1,977) NM,MIN(NM),XLK,XLGQM(NM),QKlog,QKSlog,AF XLGQM(NM) = 666. 109 CONTINUE WRITE(IOUT1,923) 110 WRITE(IOUT1,979) WRITE(IOUT1,980) DO 112 NM = 1, NMTT IF(XLGQM(NM).EQ.666.) GO TO 112 XLK =LGKM(NM) AF = (XLK - XLGQM(NM)) * RT * 2.303 QKlog = XLGQM(NM) - XLK QKSlog=QKlog/SCALE(NM) C* IF(NM.GT.ITGAS) GO TO 130 C* GO TO 112 130 IF(QKlog.GE.-5.) 1 WRITE(IOUT1,977) NM,MIN(NM),XLK,XLGQM(NM),QKlog,QKSlog,AF 112 CONTINUE C 923 FORMAT (/) 970 FORMAT (1H , 78('+')) 975 FORMAT (2H , 'THE FOLLOWING MINERALS ARE PRESENTLY IN MATRIX OR W 1ERE JUST ADDED',//) 977 FORMAT (2X,I3,2X,A8,2X,3(3X,F8.2),3X,F8.3,4X,D13.5,4X,F8.4) 979 FORMAT (2H , ' THE FOLLOWING MINERALS ARE PRESENTLY EXCLUDED FROM 1 MATRIX',/3X,'MINERALS WITH log(Q/K) LESS THAN -5 ARE NOT LISTED' 2 ,' BELOW'//) 980 FORMAT (5X,' MINERAL log K log Q log(Q/K)', 1' log(Q/K)/S AFFINITY',/) RETURN END SUBROUTINE SQUOMP C TO SORT AND INITIALIZE SOLID SOLUTION ARRAYS. C NM MINERAL INDEX: CURRENT SEQUENCE POSITION AS READ FROM C SOLTHERM FOR EACH PARTICULAR RUN. C JSOLS(NM) SOLID SOLUTION INDEX: FIXED ID NUMBER (E.G.GASES = 6) C B(NM) COEFFICIENT FOR MULTISITE MIXING C SOLS(JS,L) RETURNS (CONTAINS) NM VALUE, WITH JS = JSOLS(NM) AND C L = POSITION OF END ENDMEMBER FOR THAT JS SOLID SOLUTION C (1ST, 2ND ETC. END MEMBER) C IST(JS) TOTAL NUMBER OF END MEMBERS IN SOL SOL JS = JSOLS(NM) C ISOLS(NM) RETURNS (CONTAINS) THE POSITION, IN ARRAY OF CURRENTLY C SATURATED SOL SOL, OF THE SOLID SOLUTION CONTAINING NM C SOLTRY(J) SUM OF MOLES OF ALL END MEMBERS IN SATURATED SOL SOL C J = ISOLS(NM) C SUMSOL(J) SUM OF Q/K'S OF ALL END MEMBERS IN SATURATED SOL SOL C J = ISOLS(NM) C DGDN(J,I) DERIVATIVE OF GAMIN(NM) W/ RESPECT TO MOLES OF C ENDMEMBER I, WITH J = QES(NM) AND I = L ABOVE C IMPLICIT DOUBLE PRECISION (A-H,O-Z) INTEGER BG1,BG2,BG3,BG4 PARAMETER(BG1=450,BG2=650,BG3=42,BG4=85) DOUBLE PRECISION LGKM,MINTRY CHARACTER*8 MIN INTEGER SPECM, SEQ, QES, SOLS COMMON/MAXSIZ/ MAXSAQ,MAXNS,MAXNM,MAXSTO,MAXSSL,MAXN,MAXMEM,MAXIN COMMON/MINNIE/ AQM(BG3),ACT(BG2),LGKM(BG1),SCALE(BG1),PFLUID,Plog 1,GASTOT,NMTT,LOOC COMMON/MORRIS/ MIN(BG1),COEFM(BG1,8),MINTRY(BG1),XMOLW 1 (BG1), tempK,NMT,MINCT,SPECM(BG1,8),ITM(BG1),SEQ(BG1),QES(BG1) COMMON/MORSEL/ GAMIN(BG1),B(BG1),SUMSOL(15),SOLTRY(15), 1 DGDN(BG3,20),SOLS(15,20),ISOLS(BG1),LIMSOL,JSOLS(BG1),IST(15) COMMON/IO/ INP1,INP2,INP3,INP4,IOUT1,IOUT2,IPUN,ISTEP,IPUNCH WRITE(IOUT1,500) DO 180 J = 1,MAXIN DO 180 I = 1,MAXMEM 180 DGDN(J,I) = 0. DO 183 J = 1,MAXSSL DO 182 I = 1,MAXMEM 182 SOLS(J,I) = 0 IST(J) = 0 183 CONTINUE DO 186 NM = 1, NMTT JS = JSOLS(NM) IF(JS.EQ.0) GO TO 186 L = 0 IF(JS.LE.MAXSSL) GO TO 185 WRITE(IOUT1,400) MIN(NM), JS, MAXSSL 400 FORMAT(/5X,A8,' HAS A TOO LARGE SOLID SOLUTION INDEX (',I3,')', $ /5X,'MAXIMUM VALUE ALLOWED IS ',I3//) STOP C 185 L = L + 1 IF(L.LE.MAXMEM) GO TO 187 WRITE(IOUT1,410) MIN(NM), L, MAXMEM 410 FORMAT(/5X,A8,' IS PART OF A SOLID SOLUTION WITH TOO MANY' $ ,' END MEMBERS (',I3,')'/5X,'MAXIMUM NUMBER ALLOWED IS ',I3//) STOP C 187 IF(SOLS(JS,L).NE.0) GO TO 185 SOLS(JS,L) = NM IST(JS) = L WRITE(IOUT1,510) MIN(NM), JS, B(NM) 186 CONTINUE 500 FORMAT(/6X,'THE FOLLOWING MINERALS AND/OR GASES WITH IDENTICAL', 1/6X,'INDEX ARE IN SOLID SOLUTION:'//,8X, 2 'MINERAL INDEX B(NM)') 510 FORMAT(8X,A8,3X,I5,3X,F6.3) C ENTRY SQUIMP DO 163 NM = 1, NMTT 163 ISOLS(NM) = 0 L = 0 DO 189 I = 1,MAXSSL C RESET SUMSOL TO ZERO FOR MINSAT SUMSOL(I) = 0. M1 = SOLS(I,1) IF(IST(I).GE.2) GO TO 188 IF(IST(I).EQ.0) GO TO 189 SOLS(I,1) = 0 JSOLS(M1) = 0 IST(I) = 0 GO TO 189 188 CONTINUE IS = IST(I) L = L + 1 SOLTRY(L) = 0.0 DO 196 J = 1, IS LS = SOLS(I,J) C SKIP IF ONE END MEMBER IS NOT IN MATRIX IF(QES(LS).EQ.0) GO TO 196 SOLTRY(L) = SOLTRY(L) + MINTRY(LS) ISOLS(LS) = L 196 CONTINUE 189 CONTINUE LIMSOL = L RETURN END SUBROUTINE COOLER C COOLER IS USED TO GO ON TO THE NEXT STEP, WHICH CAN BE: C T CHANGE, P CHANGE, P-T CHANGE, OR COMPOSITION CHANGE C NOTE, CURRENTLY P CHANGE ONLY AFFECTS GASES C IMPLICIT DOUBLE PRECISION (A-H,O-Z) INTEGER BG1,BG2,BG3,BG4 PARAMETER(BG1=450,BG2=650,BG3=42,BG4=85) DOUBLE PRECISION MINTRY,MTRY,MTOT,LGKM,LGK CHARACTER*8 MIN,NOMOX INTEGER QES,SEQ,QAS,SAQ,SPECM,BSTOT,SPEC,SAQTOT,SPECOX,BSTP1 1,OFLAG COMMON /GEORGE/AZERO(BG2),XI, NS, NST COMMON/TRIX/ TMIN(BG3) COMMON/MORT/MTRY(BG2),GAMMA(BG2),WATM,FO2,FO2log,TERMLN,KK 1,OFLAG COMMON/MORRIS/ MIN(BG1),COEFM(BG1,8),MINTRY(BG1),XMOLW 1 (BG1), tempK,NMT,MINCT,SPECM(BG1,8),ITM(BG1),SEQ(BG1),QES(BG1) COMMON/TURNIP/ SAQ(BG3), QAS(BG3), SAQTOT COMMON/OXEN/ MTOT(BG3),COEF(BG2,8),SPEC(BG2,8) COMMON/BULL/BSTOT,BSTP1,JGSTOT COMMON/MINNIE/ AQM(BG3),ACT(BG2),LGKM(BG1),SCALE(BG1),PFLUID,Plog 1,GASTOT,NMTT,LOOC COMMON/FROID/ SINC,BIT,SLIM,AKlog,APFCL(BG2,5), 1 BPFCL(BG1,5),XPFC(11,5), XF(11), COE(5), ALG(4), 2 XDH(4),ALK(5),LGK(BG2),temp,tempC, HEATC,COMTOT(BG3), HEATM, 3 TOTMIX,CFH(5),CFT(5),VBCOE(20,3),VCCOE(20,3),CVBCF(3,3), 4 CVCCF(7,3), IFRAC C* COMMON/FUGA/GASlog(20),Y(20),VB(20),VC(20),CVB(3),CVC(7),W1,W2,W3, C* 1 NGAS,IMIX,IDEAL,ITGAS COMMON/IO/ INP1,INP2,INP3,INP4,IOUT1,IOUT2,IPUN,ISTEP,IPUNCH COMMON/PP/TS(200),PS(200),NPP,INCP COMMON/BESS/ WTPC(BG3), COEFOX(BG3,8), XMW(BG3), 1 NOMOX(BG3),ITOX(BG3),NOOX, SPECOX(BG3,8),MINSOL C C C DECREASE P AT CONSTANT T 65 IF(INCP.EQ.0) GO TO 80 PFLUID = PFLUID + BIT WRITE(IOUT1,904) BIT , PFLUID WRITE(IOUT2,846) BIT Plog = Dlog10(PFLUID) IF(SINC.GT.0..AND.PFLUID.LE.SLIM) GO TO 160 IF(SINC.LT.0..AND.PFLUID.GE.SLIM) GO TO 160 WRITE(IOUT1,628) SLIM, PFLUID WRITE(IOUT2,628) SLIM, PFLUID STOP C C TITRATE SOLIDS AT CONSTANT T 80 IF(MINSOL.EQ.0) GO TO 85 CALL BULK IF(SINC.GT.0..AND.TOTMIX.LE.SLIM) GO TO 160 IF(SINC.LT.0..AND.TOTMIX.GE.SLIM) GO TO 160 WRITE(IOUT1,627) SLIM, TOTMIX WRITE(IOUT2,627) SLIM, TOTMIX STOP C C MIX THE SOLUTION, WITH OR WITHOUT T CHANGE 85 IF(tempC.EQ.0.) GO TO 90 CALL MIXER IF(SINC.GT.0..AND.TOTMIX.GT.SLIM) GO TO 88 IF(SINC.LT.0..AND.TOTMIX.LT.SLIM) GO TO 88 IF(tempC.EQ.temp) GO TO 160 GO TO 100 88 WRITE(IOUT1,627) SLIM, TOTMIX WRITE(IOUT2,627) SLIM, TOTMIX STOP C C CHANGE tempERATURE 90 temp = temp + BIT WRITE(IOUT1,903) BIT , temp WRITE(IOUT2,842) BIT IF(temp.LE.1227.) GO TO 92 WRITE(IOUT1,625) temp WRITE(IOUT2,625) temp STOP 92 IF (OFLAG.NE.0) GO TO 91 FO2 = 0. FO2log = 0. 91 IF(SINC.GT.0..AND.temp.LE.SLIM) GO TO 100 IF(SINC.LT.0..AND.temp.GE.SLIM) GO TO 100 WRITE(IOUT1,626) SLIM,temp WRITE(IOUT2,626) SLIM, temp STOP C C BELOW WE RECALCULATE ALL THERMO DATA IF T OR P WAS CHANGED 100 CONTINUE tempK=temp + 273.15 C* DO 50 I=1,3 C* 50 CVB(I) = CVBCF(I,1)/tempK/tempK + CVBCF(I,2)/tempK + CVBCF(I,3) C* DO 52 I=1,7 C* 52 CVC(I) = CVCCF(I,1)/tempK/tempK + CVCCF(I,2)/tempK + CVCCF(I,3) C* DO 54 I=1,NGAS C* VB(I)= VBCOE(I,1)/tempK/tempK + VBCOE(I,2)/tempK + VBCOE(I,3) C* 54 VC(I)= VCCOE(I,1)/tempK/tempK + VCCOE(I,2)/tempK + VCCOE(I,3) C* C* DO 127 J = 1, 9 C* DO 123 I = 1,5 C*123 COE(I) = XPFC(J,I) C* CALL POWER(COE,temp,AKlog) C* XF(J) = AKlog 127 CONTINUE C RECOMPUTE DERIVED SPECIES DATA WITH NEW T NBSP1 = SAQTOT + 1 DO 107 NS = NBSP1, NST DO 109 I = 1, 5 109 COE(I) = APFCL(NS,I) 110 CALL POWERK(COE,tempK,AKlog) LGK(NS) = AKlog 107 CONTINUE C C THERE ARE TWO WAYS CHANGE P AS F(T): POWER FUNCTION P AS C F(T), WHOSE COEFFICIENTS ARE READ IN GASTHERM; A SET OF GIVEN C P-T POINTS READ FROM AN ACCESSORY FILE (INP3). C IF NEITHER OF THESE OPTIONS ARE USED, P IS CONSTANT. IF(XF(9).NE.0.) PFLUID=XF(9) IF(NPP.NE.0) CALL PRESS(PFLUID,temp) Plog = Dlog10(PFLUID) C HERE WE RECOMPUTE GAS AND MINERAL DATA WITH NEW P AND T DO 117 NM = 1, NMTT DO 111 I = 1, 5 111 COE(I) = BPFCL(NM,I) 114 CALL POWERK(COE,tempK,AKlog) LGKM(NM) = AKlog 117 CONTINUE C C BIT NOT EQUAL TO SINC ONLY IF BACK TITRATION 160 IF(BIT.NE.SINC) GO TO 210 C FRACTIONATION OPTIONS BELOW C NO FRACTIONATON IF(IFRAC.GT.0) GO TO 202 WRITE(IOUT1,907) GO TO 210 C C FRACTIONATES SOLIDS ONLY 202 DO 170 NS = 1, SAQTOT 170 MTOT(NS) = MTOT(NS) - TMIN(NS) WRITE(IOUT1,908) WRITE(IOUT2,908) GO TO 210 C 210 CONTINUE C NEXT TWO STATEMENTS CAUSE MINSAT TO USE THE LOWEST K/Q FOR C MINERAL SELECTION RATHER THAN T-CHANGE TO FIND SINGLE C SUPERSATURATED MINERAL. IF(DABS(BIT).LT..05.AND.(BIT*SINC).LT.0.) LOOC=0 IF (DABS(BIT/SINC).LT..24) LOOC=0 RETURN 625 FORMAT(///5X,'Temperature greater than 1227 C. temp =',F8.3, * /5X,'EXECUTION STOPPED.'//) 626 FORMAT(///5X,'Temperature reached given limit of ',F8.3, * /5X,'Temp = ',F8.3,' EXECUTION STOPPED.'//) 627 FORMAT(///5X,'MIXING FRACTION REACHED GIVEN LIMIT OF ',G10.4, * /5X,'TOTMIX = ',G10.4,' EXECUTION STOPPED.'//) 628 FORMAT(///5X,'PRESSURE REACHED GIVEN LIMIT OF ',F8.3, * /5X,'PFLUID = ',F8.3,' EXECUTION STOPPED.'//) 630 FORMAT(///5X,'ENTHALPY REACHED GIVEN LIMIT OF ',F10.4, * /5X,'ENTH =',F10.4,' EXECUTION STOPPED.'//) C 842 FORMAT(5X,' Next temperature change of ',F8.3,'deg.C.',///) 846 FORMAT(5X,' Next pressure change of ',F8.3,' atm',///) 847 FORMAT(5X,' Next enthalpy change of ',F10.4,'KCAL',/,' TOTAL ', 1' ENTHALPY ADDED (INCL. STARTING ENTHALPY)',F10.4,' KCAL'///) 903 FORMAT (' Temperature changed by ',F8.3,' DEGREES TO ',F8.3,' DE 1GREES C.',/) 904 FORMAT (' PRESSURE CHANGED BY ',F8.3,' ATM TO ',F8.3,' ATM'/) 905 FORMAT (' ENTHALPY CHANGED BY ',F10.4,' KCAL TO ',F10.4,' KCAL'/, 1' TOTAL ENTHALPY ADDED (INCL. STARTING ENTHALPY)',F10.4,' KCAL'/) 907 FORMAT (5X,'SOLIDS AND GASES CARRIED') 908 FORMAT(5X,'SOLIDS ONLY LEFT BEHIND') 909 FORMAT(5X,'GASES ONLY LEFT BEHIND') 910 FORMAT(5X,'SOLIDS AND GASES LEFT BEHIND') END SUBROUTINE MIXER IMPLICIT DOUBLE PRECISION (A-H,O-Z) INTEGER BG1,BG2,BG3,BG4 PARAMETER(BG1=450,BG2=650,BG3=42,BG4=85) DOUBLE PRECISION MTOT,LGK,LGKM INTEGER BSTOT,SPEC,BSTP1 COMMON/OXEN/ MTOT(BG3),COEF(BG2,8),SPEC(BG2,8) COMMON/BULL/BSTOT,BSTP1,JGSTOT COMMON/FROID/ SINC,BIT,SLIM,AKlog,APFCL(BG2,5), 1 BPFCL(BG1,5),XPFC(11,5), XF(11), COE(5), ALG(4), 2 XDH(4),ALK(5),LGK(BG2),temp,tempC, HEATC,COMTOT(BG3), HEATM, 3 TOTMIX,CFH(5),CFT(5),VBCOE(20,3),VCCOE(20,3),CVBCF(3,3), 4 CVCCF(7,3), IFRAC COMMON/MINNIE/ AQM(BG3),ACT(BG2),LGKM(BG1),SCALE(BG1),PFLUID,Plog 1,GASTOT,NMTT,LOOC COMMON/IO/ INP1,INP2,INP3,INP4,IOUT1,IOUT2,IPUN,ISTEP,IPUNCH C C TITRATE MIXER (COOL) SOLUTION INTO ORIGINAL (HOT) SOLUTION WRITE(IOUT1,925) TOTMIX WRITE(IOUT2,925) TOTMIX DO 101 I = 1, BSTOT 101 MTOT(I) = MTOT(I) + BIT * COMTOT(I) IF (temp.EQ.tempC) GO TO 102 temp = (temp*(1+TOTMIX)+tempC*BIT)/(1+TOTMIX+BIT) C Temperature is currently a simple weighted sum of the mixed C comonents. NO ACCOUNT FOR NON-LINEARITIES IN HEAT CAPACITIES C IS TAKEN. 102 TOTMIX=TOTMIX+BIT C WRITE(IOUT2,920) TOTMIX,temp WRITE(IOUT1,920) TOTMIX,temp RETURN C 920 FORMAT(5X,'NEW MIXER FRACTION: ',G10.4,/, 1 5X,'RESULTING tempERATURE: ',F8.3,' DEG.C.'/) 925 FORMAT(/5X,'MIXER FRACTION: ',G10.4,/) END SUBROUTINE BULK C BULK COMPUTES COMPOSITION OF SOLID PHASE IN TERMS OF COMPONENT C SPECIES, GIVEN WT. PERCENTS OF OXIDES, ELEMENTS, OR MINERALS. C IF MINERAL REACTANTS ARE USED, THE MINERAL NAMES SHOULD BE WRITTEN C TO MATCH THE FORM USED IN GASTHERM IF YOU WANT MINSOL = 2 C OPTION TO WORK C IMPLICIT DOUBLE PRECISION (A-H,O-Z) INTEGER BG1,BG2,BG3,BG4 PARAMETER(BG1=450,BG2=650,BG3=42,BG4=85) DOUBLE PRECISION MTOT,MINTRY,LGK INTEGER SPECM, SEQ, QES, SPEC, SPECOX, BSTOT,BSTP1 CHARACTER*8 AMOLE,MIN,NOMOX,TYP DIMENSION SOLMOL(BG3) COMMON/MORRIS/ MIN(BG1),COEFM(BG1,8),MINTRY(BG1),XMOLW 1 (BG1), tempK,NMT,MINCT,SPECM(BG1,8),ITM(BG1),SEQ(BG1),QES(BG1) COMMON/OXEN/ MTOT(BG3),COEF(BG2,8),SPEC(BG2,8) COMMON/BULL/BSTOT,BSTP1,JGSTOT COMMON/FROID/ SINC,BIT,SLIM,AKlog,APFCL(BG2,5), 1 BPFCL(BG1,5),XPFC(11,5), XF(11), COE(5), ALG(4), 2 XDH(4),ALK(5),LGK(BG2),temp,tempC, HEATC,COMTOT(BG3), HEATM, 3 TOTMIX,CFH(5),CFT(5),VBCOE(20,3),VCCOE(20,3),CVBCF(3,3), 4 CVCCF(7,3), IFRAC COMMON/IO/ INP1,INP2,INP3,INP4,IOUT1,IOUT2,IPUN,ISTEP,IPUNCH COMMON/BESS/ WTPC(BG3), COEFOX(BG3,8), XMW(BG3), 1 NOMOX(BG3),ITOX(BG3),NOOX, SPECOX(BG3,8),MINSOL COMMON /GEORGE/ AZERO(BG2),XI, NS, NST C DATA TYP/'GRAMS '/, AMOLE/'MOLES '/ C OLDTOT = TOTMIX TOTMIX = TOTMIX + BIT DO 102 I = 1, BSTOT 102 SOLMOL(I) = 0.0 DO 105 I = 1, NOOX IF(XMW(I).EQ.0.) WRITE(IOUT1,600) NOMOX(I) 600 FORMAT(//5X,'WARNING, MOLECULAR WEIGHT OF REACTANT ',A8,' IS 0.'/ 1 5X,'CHECK MINOX DATA FILE FOR ERRORS OR DOUBLE ENTRIES.'//) OXMOL = BIT * WTPC(I) * .01/XMW(I) IF(MINSOL.GT.2) OXMOL = BIT*WTPC(I)* 0.01 C MINSOL = 1 TITRATION IN GRAMS (SINC IN GRAMS, WTPC IN WT%) C MINSOL = 2 ACTIVATES NON-TITRATION OF EQUILIBRATED REACTANTS C WITH GRAM TITRATION OPTION C MINSOL = 3 TITRATION OF IN MOLES (SINC IN MOLES, WTPC IN MOLE%) C MINSOL = 4 ACTIVATES NON-TITRATION OF EQUIL. REACTANTS W/ MOLE C TITRATION OPTION IF(MINSOL.NE.2.AND.MINSOL.NE.4) GO TO 95 DO 90 J = 1, NMT NM = SEQ(J) IF(NOMOX(I).NE.MIN(NM)) GO TO 90 OXMOL = 0.0 WRITE(IOUT1,900) MIN(NM) WRITE(IOUT2,900) MIN(NM) GO TO 95 90 CONTINUE 900 FORMAT(2H ,'REACTANT ',A8,' NOT TITRATED BECAUSE EQUILIBRATED') C 95 CONTINUE ITOT = ITOX(I) DO 103 IX = 1, ITOT CX = COEFOX(I,IX) JSPX = SPECOX(I,IX) IF(JSPX.EQ.0) GO TO 105 SOLMOL(JSPX) = SOLMOL(JSPX) + CX * OXMOL 103 CONTINUE 105 CONTINUE C WE TITRATE SOLID INTO SOLUTION AND RECALCULATE MASS BALANCE DO 205 I = 1,BSTOT MTOT(I) = MTOT(I) + SOLMOL(I) 205 CONTINUE C IF(MINSOL.GT.2) TYP = AMOLE WRITE(IOUT1,910) BIT, TYP WRITE(IOUT2,910) BIT, TYP WRITE(IOUT2,920) OLDTOT,TYP,TOTMIX,TYP WRITE(IOUT1,920) OLDTOT,TYP,TOTMIX,TYP RETURN C 910 FORMAT(/5X,'NEXT SOLID TITRATION INCREMENT OF: ',F10.6,1X,A8) 920 FORMAT(5X,'CURRENT TOTAL AMOUNT OF SOLID ADDED ',F11.6,1X,A8 1 /5X,'NEW TOTAL AMOUNT OF SOLID ADDED ',F11.6,A8//) END C SUBROUTINE POWER(COE,temp, AKlog) IMPLICIT DOUBLE PRECISION (A-H,O-Z) INTEGER BG1,BG2,BG3,BG4 PARAMETER(BG1=450,BG2=650,BG3=42,BG4=85) DIMENSION COE(5) COMMON/IO/ INP1,INP2,INP3,INP4,IOUT1,IOUT2,IPUN,ISTEP,IPUNCH COMMON/PRECIS/ RMIN, RlogMN, RlogMX AKlog = COE(1) DO 107 I = 1, 4 J = I + 1 AKlog = AKlog + COE(J) * temp**I 107 CONTINUE RETURN END C SUBROUTINE POWERK(COE,tempK,AKlog) IMPLICIT DOUBLE PRECISION (A-H,O-Z) INTEGER BG1,BG2,BG3,BG4 PARAMETER(BG1=450,BG2=650,BG3=42,BG4=85) DIMENSION COE(5) COMMON/IO/ INP1,INP2,INP3,INP4,IOUT1,IOUT2,IPUN,ISTEP,IPUNCH COMMON/PRECIS/ RMIN, RlogMN, RlogMX AKlog = COE(1) AKlog = AKlog + COE(2)/tempK AKlog = AKlog + COE(3)*tempK AKlog = AKlog + COE(4)/tempK**2 AKlog = AKlog + COE(5)*Dlog10(tempK) RETURN END SUBROUTINE SLUD IMPLICIT DOUBLE PRECISION (A-G,O-Z) INTEGER BG1,BG2,BG3,BG4 PARAMETER(BG1=450,BG2=650,BG3=42,BG4=85) COMMON/SLOUGH/ A(BG4,BG4),F(BG4),T(BG4,BG4),IV(BG4),N,ITREF C DO 8100 J=1,N DO 8100 I=1,N T(I,J) = A(I,J) 8100 CONTINUE 8110 CONTINUE C IV(N) = 1 DO 8260 K=1,N PIV = DABS(T(K,K)) IF(K.GE.N) GO TO 8260 C L = K KP1 = K+1 DO 8200 I=KP1,N IF(PIV.GE.DABS(T(I,K))) GO TO 8200 PIV = DABS(T(I,K)) L = I 8200 CONTINUE IV(K) = L C TMP = T(L,K) IF(K.NE.L) GO TO 8210 IF(PIV.GT.0.0) GO TO 8220 IV(N) = 0 GO TO 8260 8210 CONTINUE IV(N) = -IV(N) T(L,K) = T(K,K) T(K,K) = TMP 8220 CONTINUE C TMP = -TMP DO 8230 I=KP1,N T(I,K) = T(I,K)/TMP 8230 CONTINUE C DO 8250 J=KP1,N TMP = T(L,J) T(L,J) = T(K,J) T(K,J) = TMP DO 8240 I=KP1,N T(I,J) = T(I,J) + T(I,K) * TMP 8240 CONTINUE 8250 CONTINUE 8260 CONTINUE IF(PIV.EQ.0.0) IV(N) = 0 RETURN END SUBROUTINE SIR(X) IMPLICIT DOUBLE PRECISION (A-G,O-Z) INTEGER BG1,BG2,BG3,BG4 PARAMETER(BG1=450,BG2=650,BG3=42,BG4=85) DIMENSION X(BG4), B(BG4), R(BG4) COMMON/SLOUGH/ A(BG4,BG4),F(BG4),T(BG4,BG4),IV(BG4),N,ITREF COMMON/IO/ INP1,INP2,INP3,INP4,IOUT1,IOUT2,IPUN,ISTEP,IPUNCH C C B IS THE VECTOR CONTAINING THE RIGHT-HAND SIDE OF THE C SYSTEM OF LINEAR EQUATIONS WHICH IS -F. NOTE THE MINUS SIGN WHICH C IS COMPATIBLE WITH XNEW = XOLD + X IN MAIN (NOTE PLUS SIGN) C DO 150 I=1,N B(I)=-F(I) 150 CONTINUE C IER = 0 DO 8100 I=1,N X(I) = B(I) 8100 CONTINUE IF(IV(N).NE.0) GO TO 8500 C WRITE(IOUT1,915) 915 FORMAT(/,5X,'******** WARNING ********',/,2X, 1'COMPUTATIONAL SINGULARITY, IV(N) = 0.0',/) STOP C 8500 CONTINUE QUOT = 1.0 C CALL SBS(X) IF(ITREF.EQ.0) RETURN 8200 CALL SAXMB(X,B,R) IF(ITREF.EQ.1) RETURN CALL SBS(R) IER = IER+1 IF(ISTEP.EQ.1) WRITE(IOUT1,909) IER 909 FORMAT(5X,' RESIDUAL VECTOR (IER =',I2,')') IF(ISTEP.EQ.1) WRITE(IOUT1,973) (R(I), I=1,N) C XN1 = 0.0 RN1 = 0.0 DO 8210 I=1,N XN1 = XN1 + DABS(X(I)) RN1 = RN1 + DABS(R(I)) X(I) = X(I) - R(I) 8210 CONTINUE C IF(XN1.GT.0.0) RN1 = RN1/XN1 IF((RN1 + RN1).LE.QUOT) GO TO 8220 IER = -IER WRITE(IOUT1,908) 908 FORMAT(2X,'*************** WARNING *******************',/ 1,5X,'THE SYSTEM IS ILL-CONDITIONNED') RETURN 8220 CONTINUE QUOT = RN1 IF(1.0 + SNGL(RN1).NE.1.0) GO TO 8200 RETURN ENTRY DUMP WRITE(IOUT1,923) WRITE(IOUT1,974) N DO 507 I = 1, N WRITE(IOUT1,973) (A(I,J), J = 1, N), F(I) 507 CONTINUE RETURN ENTRY DUMP2 WRITE(IOUT1,910) IER WRITE(IOUT1,922) RETURN 910 FORMAT(5X,'NUMBER OF ITERATIVE REFINEMENTS : ',I4) 922 FORMAT(//) 923 FORMAT (///) 973 FORMAT (2H , 7D11.4) 974 FORMAT (2H , 'MATRIX OF A(I,I), F(I) I=',I2//) END SUBROUTINE SBS(B) IMPLICIT DOUBLE PRECISION (A-G,O-Z) INTEGER BG1,BG2,BG3,BG4 PARAMETER(BG1=450,BG2=650,BG3=42,BG4=85) DIMENSION B(BG4) COMMON/SLOUGH/ A(BG4,BG4),F(BG4),T(BG4,BG4),IV(BG4),N,ITREF C DO 8110 K=1,N IF(K.GE.N) GO TO 8110 L = IV(K) TMP = B(L) B(L) = B(K) B(K) = TMP KP1 = K + 1 DO 8100 I=KP1,N B(I) = B(I) + T(I,K)*TMP 8100 CONTINUE 8110 CONTINUE C K = N 8200 B(K) = B(K)/T(K,K) IF(K.LE.1) RETURN TMP = -B(K) KP1 = K K = K-1 DO 8210 I=1,K B(I) = B(I) + T(I,KP1) *TMP 8210 CONTINUE GO TO 8200 END SUBROUTINE SAXMB(X,B,R) IMPLICIT DOUBLE PRECISION (A-G,O-Z) INTEGER BG1,BG2,BG3,BG4 PARAMETER(BG1=450,BG2=650,BG3=42,BG4=85) DIMENSION X(BG4), B(BG4), R(BG4) COMMON/SLOUGH/ A(BG4,BG4),F(BG4),T(BG4,BG4),IV(BG4),N,ITREF C DO 8110 I=1,N SUM = -B(I) DO 8100 J = 1,N SUM = SUM + A(I,J)*X(J) 8100 CONTINUE R(I) = SUM 8110 CONTINUE RETURN END SUBROUTINE PRESS(P,T) IMPLICIT DOUBLE PRECISION (A-H,O-Z) INTEGER BG1,BG2,BG3,BG4 PARAMETER(BG1=450,BG2=650,BG3=42,BG4=85) C C THIS SUBROUTINE USES THE POINTS OF A GIVEN P-T CURVE, READ C IN INP3, AND INTERPOLATES LINEARLY BETWEEN THE TWO CLOSEST C GIVEN POINTS TO RETURN THE PRESSURE. N.S. ADDED OCT 83 C COMMON/PP/TS(200),PS(200),NPP,INCP COMMON/IO/ INP1,INP2,INP3,INP4,IOUT1,IOUT2,IPUN,ISTEP,IPUNCH C C IF(T.GT.TS(NPP)) RETURN C GET THE APPROXIMATE POSITION OF POINT IN CURVE ARRAY ITEM=IDINT((T-TS(1))*NPP/(TS(NPP)-TS(1)))+1 I=ITEM IF(I.GT.NPP) I=NPP IF(TS(I)-T) 40,30,50 30 P=PS(I) RETURN 40 K=I+1 IF(TS(K).GE.T) GO TO 60 I=K GO TO 40 50 K=I-1 IF(TS(K).LE.T) GO TO 60 I=K GO TO 50 60 CONTINUE P=((T-TS(I))*(PS(K)-PS(I))/(TS(K)-TS(I))) + PS(I) RETURN END C SUBROUTINE PHI(PF) C *****THIS SUBROUTINE IS NOT IN USE AT PRESENT.. IN ORDER TO USE C YOU MUST FIRST ADJUST ALL COMMON BLOCKS AND ARRAY SIZES TO CONFORM C WITH PRESENT GASWORKS VERSION C C* IMPLICIT DOUBLE PRECISION (A-H,O-Z) C* INTEGER BG1,BG2,BG3,BG4 C* PARAMETER(BG1=450,BG2=650,BG3=42,BG4=85) C* CHARACTER*8 MIN C* COMMON/MORRIS/ MIN(BG1),COEFM(BG1,8),MINTRY(BG1),XMOLW C* 1 (BG1), tempK,NMT,MINCT,SPECM(BG1,8),ITM(BG1),SEQ(BG1),QES(BG1) C* COMMON/MORT/MTRY(310),GAMMA(310),WATM,FO2,FO2log,KK C* 1,OFLAG C* COMMON/FUGA/GASlog(20),Y(20),VB(20),VC(20),CVB(3),CVC(7),W1,W2,W3, C* 1 NGAS,IMIX,IDEAL,ITGAS C* COMMON/MORSEL/ GAMIN(BG1),B(BG1),SUMSOL(15),SOLTRY(15), C* 1 DGDN(BG3,20),SOLS(15,20),ISOLS(BG1),LIMSOL,JSOLS(BG1),IST(15) C* COMMON/VAL/BVAL(20), CVAL(20), BMIX, CMIX C* INTEGER SOLS, SPECM, SEQ, QES, OFLAG C* DOUBLE PRECISION MINTRY C* FUNC1(A1,A2,A3) = W1*A1 + W2*A2 + W3*A3 C* FUNC2(A1,A2,A3,A4,A5,A6) = W1*W1*A1 + W2*W2*A2 + W3*W3*A3 C* & + 2.*( W1*W2*A4 + W1*W3*A5 + W2*W3*A6 ) C* C* THIS SUBROUTINE COMPUTES FUGACITY COEFFICIENTS FOR GASES. C* WE ASSUME NON IDEAL MIXING FOR MIXTURES OF H2O, CO2 AND CH4 C* AND IDEAL MIXING FOR THE OTHER GASES. C* SINCE H2O, CO2 AND CH4 GENERALLY ACCOUNT FO 99 PERCENT OF THE C* THE GAS PHASE, THE RESULTING ERROR WHEN COMPUTING GAS COMPOSITIONS C* IS ACCEPTABLE. THE FUGACITY COEFFICIENTS, PHI, FOR H2O, CO2 AND CH C* ARE THEREFORE DEPENDENT ON T, P AND MOLE FRACTION Y OF THESE C* THREE COMPONENTS. PHI FOR OTHER GASES ARE ONLY DEPENDENT ON T AND C* P (PHI OF PURE GAS = PHI OF GAS IN MIXTURE) C* ENTRIES FOR H2O, CO2 AND CH4 GAS HAVE TO BE AT THE TOP OF THE GAS C* LIST IN DATA FILE SOLTHERM, H2O FIRST, CO2 SECOND AND CH4 THIRD. C* FUGACITY COEFFICIENTS FOR H2O, CO2 AND CH4 ARE CALCULATED WITH C* THEIR MOLE FRACTIONS NORMALIZED TO 1 (W1 W2 W3). C* IMIX IS A FLAG WHICH INDICATES WHICH OF THESE THREE GASES ARE C* PRESENT (H2O IS ALWAYS PRESENT) : C* IMIX=3 H2O-CO2-CH4 NON IDEAL MIXING C* IMIX=2 H2O-CO2 (NO CH4) NON IDEAL MIXING C* IMIX=1 H2O ONLY (NO CH4,CO2) IDEAL MIXING WITH OTHER GASES C* C* PHI ARE CALCULATED FROM COMPRESSIBILITY DATA, USING A VIRIAL C* EQUATION IN PRESSURE Z = P*V/R/T = 1 + VB*PF + VC*PF**2. C* FOR NON IDEAL MIXING WE USE Z = ZMIX. FOR A MULTICOMPONENT C* MIXTURE ZMIX = 1 + BMIX*P + CMIX*P*P WHERE BMIX AND CMIX ARE C* EXPRESSED IN TERMS OF CROSS VIRIAL COEFFICIENTS BIJ' AND CIJK'. C* VALUES FOR BIJ'S AND CIJK'S WHERE OBTAINED FROM LEAST SQUARE C* FIT OF PUBLISHED PVT OR SOLUBILITY DATA. PHI(I)'S ARE THEN C* OBTAINED BY TAKING THE APPROPRIATE PARTIAL DERIVATIVES. C* SEE SPYCHER AND REED, IN PREPARATION. C* CROSS VIRIAL COEFFICIENTS ARE ASSIGNED AS FOLLOW (1=H2O, 2=CO2, C* 3=CH4): C* CVB(1) : B12 C* CVB(2) : B13 C* CVB(3) : B23 C* CVC(1) : C112 C* CVC(2) : C122 C* CVC(3) : C113 C* CVC(4) : C133 C* CVC(5) : C223 C* CVC(6) : C233 C* CVC(7) : C123 C* C******** THIS ROUTINE NEEDS SUBROUTINE MIXUP FOR NON IDEAL MIXING C* C******** AS OF FEB 86, BECAUSE OF LACK OF EXPERIMENTAL DATA TO C* TO COMPUTE THESE VALUES, C113, C133 AND C123 ARE SET TO C* ZERO. C* DATA FOR H2O-CH4 IS EXTRAPOLATED ABOVE 100 DEG.C. DATA FOR C* CO2-CH4 IS EXTRAPOLATED ABOVE 240 DEG.C. C******** WATCH ! THE CURRENT PRESSURE LIMIT FOR COMPUTING C* FUGACITY COEFFICIENTS WITH ACCURACY AROUND 1-2% OR LESS C* IS ABOUT 500 ATM FROM 150 TO 300 DEG.C, AND 200 ATM FROM C* FROM 80 TO 150 DEG.C. IN THIS LOWER T RANGE, ERRORS CAN BE C* UP TO 10% AT 500 BARS. NOT RECOMMENDED BELOW C* 75 DEG.C. EXCEPT AT LOW P. H2 DATA IS VALID UP TO C* 1300 BARS FROM 0 TO 600 DEG.C. A SET OF COEFFS VALID ABOVE C* 350 C UP TO 1000 BARS IS AVAILBALE FOR H2O-CO2. SEE SPYCHER C* AND REED, IN PREPARARION. C* C* SEE SOLTHERM DATA FILE FOR SOURCE OF CURRENT DATA FOR PURE AND C* MIXED GASES. C* C* WRITTEN BY N.SPYCHER FEB 86 C* **** LAST REVISED JAN 87. ADD DGDN TO EASE CONVERGENCE IN SOME C* RARE CASES. N.S. C* C* N1=1 C* IF(IDEAL.NE.0.OR.IMIX.EQ.0) GO TO 10 C* CALL MIXUP(VB,VC,CVB,CVC) C* ********** C* N1 = IMIX + 1 C* C* IF IMIX IS 2, BVAL(3) AND CVAL(3) ARE OVERWRITTEN BELOW C* 10 CONTINUE C* IDEAL MIXING C* DO 15 I = N1,NGAS C* BVAL(I) = VB(I) C* 15 CVAL(I) = VC(I) C* C* NOW WE COMPUTE FUGACITY COEFFICIENTS C* DO 20 I=1,NGAS C* VV = BVAL(I)*PF + CVAL(I)*PF*PF/2. C* SKIP IF VV IS TOO SMALL OR TOO LARGE AND KEEP OLD GAMIN VALUE C* IF(DABS(VV).GT. 10.) GO TO 20 C* GAMIN(I) = DEXP(VV) C* B(I) = 1. C* 20 CONTINUE C* C* C-OUT BELOW AND FUNCTIONS ABOVE IF CONVERGENCE PROBLEMS ARISE, C* PARTICULARTLY AT HIGH CO2 MOLE FRAC. IN GAS PHASE C* C* NOW WE COMPUTE DERIVATIVES OF GAMIN W/ RESPECT TO Y (NON IDEAL C* MIXING) TO EASE CONVERGENCE IN MINERA IN SOME RARE CASES. C* SKIP IF: GASES ARE NOT SATURATED, OR IDEAL MIXING. C* IF(ISOLS(1).EQ.0) RETURN C* IF(IDEAL.NE.0.OR.IMIX.EQ.0) RETURN C* SUMY = MINTRY(1) + MINTRY(2) C* IF(IMIX.GT.2) SUMY = SUMY + MINTRY(3) C* D1 = FUNC1(VB(1),CVB(1),CVB(2)) C* D2 = FUNC1(CVB(1),VB(2),CVB(3)) C* D3 = FUNC1(CVB(2),CVB(3),VB(3)) C* D12 = ( 2.*CVB(1) + 2.*BMIX - 2.*D1 - 2.*D2) * PF C* D13 = ( 2.*CVB(2) + 2.*BMIX - 2.*D3 - 2.*D1) * PF C* D23 = ( 2.*CVB(2) + 2.*BMIX - 2.*D1 - 2.*D3) * PF C* E1 = FUNC2(VC(1),CVC(2),CVC(4),CVC(1),CVC(3),CVC(7)) C* E2 = FUNC2(CVC(1),VC(2),CVC(6),CVC(2),CVC(7),CVC(5)) C* E3 = FUNC2(CVC(3),CVC(5),VC(3),CVC(7),CVC(4),CVC(6)) C* E12 = (6.*FUNC1(CVC(1),CVC(2),CVC(7)) + 6.*CMIX - 6.*E1 C* & - 6.*E2) * PF*PF/2. C* E13 = (6.*FUNC1(CVC(3),CVC(7),CVC(4)) + 6.*CMIX - 6.*E1 C* & - 6.*E3) * PF*PF/2. C* E23 = (6.*FUNC1(CVC(7),CVC(5),CVC(6)) + 6.*CMIX - 6.*E2 C* & - 6.*E3) * PF*PF/2. C* C* DGDN(1,1) = GAMIN(1)/SUMY * (( 2.*VB(1) + 2.*BMIX - 4.*D1) * PF C* & + (6.*FUNC1(VC(1),CVC(1),CVC(3)) + 6.*CMIX - 12.*E1)*PF*PF/2.) C* DGDN(1,2) = GAMIN(1)/SUMY * (D12 + E12) C* DGDN(1,3) = GAMIN(1)/SUMY * (D13 + E13) C* C* DGDN(2,1) = GAMIN(2)/SUMY * (D12 + E12) C* DGDN(2,2) = GAMIN(2)/SUMY * (( 2.*VB(2) + 2.*BMIX - 4.*D2) * PF C* & + (6.*FUNC1(CVC(2),VC(2),CVC(5)) + 6.*CMIX - 12.*E2)*PF*PF/2.) C* DGDN(2,3) = GAMIN(2)/SUMY * (D23 + E23) C* C* IF(IMIX.LT.3) RETURN C* DGDN(3,1) = GAMIN(3)/SUMY * (D13 + E13) C* DGDN(3,2) = GAMIN(3)/SUMY * (D23 + E23) C* DGDN(3,3) = GAMIN(3)/SUMY * (( 2.*VB(3) + 2.*BMIX - 4.*D3) * PF C* & + (6.*FUNC1(CVC(4),CVC(6),VC(3)) + 6.*CMIX - 12.*E3)*PF*PF/2.) C* RETURN C* END C* SUBROUTINE MIXUP(B,C,CB,CC) C* IMPLICIT DOUBLE PRECISION (A-H,O-Z) C* INTEGER BG1,BG2,BG3,BG4 C* PARAMETER(BG1=450,BG2=650,BG3=42,BG4=85) C* COMMON/FUGA/GASlog(20),Y(20),VB(20),VC(20),CVB(3),CVC(7),W1,W2,W3, C* 1 NGAS,IMIX,IDEAL,ITGAS C* COMMON/VAL/BVAL(20),CVAL(20),BMIX,CMIX C* DIMENSION B(20),C(20),CB(3),CC(7) C* C* THIS ROUTINE COMPUTES BMIX, CMIX AND THEIR DERIVATIVE WITH C* RESPECT TO WI AT T,P WJ NOT WI CONSTANT. THE RESULTING VALUES C* BVAL AND CVAL ARE THEN USED IN PHI TO CALCULATE FUGACITY COEFFS. C* SEE SUBROUTINE PHI FOR COMMENTS. FOR ENTHALPIES, WE PLUG IN C* VALUES OF DB/DT, DC/DT, ETC. AND THEREFORE WE COMPUTES C* DBMIX/DT, DCMIX/DT ETC. WE THEN USE RESULTING VALUES OF BVAL C* AND CVAL TO COMPUTE ENTHALPIES OF GASES. SEE SUBROUTINE ENTHAL C* B, C ARE 2ND AND 3RD VIRIAL COEFFS; CB, CC ARE 2ND AND 3RD CROSS C* VIRIAL COEFFS AT GIVEN temp. (IF MIXUP IS CALLED FROM ENTHALP C* THEN B ETC.. ARE -T**2 * DB/DT ETC...) C* CROSS VIRIAL COEFFICIENTS ARE ASSIGNED AS FOLLOW AS IN SUBROUTINE C* PHI. C* C* WRITTEN BY NICOLAS SPYCHER, U.OF.O JAN 1986 C* LAST REVISED: FEB 86 BY: N.S C* C* FUNC1(A1,A2,A3) = W1*A1 + W2*A2 + W3*A3 C* FUNC2(A1,A2,A3,A4,A5,A6) = W1*W1*A1 + W2*W2*A2 + W3*W3*A3 C* & + 2.*( W1*W2*A4 + W1*W3*A5 + W2*W3*A6 ) C* C* WE HAVE TO NORMALIZE THE SUM OF THE MOLE FRACTIONS OF H2O,CO2,CH4 C* TO 1 BECAUSE WE IGNORE THE MIXING EFFECTS OF ALL OTHER GASES. C* C* WTOT = Y(1) + Y(2) C* W3=0. C* IF(IMIX.LT.3) GO TO 5 C* WTOT=WTOT+Y(3) C* W3=Y(3)/WTOT C* 5 W1=Y(1)/WTOT C* W2=Y(2)/WTOT C* IF(Y(1).LE.1.D-23) W1 = 0. C* IF(Y(2).LE.1.D-23) W2 = 0. C* IF(Y(3).LE.1.D-23) W3 = 0. C* NON IDEAL MIXING C* C* BMIX = FUNC2(B(1),B(2),B(3),CB(1),CB(2),CB(3)) C* CMIX = W1*W1*W1*C(1) + W2*W2*W2*C(2) + W3*W3*W3*C(3) C* & + 3.*( W1*W1*W2*CC(1) C* & + W1*W2*W2*CC(2) + W1*W1*W3*CC(3) + W1*W3*W3*CC(4) C* & + W2*W2*W3*CC(5) + W2*W3*W3*CC(6) + 2.*W1*W2*W3*CC(7) ) C* BVAL AND CVAL ALSO NEEDED IN PSAT TO SET UP PARTIAL DERIVATIVES C* OF GAMIN WITH RESPECT TO PRESSURE (TO SOLVE FOR SAT. PRESSURE) C* C* Z = 1 + BMIX*P + CMIX*P*P C* BVAL(1) = 2.*FUNC1(B(1),CB(1),CB(2)) - BMIX C* CVAL(1) = 3.*FUNC2(C(1),CC(2),CC(4),CC(1),CC(3),CC(7) ) C* & - 2.*CMIX C* C* BVAL(2) = 2.*FUNC1(CB(1),B(2),CB(3)) - BMIX C* CVAL(2) = 3.*FUNC2(CC(1),C(2),CC(6),CC(2),CC(7),CC(5) ) C* & - 2.*CMIX C* C* BVAL(3) = 2.*FUNC1(CB(2),CB(3),B(3)) - BMIX C* CVAL(3) = 3.*FUNC2(CC(3),CC(5),C(3),CC(7),CC(4),CC(6) ) C* & - 2.*CMIX C* IF IMIX IS 2, BVAL(3) AND CVAL(3) WILL BE OVERWRITTEN C* RETURN C* END C* SUBROUTINE ENTHAL(TC) C* C* IMPLICIT DOUBLE PRECISION (A-H,O-Z) C* INTEGER BG1,BG2,BG3,BG4 C* PARAMETER(BG1=450,BG2=650,BG3=42,BG4=85) C* COMMON/FROID/ SINC,BIT,SLIM,AKlog,APFCL(BG2,5), C* 1 BPFCL(BG1,5),XPFC(11,5), XF(11), COE(5), ALG(4), C* 2 XDH(4),ALK(5),LGK(BG2),temp,tempC, HEATC,COMTOT(BG3), HEATM, C* 3 TOTMIX,CFH(5),CFT(5),VBCOE(20,3),VCCOE(20,3),CVBCF(3,3), C* 4 CVCCF(7,3), IFRAC C* COMMON/FUGA/GASlog(20),Y(20),VB(20),VC(20),CVB(3),CVC(7),W1,W2,W3, C* 1 NGAS,IMIX,IDEAL,ITGAS C* COMMON/VAL/BVAL(20),CVAL(20) C* DIMENSION WATCF1(4),WATCF2(5),DBDT(20),DCDT(20),DCBDT(3),DCCDT(7) C* DOUBLE PRECISION LGK C* DATA WATCF1/2.335628,-.00441813,2.30965D-5,-777.40446/, C* 1 WATCF2/240.912149,-.35584278,.00021415,-7.195396D+4,7.895231D-6/ C* DATA A1,B1,C1/7.17,2.56D-3,.08D+5/, C* 1 A2,B2,C2/10.55,2.16D-3,-2.04D+5/, C* 2 A3,B3,C3,D3/2.975,18.329D-3,.346D+5,-4.303D-6/ C* FUNCTION DHT FROM CP = A + B*T + C/T**2 C* DHT(A,B,C,T) = A*(T-298.15) + B/2.*(T*T-298.15*298.15) - C* 1 C*(1./T - 1./298.15) C* C* THIS SUBROUTINE CALCULATES ENTHALPIES OF WATER, H2O GAS, C* CO2 AND CH4. WATER ENTHALPY IS ASSUMED TO BE PRESSURE C* INDEPENDENT. C* THE ENTHALPY OF WATER FOR A GIVEN tempERATURE IS C* CALCULATED AT THE CORRESPONDING SATURATION PRESSURE. SINCE C* WATER IS NEARLY INCOMPRESSIBLE, THE DIFFERENCE IN ENTHALPY C* AT PRESSURES HIGHER THAN THE SATURATION PRESSURE IS NEGLIGIBLE. C* THE ENTHALPY IS CALCULATED FROM A POWER FUNCTION OF THE C* tempERATURE. C* H(TK) = A + B*TK + C*TK**2 + D/TK + E/TK**2 C* WHERE TK IS THE tempERATURE IN DEG. KELVIN. THE COEFFICIENTS C* A,B,C,D,E WERE LEAST-SQUARE FITTED FROM HELGESON AND KIRKHAM C* 1974 PART I (AJS, 274, TABLE 37,P.1184). THE VALUES OF THESE C* COEFFICIENTS ARE SUCH THAT THE CALCULATED ENTHALPY H(TK) IS C* IN KCAL/MOLE AND IS ZERO AT 0 DEG.C. C* ENTHALPY OF H2O, CO2 AND CH4 GAS: C* THE ENTHALPIES OF THESE GASES ARE CALCULATED FROM HEAT C* CAPACITY DATA (BARIN&KNACKE,1973,1977,THERMOCHEMICAL PROPERTIES C* OF INORGANIC SUBSTANCES, SPRINGER-VERLAG) AND FROM VIRIAL C* COEFFICIENTS (SAME DATA THAT WE USE TO COMPUTE FUGACITY C* COEFFICIENTS, SEE SUBROUTINE PHI). THE ENTHALPY IS THEN: C* H GAS MIXTURE = SUM OF (MOLES(I) * (DH/DT (I) + DH/DP (I))) C* IF IDEAL MIXING, THEN DH/DP IS FOR PURE GAS. IF NO-IDEAL MIXING C* THEN DH/DP IS FOR THE GAS IN THE MIXTURE. C* DHT IS THE CHANGE OF ENTHALPY WITH tempERATURE, CALCULATED FROM C* A MAIER-KELLY HEAT CAPACITY POWER FUNCTION, AND DHP IS THE C* CHANGE WITH PRESSURE, CALCULATED FROM THE FOLLOWING EQUATION: C* DHP = R*TK**2 * ( DB/DT*P + DC/DT*P**2/2 ) C* WHERE B AND C ARE THE SECOND AND THIRD VIRIAL COEFFICIENTS C* OF THE VIRIAL EQ. OF STATE IN PRESSURE. FOR NON IDEAL MIXTURES C* WE TAKE THE APPROPRIATE PARTIAL DERIVATIVES. C* ****** WARNING: DHP MAY BE UP TO 8% IN ERROR AT HIGHER T,P C* HOWEVER THE ERROR IN THE TOTAL ENTHALPY OF THE GASES DOES NOT C* EXEED A FEW PRECENT. MAKE SURE TO RESPECT T,P LIMITS (SEE C* SUBROUTINE PHI). C* ENTHAPIES OF CO2 AND CH4 ARE ZERO AT 0 DEG.C. AND 0 BAR. C* FOR H2O GAS, AT 0 DEG.C. 0.006 BAR, H = ENTH. OF VAPORIZATION. C* (10.77 KCAL/MOLE) C* WRITTEN BY NICOLAS SPYCHER, U.OF.O FEB 86 C* LAST REVISED: BY: C* C* TK=TC + 273.15 C* GETS HEAT OF WATER IF LESS THAN 100 DEG.C. COEFFICIENTS C* WATCF1 VALID ONLY FROM 0 TO 99 DEG.C. C* IF(temp.GE.100.) GO TO 20 C* ENTHW = WATCF1(1) + WATCF1(2)*TK + WATCF1(3)*TK*TK + WATCF1(4)/TK C* GETS HEAT OF WATER IF 100 DEG.C.OR ABOVE. WATCF2 COEFFICIENTS C* VALID FROM 100 TO 350 DEG.C. C* 20 CONTINUE C* ENTHW = WATCF2(1) + WATCF2(2)*TK + WATCF2(3)*TK*TK + WATCF2(4)/TK C* & + WATCF2(5)/TK/TK C* RETURN C* C* ENTRY PFENTH(TC,P) C* *************** C* TK=TC + 273.15 C* GET HEAT OF GASES. 1 H2O; 2 CO2; 3 CH4; C* ENTHM(1)= DHT(A1,B1,C1,TK)/1000. + 10.970 C* ENTHM(2)= DHT(A2,B2,C2,TK)/1000. + .210 C* ENTHM(3)= DHT(A3,B3,C3,TK)/1000. + D3*(TK**3.-298.15**3.)/3000. C* 1 + .210 C* C* IF(IDEAL-1) 53,52,51 C* 51 RETURN C* PREF IS ONE ATM SINCE CP DATA IS AT ONE ATM C* IDEAL MIXING/REAL GAS WE GET DHP FOR PURE GASES THEN ADD TO DHT C* 52 CONTINUE C* DO 50 I=1,IMIX C* DB = 2.*VBCOE(I,1)/TK + VBCOE(I,2) C* DC = 2.*VCCOE(I,1)/TK + VCCOE(I,2) C* DHDP(I) = 1.987 * (DB + DC*P)/1000. C* DHP = 1.987 * (DB*(P-1.) + DC*(P*P-1.)/2.)/1000. C* 50 ENTHM(I) = ENTHM(I) + DHP C* RETURN C* C* 53 CONTINUE C* IF(Y(1).EQ.0.) GO TO 52 C* NON IDEAL MIXING/REAL GAS. WE CALCULATE DHP FOR GAS IN MIXTURE C* THEN ADD TO DHDT. PREF IS ONE ATM SINCE CP DATA IS AT 1 ATM. C* BELOW WE GET VALUES OF T**2 * DB/DT (ALSO FOR C AND CROSS B,C) C* DO 60 I = 1,IMIX C* DBDT(I) = 2.*VBCOE(I,1)/TK + VBCOE(I,2) C* 60 DCDT(I) = 2.*VCCOE(I,1)/TK + VCCOE(I,2) C* DO 62 I = 1,3 C* 62 DCBDT(I) = 2.*CVBCF(I,1)/TK + CVBCF(I,2) C* DO 64 I = 1,7 C* 64 DCCDT(I) = 2.*CVCCF(I,1)/TK + CVCCF(I,2) C* C* CALL MIXUP(DBDT,DCDT,DCBDT,DCCDT) C* ********** C* DO 66 I=1,IMIX C* DHDP(I) = 1.984* (BVAL(I) + CVAL(I)*P)/1000. C* DHP= 1.984* (BVAL(I)*(P-1.) + CVAL(I)*(P*P-1.)/2.)/1000. C* 66 ENTHM(I) = ENTHM(I) + DHP C* RETURN C* END