pychnosz 1.1.12__cp310-cp310-macosx_15_0_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. pychnosz/.dylibs/libgcc_s.1.1.dylib +0 -0
  2. pychnosz/.dylibs/libgfortran.5.dylib +0 -0
  3. pychnosz/.dylibs/libquadmath.0.dylib +0 -0
  4. pychnosz/__init__.py +129 -0
  5. pychnosz/_version.py +34 -0
  6. pychnosz/biomolecules/__init__.py +29 -0
  7. pychnosz/biomolecules/ionize_aa.py +197 -0
  8. pychnosz/biomolecules/proteins.py +595 -0
  9. pychnosz/core/__init__.py +46 -0
  10. pychnosz/core/affinity.py +1256 -0
  11. pychnosz/core/animation.py +593 -0
  12. pychnosz/core/balance.py +334 -0
  13. pychnosz/core/basis.py +716 -0
  14. pychnosz/core/diagram.py +3336 -0
  15. pychnosz/core/equilibrate.py +813 -0
  16. pychnosz/core/equilibrium.py +554 -0
  17. pychnosz/core/info.py +821 -0
  18. pychnosz/core/retrieve.py +364 -0
  19. pychnosz/core/speciation.py +580 -0
  20. pychnosz/core/species.py +599 -0
  21. pychnosz/core/subcrt.py +1696 -0
  22. pychnosz/core/thermo.py +593 -0
  23. pychnosz/core/unicurve.py +1226 -0
  24. pychnosz/data/__init__.py +11 -0
  25. pychnosz/data/add_obigt.py +327 -0
  26. pychnosz/data/extdata/Berman/BDat17_2017.csv +2 -0
  27. pychnosz/data/extdata/Berman/Ber88_1988.csv +68 -0
  28. pychnosz/data/extdata/Berman/Ber90_1990.csv +5 -0
  29. pychnosz/data/extdata/Berman/DS10_2010.csv +6 -0
  30. pychnosz/data/extdata/Berman/FDM+14_2014.csv +2 -0
  31. pychnosz/data/extdata/Berman/Got04_2004.csv +5 -0
  32. pychnosz/data/extdata/Berman/JUN92_1992.csv +3 -0
  33. pychnosz/data/extdata/Berman/SHD91_1991.csv +12 -0
  34. pychnosz/data/extdata/Berman/VGT92_1992.csv +2 -0
  35. pychnosz/data/extdata/Berman/VPT01_2001.csv +3 -0
  36. pychnosz/data/extdata/Berman/VPV05_2005.csv +2 -0
  37. pychnosz/data/extdata/Berman/ZS92_1992.csv +11 -0
  38. pychnosz/data/extdata/Berman/sympy.R +99 -0
  39. pychnosz/data/extdata/Berman/testing/BA96.bib +12 -0
  40. pychnosz/data/extdata/Berman/testing/BA96_Berman.csv +21 -0
  41. pychnosz/data/extdata/Berman/testing/BA96_OBIGT.csv +21 -0
  42. pychnosz/data/extdata/Berman/testing/BA96_refs.csv +6 -0
  43. pychnosz/data/extdata/OBIGT/AD.csv +25 -0
  44. pychnosz/data/extdata/OBIGT/Berman_cr.csv +93 -0
  45. pychnosz/data/extdata/OBIGT/DEW.csv +211 -0
  46. pychnosz/data/extdata/OBIGT/H2O_aq.csv +4 -0
  47. pychnosz/data/extdata/OBIGT/SLOP98.csv +411 -0
  48. pychnosz/data/extdata/OBIGT/SUPCRT92.csv +178 -0
  49. pychnosz/data/extdata/OBIGT/inorganic_aq.csv +729 -0
  50. pychnosz/data/extdata/OBIGT/inorganic_cr.csv +273 -0
  51. pychnosz/data/extdata/OBIGT/inorganic_gas.csv +20 -0
  52. pychnosz/data/extdata/OBIGT/organic_aq.csv +1104 -0
  53. pychnosz/data/extdata/OBIGT/organic_cr.csv +481 -0
  54. pychnosz/data/extdata/OBIGT/organic_gas.csv +268 -0
  55. pychnosz/data/extdata/OBIGT/organic_liq.csv +533 -0
  56. pychnosz/data/extdata/OBIGT/testing/GEMSFIT.csv +43 -0
  57. pychnosz/data/extdata/OBIGT/testing/IGEM.csv +17 -0
  58. pychnosz/data/extdata/OBIGT/testing/Sandia.csv +8 -0
  59. pychnosz/data/extdata/OBIGT/testing/SiO2.csv +4 -0
  60. pychnosz/data/extdata/misc/AD03_Fig1a.csv +69 -0
  61. pychnosz/data/extdata/misc/AD03_Fig1b.csv +43 -0
  62. pychnosz/data/extdata/misc/AD03_Fig1c.csv +89 -0
  63. pychnosz/data/extdata/misc/AD03_Fig1d.csv +30 -0
  64. pychnosz/data/extdata/misc/BZA10.csv +5 -0
  65. pychnosz/data/extdata/misc/HW97_Cp.csv +90 -0
  66. pychnosz/data/extdata/misc/HWM96_V.csv +229 -0
  67. pychnosz/data/extdata/misc/LA19_test.csv +7 -0
  68. pychnosz/data/extdata/misc/Mer75_Table4.csv +42 -0
  69. pychnosz/data/extdata/misc/OBIGT_check.csv +423 -0
  70. pychnosz/data/extdata/misc/PM90.csv +7 -0
  71. pychnosz/data/extdata/misc/RH95.csv +23 -0
  72. pychnosz/data/extdata/misc/RH98_Table15.csv +17 -0
  73. pychnosz/data/extdata/misc/SC10_Rainbow.csv +19 -0
  74. pychnosz/data/extdata/misc/SK95.csv +55 -0
  75. pychnosz/data/extdata/misc/SOJSH.csv +61 -0
  76. pychnosz/data/extdata/misc/SS98_Fig5a.csv +81 -0
  77. pychnosz/data/extdata/misc/SS98_Fig5b.csv +84 -0
  78. pychnosz/data/extdata/misc/TKSS14_Fig2.csv +25 -0
  79. pychnosz/data/extdata/misc/bluered.txt +1000 -0
  80. pychnosz/data/extdata/protein/Cas/Cas_aa.csv +177 -0
  81. pychnosz/data/extdata/protein/Cas/Cas_uniprot.csv +186 -0
  82. pychnosz/data/extdata/protein/Cas/download.R +34 -0
  83. pychnosz/data/extdata/protein/Cas/mkaa.R +34 -0
  84. pychnosz/data/extdata/protein/POLG.csv +12 -0
  85. pychnosz/data/extdata/protein/TBD+05.csv +393 -0
  86. pychnosz/data/extdata/protein/TBD+05_aa.csv +393 -0
  87. pychnosz/data/extdata/protein/rubisco.csv +28 -0
  88. pychnosz/data/extdata/protein/rubisco.fasta +239 -0
  89. pychnosz/data/extdata/protein/rubisco_aa.csv +28 -0
  90. pychnosz/data/extdata/src/H2O92D.f.orig +3457 -0
  91. pychnosz/data/extdata/src/README.txt +5 -0
  92. pychnosz/data/extdata/taxonomy/names.dmp +215 -0
  93. pychnosz/data/extdata/taxonomy/nodes.dmp +63 -0
  94. pychnosz/data/extdata/thermo/Bdot_acirc.csv +60 -0
  95. pychnosz/data/extdata/thermo/buffer.csv +40 -0
  96. pychnosz/data/extdata/thermo/element.csv +135 -0
  97. pychnosz/data/extdata/thermo/groups.csv +6 -0
  98. pychnosz/data/extdata/thermo/opt.csv +2 -0
  99. pychnosz/data/extdata/thermo/protein.csv +506 -0
  100. pychnosz/data/extdata/thermo/refs.csv +343 -0
  101. pychnosz/data/extdata/thermo/stoich.csv.xz +0 -0
  102. pychnosz/data/loader.py +431 -0
  103. pychnosz/data/mod_obigt.py +322 -0
  104. pychnosz/data/obigt.py +471 -0
  105. pychnosz/data/worm.py +228 -0
  106. pychnosz/fortran/.gitignore +6 -0
  107. pychnosz/fortran/__init__.py +16 -0
  108. pychnosz/fortran/h2o92.dylib +0 -0
  109. pychnosz/fortran/h2o92_interface.py +527 -0
  110. pychnosz/geochemistry/__init__.py +21 -0
  111. pychnosz/geochemistry/minerals.py +514 -0
  112. pychnosz/geochemistry/redox.py +500 -0
  113. pychnosz/models/__init__.py +47 -0
  114. pychnosz/models/archer_wang.py +165 -0
  115. pychnosz/models/berman.py +309 -0
  116. pychnosz/models/cgl.py +381 -0
  117. pychnosz/models/dew.py +997 -0
  118. pychnosz/models/hkf.py +523 -0
  119. pychnosz/models/hkf_helpers.py +231 -0
  120. pychnosz/models/iapws95.py +1113 -0
  121. pychnosz/models/supcrt92_fortran.py +238 -0
  122. pychnosz/models/water.py +480 -0
  123. pychnosz/utils/__init__.py +27 -0
  124. pychnosz/utils/expression.py +1074 -0
  125. pychnosz/utils/formula.py +830 -0
  126. pychnosz/utils/formula_ox.py +227 -0
  127. pychnosz/utils/reset.py +33 -0
  128. pychnosz/utils/units.py +259 -0
  129. pychnosz-1.1.12.dist-info/METADATA +197 -0
  130. pychnosz-1.1.12.dist-info/RECORD +133 -0
  131. pychnosz-1.1.12.dist-info/WHEEL +5 -0
  132. pychnosz-1.1.12.dist-info/licenses/LICENSE.txt +19 -0
  133. pychnosz-1.1.12.dist-info/top_level.txt +1 -0
@@ -0,0 +1,3457 @@
1
+ *** H2O92 - Computes state, thermodynamic, transport, and electroststic
2
+ *** properties of fluid H2O at T,[P,D] using equations and data
3
+ *** given by Haar et al. (1984), Levelt Sengers et al. (1983),
4
+ *** Johnson and Norton (1991), Watson et al. (1980), Sengers and
5
+ *** Kamgar-Parsi (1984), Sengers et al. (1984), Helgeson and Kirkham
6
+ *** (1974), Uematsu and Franck (1980), and Pitzer (1983).
7
+ ***
8
+ ***********************************************************************
9
+ ***
10
+ *** Author: James W. Johnson
11
+ *** Earth Sciences Dept., L-219
12
+ *** Lawrence Livermore National Laboratory
13
+ *** Livermore, CA 94550
14
+ *** johnson@s05.es.llnl.gov
15
+ ***
16
+ *** Abandoned: 8 November 1991
17
+ ***
18
+ ***********************************************************************
19
+ *
20
+ * specs - Input unit, triple point, saturation, and option specs:
21
+ *
22
+ ***** it, id, ip, ih, itripl, isat, iopt, useLVS, epseqn, icrit;
23
+ *
24
+ * note that the returned value of isat may differ from
25
+ * its input value and that icrit need not be specified
26
+ * prior to invocation.
27
+ *
28
+ *
29
+ * states - State variables:
30
+ *
31
+ ***** temp, pres, dens(1), dens(2);
32
+ *
33
+ * note that the first three of these must be specified prior
34
+ * to invocation and that, in the case of saturation, vapor
35
+ * density is returned in dens(1), liquid in dens(2).
36
+ *
37
+ *
38
+ * props - Thermodynamic, transport, electrostatic, and combined
39
+ * property values:
40
+ *
41
+ ***** A, G, S, U, H, Cv, Cp, Speed, alpha, beta, diel, visc,
42
+ ***** tcond, surten, tdiff, Prndtl, visck, albe,
43
+ ***** ZBorn, YBorn, QBorn, daldT, XBorn
44
+ *
45
+ *
46
+ * error - LOGICAL argument that indicates success ("FALSE") or
47
+ * failure ("TRUE") of the call, the latter value in
48
+ * response to out-of-bounds specs or states variables.
49
+ *
50
+ ***********************************************************************
51
+
52
+ SUBROUTINE H2O92(specs,states,props,error)
53
+
54
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
55
+
56
+ PARAMETER (NPROP = 23, NPROP2 = 46)
57
+
58
+ INTEGER specs(10)
59
+ DOUBLE PRECISION states(4), props(NPROP2), Dens(2),
60
+ 1 wpliq(NPROP), wprops(NPROP)
61
+ LOGICAL crtreg, valid, error, useLVS
62
+
63
+ COMMON /units/ ft, fd, fvd, fvk, fs, fp, fh, fst, fc
64
+ COMMON /wpvals/ wprops, wpliq
65
+
66
+ SAVE
67
+
68
+
69
+ CALL unit(specs(1),specs(2),specs(3),specs(4),specs(5))
70
+
71
+ IF (.NOT. (valid(specs(1),specs(2),specs(3),specs(4),specs(5),
72
+ 1 specs(6),specs(7),specs(8),specs(9),
73
+ 2 states(1),states(2),states(3)))) THEN
74
+ error = .TRUE.
75
+ RETURN
76
+ ELSE
77
+ error = .FALSE.
78
+ END IF
79
+
80
+ IF (crtreg(specs(6),specs(7),specs(1),
81
+ 1 states(1),states(2),states(3))) THEN
82
+ specs(10) = 1
83
+ useLVS = (specs(8) .EQ. 1)
84
+ ELSE
85
+ specs(10) = 0
86
+ useLVS = .FALSE.
87
+ END IF
88
+
89
+
90
+ IF (useLVS) THEN
91
+ Dens(1) = states(3)
92
+ CALL LVSeqn(specs(6),specs(7),specs(5),
93
+ 1 states(1),states(2),Dens,specs(9))
94
+ Dens(1) = Dens(1) / 1.0d3
95
+ IF (specs(6) .EQ. 1) THEN
96
+ Dens(2) = Dens(2) / 1.0d3
97
+ END IF
98
+ ELSE
99
+ Dens(1) = states(3) / 1.0d3
100
+ CALL HGKeqn(specs(6),specs(7),specs(5),
101
+ 1 states(1),states(2),Dens,specs(9))
102
+ END IF
103
+
104
+ CALL load(1,wprops,props)
105
+
106
+ IF (specs(6) .EQ. 1) THEN
107
+ tempy = Dens(1)
108
+ Dens(1) = Dens(2)
109
+ Dens(2) = tempy
110
+ CALL load(2,wpliq,props)
111
+ END IF
112
+
113
+ states(1) = TdegUS(specs(1),states(1))
114
+ states(2) = states(2) * fp
115
+ states(3) = Dens(1) / fd
116
+
117
+ IF (specs(6) .EQ. 1) THEN
118
+ states(4) = Dens(2) / fd
119
+ END IF
120
+
121
+ RETURN
122
+ END
123
+
124
+ ************************************************************************
125
+
126
+ *** valid - Returns "TRUE" if unit and equation specifications
127
+ * are valid and input state conditions fall within
128
+ * the HGK equation's region of validity;
129
+ * returns "FALSE" otherwise.
130
+
131
+ LOGICAL FUNCTION valid(it,id,ip,ih,itripl,isat,iopt,
132
+ 1 useLVS,epseqn,Temp,Pres,Dens)
133
+
134
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
135
+
136
+ INTEGER useLVS, epseqn
137
+ LOGICAL valspc, valTD, valTP
138
+
139
+ COMMON /tolers/ TTOL, PTOL, DTOL, XTOL, EXPTOL, FPTOL
140
+ COMMON /units/ ft, fd, fvd, fvk, fs, fp, fh, fst, fc
141
+ COMMON /crits/ Tc, rhoC, Pc, Pcon, Ucon, Scon, dPcon
142
+ COMMON /tpoint/ Utr, Str, Htr, Atr, Gtr,
143
+ 1 Ttr, Ptripl, Dltrip, Dvtrip
144
+ COMMON /HGKbnd/ Ttop, Tbtm, Ptop, Pbtm, Dtop, Dbtm
145
+ COMMON /liqice/ sDli1, sPli1, sDli37, sPli37, sDIB30,
146
+ 1 Tli13, Pli13, Dli13, TnIB30, DnIB30
147
+
148
+ SAVE
149
+
150
+
151
+ *** ensure validity of input specifications
152
+ IF (.NOT. valspc(it,id,ip,ih,itripl,isat,iopt,
153
+ 1 useLVS,epseqn)) THEN
154
+ valid = .FALSE.
155
+ RETURN
156
+ END IF
157
+
158
+ *** convert to degC, bars, g/cm3 ***
159
+ T = TdegK(it,Temp) - 273.15d0
160
+ D = Dens * fd
161
+ P = Pres / fp * 1.0d1
162
+ Ttripl = Ttr - 273.15d0
163
+ Tcrit = Tc - 273.15d0
164
+ Pcrit = Pc * 1.0d1
165
+
166
+ IF (isat .EQ. 0) THEN
167
+ IF (iopt .EQ. 1) THEN
168
+ valid = valTD(T,D,isat,epseqn)
169
+ ELSE
170
+ valid = valTP(T,P)
171
+ END IF
172
+ ELSE
173
+ IF (iopt .EQ. 1) THEN
174
+ valid = ((T+FPTOL .GE. Ttripl) .AND.
175
+ 1 (T-FPTOL .LE. Tcrit))
176
+ ELSE
177
+ valid = ((P+FPTOL .GE. Ptripl) .AND.
178
+ 1 (P-FPTOL .LE. Pcrit))
179
+ END IF
180
+ END IF
181
+
182
+ RETURN
183
+ END
184
+
185
+ *****************************************************************
186
+
187
+ *** valspc - Returns "TRUE" if it, id, ip, ih, itripl, isat, iopt,
188
+ * useLVS, and epseqn values all define valid input;
189
+ * returns "FALSE" otherwise.
190
+
191
+ LOGICAL FUNCTION valspc(it,id,ip,ih,itripl,isat,iopt,
192
+ 1 useLVS,epseqn)
193
+
194
+ INTEGER useLVS, epseqn
195
+
196
+ SAVE
197
+
198
+
199
+ valspc = (1 .LE. it) .AND. (it .LE. 4) .AND.
200
+ 1 (1 .LE. id) .AND. (id .LE. 4) .AND.
201
+ 2 (1 .LE. ip) .AND. (ip .LE. 5) .AND.
202
+ 3 (1 .LE. ih) .AND. (ih .LE. 6) .AND.
203
+ 4 (0 .LE. itripl) .AND. (itripl .LE. 1) .AND.
204
+ 5 (0 .LE. isat) .AND. (isat .LE. 1) .AND.
205
+ 6 (1 .LE. iopt) .AND. (iopt .LE. 2) .AND.
206
+ 7 (0 .LE. useLVS) .AND. (useLVS .LE. 1) .AND.
207
+ 8 (1 .LE. epseqn) .AND. (epseqn .LE. 5)
208
+
209
+ RETURN
210
+ END
211
+
212
+ *****************************************************************
213
+
214
+ *** valTD - Returns "TRUE" if T-D defines liquid or vapor H2O
215
+ * within validity limits of the HGK equation of state;
216
+ * returns "FALSE" otherwise.
217
+
218
+ LOGICAL FUNCTION valTD(T,D,isat,epseqn)
219
+
220
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
221
+
222
+ INTEGER epseqn
223
+
224
+ COMMON /tolers/ TTOL, PTOL, DTOL, XTOL, EXPTOL, FPTOL
225
+ COMMON /aconst/ wm, gascon, tz, aa, zb, dzb, yb, uref, sref
226
+ COMMON /RTcurr/ rt
227
+ COMMON /crits/ Tc, rhoC, Pc, Pcon, Ucon, Scon, dPcon
228
+ COMMON /tpoint/ Utr, Str, Htr, Atr, Gtr,
229
+ 1 Ttr, Ptripl, Dltrip, Dvtrip
230
+ COMMON /HGKbnd/ Ttop, Tbtm, Ptop, Pbtm, Dtop, Dbtm
231
+ COMMON /liqice/ sDli1, sPli1, sDli37, sPli37, sDIB30,
232
+ 1 Tli13, Pli13, Dli13, TnIB30, DnIB30
233
+ COMMON /coefs/ a(20), q(20), x(11)
234
+ COMMON /satur/ Dliq, Dvap, DH2O, iphase
235
+
236
+ SAVE
237
+
238
+ EQUIVALENCE (TmnLVS, x(1))
239
+
240
+
241
+ IF ((T-FPTOL .GT. Ttop) .OR. (T+FPTOL .LT. Tbtm) .OR.
242
+ 1 (D-FPTOL .GT. Dtop) .OR. (D+FPTOL .LT. Dbtm)) THEN
243
+ valTD = .FALSE.
244
+ RETURN
245
+ END IF
246
+
247
+ Tcrit = Tc - 273.15d0
248
+ Ttripl = Ttr - 273.15d0
249
+
250
+ IF ((T+FPTOL .GE. Tcrit) .OR.
251
+ 1 ((T .GE. TnIB30) .AND. (D .GE. Dltrip))) THEN
252
+ Dlimit = sDIB30 * (T-TnIB30) + Dtop
253
+ valTD = (D-FPTOL .LE. Dlimit)
254
+ ELSE
255
+ IF (D-FPTOL .LE. Dltrip) THEN
256
+ IF (T .GE. Ttripl) THEN
257
+ valTD = .TRUE.
258
+ Tk = T + 273.15d0
259
+ IF (Tk .LT. TmnLVS) THEN
260
+ rt = gascon * Tk
261
+ CALL pcorr(0,Tk,Ps,Dl,Dv,epseqn)
262
+ ELSE
263
+ istemp = 1
264
+ DH2O = 0.0d0
265
+ P = Pfind(istemp,Tk,DH2O)
266
+ CALL denLVS(istemp,Tk,P)
267
+ Dv = Dvap / 1.0d3
268
+ Dl = Dliq / 1.0d3
269
+ END IF
270
+ IF ((D .GE. Dv) .AND. (D. LE. Dl)) THEN
271
+ isat = 1
272
+ END IF
273
+ ELSE
274
+ P = Psublm(T)
275
+ PMPa = P / 1.0d1
276
+ Tk = T + 273.15d0
277
+ Dguess = PMPa / Tk / 0.4d0
278
+ rt = gascon * Tk
279
+ CALL bb(Tk)
280
+ CALL denHGK(Dsublm,PMPa,Dguess,Tk,dPdD)
281
+ valTD = (D-FPTOL .LE. Dsublm)
282
+ END IF
283
+ ELSE
284
+ IF (D .LE. Dli13) THEN
285
+ Dlimit = sDli1 * (T-Tli13) + Dli13
286
+ valTD = (D+FPTOL .GE. Dlimit)
287
+ ELSE
288
+ Dlimit = sDli37 * (T-Tli13) + Dli13
289
+ valTD = (D-FPTOL .LE. Dlimit)
290
+ END IF
291
+ END IF
292
+ END IF
293
+
294
+ RETURN
295
+ END
296
+
297
+ *****************************************************************
298
+
299
+ *** valTP - Returns "TRUE" if T-P defines liquid or vapor H2O
300
+ * within validity limits of the HGK equation of state;
301
+ * returns "FALSE" otherwise.
302
+
303
+ LOGICAL FUNCTION valTP(T,P)
304
+
305
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
306
+
307
+ COMMON /tolers/ TTOL, PTOL, DTOL, XTOL, EXPTOL, FPTOL
308
+ COMMON /crits/ Tcrit, rhoC, Pc, Pcon, Ucon, Scon, dPcon
309
+ COMMON /tpoint/ Utr, Str, Htr, Atr, Gtr,
310
+ 1 Ttr, Ptripl, Dltrip, Dvtrip
311
+ COMMON /HGKbnd/ Ttop, Tbtm, Ptop, Pbtm, Dtop, Dbtm
312
+ COMMON /liqice/ sDli1, sPli1, sDli37, sPli37, sDIB30,
313
+ 1 Tli13, Pli13, Dli13, TnIB30, DnIB30
314
+
315
+ SAVE
316
+
317
+
318
+ IF ((T-FPTOL .GT. Ttop) .OR. (T+FPTOL .LT. Tbtm) .OR.
319
+ 1 (P-FPTOL .GT. Ptop) .OR. (P+FPTOL .LT. Pbtm)) THEN
320
+ valTP = .FALSE.
321
+ RETURN
322
+ ELSE
323
+ valTP = .TRUE.
324
+ END IF
325
+
326
+ IF (P .GE. Pli13) THEN
327
+ Plimit = sPli37 * (T-Tli13) + Pli13
328
+ valTP = (P-FPTOL .LE. Plimit)
329
+ ELSE
330
+ IF (P .GE. Ptripl) THEN
331
+ Plimit = sPli1 * (T-Tli13) + Pli13
332
+ valTP = (P+FPTOL .GE. Plimit)
333
+ ELSE
334
+ Psubl = Psublm(T)
335
+ valTP = (P-FPTOL .LE. Psubl)
336
+ END IF
337
+ END IF
338
+
339
+ RETURN
340
+ END
341
+
342
+ *****************************************************************
343
+
344
+ *** Psublm - Returns Psublimation(T) computed from the
345
+ * equation given by Washburn (1924): Monthly
346
+ * Weather Rev., v.52, pp.488-490.
347
+
348
+ DOUBLE PRECISION FUNCTION Psublm(Temp)
349
+
350
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
351
+
352
+ SAVE
353
+
354
+
355
+ T = Temp + 2.731d2
356
+
357
+ PmmHg = power(1.0d1, (-2.4455646d3/T + 8.2312d0*DLOG10(T) -
358
+ 1 1.677006d-2*T + 1.20514d-5*T*T - 6.757169d0))
359
+
360
+ *** convert mmHg to bars ***
361
+ Psublm = PmmHg * 1.33322d-3
362
+
363
+ RETURN
364
+ END
365
+
366
+ ************************************************************************
367
+
368
+ *** HGKcon - Constant parameters for the H2O equation of state
369
+ * given by Haar, Gallagher, & Kell (1984):
370
+ * bp, bq = b(j), B(j) from Table A.1, p.272
371
+ * g1, g2, gf = alpha, beta, gamma from eq (A.2), p.272
372
+ * g, ii, jj = g(i), k(i), l(i) from eq (A.5), p.272.
373
+ * Note that tz < tcHGK.
374
+ * Tolerence limits required in various real & inexact
375
+ * comparisons are set and stored in COMMON /tolers/.
376
+
377
+
378
+ BLOCK DATA HGKcon
379
+
380
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
381
+
382
+ COMMON /aconst/ wm, gascon, tz, aa, zb, dzb, yb, uref, sref
383
+ COMMON /nconst/ g(40), ii(40), jj(40), nc
384
+ COMMON /ellcon/ g1, g2, gf, b1, b2, b1t, b2t, b1tt, b2tt
385
+ COMMON /bconst/ bp(10), bq(10)
386
+ COMMON /addcon/ atz(4), adz(4), aat(4), aad(4)
387
+ COMMON /HGKcrt/ tcHGK, dcHGK, pcHGK
388
+ COMMON /tolers/ TTOL, PTOL, DTOL, XTOL, EXPTOL, FPTOL
389
+ COMMON /HGKbnd/ Ttop, Tbtm, Ptop, Pbtm, Dtop, Dbtm
390
+ COMMON /liqice/ sDli1, sPli1, sDli37, sPli37, sDIB30,
391
+ 1 Tli13, Pli13, Dli13, TnIB30, DnIB30
392
+ COMMON /tpoint/ Utripl, Stripl, Htripl, Atripl, Gtripl,
393
+ 1 Ttripl, Ptripl, Dltrip, Dvtrip
394
+
395
+ SAVE
396
+
397
+ DATA Ttripl, Ptripl, Dltrip, Dvtrip
398
+ 1 / 2.7316d2,
399
+ 2 0.611731677193563186622762580414d-2,
400
+ 3 0.999778211030936587977889295063d0,
401
+ 4 0.485467583448287303988319166423d-5 /
402
+
403
+ DATA Ttop, Tbtm, Ptop, Pbtm, Dtop, Dbtm
404
+ 1 / 2.25d3, -2.0d1, 3.0d4, 1.0d-3,
405
+ 2 0.138074666423686955066817336896d1,
406
+ 3 0.858745555396173972667420987465d-7 /
407
+
408
+ DATA sDli1, sPli1, sDli37, sPli37, sDIB30,
409
+ 1 Tli13, Pli13, Dli13, TnIB30, DnIB30
410
+ 2 / -0.584797401732178547634910059828d-2,
411
+ 3 -0.138180804975562958027981345769d3,
412
+ 4 0.183244000000000000000000000007d-2,
413
+ 5 0.174536874999999999999999999995d3,
414
+ 6 -0.168375439429928741092636579574d-3,
415
+ 7 -0.15d2,
416
+ 8 0.20741d4,
417
+ 9 0.108755631570602617113573577945d1,
418
+ 1 0.145d3,
419
+ 1 0.102631640581853166397515716306d1 /
420
+
421
+
422
+ DATA TTOL, PTOL, DTOL, XTOL, EXPTOL, FPTOL
423
+ 1 / 1.0d-6, 1.0d-6, 1.0d-9, 1.0d-5, -673.5d0, 1.0d-7 /
424
+
425
+ DATA tcHGK, dcHGK, pcHGK / .647126d3, .322d3, .22055d2 /
426
+
427
+ DATA atz /.64d3, .64d3, .6416d3, .27d3/
428
+ DATA adz /.319d0, .319d0, .319d0, .155d1/
429
+ DATA aat /.2d5, .2d5, .4d5, .25d2/
430
+ DATA aad /.34d2, .4d2, .3d2, .105d4/
431
+
432
+ DATA wm, gascon, tz, aa, uref, sref
433
+ 1 / .1801520000d2, .46152200d0, .647073d3, .1d1,
434
+ 2 -.4328455039d4, .76180802d1 /
435
+
436
+ DATA g1, g2, gf /.11d2, .44333333333333d2, .35d1/
437
+
438
+ DATA bp / .7478629d0, -.3540782d0, 2*.0d0, .7159876d-2,
439
+ 1 .0d0, -.3528426d-2, 3*.0d0/
440
+
441
+ DATA bq / .11278334d1, .0d0, -.5944001d0, -.5010996d1, .0d0,
442
+ 1 .63684256d0, 4*.0d0/
443
+
444
+ DATA nc / 36 /
445
+
446
+ DATA g /-.53062968529023d3, .22744901424408d4, .78779333020687d3
447
+ 1, -.69830527374994d2, .17863832875422d5, -.39514731563338d5
448
+ 2, .33803884280753d5, -.13855050202703d5, -.25637436613260d6
449
+ 3, .48212575981415d6, -.34183016969660d6, .12223156417448d6
450
+ 4, .11797433655832d7, -.21734810110373d7, .10829952168620d7
451
+ 5, -.25441998064049d6, -.31377774947767d7, .52911910757704d7
452
+ 6, -.13802577177877d7, -.25109914369001d6, .46561826115608d7
453
+ 7, -.72752773275387d7, .41774246148294d6, .14016358244614d7
454
+ 8, -.31555231392127d7, .47929666384584d7, .40912664781209d6
455
+ 9, -.13626369388386d7, .69625220862664d6, -.10834900096447d7
456
+ a, -.22722827401688d6, .38365486000660d6, .68833257944332d4
457
+ b, .21757245522644d5, -.26627944829770d4, -.70730418082074d5
458
+ c, -.22500000000000d0, -.16800000000000d1
459
+ d, .5500000000000d-1, -.93000000000000d2/
460
+
461
+ DATA ii / 4*0, 4*1, 4*2, 4*3, 4*4, 4*5, 4*6, 4*8, 2*2, 0, 4,
462
+ 1 3*2, 4/
463
+
464
+ DATA jj / 2, 3, 5, 7, 2, 3, 5, 7, 2, 3, 5, 7, 2, 3, 5, 7,
465
+ 1 2, 3, 5, 7, 2, 3, 5, 7, 2, 3, 5, 7, 2, 3, 5, 7,
466
+ 2 1, 4, 4, 4, 0, 2, 0, 0/
467
+
468
+ END
469
+
470
+ *********************************************************************
471
+
472
+ *** LVScon - Constant parameters for the H2O critical region equation
473
+ * of state given by Levelt Sengers, Kamgar-Parsi, Balfour,
474
+ * & Sengers (1983).
475
+
476
+ BLOCK DATA LVScon
477
+
478
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
479
+
480
+ COMMON /crits/ Tc, rhoC, Pc, Pcon, Ucon, Scon, dPcon
481
+ COMMON /coefs/ a(20), q(20), x(11)
482
+
483
+ SAVE
484
+
485
+ DATA Tc, rhoC, Pc, Pcon, Ucon, Scon, dPcon
486
+ 1 / 647.067d0, 322.778d0, 22.046d0,
487
+ 2 0.034070660379837018423130834983d0, 22046.0d0,
488
+ 3 0.034070660379837018423130834983d3,
489
+ 4 0.000000327018783663660700780197d0 /
490
+
491
+ DATA a / -0.017762d0, 5.238000d0, 0.000000d0, -2.549150d1,
492
+ 1 6.844500d0, 0.325000d0, 1.440300d0, 0.000000d0,
493
+ 2 1.375700d0, 2.366660d1, 4.820000d0, 0.294200d0,
494
+ 3 -1.123260d1, -2.265470d1, -1.788760d1, -4.933200d0,
495
+ 4 1.109430391161019373812391218008d0,
496
+ 5 -1.981395981400671095301629432211d0,
497
+ 6 0.246912528778663959151808173743d0,
498
+ 7 -0.843411332867484343974055795059d0 /
499
+
500
+ DATA q / -0.006000d0, -0.003000d0, 0.000000d0, 6.470670d2,
501
+ 1 3.227780d2, 2.204600d1, 0.267000d0, -1.600000d0,
502
+ 2 0.491775937675717720291497417773d0, 0.108500d0,
503
+ 3 0.586534703230779473334597524774d0,
504
+ 4 -1.026243389120214352553706598564d0,
505
+ 5 0.612903225806451612903225804745d0, 0.500000d0,
506
+ 6 -0.391500d0, 0.825000d0, 0.741500d0,
507
+ 7 0.103245882826119154987166286332d0,
508
+ 8 0.160322434159191991394857495360d0,
509
+ 9 -0.169859514687100893997445721324d0 /
510
+
511
+ DATA x / 6.430000d2, 6.453000d2, 6.950000d2,
512
+ 1 1.997750d2, 4.200400d2,
513
+ 2 2.09945691135940719075293945960d1,
514
+ 3 2.15814057875264119875397458907d1,
515
+ 4 3.0135d1, 4.0484d1,
516
+ 5 .175777517046267847932127026995d0,
517
+ 6 .380293646126229135059562456934d0 /
518
+
519
+
520
+ * EQUIVALENCE (cc, a(1) ), (pointA, q(1) ), (Tmin1, x(1)),
521
+ * 1 (p3, a(2) ), (pointB, q(2) ), (Tmin2, x(2)),
522
+ * 2 (delroc, a(3) ), (delpc, q(3) ), (Tmax, x(3)),
523
+ * 3 (p2, a(4) ), (Tc, q(4) ), (Dmin, x(4)),
524
+ * 4 (p1, a(5) ), (rhoc, q(5) ), (Dmax, x(5)),
525
+ * 5 (beta, a(6) ), (Pc, q(6) ), (Pmin1, x(6)),
526
+ * 6 (xko, a(7) ), (dPcdTc, q(7) ), (Pmin2, x(7)),
527
+ * 7 (delTc, a(8) ), (slopdi, q(8) ), (Pmax1, x(8)),
528
+ * 8 (besq, a(9) ), (p11, q(9) ), (Pmax2, x(9)),
529
+ * 9 (aa, a(10)), (alpha, q(10)), (sl1, x(10)),
530
+ * 0 (delta, a(11)), (p00, q(11)), (sl2, x(11)),
531
+ * 1 (k1, a(12)), (p20, q(12)),
532
+ * 2 (muc, a(13)), (p40, q(13)),
533
+ * 3 (mu1, a(14)), (deli, q(14)),
534
+ * 4 (mu2, a(15)), (alh1, q(15)),
535
+ * 5 (mu3, a(16)), (beti, q(16)),
536
+ * 6 (s00, a(17)), (gami, q(17)),
537
+ * 7 (s20, a(18)), (p01, q(18)),
538
+ * 8 (s01, a(19)), (p21, q(19)),
539
+ * 9 (s21, a(20)), (p41, q(20))
540
+
541
+ END
542
+
543
+ *******************************************************************
544
+
545
+ *** unit - Sets internal parameters according to user-specified
546
+ * choice of units. Internal program units are degK(T),
547
+ * and gm/cm**3(D); all other properties are computed in
548
+ * dimensionless form and dimensioned at output time.
549
+ * NOTE: conversion factors for j/g ---> cal/(g,mole)
550
+ * (ffh (4 & 5)) are consistent with those given in
551
+ * Table 1, Helgeson & Kirkham (1974a) for thermal calories,
552
+ * and differ slightly with those given by Haar et al (1984)
553
+ * for international calories.
554
+
555
+ SUBROUTINE unit(it,id,ip,ih,itripl)
556
+
557
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
558
+
559
+ DOUBLE PRECISION fft(4), ffd(4), ffvd(4), ffvk(4),
560
+ 1 ffs(4), ffp(5), ffh(6),
561
+ 2 ffst(4), ffcd(4), ffch(6)
562
+
563
+ COMMON /units/ ft, fd, fvd, fvk, fs, fp, fh, fst, fc
564
+
565
+ SAVE
566
+
567
+ DATA fft /1.0d0, 1.0d0, 0.555555556d0, 0.555555556d0 /
568
+ DATA ffd /1.0d-3, 1.0d0, 1.80152d-2, 1.6018d-2/
569
+ DATA ffvd /1.0d0, 1.0d1, 0.555086816d0, 0.671968969d0 /
570
+ DATA ffvk /1.0d0, 1.0d4, 1.0d4, 1.076391042d1 /
571
+ DATA ffs /1.0d0, 1.0d2, 1.0d2, 3.280833d0 /
572
+ DATA ffp /1.0d0, 1.0d1, 9.869232667d0, 1.45038d2, 1.01971d1/
573
+ DATA ffh /1.0d0, 1.0d0, 1.80152d1, 2.3901d-1,
574
+ 1 4.305816d0, 4.299226d-1/
575
+ DATA ffst /1.0d0, 1.0d3, 0.555086816d2, 0.2205061d1 /
576
+ DATA ffcd /1.0d0, 1.0d-2, 1.0d-2, 0.3048d0 /
577
+ DATA ffch /1.0d-3, 1.0d0, 1.0d0, 0.23901d0,
578
+ 1 0.23901d0, 0.947244d-3 /
579
+
580
+
581
+ ft = fft(it)
582
+ fd = ffd(id)
583
+ fvd = ffvd(id)
584
+ fvk = ffvk(id)
585
+ fs = ffs(id)
586
+ fp = ffp(ip)
587
+ fh = ffh(ih)
588
+ fst = ffst(id)
589
+ fc = ffcd(id) * ffch(ih)
590
+
591
+ IF (itripl .EQ. 1) CALL tpset
592
+
593
+ RETURN
594
+
595
+ END
596
+
597
+ ***********************************************************************
598
+
599
+ *** crtreg - Returns "TRUE" if input state conditions fall within
600
+ * the critical region of H2O; otherwise returns "FALSE".
601
+ * T, P, D, input in user-specified units, are returned in
602
+ * degK, MPa, kg/m3.
603
+
604
+ LOGICAL FUNCTION crtreg(isat,iopt,it,T,P,D)
605
+
606
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
607
+
608
+ LOGICAL llim, ulim
609
+
610
+ COMMON /crits/ Tc, rhoc, Pc, Pcon, Ucon, Scon, dPcon
611
+ COMMON /coefs/ a(20), q(20), x(11)
612
+ COMMON /units/ ft, fd, fvd, fvk, fs, fp, fh, fst, fc
613
+
614
+ SAVE
615
+
616
+ EQUIVALENCE (Tmin1, x(1)), (Tmin2, x(2)), (Tmax, x(3)),
617
+ 1 (Dmin, x(4)), (Dmax, x(5)),
618
+ 2 (Pbase1, x(6)), (Pbase2,x(7)),
619
+ 3 (PTmins, x(10)), (PTmaxs,x(11))
620
+
621
+
622
+ T = TdegK(it,T)
623
+ IF (isat .EQ. 0) THEN
624
+ IF (iopt .EQ. 1) THEN
625
+ D = D * fd * 1.0d3
626
+ crtreg = ((T .GE. Tmin1) .AND. (T .LE. Tmax) .AND.
627
+ 1 (D .GE. Dmin) .AND. (D .LE. Dmax))
628
+ ELSE
629
+ P = P / fp
630
+ IF ((T .LT. Tmin1) .OR. (T .GT. Tmax)) THEN
631
+ crtreg = .FALSE.
632
+ ELSE
633
+ Pmin = Pbase1 + PTmins * (T - Tmin1)
634
+ Pmax = Pbase2 + PTmaxs * (T - Tmin2)
635
+ llim = (P .GE. Pmin)
636
+ ulim = (P .LE. Pmax)
637
+ IF (llim .AND. ulim) THEN
638
+ crtreg = .TRUE.
639
+ ELSE
640
+ IF (llim .AND. (T .LE. Tmin2)) THEN
641
+ isat1 = 1
642
+ ddummy = 0.0d0
643
+ Pstest = Pfind(isat1,T,ddummy)
644
+ crtreg = (P .LE. Pstest)
645
+ ELSE
646
+ crtreg = .FALSE.
647
+ END IF
648
+ END IF
649
+ END IF
650
+ END IF
651
+ ELSE
652
+ IF (iopt .EQ. 1) THEN
653
+ crtreg = (T .GE. Tmin1)
654
+ ELSE
655
+ P = P / fp
656
+ crtreg = (P .GE. Pbase1)
657
+ END IF
658
+ END IF
659
+
660
+ RETURN
661
+ END
662
+
663
+ *********************************************************************
664
+
665
+ *** HGKeqn - Computes thermodynamic and transport properties of
666
+ * of H2O from the equation of state given by
667
+ * Haar, Gallagher, & Kell (1984).
668
+
669
+ SUBROUTINE HGKeqn(isat,iopt,itripl,Temp,Pres,Dens,epseqn)
670
+
671
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
672
+
673
+ PARAMETER (NPROP = 23)
674
+
675
+ INTEGER epseqn
676
+ DOUBLE PRECISION Dens(2), wprops(NPROP), wpliq(NPROP)
677
+
678
+ COMMON /aconst/ wm, gascon, tz, aa, zb, dzb, yb, uref, sref
679
+ COMMON /wpvals/ wprops, wpliq
680
+ COMMON /RTcurr/ rt
681
+
682
+ SAVE
683
+
684
+ rt = gascon * Temp
685
+
686
+ CALL HGKsat(isat,iopt,itripl,Temp,Pres,Dens,epseqn)
687
+
688
+ IF (isat .EQ. 0) THEN
689
+ CALL bb(Temp)
690
+ CALL calcv3(iopt,itripl,Temp,Pres,Dens(1),epseqn)
691
+ CALL thmHGK(Dens(1),Temp)
692
+ CALL dimHGK(isat,itripl,Temp,Pres,Dens(1),epseqn)
693
+ ELSE
694
+ DO 10 i=1,NPROP
695
+ 10 wpliq(i) = wprops(i)
696
+ CALL dimHGK(2,itripl,Temp,Pres,Dens(2),epseqn)
697
+ END IF
698
+
699
+ RETURN
700
+ END
701
+
702
+ *****************************************************************
703
+
704
+ *** HGKsat - If isat=1, computes Psat(T) or Tsat(P) (iopt=1,2),
705
+ * liquid and vapor densities, and associated
706
+ * thermodynamic and transport properties.
707
+ * If isat=0, checks whether T-D or T-P (iopt=1,2)
708
+ * falls on or within TOL of the liquid-vapor
709
+ * surface; if so, sets isat <- 1 and computes
710
+ * properties.
711
+
712
+ SUBROUTINE HGKsat(isat,iopt,itripl,Temp,Pres,Dens,epseqn)
713
+
714
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
715
+
716
+ DOUBLE PRECISION Dens(2)
717
+ INTEGER epseqn
718
+
719
+ COMMON /tolers/ TTOL, PTOL, DTOL, XTOL, EXPTOL, FPTOL
720
+ COMMON /HGKcrt/ tcHGK, dcHGK, pcHGK
721
+ COMMON /aconst/ wm, gascon, tz, aa, zb, dzb, yb, uref, sref
722
+ COMMON /units/ ft, fd, fvd, fvk, fs, fp, fh, fst, fc
723
+ COMMON /tpoint/ Utr, Str, Htr, Atr, Gtr,
724
+ 1 Ttripl, Ptripl, Dltrip, Dvtrip
725
+ COMMON /crits/ Tc, rhoC, Pc, Pcon, Ucon, Scon, dPcon
726
+
727
+ SAVE
728
+
729
+
730
+ IF (isat .EQ. 1) THEN
731
+ IF (iopt .EQ. 1) THEN
732
+ CALL pcorr(itripl,Temp,Pres,Dens(1),Dens(2),epseqn)
733
+ ELSE
734
+ CALL tcorr(itripl,Temp,Pres,Dens(1),Dens(2),epseqn)
735
+ END IF
736
+ ELSE
737
+ IF ((Temp .GT. Tc) .OR. (Temp .LT. Ttripl) .OR.
738
+ 1 ((iopt .EQ. 2) .AND. (Pres .GT. Pc))) THEN
739
+ RETURN
740
+ ELSE
741
+ CALL pcorr(itripl,Temp,Ptemp,dltemp,dvtemp,epseqn)
742
+ IF (((iopt .EQ. 2) .AND.
743
+ 1 (DABS(Pres-Ptemp) .LE. PTOL)) .OR.
744
+ 2 ((iopt .EQ. 1) .AND.
745
+ 3 ((DABS(Dens(1)-dltemp) .LE. DTOL) .OR.
746
+ 4 (DABS(Dens(1)-dvtemp) .LE. DTOL)))) THEN
747
+ isat = 1
748
+ Pres = Ptemp
749
+ Dens(1) = dltemp
750
+ Dens(2) = dvtemp
751
+ END IF
752
+ END IF
753
+ END IF
754
+
755
+ RETURN
756
+ END
757
+
758
+ ************************************************************************
759
+
760
+ *** calcv3 - Compute the dependent state variable.
761
+
762
+ SUBROUTINE calcv3(iopt,itripl,Temp,Pres,Dens,epseqn)
763
+
764
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
765
+
766
+ INTEGER epseqn
767
+
768
+ COMMON /units/ ft, fd, fvd, fvk, fs, fp, fh, fst, fc
769
+ COMMON /qqqq/ q0, q5
770
+ COMMON /aconst/ wm, gascon, tz, aa, z, dz, y, uref, sref
771
+ COMMON /fcts/ ad, gd, sd, ud, hd, cvd, cpd, dpdt, dvdt, dpdd,
772
+ 1 cjtt, cjth
773
+ COMMON /RTcurr/ rt
774
+
775
+ SAVE
776
+
777
+
778
+ IF (iopt .EQ. 1) THEN
779
+ CALL resid(Temp,Dens)
780
+ CALL base(Dens,Temp)
781
+ CALL ideal(Temp)
782
+ Pres = rt * Dens * z + q0
783
+ ELSE
784
+ IF (Temp .LT. tz) THEN
785
+ CALL pcorr(itripl,Temp,ps,dll,dvv,epseqn)
786
+ ELSE
787
+ ps = 2.0d4
788
+ dll = 0.0d0
789
+ END IF
790
+ IF (Pres .GT. ps) THEN
791
+ dguess = dll
792
+ ELSE
793
+ dguess = Pres / Temp / 0.4d0
794
+ END IF
795
+
796
+ CALL denHGK(Dens,Pres,dguess,Temp,dpdd)
797
+ CALL ideal(Temp)
798
+ END IF
799
+
800
+ RETURN
801
+ END
802
+
803
+ ******************************************************************************
804
+
805
+ *** thmHGK - Computes thermodynamic functions in dimensionless
806
+ * units from the HGK equation of state: Helmholtz, Gibbs,
807
+ * internal energy, and enthalpy functions (ad, gd, ud, hd) are
808
+ * per RT; entropy and heat capacities (sd, cvd, cpd) are per R.
809
+
810
+ SUBROUTINE thmHGK(d,t)
811
+
812
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
813
+
814
+ COMMON /aconst/ wm, gascon, tz, aa, zb, dzb, y, uref, sref
815
+ COMMON /qqqq/ qp, qdp
816
+ COMMON /basef/ ab, gb, sb, ub, hb, cvb, pb, dpdtb
817
+ COMMON /resf/ ar, gr, sr, ur, hr, cvr, dpdtr
818
+ COMMON /idf/ ai, gi, si, ui, hi, cvi, cpi
819
+ COMMON /fcts/ ad, gd, sd, ud, hd, cvd, cpd, dpdt, dvdt, dpdd,
820
+ 1 cjtt, cjth
821
+ COMMON /RTcurr/ rt
822
+
823
+ SAVE
824
+
825
+
826
+ z = zb + qp/rt/d
827
+ dpdd = rt * (zb + y * dzb) + qdp
828
+ ad = ab + ar + ai - uref/t + sref
829
+ gd = ad + z
830
+ ud = ub + ur + ui - uref/t
831
+ dpdt = rt * d * dpdtb + dpdtr
832
+ cvd = cvb + cvr + cvi
833
+ cpd = cvd + t*dpdt*dpdt/(d*d*dpdd*gascon)
834
+ hd = ud + z
835
+ sd = sb + sr + si - sref
836
+ dvdt = dpdt / dpdd / d / d
837
+ cjtt = 1.0d0 / d - t * dvdt
838
+ cjth = -cjtt / cpd / gascon
839
+
840
+ RETURN
841
+
842
+ END
843
+
844
+ *************************************************************************
845
+
846
+ *** bb - Computes molecular parameters b, the "excluded volume"
847
+ * (eq A.3), and B, the second virial coefficient (eq A.4),
848
+ * in cm3/g (b1,b2) and their first and second derivatives
849
+ * with respect to temperature (b1t,b1tt,b2t,b2tt).
850
+
851
+ SUBROUTINE bb(t)
852
+
853
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
854
+
855
+ DOUBLE PRECISION v(10)
856
+
857
+ COMMON /ellcon/ g1, g2, gf, b1, b2, b1t, b2t, b1tt, b2tt
858
+ COMMON /aconst/ wm, gascon, tz, aa, z, dz, y, uref, sref
859
+ COMMON /bconst/ bp(10), bq(10)
860
+
861
+ SAVE
862
+
863
+
864
+ v(1) = 1.0d0
865
+
866
+ DO 2 i=2,10
867
+ 2 v(i) = v(i-1) * tz / t
868
+
869
+ b1 = bp(1) + bp(2) * DLOG(1.0 / v(2))
870
+ b2 = bq(1)
871
+ b1t = bp(2) * v(2) / tz
872
+ b2t = 0.0d0
873
+ b1tt = 0.0d0
874
+ b2tt = 0.0d0
875
+
876
+ DO 4 i=3,10
877
+ b1 = b1 + bp(i) * v(i-1)
878
+ b2 = b2 + bq(i) * v(i-1)
879
+ b1t = b1t - (i-2) * bp(i) * v(i-1) / t
880
+ b2t = b2t - (i-2) * bq(i) * v(i-1) / t
881
+ b1tt = b1tt + bp(i) * (i-2)*(i-2) * v(i-1) / t / t
882
+ 4 b2tt = b2tt + bq(i) * (i-2)*(i-2) * v(i-1) / t / t
883
+
884
+ b1tt = b1tt - b1t / t
885
+ b2tt = b2tt - b2t / t
886
+
887
+ RETURN
888
+
889
+ END
890
+
891
+ ***********************************************************************
892
+
893
+ *** base - Computes Abase, Gbase, Sbase, Ubase, Hbase, Cvbase
894
+ * -- all per RT (dimensionless) -- as well as Pbase & dP/dT
895
+ * -- both per (DRT) -- for the base function (ab, gb, sb, ub,
896
+ * hb, cvb, pb, dpdtb). See Haar, Gallagher & Kell (1979), eq(1).
897
+
898
+
899
+ SUBROUTINE base(d,t)
900
+
901
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
902
+
903
+ COMMON /ellcon/ g1, g2, gf, b1, b2, b1t, b2t, b1tt, b2tt
904
+ COMMON /basef/ ab, gb, sb, ub, hb, cvb, pb, dpdtb
905
+ COMMON /aconst/ wm, gascon, tz, a, z, dz, y, uref, sref
906
+
907
+ SAVE
908
+
909
+
910
+ y = .25d0 * b1 * d
911
+ x = 1.0d0 - y
912
+ z0 = (1.0d0 + g1*y + g2*y*y) / (x*x*x)
913
+ z = z0 + 4.0d0*y*(b2/b1 - gf)
914
+ dz0 = (g1 + 2.0d0*g2*y)/(x*x*x) +
915
+ 1 3.0d0*(1.0d0 + g1*y + g2*y*y)/(x*x*x*x)
916
+ dz = dz0 + 4.0d0*(b2/b1 - gf)
917
+
918
+ pb = z
919
+
920
+ ab = -DLOG(x) - (g2 - 1.0d0)/x + 28.16666667d0/x/x +
921
+ 1 4.0d0*y*(b2/b1 - gf) + 15.166666667d0 +
922
+ 2 DLOG(d*t*gascon/.101325d0)
923
+ gb = ab + z
924
+ ub = -t*b1t*(z - 1.0d0 - d*b2)/b1 - d*t*b2t
925
+ sb = ub - ab
926
+ hb = z + ub
927
+
928
+ bb2tt = t * t * b2tt
929
+ cvb = 2.0d0*ub + (z0 - 1.0d0)*(((t*b1t/b1)*(t*b1t/b1)) -
930
+ 1 t*t*b1tt/b1) - d*(bb2tt - gf*b1tt*t*t) -
931
+ 2 (t*b1t/b1)*(t*b1t/b1)*y*dz0
932
+
933
+ dpdtb = pb/t + d*(dz*b1t/4.0d0 + b2t - b2/b1*b1t)
934
+
935
+ RETURN
936
+
937
+ END
938
+
939
+ ***********************************************************************
940
+
941
+ *** resid - Computes residual contributions to pressure (q), the
942
+ * Helmloltz function (ar) , dP/dD (q5), the Gibbs function
943
+ * (gr), entropy (sr), internal energy (ur), enthalpy (hr),
944
+ * isochoric heat capacity (cvr), and dP/dT. The first 36
945
+ * terms of the residual function represent a global
946
+ * least-squares fit to experimental data outside the
947
+ * critical region, terms 37-39 affect only the immediate
948
+ * vicinity of the critical point, and the last term (40)
949
+ * contributes only in the high pressure, low temperature
950
+ * region.
951
+
952
+ SUBROUTINE resid(t,d)
953
+
954
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
955
+
956
+ DOUBLE PRECISION qr(11), qt(10), qzr(9), qzt(9)
957
+
958
+ COMMON /resf/ ar, gr, sr, ur, hr, cvr, dpdtr
959
+ COMMON /qqqq/ q, q5
960
+ COMMON /nconst/ g(40), ii(40), jj(40), n
961
+ COMMON /aconst/ wm, gascon, tz, aa, z, dz, y, uref, sref
962
+ COMMON /addcon/ atz(4), adz(4), aat(4), aad(4)
963
+ COMMON /RTcurr/ rt
964
+ COMMON /tolers/ TTOL, PTOL, DTOL, XTOL, EXPTOL, FPTOL
965
+
966
+ SAVE
967
+
968
+ EQUIVALENCE (qr(3), qzr(1)), (qt(2), qzt(1))
969
+
970
+
971
+ qr(1) = 0.0d0
972
+ q5 = 0.0d0
973
+ q = 0.0d0
974
+ ar = 0.0d0
975
+ dadt = 0.0d0
976
+ cvr = 0.0d0
977
+ dpdtr = 0.0d0
978
+
979
+ e = DEXP(-aa * d)
980
+ q10 = d * d * e
981
+ q20 = 1.0d0 - e
982
+ qr(2) = q10
983
+ v = tz / t
984
+ qt(1) = t / tz
985
+
986
+ DO 4 i=2,10
987
+ qr(i+1) = qr(i) * q20
988
+ 4 qt(i) = qt(i-1) * v
989
+
990
+ DO 10 i=1,n
991
+ k = ii(i) + 1
992
+ l = jj(i)
993
+ zz = k
994
+ IF (k .EQ. 1) THEN
995
+ qp = g(i) * aa * qr(2) * qzt(l)
996
+ ELSE
997
+ qp = g(i) * aa * qzr(k-1) * qzt(l)
998
+ END IF
999
+ q = q + qp
1000
+ q5 = q5 + aa*(2.0/d - aa*(1.0 - e*(k-1)/q20))*qp
1001
+ ar = ar + g(i)*qzr(k)*qzt(l)/q10/zz/rt
1002
+ dfdt = power(q20,DBLE(k))*(1-l)*qzt(l+1)/tz/k
1003
+ d2f = l * dfdt
1004
+ dpt = dfdt*q10*aa*k/q20
1005
+ dadt = dadt + g(i)*dfdt
1006
+ dpdtr = dpdtr + g(i)*dpt
1007
+ 10 cvr = cvr + g(i)*d2f/gascon
1008
+
1009
+ qp = 0.0d0
1010
+ q2a = 0.0d0
1011
+
1012
+ DO 20 j=37,40
1013
+ IF (g(j) .EQ. 0.0d0) GO TO 20
1014
+ k = ii(j)
1015
+ km = jj(j)
1016
+ ddz = adz(j-36)
1017
+ del = d/ddz - 1.0d0
1018
+ IF (DABS(del) .LT. 1.0d-10) del = 1.0d-10
1019
+ ex1 = -aad(j-36) * power(del,DBLE(k))
1020
+ IF (ex1 .LT. EXPTOL) THEN
1021
+ dex = 0.0d0
1022
+ ELSE
1023
+ dex = DEXP(ex1) * power(del,DBLE(km))
1024
+ END IF
1025
+ att = aat(j-36)
1026
+ tx = atz(j-36)
1027
+ tau = t/tx - 1.0d0
1028
+ ex2 = -att * tau * tau
1029
+ IF (ex2 .LE. EXPTOL) THEN
1030
+ tex = 0.0d0
1031
+ ELSE
1032
+ tex = DEXP(ex2)
1033
+ END IF
1034
+ q10 = dex * tex
1035
+ qm = km/del - k*aad(j-36)*power(del,DBLE(k-1))
1036
+ fct = qm * d*d * q10 / ddz
1037
+ q5t = fct*(2.0d0/d + qm/ddz) - (d/ddz)*(d/ddz)*q10 *
1038
+ 1 (km/del/del + k*(k-1)*aad(j-36) *
1039
+ 2 power(del,DBLE(k-2)))
1040
+ q5 = q5 + q5t*g(j)
1041
+ qp = qp + g(j)*fct
1042
+ dadt = dadt - 2.0d0*g(j)*att*tau* q10 /tx
1043
+ dpdtr = dpdtr - 2.0d0*g(j)*att*tau* fct /tx
1044
+ q2a = q2a + t*g(j)*(4.0d0*att*ex2 + 2.0d0*att)*q10/tx/tx
1045
+ ar = ar + q10*g(j)/rt
1046
+ 20 CONTINUE
1047
+
1048
+ sr = -dadt / gascon
1049
+ ur = ar + sr
1050
+ cvr = cvr + q2a/gascon
1051
+ q = q + qp
1052
+
1053
+ RETURN
1054
+
1055
+ END
1056
+
1057
+ ************************************************************************
1058
+
1059
+ *** ideal - Computes thermodynamic properties for H2O in the
1060
+ * ideal gas state using equations given by Woolley (1979).
1061
+
1062
+ SUBROUTINE ideal(t)
1063
+
1064
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
1065
+
1066
+ DOUBLE PRECISION c(18)
1067
+
1068
+ COMMON /idf/ ai, gi, si, ui, hi, cvi, cpi
1069
+
1070
+ SAVE
1071
+
1072
+ DATA c / .19730271018d2, .209662681977d2, -.483429455355d0,
1073
+ 1 .605743189245d1, .2256023885d2, -.987532442d1,
1074
+ 2 -.43135538513d1, .458155781d0, -.47754901883d-1,
1075
+ 3 .41238460633d-2, -.27929052852d-3, .14481695261d-4,
1076
+ 4 -.56473658748d-6, .16200446d-7, -.3303822796d-9,
1077
+ 5 .451916067368d-11, -.370734122708d-13,
1078
+ 6 .137546068238d-15/
1079
+
1080
+
1081
+ tt = t / 1.0d2
1082
+ tl = DLOG(tt)
1083
+ gi = -(c(1)/tt + c(2)) * tl
1084
+ hi = (c(2) + c(1)*(1.0d0 - tl)/tt)
1085
+ cpi = c(2) - c(1)/tt
1086
+
1087
+ DO 8 i=3,18
1088
+ emult = power(tt,DBLE(i-6))
1089
+ gi = gi - c(i) * emult
1090
+ hi = hi + c(i) * (i-6) * emult
1091
+ 8 cpi = cpi + c(i) * (i-6) * (i-5) * emult
1092
+
1093
+ ai = gi - 1.0d0
1094
+ ui = hi - 1.0d0
1095
+ cvi = cpi - 1.0d0
1096
+ si = ui - ai
1097
+
1098
+ RETURN
1099
+ END
1100
+
1101
+ ******************************************************************************
1102
+
1103
+ *** dalHGK - Computes/returns (d(alpha)/dt)p(d,t,alpha)
1104
+ * for the Haar et al. (1983) equation of state.
1105
+
1106
+ DOUBLE PRECISION FUNCTION dalHGK(d,t,alpha)
1107
+
1108
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
1109
+
1110
+ DOUBLE PRECISION tempi(4), densi(4), betai(4), alphai(4),
1111
+ 1 g(40), k, l, km, lm, kp, lp
1112
+ INTEGER ll(40), kk(40)
1113
+
1114
+ COMMON /aconst/ wm, gascon, tz, a, z, dz, y, uref, sref
1115
+ COMMON /ellcon/ g1, g2, gf, b1, b2, b1t, b2t, b1tt, b2tt
1116
+ COMMON /basef/ ab, gb, sb, ub, hb, cvb, pb, dpdtb
1117
+ COMMON /resf/ ar, gr, sr, ur, hr, cvr, dpdtr
1118
+ COMMON /qqqq/ q, q5
1119
+ COMMON /nconst/ g, kk, ll, n
1120
+ COMMON /addcon/ tempi, densi, betai, alphai
1121
+ COMMON /tolers/ TTOL, PTOL, DTOL, XTOL, EXPTOL, FPTOL
1122
+
1123
+ SAVE
1124
+
1125
+
1126
+ *** evaluate derivatives for the base function
1127
+
1128
+ y = .25d0 * b1 * d
1129
+ x = 1.0d0 - y
1130
+ dydtp = (d/4.0d0)*(b1t - b1*alpha)
1131
+
1132
+ dbdd = gascon*t * ((b1/4.0d0/x) * (1.0d0 - (g2-1.0d0)/x +
1133
+ 1 (g1+g2+1.0d0)/x/x) + b2 - b1*gf + 1.0d0/d)
1134
+
1135
+ db2dd = gascon*t* ((b1*b1/16.0d0/x/x) * (1.0d0 -
1136
+ 1 2.0d0*(g2-1.0d0)/x + 3.0d0*(g1+g2+1.0d0)/x/x) -
1137
+ 2 1.0d0/d/d)
1138
+
1139
+ db2ddt = gascon*t * ((b1t/4.0d0/x/x) *
1140
+ 1 (1.0d0 - (g2-1.0d0)*(1.0d0+y)/x +
1141
+ 2 (g1+g2+1.0d0)*(1.0d0+2.0d0*y)/x/x) +
1142
+ 3 b2t - gf*b1t) + dbdd/t
1143
+
1144
+ db2dtp = dbdd/t + gascon*t* ( (b1*dydtp/4.0d0/x/x/x) *
1145
+ 1 (1.0d0 - g2 + 2.0d0*(g1+g2+1.0d0)/x) +
1146
+ 2 ((x*b1t + b1*dydtp)/4.0d0/x/x) *
1147
+ 3 (1.0d0 - (g2-1.0d0)/x + (g1+g2+1.0d0)/x/x) +
1148
+ 4 b2t - gf*b1t + alpha/d )
1149
+
1150
+ db3ddt = db2dd/t + gascon*t * ( (b1*b1*dydtp/8.0d0/x/x/x/x) *
1151
+ 1 (1.0d0 - g2 + 3.0d0*(g1+g2+1.0d0)/x) +
1152
+ 2 (b1*(x*b1t + b1*dydtp)/8.0d0/x/x/x) *
1153
+ 3 (1.0d0 - 2.0d0*(g2-1.0d0)/x + 3.0d0*(g1+g2+1.0d0)/x/x)
1154
+ 4 - 2.0d0*alpha/d/d )
1155
+
1156
+ db3dtt = (db2ddt - dbdd/t)/t + gascon*t* (
1157
+ 1 (b1t*dydtp/2.0d0/x/x/x/x) * (1.0d0 - g2 +
1158
+ 2 (g1+g2+1.0d0)*(2.0d0+y)/x) +
1159
+ 3 ((x*b1tt + 2.0d0*b1t*dydtp)/4.0d0/x/x/x) * (1.0d0 -
1160
+ 4 (g2-1.0d0)*(1+y)/x + (g1+g2+1.0d0)*(1.0d0+2.0d0*y)/x/x)
1161
+ 5 + b2tt - gf*b1tt ) + (t*db2dtp - dbdd)/t/t
1162
+
1163
+ ***********************************************************
1164
+
1165
+ *** evaluate derivatives for the residual function
1166
+
1167
+ * drdd = q/d/d
1168
+ * dr2dd = (q5 - 2.0d0/d*q)/d/d
1169
+ * dr2ddt = dpdtr/d/d
1170
+
1171
+ e1 = DEXP(-a * d)
1172
+ e2 = 1.0d0 - e1
1173
+ tzt = tz / t
1174
+
1175
+ drdd = 0.0d0
1176
+ dr2dd = 0.0d0
1177
+ dr2ddt = 0.0d0
1178
+ dr2dtp = 0.0d0
1179
+ dr3ddt = 0.0d0
1180
+ dr3dtt = 0.0d0
1181
+
1182
+ *** evaluate terms 1-36
1183
+
1184
+ DO 10 i=1,n
1185
+ k = DBLE(kk(i)) + 1.0d0
1186
+ l = DBLE(ll(i)) - 1.0d0
1187
+ km = k - 1.0d0
1188
+ lm = l - 1.0d0
1189
+ kp = k + 1.0d0
1190
+ lp = l + 1.0d0
1191
+ xtzt = power(tzt,l)
1192
+
1193
+ drdd = drdd + g(i) * xtzt*power(e2,km)*e1
1194
+
1195
+ dr2dd = dr2dd + g(i) * e1*xtzt*power(e2,km) *
1196
+ 1 (km*e1/e2 - 1.0d0)
1197
+
1198
+ dr2ddt = dr2ddt - g(i)*e1*l*power(e2,km)*power(tzt,lp)/tz
1199
+
1200
+ dr2dtp = dr2dtp + g(i)*e1*power(e2,km)*xtzt *
1201
+ 1 ( d*alpha - l/t - km*e1*d*alpha/e2 )
1202
+
1203
+ dr3ddt = dr3ddt + g(i)*( km*d*alpha*e1*e1*xtzt*
1204
+ 1 power(e2,k-3.0d0) + e1*xtzt*power(e2,km)*
1205
+ 2 (km*e1/e2 - 1.0d0) * (d*alpha - l/t -
1206
+ 3 km*d*alpha*e1/e2) )
1207
+
1208
+ dr3dtt = dr3dtt + g(i)*l*e1*power(e2,km)*power(tzt,lp)/tz
1209
+ 1 * ( lp/t + d*alpha*km*e1/e2 - d*alpha )
1210
+
1211
+ 10 CONTINUE
1212
+
1213
+ *** evaluate terms 37-40
1214
+
1215
+ DO 20 i=37,40
1216
+ k = DBLE(kk(i))
1217
+ l = DBLE(ll(i))
1218
+ km = k - 1.0d0
1219
+ lm = l - 1.0d0
1220
+ kp = k + 1.0d0
1221
+ lp = l + 1.0d0
1222
+ ai = alphai(i-36)
1223
+ bi = betai(i-36)
1224
+ di = densi(i-36)
1225
+ ti = tempi(i-36)
1226
+ tau = t/ti - 1.0d0
1227
+ del = d/di - 1.0d0
1228
+ IF (DABS(del) .LT. 1.0d-10) del = 1.0d-10
1229
+
1230
+ ex1 = -ai * power(del,k)
1231
+ IF (ex1 .LT. EXPTOL) THEN
1232
+ dex = 0.0d0
1233
+ ELSE
1234
+ dex = DEXP(ex1)
1235
+ END IF
1236
+ ex2 = -bi * tau * tau
1237
+ IF (ex2 .LE. EXPTOL) THEN
1238
+ tex = 0.0d0
1239
+ ELSE
1240
+ tex = DEXP(ex2)
1241
+ END IF
1242
+ ex12 = dex * tex
1243
+ qm = l/del - k*ai*power(del,km)
1244
+ xdell = power(del,l)
1245
+ xdelk = power(del,k)
1246
+
1247
+ drdd = drdd + g(i)*xdell*ex12/di*qm
1248
+
1249
+ dr2dd = dr2dd + g(i)*xdell*ex12/di/di * (qm*qm -
1250
+ 1 l/di/di - ai*k*km*power(del,k-2.0d0))
1251
+
1252
+ dr2ddt = dr2ddt - g(i)*2.0d0*bi*tau*ex12*xdell/ti/di*qm
1253
+
1254
+ dr2dtp = dr2dtp + g(i)/di*( d*alpha*xdell*ex12/di/del/del *
1255
+ 1 (l + ai*k*km*xdelk) + qm * ( ex12 *
1256
+ 2 ( xdell* (k*ai*d*alpha*power(del,km)/di -
1257
+ 3 2.0d0*bi*tau/ti) - l*d*alpha*power(del,lm)/di) ) )
1258
+
1259
+ dr3ddt = dr3ddt + g(i)/di/di*( xdell*ex12* (2.0d0*qm*
1260
+ 1 (l*d*alpha/di/del/del + ai*k*km*d*alpha*
1261
+ 2 power(del,k-2.0d0)/di) - 2.0d0*l*d*alpha/di/del
1262
+ 3 /del/del + ai*k*km*(k-2.0d0)*power(del,k-3.0d0)*
1263
+ 4 d*alpha/di) + (qm*qm - l/del/del - ai*k*km*
1264
+ 5 power(del,k-2.0d0)) *(ex12*xdell*( ai*k*
1265
+ 6 power(del,k-1.0d0)*d*alpha/di - 2.0d0*bi*tau/ti ) -
1266
+ 7 ex12*l*power(del,l-1.0d0)*d*alpha/di) )
1267
+
1268
+ dr3dtt = dr3dtt - 2.0d0*g(i)*bi/ti/di * ( tau*xdell*ex12*d*
1269
+ 1 alpha/del/del/di * (l + ai*k*km*power(del,k)) +
1270
+ 2 qm*( xdell*ex12*( ai*k*d*alpha*tau*power(del,km)/di
1271
+ 3 + (1.0d0 - 2.0d0*bi*tau*tau)/ti -
1272
+ 4 tau*l*d*alpha/di/del ) ) )
1273
+
1274
+
1275
+ 20 CONTINUE
1276
+
1277
+ *** compute (d(alpha)/dT)P
1278
+
1279
+ dalHGK = ((db3dtt + dr3dtt)*(2.0d0*(dbdd + drdd) +
1280
+ 1 d*(db2dd + dr2dd)) -
1281
+ 2 (db2ddt + dr2ddt)*(2.0d0*(db2dtp + dr2dtp) +
1282
+ 3 d*(db3ddt + dr3ddt) - d*alpha*(db2dd + dr2dd))) /
1283
+ 4 (2.0d0*(dbdd + drdd) + d*(db2dd + dr2dd)) /
1284
+ 5 (2.0d0*(dbdd + drdd) + d*(db2dd + dr2dd))
1285
+
1286
+ RETURN
1287
+
1288
+ END
1289
+
1290
+ ******************************************************************************
1291
+
1292
+ *** denHGK - Computes density (d in g/cm3) and dP/dD (dPdd) as
1293
+ * f(p(MPa),t(degK)) from an initial density guess (dguess).
1294
+
1295
+ SUBROUTINE denHGK(d,p,dguess,t,dpdd)
1296
+
1297
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
1298
+
1299
+ COMMON /qqqq/ q0, q5
1300
+ COMMON /aconst/ wm, gascon, tz, aa, z, dz, y, uref, sref
1301
+ COMMON /basef/ ab, gb, sb, ub, hb, cvb, pb, dpdtb
1302
+ COMMON /RTcurr/ rt
1303
+
1304
+ SAVE
1305
+
1306
+
1307
+ i = 0
1308
+ d = dguess
1309
+
1310
+ 10 i = i + 1
1311
+
1312
+ IF (d .LE. 0.0d0) d = 1.0d-8
1313
+ IF (d .GT. 1.9d0) d = 1.9d0
1314
+
1315
+ CALL resid(t,d)
1316
+ CALL base(d,t)
1317
+
1318
+ pp = rt * d * pb + q0
1319
+ dpdd = rt * (z + y * dz) + q5
1320
+
1321
+ *** if dpdd < 0 assume d in 2-phase region and adjust accordingly ***
1322
+
1323
+ IF (dpdd .GT. 0.0d0) GO TO 20
1324
+
1325
+ IF (dguess .GE. 0.2967d0) d = d * 1.02d0
1326
+ IF (dguess .LT. 0.2967d0) d = d * 0.98d0
1327
+ IF (i .LE. 10) GO TO 10
1328
+
1329
+ 20 dpdx = dpdd * 1.1d0
1330
+ IF (dpdx .LT. 0.1d0) dpdx = 0.1d0
1331
+ dp = DABS(1.0d0 - pp/p)
1332
+
1333
+ IF ((dp .LT. 1.0d-8) .OR.
1334
+ 1 ((dguess .GT. 0.3d0) .AND. (dp .LT. 1.0d-7)) .OR.
1335
+ 2 ((dguess .GT. 0.7d0) .AND. (dp .LT. 1.0d-6))) RETURN
1336
+
1337
+ x = (p - pp) / dpdx
1338
+ IF (DABS(x) .GT. 0.1d0) x = x * 0.1d0 / DABS(x)
1339
+ d = d + x
1340
+ IF (d .LE. 0.0d0) d = 1.0d-8
1341
+ IF (i .LE. 30) GO TO 10
1342
+
1343
+ RETURN
1344
+
1345
+ END
1346
+
1347
+ ***********************************************************************
1348
+
1349
+ *** PsHGK - Returns an approximation to Psaturation(T) that agrees
1350
+ * to within 0.02% of that predicted by the HGK surface
1351
+ * for temperatures up to within roughly a degree of
1352
+ * the critical point.
1353
+
1354
+ DOUBLE PRECISION FUNCTION PsHGK(t)
1355
+
1356
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
1357
+
1358
+ DOUBLE PRECISION a(8)
1359
+
1360
+ SAVE
1361
+
1362
+ DATA a /-.78889166d1, .25514255d1, -.6716169d1, .33239495d2,
1363
+ 1 -.10538479d3, .17435319d3, -.14839348d3, .48631602d2/
1364
+
1365
+
1366
+ IF (T .LE. 314.0d0) THEN
1367
+ pl = 6.3573118d0 - 8858.843d0/t +
1368
+ 1 607.56335d0 * power(t,-0.6d0)
1369
+ PsHGK = 0.1d0 * DEXP(pl)
1370
+ ELSE
1371
+ v = t / 647.25d0
1372
+ w = DABS(1.0d0 - v)
1373
+ b = 0.0d0
1374
+ DO 4 i=1,8
1375
+ z = i
1376
+ b = b + a(i)*power(w,(z + 1.0d0)/2.0d0)
1377
+ 4 CONTINUE
1378
+ q = b / v
1379
+ PsHGK = 22.093d0 * DEXP(q)
1380
+ END IF
1381
+
1382
+ RETURN
1383
+ END
1384
+
1385
+ ***********************************************************************
1386
+
1387
+ *** TsHGK - Returns Tsaturation(P).
1388
+
1389
+ DOUBLE PRECISION FUNCTION TsHGK(p)
1390
+
1391
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
1392
+
1393
+ SAVE
1394
+
1395
+
1396
+ TsHGK = 0.0d0
1397
+
1398
+ IF (p .GT. 22.05d0) RETURN
1399
+
1400
+ k = 0
1401
+ pl = 2.302585d0 + DLOG(p)
1402
+ tg = 372.83d0 +
1403
+ 1 pl*(27.7589d0 + pl*(2.3819d0 + pl*(0.24834d0 +
1404
+ 2 pl*0.0193855d0)))
1405
+
1406
+ 1 IF (tg .LT. 273.15d0) tg = 273.15d0
1407
+ IF (tg .GT. 647.00d0) tg = 647.00d0
1408
+
1409
+ IF (k .GE. 8) THEN
1410
+ TsHGK = tg
1411
+ ELSE
1412
+ k = k + 1
1413
+ pp = PsHGK(tg)
1414
+ dp = TdPsdT(tg)
1415
+ IF (ABS(1.0d0 - pp/p) .LT. 1.0d-5) THEN
1416
+ TsHGK = tg
1417
+ ELSE
1418
+ tg = tg * (1.0d0 + (p - pp)/dp)
1419
+ GO TO 1
1420
+ END IF
1421
+ END IF
1422
+
1423
+ RETURN
1424
+ END
1425
+
1426
+ ***********************************************************************
1427
+
1428
+ *** TdPsdT - Returns T*(dPsat/dT).
1429
+
1430
+ DOUBLE PRECISION FUNCTION TdPsdT(t)
1431
+
1432
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
1433
+
1434
+ DOUBLE PRECISION a(8)
1435
+
1436
+ SAVE
1437
+
1438
+ DATA a /-.78889166d1, .25514255d1, -.6716169d1, .33239495d2,
1439
+ 1 -.10538479d3, .17435319d3, -.14839348d3, .48631602d2/
1440
+
1441
+
1442
+ v = t / 647.25d0
1443
+ w = 1.0 - v
1444
+ b = 0.0d0
1445
+ c = 0.0d0
1446
+
1447
+ DO 4 i=1,8
1448
+ z = i
1449
+ y = a(i) * power(w,(z + 1.0d0)/2.0d0)
1450
+ c = c + y/w*(0.5d0 - 0.5d0*z - 1.0d0/v)
1451
+ 4 b = b + y
1452
+
1453
+ q = b / v
1454
+ TdPsdT = 22.093d0 * DEXP(q) * c
1455
+
1456
+ RETURN
1457
+
1458
+ END
1459
+
1460
+ ***********************************************************************
1461
+
1462
+ *** corr - Computes liquid and vapor densities (dliq & dvap)
1463
+ * and (Gl-Gv)/RT (delg) for T-P conditions on or
1464
+ * near the saturation surface.
1465
+
1466
+ SUBROUTINE corr(itripl,t,p,dl,dv,delg,epseqn)
1467
+
1468
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
1469
+
1470
+ INTEGER epseqn
1471
+
1472
+ COMMON /qqqq/ q00, q11
1473
+ COMMON /aconst/ wm, gascon, tz, aa, zb, dzb, yb, uref, sref
1474
+ COMMON /fcts/ ad, gd, sd, ud, hd, cvd, cpd, dpdt, dvdt, dpdd,
1475
+ 1 cjtt, cjth
1476
+ COMMON /basef/ ab, gb, sb, ub, hb, cvb, pb, dpdtb
1477
+ COMMON /RTcurr/ rt
1478
+ COMMON /units/ ft, fd, fvd, fvk, fs, fp, fh, fst, fc
1479
+ COMMON /HGKcrt/ tcHGK, dcHGK, pcHGK
1480
+
1481
+ SAVE
1482
+
1483
+
1484
+ CALL bb(t)
1485
+
1486
+ dguess = dl
1487
+ IF (dl .LE. 0.0d0) dguess = 1.11d0 - 0.0004d0*t
1488
+
1489
+ CALL denHGK(dl,p,dguess,t,dpdd)
1490
+ CALL ideal(t)
1491
+ CALL thmHGK(dl,t)
1492
+ *** save liquid properties
1493
+ CALL dimHGK(1,itripl,t,p,dl,epseqn)
1494
+ gl = gd
1495
+
1496
+ dguess = dv
1497
+ IF (dv .LE. 0.0d0) dguess = p / rt
1498
+
1499
+ CALL denHGK(dv,p,dguess,t,dpdd)
1500
+ IF (dv .LT. 5.0d-7) dv = 5.0d-7
1501
+ CALL ideal(t)
1502
+ CALL thmHGK(dv,t)
1503
+ *** vapor properties will be available
1504
+ *** in COMMON /fcts/ (dimensionless) after
1505
+ *** pcorr's final call of corr (delg < 10d-4)
1506
+ gv = gd
1507
+ delg = gl - gv
1508
+
1509
+ RETURN
1510
+ END
1511
+
1512
+ ***********************************************************************
1513
+
1514
+ *** pcorr - Computes Psaturation(T) (p) and liquid and vapor
1515
+ * densities (dl & dv) from refinement of an initial
1516
+ * approximation (PsHGK(t)) in accord with Gl = Gv.
1517
+
1518
+ SUBROUTINE pcorr(itripl,t,p,dl,dv,epseqn)
1519
+
1520
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
1521
+
1522
+ INTEGER epseqn
1523
+
1524
+ COMMON /aconst/ wm, gascon, tz, aa, zb, dzb, yb, uref, sref
1525
+
1526
+ SAVE
1527
+
1528
+ p = PsHGK(t)
1529
+ dl = 0.0d0
1530
+ dv = 0.0d0
1531
+
1532
+ 2 CALL corr(itripl,t,p,dl,dv,delg,epseqn)
1533
+
1534
+ dp = delg * gascon * T / (1.0d0/dv - 1.0d0/dl)
1535
+ p = p + dp
1536
+ IF (DABS(delg) .GT. 1.0d-4) GO TO 2
1537
+
1538
+ RETURN
1539
+ END
1540
+
1541
+ ************************************************************
1542
+
1543
+ *** tcorr - Computes Tsaturation(P) (t) and liquid and vapor
1544
+ * densities (dl & dv) from refinement of an initial
1545
+ * approximation (TsHGK(p)) in accord with Gl = Gv.
1546
+
1547
+ SUBROUTINE tcorr(itripl,t,p,dl,dv,epseqn)
1548
+
1549
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
1550
+
1551
+ INTEGER epseqn
1552
+
1553
+ COMMON /aconst/ wm, gascon, tz, aa, zb, dzb, yb, uref, sref
1554
+ COMMON /RTcurr/ rt
1555
+
1556
+ SAVE
1557
+
1558
+
1559
+ t = TsHGK(p)
1560
+ IF (t .EQ. 0.0d0) RETURN
1561
+ dl = 0.0d0
1562
+ dv = 0.0d0
1563
+
1564
+ 1 rt = t * gascon
1565
+ CALL corr(itripl,t,p,dl,dv,delg,epseqn)
1566
+
1567
+ dp = delg * gascon * t / (1.0d0/dv - 1.0d0/dl)
1568
+ t = t * (1.0d0 - dp/TdPsdT(t))
1569
+
1570
+ IF (DABS(delg) .GT. 1.0d-4) GO TO 1
1571
+
1572
+ RETURN
1573
+ END
1574
+
1575
+ ***************************************************************
1576
+
1577
+ *** LVSeqn - Computes thermodynamic and transport properties of
1578
+ * critical region H2O (369.85-419.85 degC,
1579
+ * 0.20-0.42 gm/cm3) from the fundamental equation given
1580
+ * by Levelt Sengers, et al (1983): J.Phys.Chem.Ref.Data,
1581
+ * V.12, No.1, pp.1-28.
1582
+
1583
+ SUBROUTINE LVSeqn(isat,iopt,itripl,T,P,Dens,epseqn)
1584
+
1585
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
1586
+
1587
+ PARAMETER (NPROP = 23)
1588
+
1589
+ DOUBLE PRECISION wprops(NPROP), wpliq(NPROP), Dens(2)
1590
+ LOGICAL cpoint
1591
+ INTEGER epseqn
1592
+
1593
+ COMMON /coefs/ a(20), q(20), x(11)
1594
+ COMMON /crits/ Tc, rhoc, Pc, Pcon, Ucon, Scon, dPcon
1595
+ COMMON /therm/ AE, GE, U, H, Entrop, Cp, Cv, betaw, alphw,
1596
+ 1 heat, Speed
1597
+ COMMON /satur/ Dliq, Dvap, DH2O, iphase
1598
+ COMMON /param/ r1, th1
1599
+ COMMON /units/ ft, fd, fvd, fvk, fs, fp, fh, fst, fc
1600
+ COMMON /wpvals/ wprops, wpliq
1601
+
1602
+ SAVE
1603
+
1604
+
1605
+ cpoint = .FALSE.
1606
+ DH2O = Dens(1)
1607
+
1608
+ 10 CALL LVSsat(iopt,isat,T,P,DH2O)
1609
+
1610
+ IF ((isat .NE. 0) .OR. (iopt .NE. 1)) CALL denLVS(isat,T,P)
1611
+
1612
+ IF (isat .EQ. 0) THEN
1613
+ Dens(1) = DH2O
1614
+ ELSE
1615
+ Dens(1) = Dliq
1616
+ Dens(2) = Dvap
1617
+ END IF
1618
+
1619
+ IF (isat .EQ. 0) THEN
1620
+ CALL thmLVS(isat,T,r1,th1)
1621
+ CALL dimLVS(isat,itripl,th1,T,P*1.0d1,dl,dv,wprops,epseqn)
1622
+ IF (cpoint) THEN
1623
+ CALL cpswap
1624
+ Dens(1) = cdens
1625
+ Dens(2) = cdens
1626
+ isat = 1
1627
+ iopt = ioptsv
1628
+ END IF
1629
+ ELSE
1630
+ th1 = -1.0d0
1631
+ CALL thmLVS(isat,T,r1,th1)
1632
+ CALL dimLVS(isat,itripl,th1,T,P*1.0d1,dl,dv,wprops,epseqn)
1633
+ th1 = 1.0d0
1634
+ CALL thmLVS(isat,T,r1,th1)
1635
+ CALL dimLVS(isat,itripl,th1,T,P*1.0d1,dl,dv,wpliq,epseqn)
1636
+ IF (dl .EQ. dv) THEN
1637
+ cpoint = .TRUE.
1638
+ cdens = dl
1639
+ T = 647.0670000003d0
1640
+ P = 22.0460000008d0
1641
+ ioptsv = iopt
1642
+ iopt = 2
1643
+ isat = 0
1644
+ GO TO 10
1645
+ END IF
1646
+ END IF
1647
+
1648
+ END
1649
+
1650
+ *********************************************************************
1651
+
1652
+ *** cpswap - Load critical point A, G, U, H, S, Vs, Di, ZB,
1653
+ * albe values from wpliq into wprops and
1654
+ * approximations to critical Cv, Cp, alpha, beta,
1655
+ * visc, tcond, Prndtl, tdiff, visck, YB, QB, XB,
1656
+ * daldT, st values from wprops into wpliq.
1657
+
1658
+ SUBROUTINE cpswap
1659
+
1660
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
1661
+
1662
+ PARAMETER (NPROP = 23)
1663
+
1664
+ INTEGER aw, gw, sw, uw, hw, cvw, cpw, vsw, alw, bew,
1665
+ 1 diw, viw, tcw, stw, tdw, Prw, vikw, albew,
1666
+ 2 ZBw, YBw, QBw, dalwdT, XBw
1667
+ DOUBLE PRECISION wprops(NPROP), wpliq(NPROP)
1668
+
1669
+ COMMON /wpvals/ wprops, wpliq
1670
+ COMMON /units/ ft, fd, fvd, fvk, fs, fp, fh, fst, fc
1671
+
1672
+ SAVE
1673
+
1674
+ DATA aw, gw, sw, uw, hw, cvw, cpw, vsw, alw, bew, diw, viw,
1675
+ 1 tcw, stw, tdw, Prw, vikw, albew, ZBw, YBw, QBw,
1676
+ 2 dalwdT, XBw
1677
+ 2 / 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
1678
+ 3 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 /
1679
+
1680
+
1681
+ wprops(aw) = wpliq(aw)
1682
+ wprops(gw) = wpliq(gw)
1683
+ wprops(sw) = wpliq(sw)
1684
+ wprops(uw) = wpliq(uw)
1685
+ wprops(hw) = wpliq(hw)
1686
+ wprops(diw) = wpliq(diw)
1687
+ wprops(ZBw) = wpliq(ZBw)
1688
+ wprops(stw) = wpliq(stw)
1689
+
1690
+ wpliq(cvw) = wprops(cvw)
1691
+ wpliq(cpw) = wprops(cpw)
1692
+ wpliq(alw) = wprops(alw)
1693
+ wpliq(bew) = wprops(bew)
1694
+ wpliq(YBw) = wprops(YBw)
1695
+ wpliq(QBw) = wprops(QBw)
1696
+ wpliq(XBw) = wprops(XBw)
1697
+ wpliq(tcw) = wprops(tcw)
1698
+ wpliq(tdw) = wprops(tdw)
1699
+ wpliq(Prw) = wprops(Prw)
1700
+ wpliq(dalwdT) = wprops(dalwdT)
1701
+ wpliq(albew) = wprops(albew)
1702
+
1703
+ wprops(vsw) = 0.429352766443498d2 * fs
1704
+ wprops(viw) = 1.0d6
1705
+ wprops(vikw) = 1.0d6
1706
+
1707
+ wpliq(vsw) = wprops(vsw)
1708
+ wpliq(viw) = wprops(viw)
1709
+ wpliq(vikw) = wprops(vikw)
1710
+
1711
+ END
1712
+
1713
+ *********************************************************************
1714
+
1715
+ *** LVSsat - If isat=1, computes Psat(T) or Tsat(P) (iopt=1,2).
1716
+ * If isat=0, checks whether T-D or T-P (iopt=1,2)
1717
+ * falls on or within TOL of the liq-vap surface; if so,
1718
+ * isat <- 1 and T <- Tsat.
1719
+
1720
+ SUBROUTINE LVSsat(iopt,isat,T,P,D)
1721
+
1722
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
1723
+
1724
+ COMMON /tolers/ TTOL, PTOL, DTOL, XTOL, EXPTOL, FPTOL
1725
+ COMMON /crits/ Tc, rhoc, Pc, Pcon, Ucon, Scon, dPcon
1726
+
1727
+ SAVE
1728
+
1729
+ DATA ERRTOL, TCTOL / 1.0d-12, 1.0d-2 /
1730
+
1731
+
1732
+ IF (isat .EQ. 1) THEN
1733
+ IF (iopt .EQ. 1) THEN
1734
+ P = Pfind(isat,T,D)
1735
+ END IF
1736
+ T = TsLVS(isat,P)
1737
+ ELSE
1738
+ IF (iopt .EQ. 1) THEN
1739
+ P = Pfind(isat,T,D)
1740
+ END IF
1741
+ IF (P-ERRTOL .GT. Pc) THEN
1742
+ RETURN
1743
+ ELSE
1744
+ CALL backup
1745
+ Tsat = TsLVS(isat,P)
1746
+ IF (DABS(Tsat-T) .LT. TCTOL) THEN
1747
+ T = Tsat
1748
+ isat = 1
1749
+ ELSE
1750
+ CALL restor
1751
+ END IF
1752
+ END IF
1753
+ END IF
1754
+
1755
+ RETURN
1756
+ END
1757
+
1758
+ *********************************************************************
1759
+
1760
+ *** denLVS - Calculates DH2O(T,P) or Dvap,Dliq(T,P) from the
1761
+ * Levelt Sengers, et al (1983) critical region
1762
+ * equation of state.
1763
+
1764
+ SUBROUTINE denLVS(isat,T,P)
1765
+
1766
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
1767
+
1768
+ DOUBLE PRECISION s(2), sd(2)
1769
+
1770
+ COMMON /coefs/ a(20), q(20), x(11)
1771
+ COMMON /crits/ Tc, rhoc, Pc, Pcon, Ucon, Scon, dPcon
1772
+ COMMON /satur/ Dliq, Dvap, DH2O, iphase
1773
+ COMMON /therm/ AE, GE, U, H, Entrop, Cp, Cv, betaw, alphw,
1774
+ 1 heat, Speed
1775
+ COMMON /param/ r1, th1
1776
+ COMMON /deri2/ dPdD, dPdT
1777
+
1778
+ SAVE
1779
+
1780
+ EQUIVALENCE (Dmin, x(4)), (Dmax, x(5)), (pw11, q(9)),
1781
+ 1 (xk0, a(7)), (xk1, a(12))
1782
+
1783
+ IF (isat .EQ. 0) THEN
1784
+ DH2O = rhoc
1785
+ DO 10 i=1,20
1786
+ Pnext = Pfind(isat,T,DH2O)
1787
+ Pdif = Pnext - P
1788
+ IF (iphase .EQ. 2) THEN
1789
+ IF (DABS(Pdif) .LE. 0.0d0) THEN
1790
+ RETURN
1791
+ ELSE
1792
+ END IF
1793
+ IF (Pdif .LT. 0.0d0) THEN
1794
+ DH2O = Dmax
1795
+ ELSE
1796
+ DH2O = Dmin
1797
+ END IF
1798
+ ELSE
1799
+ delD = -Pdif/dPdD
1800
+ DH2O = DH2O + delD
1801
+ IF (DH2O .LT. Dmin) DH2O = Dmin
1802
+ IF (DH2O .GT. Dmax) DH2O = Dmax
1803
+ IF (DABS(delD/DH2O) .LT. 1.0d-6) RETURN
1804
+ END IF
1805
+ 10 CONTINUE
1806
+ ELSE
1807
+ Tw = -Tc/T
1808
+ dTw = 1.0d0 + Tw
1809
+
1810
+ CALL ss(r1,th1,s,sd)
1811
+ rho1 = 1.0d0+pw11*dTw+a(1)*(s(1)+s(2))
1812
+ rho2 = xk0*power(r1,a(6)) + xk1*power(r1,q(16))
1813
+
1814
+ Dvap = rhoc * (rho1 - rho2)
1815
+ Dliq = rhoc * (rho1 + rho2)
1816
+
1817
+ RETURN
1818
+ END IF
1819
+
1820
+ RETURN
1821
+ END
1822
+
1823
+ *********************************************************************
1824
+
1825
+ *** TsLVS - Returns saturation T(P)
1826
+
1827
+ DOUBLE PRECISION FUNCTION TsLVS(isat,P)
1828
+
1829
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
1830
+
1831
+ COMMON /therm/ AE, GE, U, H, Entrop, Cp, Cv, betaw, alphw,
1832
+ 1 heat, Speed
1833
+ COMMON /satur/ Dliq, Dvap, DH2O, iphase
1834
+ COMMON /crits/ Tc, rhoc, Pc, Pcon, Ucon, Scon, dPcon
1835
+ COMMON /deri2/ dPdD, dPdT
1836
+
1837
+ SAVE
1838
+
1839
+
1840
+ TsLVS2 = Tc - 1.0d0
1841
+ D = rhoc
1842
+
1843
+ DO 10 i=1,20
1844
+ Pnext = Pfind(isat,TsLVS2,D)
1845
+ dT = (Pnext - P)/dPdT
1846
+ TsLVS2 = TsLVS2 - dT
1847
+ IF (TsLVS2 .GT. Tc) THEN
1848
+ TsLVS2 = Tc
1849
+ ELSE
1850
+ IF (DABS(dT/TsLVS2) .LT. 1.0d-8) THEN
1851
+ GO TO 20
1852
+ ELSE
1853
+ END IF
1854
+ END IF
1855
+ 10 CONTINUE
1856
+
1857
+ 20 TsLVS = TsLVS2
1858
+
1859
+ RETURN
1860
+ END
1861
+
1862
+ *********************************************************************
1863
+
1864
+ *** Pfind - Returns P(T,D). Computes (dP/dD)T when invoked by SUB
1865
+ * Dfind (isat=0) and (dP/dT)D when invoked by SUB TsLVS
1866
+ * (isat=1). Also computes 1st & 2nd partial derivatives
1867
+ * the singular part of the potential (Delta P tilde) that
1868
+ * are used in SUB thmLVS.
1869
+
1870
+ DOUBLE PRECISION FUNCTION Pfind(isat,T,D)
1871
+
1872
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
1873
+
1874
+ DOUBLE PRECISION s(2), xk(2), sd(2)
1875
+
1876
+ COMMON /coefs/ a(20), q(20), x(11)
1877
+ COMMON /crits/ Tc, rhoc, Pc, Pcon, Ucon, Scon, dPcon
1878
+ COMMON /satur/ Dliq, Dvap, DH2O, iphase
1879
+ COMMON /therm/ AE, GE, U, H, Entrop, Cp, Cv, betaw, alphw,
1880
+ 1 heat, Speed
1881
+ COMMON /param/ r1, th1
1882
+ COMMON /tolers/ TTOL, PTOL, DTOL, XTOL, EXPTOL, FPTOL
1883
+ COMMON /deriv/ amu, s, Pw, Tw, dTw, dM0dT, dP0dT,
1884
+ 1 d2PdM2, d2PdMT, d2PdT2, p0th, p1th, xk
1885
+ COMMON /deri2/ dPdD, dPdT
1886
+ ***************************************
1887
+ COMMON /abc2/ r, th
1888
+ ***************************************
1889
+
1890
+ SAVE
1891
+
1892
+ EQUIVALENCE (Pw1, a(5)), (Pw2, a(4)), (Pw3, a(2)),
1893
+ 1 (amc, a(13)), (am1, a(14)), (am2, a(15)),
1894
+ 2 (am3, a(16)), (p00, q(11)), (p20, q(12)),
1895
+ 3 (p40, q(13)), (p01, q(18)), (p21, q(19)),
1896
+ 4 (p41, q(20)), (aa, a(10)), (xk0, a(7)),
1897
+ 5 (xk1, a(12)), (pw11,q(9)), (alpha,q(10)),
1898
+ 6 (alhi,q(15)), (besq,a(9))
1899
+
1900
+ xk(1) = xk0
1901
+ xk(2) = xk1
1902
+ IF (DABS(T-Tc) .LT. FPTOL) T = Tc
1903
+ Tee = (T-Tc)/Tc
1904
+ Tw = -Tc/T
1905
+ dTw = 1.0d0 + Tw
1906
+
1907
+ IF (isat .EQ. 0) THEN
1908
+ rho = D / rhoc
1909
+ CALL conver(rho,Tee,amu,th1,r1,rho1,s,rhodi,err)
1910
+ ELSE
1911
+ th1 = -1.0d0
1912
+ th = th1
1913
+ r1 = dTw/(1.0d0-besq)
1914
+ r = r1
1915
+ CALL ss(r1,th1,s,sd)
1916
+ rho = th1 * (xk0*power(r1,a(6)) +
1917
+ 1 xk1*power(r1,q(16))) +
1918
+ 2 a(1)*(s(1)+s(2))
1919
+ rho = 1.0d0+pw11*dTw+rho
1920
+ amu = 0.0d0
1921
+ D = rho * rhoc
1922
+ END IF
1923
+
1924
+ tt1 = th1*th1
1925
+ tt2 = tt1*tt1
1926
+
1927
+ Pw0 = 1.0d0+dTw*(Pw1+dTw*(Pw2+dTw*Pw3))
1928
+
1929
+ IF (isat .EQ. 0) THEN
1930
+ Pwmu = amu*rhodi
1931
+ ELSE
1932
+ Pwmu = 0.0d0
1933
+ END IF
1934
+
1935
+ p0th = p00+p20*tt1+p40*tt2
1936
+ p1th = p01+p21*tt1+p41*tt2
1937
+
1938
+ dPw0 = xk0*p0th*power(r1,2.0d0-alpha)
1939
+ dPw1 = xk1*p1th*power(r1,2.0d0-alhi)
1940
+ dPw = aa*(dPw0+dPw1)
1941
+
1942
+ Pw = Pw0 + Pwmu + dPw
1943
+
1944
+ Pfind = Pw * Pcon * T
1945
+
1946
+ IF (DABS(th1) .LT. 1.0d0) THEN
1947
+ iphase = 1
1948
+ ELSE
1949
+ iphase = 2
1950
+
1951
+ dP0dT = Pw1+dTw*(2.0d0*Pw2+3.0d0*Pw3*dTw)
1952
+ dM0dT = am1+dTw*(2.0d0*am2+3.0d0*am3*dTw)
1953
+ Uw = dP0dT-rho*dM0dT+pw11*amu+s(1)+s(2)
1954
+
1955
+ dPdTcd = Uw + rho*dM0dT
1956
+ dPwdTw = Pw - Tw*dPdTcd
1957
+
1958
+ dPdT = Pcon * dPwdTw
1959
+
1960
+ END IF
1961
+
1962
+ CALL aux(r1,th1,d2PdT2,d2PdMT,d2PdM2,aa,xk,sd,Cvcoex)
1963
+
1964
+ IF (iphase .EQ. 1) dPdD = dPcon * D * T / d2PdM2
1965
+
1966
+ RETURN
1967
+ END
1968
+
1969
+ ***************************************************************
1970
+
1971
+ *** aux - Calculates some second derivatives of the
1972
+ * anomalous part of the equation of state.
1973
+
1974
+ SUBROUTINE aux(r1,th1,d2PdT2,d2PdMT,d2PdM2,aa,xk,sd,Cvcoex)
1975
+
1976
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
1977
+
1978
+ DOUBLE PRECISION xk(2), s(2), sd(2), w(2), y(2), z(2), coex(2)
1979
+
1980
+ COMMON /coefs/ a(20), q(20), x(11)
1981
+
1982
+ SAVE
1983
+
1984
+ EQUIVALENCE (cc, a(1)), (beta, a(6)), (besq,a(9)),
1985
+ 1 (delta,a(11)), (alpha,q(10)), (s00, a(17)),
1986
+ 2 (s20, a(18)), (s01, a(19)), (s21, a(20))
1987
+
1988
+
1989
+ deli = 0.0d0
1990
+ s(1) = s00+s20*th1*th1
1991
+ s(2) = s01+s21*th1*th1
1992
+ sd(1) = 2.0*th1*s20
1993
+ sd(2) = 2.0*th1*s21
1994
+ ww = 0.0d0
1995
+ yy = 0.0d0
1996
+ zz = 0.0d0
1997
+ gamma = beta*(delta-1.0d0)
1998
+ tt1 = th1*th1
1999
+ ter = 2.0d0*beta*delta-1.0d0
2000
+ g = (1.0+(besq*ter-3.0)*tt1 - besq*(ter-2.0)*tt1*tt1)
2001
+ Cvcoex = 0.0d0
2002
+
2003
+ DO 30 i=1,2
2004
+ alhi = alpha - deli
2005
+ beti = beta + deli
2006
+ gami = gamma - deli
2007
+ IF (r1 .NE. 0.0d0) THEN
2008
+ w(i) = (1.0-alhi)*(1.0-3.0*tt1)*s(i) -
2009
+ 1 beta*delta*(1.0-tt1)*th1*sd(i)
2010
+ w(i) = (w(i)*power(r1,-alhi))/g
2011
+ w(i) = w(i) * xk(i)
2012
+ ww = ww + w(i)
2013
+
2014
+ y(i) = beti*(1.0d0-3.0d0*tt1)*th1 -
2015
+ 1 beta*delta*(1.0d0-tt1)*th1
2016
+ y(i) = (y(i)*power(r1,beti-1.0d0)) * xk(i) / g
2017
+ yy = yy + y(i)
2018
+
2019
+ z(i) = 1.0d0-besq*(1.0d0-(2.0d0*beti))*tt1
2020
+ z(i) = (z(i)*power(r1,-gami)) * xk(i) / g
2021
+ zz = zz + z(i)
2022
+
2023
+ a1 = (beta*(delta-3.0d0)-3.0d0*deli-besq*alhi*gami) /
2024
+ 1 (2.0d0*besq*besq*(2.0d0-alhi)*(1.0d0-alhi)*alhi)
2025
+ a2 = 1+((beta*(delta-3.0d0)-3.0d0*deli-besq*alhi*ter) /
2026
+ 1 (2.0d0*besq*(1.0d0-alhi)*alhi))
2027
+ a2 = -a2
2028
+
2029
+ a4 = 1.0d0+((ter-2.0d0)/(2.0d0*alhi))
2030
+ f1 = a1 + a2 + a4
2031
+
2032
+ coex(i) = ((2.0d0-alhi)*(1.0d0-alhi)*power(r1,-alhi) *
2033
+ 1 f1*xk(i))
2034
+ Cvcoex = Cvcoex + coex(i)
2035
+ END IF
2036
+ deli = 0.5d0
2037
+ 30 CONTINUE
2038
+
2039
+ d2PdT2 = aa * ww
2040
+ d2PdMT = yy + aa*cc*ww
2041
+ d2PdM2 = zz/aa + 2.0d0*cc*yy + cc*cc*aa*ww
2042
+
2043
+ RETURN
2044
+ END
2045
+
2046
+ ***************************************************************
2047
+
2048
+ *** conver - Transforms T,D to parametric variables r,theta
2049
+ * according to the revised and scaled equations.
2050
+
2051
+ SUBROUTINE conver(rho,Tee,amu,th1,r1,rho1s,s1,rhodi,error1)
2052
+
2053
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
2054
+
2055
+ DOUBLE PRECISION s1(2), sd(2)
2056
+
2057
+ COMMON /coefs/ a(20), q(20), x(11)
2058
+ COMMON /crits/ Tc, rhoc, Pc, Pcon, Ucon, Scon, dPcon
2059
+ **************************************************************
2060
+ COMMON /abc2/ r, th
2061
+ **************************************************************
2062
+
2063
+ SAVE
2064
+
2065
+ EQUIVALENCE (beta,a(6)), (delta,a(11)), (xk1, a(12)),
2066
+ 1 (cc, a(1)), (alhi, q(15)), (alpha,q(10)),
2067
+ 2 (besq,a(9)), (p11, q(9)), (deli, q(14)),
2068
+ 3 (p1w, q(18)), (p2w, q(19)), (p4w, q(20)),
2069
+ 4 (aa, a(10)), (xk0, a(7)), (s00, a(17)),
2070
+ 5 (s20, a(18)), (betai,q(16))
2071
+
2072
+
2073
+ Tstar = Tee + 1.0d0
2074
+ dtstin = 1.0d0 - (1.0d0 / Tstar)
2075
+ r1 = dtstin
2076
+
2077
+ IF (dtstin .LE. 0.0d0) THEN
2078
+ r1 = dtstin/(1.0d0-besq)
2079
+ th1 = 1.0d0
2080
+ ELSE
2081
+ th1 = 0.0d0
2082
+ END IF
2083
+
2084
+ CALL ss(r1,th1,s1,sd)
2085
+
2086
+ rhodi = 1.0d0 + p11*dtstin
2087
+ rhodit = rhodi + cc*s1(1) + cc*s1(2)
2088
+ drho = rho - rhodit
2089
+ amu = 0.0d0
2090
+
2091
+ IF (dtstin .LE. 0.0d0) THEN
2092
+ rho1co = xk0*power(r1,beta) + xk1*power(r1,betai)
2093
+ twofaz = rho1co
2094
+ IF (DABS(drho) .LE. twofaz) THEN
2095
+ rho1s = DSIGN(rho1co,drho) + cc*s1(1)
2096
+ th1 = DSIGN(1.00d0,drho)
2097
+ error1 = 1.0d0
2098
+ r = r1
2099
+ th = th1
2100
+ RETURN
2101
+ END IF
2102
+ END IF
2103
+
2104
+ IF (drho .EQ. 0.0d0) THEN
2105
+ th1 = 0.0d0
2106
+ r1 = dtstin
2107
+ rho1s = cc*s1(1)
2108
+ END IF
2109
+
2110
+ *** rule for first pass ***
2111
+
2112
+ y1 = dtstin
2113
+ den1 = rho - rhodit
2114
+
2115
+ CALL rtheta(r1,th1,den1,y1)
2116
+
2117
+ tt = th1*th1
2118
+ amu = aa*power(r1,beta*delta)*th1*(1.0d0-tt)
2119
+ y1 = dtstin + cc*amu
2120
+
2121
+ CALL ss(r1,th1,s1,sd)
2122
+
2123
+ rhoweg = xk1*power(r1,betai)*th1 + cc*s1(2)
2124
+ rho1s = den1 + cc*s1(1) + rhoweg
2125
+ error1 = rho - rhodi - rho1s
2126
+ r = r1
2127
+ th = th1
2128
+
2129
+ IF (DABS(error1) .LT. 1.0d-5) THEN
2130
+ RETURN
2131
+ END IF
2132
+
2133
+ *** rule for second pass ***
2134
+
2135
+ den12 = rho - rhodi - cc*s1(1) + rhoweg
2136
+
2137
+ IF (den12 .EQ. den1) den12 = den1 - 1.0d-6
2138
+
2139
+ CALL rtheta(r1,th1,den12,y1)
2140
+
2141
+ tt = th1*th1
2142
+ amu = aa*power(r1,beta*delta)*th1*(1.0d0-tt)
2143
+ y1 = dtstin + cc*amu
2144
+
2145
+ CALL ss(r1,th1,s1,sd)
2146
+
2147
+ rhoweg = xk1*power(r1,betai)*th1 + cc*s1(2)
2148
+ rho1s2 = den12 + cc*s1(1) + rhoweg
2149
+ error2 = rho - rhodi - rho1s2
2150
+
2151
+ IF (DABS(error2) .LE. 1.0d-5) THEN
2152
+ r = r1
2153
+ th = th1
2154
+ error1 = error2
2155
+ rho1s = rho1s2
2156
+ RETURN
2157
+ END IF
2158
+
2159
+ *** rule for nth pass ***
2160
+
2161
+ den2 = den12
2162
+
2163
+ DO 44 isig=1,10
2164
+ slope = (error2-error1)/(den2-den1)
2165
+ hold = den2
2166
+ den2 = den1 - (error1/slope)
2167
+
2168
+ CALL rtheta(r1,th1,den2,y1)
2169
+
2170
+ tt = th1*th1
2171
+ amu = aa*power(r1,beta*delta)*th1*(1.0d0-tt)
2172
+ y1 = dtstin + cc*amu
2173
+
2174
+ CALL ss(r1,th1,s1,sd)
2175
+
2176
+ rhoweg = xk1*power(r1,betai)*th1 + cc*s1(2)
2177
+ rho1s = den2 + cc*s1(1) + rhoweg
2178
+ error1 = error2
2179
+ error2 = rho - rhodi - rho1s
2180
+ r = r1
2181
+ th = th1
2182
+
2183
+ IF (DABS(error2) .LT. 1.0d-6) RETURN
2184
+
2185
+ den1 = hold
2186
+
2187
+ 44 CONTINUE
2188
+
2189
+ RETURN
2190
+ END
2191
+
2192
+ *********************************************************************
2193
+
2194
+ *** rtheta - Fits data for 1.0 < theta < 1.000001.
2195
+ * Solves:
2196
+ * rho = em*theta*(r**beta)
2197
+ * Tee = r*(1.0d0-besq*theta*theta)
2198
+ *
2199
+ * Routine given by Moldover (1978): Jour. Res. NBS, v. 84, n. 4,
2200
+ * p. 329 - 334.
2201
+
2202
+
2203
+ SUBROUTINE rtheta(r,theta,rho,Tee)
2204
+
2205
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
2206
+
2207
+ COMMON /coefs/ a(20), q(20), x(11)
2208
+
2209
+ SAVE
2210
+
2211
+ EQUIVALENCE (beta,a(6)), (em,a(7)), (besq,a(9))
2212
+
2213
+
2214
+ IF (em .LE. 0.0d0 .OR. besq .LE. 1.0d0) GO TO 600
2215
+
2216
+ absrho = DABS(rho)
2217
+
2218
+ IF (absrho .LT. 1.0d-12) GO TO 600
2219
+
2220
+ bee = DSQRT(besq)
2221
+
2222
+ IF (DABS(Tee) .LT. 1.0d-12) GO TO 495
2223
+ IF (Tee .LT. 0.0d0) THEN
2224
+ z = 1.0d0-(1.0d0-bee)*Tee/(1.0d0-besq) *
2225
+ 1 power(em/absrho,1.0d0/beta)
2226
+ ELSE
2227
+ z = power(1.0d0+Tee*power(em/bee/absrho,1.0d0/beta),
2228
+ 1 -beta)
2229
+ END IF
2230
+ IF (z .GT. 1.00234d0*bee) GO TO 496
2231
+
2232
+ c = -rho*bee/em/power(DABS(Tee),beta)
2233
+ z = DSIGN(z,rho)
2234
+
2235
+ DO 500 n=1,16
2236
+ z2 = z*z
2237
+ z3 = 1.0d0 - z2
2238
+ dz = z3*(z+c*power(DABS(z3),beta))/(z3+2.0d0*beta*z2)
2239
+ z = z - dz
2240
+
2241
+ IF (DABS(dz/z) .LT. 1.0d-12) GO TO 498
2242
+
2243
+ 500 CONTINUE
2244
+
2245
+ 601 IF (DABS(theta) .GT. 1.0001d0) theta = theta/DABS(theta)
2246
+ RETURN
2247
+
2248
+ 498 theta = z/bee
2249
+ r = Tee/(1.0d0-z*z)
2250
+ r = DABS(r)
2251
+ RETURN
2252
+
2253
+ 495 theta = DSIGN(1.0d0,rho)/bee
2254
+ r = power(rho/(em*theta),1.0d0/beta)
2255
+ RETURN
2256
+
2257
+ 496 theta = DSIGN(1.0d0,rho)
2258
+ r = Tee/(1.0d0-besq)
2259
+ r = DABS(r)
2260
+ RETURN
2261
+
2262
+ 600 IF (DABS(Tee) .LT. 1.0d-12) GO TO 601
2263
+
2264
+ IF (Tee .LT. 0.0d0) GO TO 496
2265
+
2266
+ theta = 1.0d-12
2267
+ r = Tee
2268
+ RETURN
2269
+
2270
+ END
2271
+
2272
+ *********************************************************************
2273
+
2274
+ *** ss - Computes terms of the summation that defines dPotl/dT
2275
+ * and the 1st derivative of the theta (s) square polynomial.
2276
+
2277
+ SUBROUTINE ss(r,th,s,sd)
2278
+
2279
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
2280
+
2281
+ DOUBLE PRECISION s(2), sd(2), sx(2)
2282
+
2283
+ COMMON /coefs/ a(20), q(20), x(11)
2284
+ ***************************************************************
2285
+ COMMON /abc1/ dPdM
2286
+ ***************************************************************
2287
+
2288
+ SAVE
2289
+
2290
+ EQUIVALENCE (alpha,q(10)), (beta,a(6)), (besq,a(9)),
2291
+ 1 (delta,a(11)), (deli,q(14)), (alhi,q(15)),
2292
+ 2 (beti, q(16)), (gami,q(17)), (p00, q(11)),
2293
+ 3 (p01, q(18)), (s00, a(17)), (s20, a(18)),
2294
+ 4 (s01, a(19)), (s21, a(20))
2295
+
2296
+ tt = th*th
2297
+ sx(1) = s00 + s20*tt
2298
+ sd(1) = 2.0d0*s20*th
2299
+ sx(2) = s01 + s21*tt
2300
+ sd(2) = 2.0d0*s21*th
2301
+ s(1) = sx(1)*a(10)*a(7)*power(r,1.0d0-alpha)
2302
+ s(2) = sx(2)*a(10)*a(12)*power(r,1.0d0-alhi)
2303
+
2304
+ dPdM = power(r,beta)*a(7)*th + a(1)*power(r,1.0d0-alpha)*
2305
+ 1 a(10)*a(7)*sx(1) +
2306
+ 2 power(r,beti)*a(12)*th + a(1)*power(r,1.0d0-alhi)*
2307
+ 3 a(10)*a(12)*sx(2)
2308
+
2309
+ RETURN
2310
+ END
2311
+
2312
+ *****************************************************************
2313
+
2314
+ *** thmLVS - Calculates thermodynamic and transport properties
2315
+ * of critical region H2O using the Levelt Sengers, et al
2316
+ * (1983) equation of state.
2317
+
2318
+ SUBROUTINE thmLVS(isat,T,r1,th1)
2319
+
2320
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
2321
+
2322
+ DOUBLE PRECISION s(2), xk(2), sd(2)
2323
+
2324
+ COMMON /coefs/ a(20), q(20), x(11)
2325
+ COMMON /crits/ Tc, rhoc, Pc, Pcon, Ucon, Scon, dPcon
2326
+ COMMON /therm/ AE, GE, U, H, Entrop, Cp, Cv, betaw, alphw,
2327
+ 1 heat, Speed
2328
+ COMMON /satur/ Dliq, Dvap, DH2O, iphase
2329
+ COMMON /deriv/ amu, s, Pw, Tw, dTw, dM0dT, dP0dT,
2330
+ 1 d2PdM2, d2PdMT, d2PdT2, p0th, p1th, xk
2331
+ COMMON /deri2/ dPdD, dPdT
2332
+ *************************************************************
2333
+ COMMON /abc1/ dPdM
2334
+ COMMON /abc3/ dPdTcd
2335
+ *************************************************************
2336
+
2337
+ SAVE
2338
+
2339
+ EQUIVALENCE (pw2, a(4)), (pw3, a(2)), (besq, a(9)),
2340
+ 1 (amc, a(13)), (am1, a(14)), (am2, a(15)),
2341
+ 2 (aa, a(10)), (xk0, a(7)), (am3, a(16)),
2342
+ 3 (xk1, a(12)), (pw11,q(9)), (alpha, q(10)),
2343
+ 4 (alhi,q(15)), (pw1, a(5))
2344
+
2345
+ d2P0dT = 2.0d0*pw2 + 6.0d0*pw3*dTw
2346
+ d2M0dT = 2.0d0*am2 + 6.0d0*am3*dTw
2347
+
2348
+ dP0dT = pw1+dTw*(2.0d0*pw2+3.0d0*pw3*dTw)
2349
+ dM0dT = am1+dTw*(2.0d0*am2+3.0d0*am3*dTw)
2350
+
2351
+ IF (isat .EQ. 0) THEN
2352
+ rho = DH2O / rhoc
2353
+ Uw = dP0dT-rho*dM0dT+pw11*amu+s(1)+s(2)
2354
+ ELSE
2355
+ rho = th1 * (xk0*power(r1,a(6)) + xk1*power(r1,q(16)))
2356
+ 1 + a(1)*(s(1)+s(2))
2357
+ rho = 1.0d0+pw11*dTw+rho
2358
+ Uw = dP0dT-rho*dM0dT+pw11*amu+s(1)+s(2)
2359
+ DH2O = rho * rhoc
2360
+ dPdT2 = Pw - Tw*(Uw+rho*dM0dT)
2361
+ heat = 1.0d3*T*(Pcon*dPdT2)*(1.0d0/Dvap-1.0d0/Dliq)
2362
+
2363
+ CALL ss(r1,th1,s,sd)
2364
+ CALL aux(r1,th1,d2PdT2,d2PdMT,d2PdM2,aa,xk,sd,Cvcoex)
2365
+ IF (r1 .NE. 0.0d0) THEN
2366
+ dPdD = dPcon * DH2O * T / d2PdM2
2367
+ END IF
2368
+ END IF
2369
+
2370
+ IF (r1 .NE. 0.0d0) THEN
2371
+ dPdTcd = dP0dT+pw11*(amu-rho/d2PdM2)+s(1)+s(2) -
2372
+ 1 d2PdMT*rho/d2PdM2
2373
+ dPwdTw = Pw - Tw*dPdTcd
2374
+ dPdTal = Pcon * dPwdTw
2375
+
2376
+ CviTw2 = d2P0dT - rho*d2M0dT + d2PdT2 -
2377
+ 1 (pw11+d2PdMT)*(pw11+d2PdMT)/d2PdM2
2378
+ Cvw = CviTw2 * Tw*Tw
2379
+ Cpw = Cvw + d2PdM2*dPwdTw*dPwdTw / (rho*rho)
2380
+ betaw = 1.0d0 / (DH2O*dPdD)
2381
+ alphw = betaw * dPdTal
2382
+ Speed = 1.0d3 * DSQRT(Cpw/Cvw*dPdD)
2383
+ ELSE
2384
+ Cvw = 1.0d0
2385
+ Cpw = 1.0d0
2386
+ betaw = 1.0d0
2387
+ alphw = 1.0d0
2388
+ Speed = 0.0d0
2389
+ END IF
2390
+
2391
+ Hw = Pw - Tw*Uw
2392
+ Sw = Hw - rho*(amu+amc+dTw*(am1+dTw*(am2+dTw*am3)))
2393
+
2394
+ Scond = Scon/DH2O
2395
+
2396
+ U = Uw * Ucon/DH2O
2397
+ H = Hw * Scond * T
2398
+ entrop = Sw * Scond
2399
+ AE = U - T * entrop
2400
+ GE = H - T * entrop
2401
+ Cv = Cvw * Scond
2402
+ Cp = Cpw * Scond
2403
+
2404
+ RETURN
2405
+ END
2406
+
2407
+ ********************************************************
2408
+
2409
+ *** dalLVS - Computes/returns (d(alpha)/dt)p(D,T,alpha)
2410
+ * for the Levelt Sengers et al. (1983)
2411
+ * equation of state. Note that D (kg/m**3),
2412
+ * T (degK), P (MPa), alpha (degK**-1).
2413
+
2414
+
2415
+ DOUBLE PRECISION FUNCTION dalLVS(D,T,P,alpha)
2416
+
2417
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
2418
+
2419
+ DOUBLE PRECISION sss(2), xk(2), s(2), dsdT(2), sp(2), dspdT(2),
2420
+ 1 k(2), calpha(2), cbeta(2), cgamma(2),
2421
+ 2 u(2), v(2), w(2), dudT(2), dvdT(2), dwdT(2)
2422
+
2423
+ COMMON /coefs/ aa(20), qq(20), xx(11)
2424
+ COMMON /crits/ Tc, Dc, Pc, Pcon, Ucon, Scon, dPcon
2425
+ COMMON /deriv/ amu, sss, Pw, Tw, dTw, dM0dT, dP0dT,
2426
+ 1 d2PdM2, d2PdMT, d2PdT2, p0th, p1th, xk
2427
+ COMMON /deri2/ dPdD, dPdT
2428
+ *************************************************************
2429
+ COMMON /abc1/ dPdM
2430
+ COMMON /abc2/ r,th
2431
+ COMMON /abc3/ dPdTcd
2432
+ *************************************************************
2433
+
2434
+ SAVE
2435
+
2436
+ EQUIVALENCE (a, aa(10)), (c, aa(1)), (delta, aa(11)),
2437
+ 1 (bsq, aa(9)), (P11, qq(9)), (Delta1, qq(14)),
2438
+ 2 (P1, aa(5)), (P2, aa(4)), (P3, aa(2)),
2439
+ 3 (s00, aa(17)), (s01, aa(19)), (s20, aa(18)),
2440
+ 4 (s21, aa(20))
2441
+
2442
+
2443
+ IF (r .EQ. 0.0d0) THEN
2444
+ dalLVS = 1.0d6
2445
+ RETURN
2446
+ END IF
2447
+
2448
+ k(1) = aa(7)
2449
+ k(2) = aa(12)
2450
+ calpha(1) = qq(10)
2451
+ calpha(2) = qq(15)
2452
+ cbeta(1) = aa(6)
2453
+ cbeta(2) = qq(16)
2454
+ cgamma(1) = cbeta(1)*(delta - 1.0d0)
2455
+ cgamma(2) = cgamma(1) - Delta1
2456
+ delT = (T - Tc) / T
2457
+
2458
+ s(1) = s00 + s20*th**2
2459
+ s(2) = s01 + s21*th**2
2460
+ sp(1) = 2.0d0*s20*th
2461
+ sp(2) = 2.0d0*s21*th
2462
+
2463
+ *********************************************************************
2464
+ ***
2465
+ *** Compute drdT and d0dT from solution of the linear system
2466
+ ***
2467
+ *** ax = b
2468
+ ***
2469
+ *** d(dPdM)/dT = -D/Dc*alpha - P11*Tc/T**2 = ar1*drdT + a01*d0dT = b1
2470
+ *** d(delT)/dT = Tc/T**2 = ar2*drdT + a02*d0dT = b2
2471
+ ***
2472
+
2473
+ b1 = -D/Dc*alpha - P11*Tc/T/T
2474
+ b2 = Tc/T**2
2475
+
2476
+ ar1 = 0.0d0
2477
+ a01 = 0.0d0
2478
+ DO 10 i = 1,2
2479
+ ar1 = ar1 + k(i) * (cbeta(i)*th*power(r,cbeta(i)-1.0d0) +
2480
+ 1 a*c*(1.0d0 - calpha(i))*power(r,-calpha(i))*s(i))
2481
+ a01 = a01 + k(i) * (power(r,cbeta(i)) + a*c*sp(i)*
2482
+ 1 power(r,1.0d0-calpha(i)))
2483
+ 10 CONTINUE
2484
+
2485
+ ar2 = 1.0d0 - bsq*th**2 - a*c*cbeta(1)*delta*
2486
+ 1 (1.0d0 - th**2)*th*power(r,(cbeta(1)*delta - 1.0d0))
2487
+ a02 = 3.0d0*a*c*th**2*power(r,cbeta(1)*delta) -
2488
+ 1 2.0d0*bsq*r*th - a*c*power(r,cbeta(1)*delta)
2489
+
2490
+ *********************************************************************
2491
+ *** solve the linear system with simplistic GE w/ partial pivoting
2492
+ *********************************************************************
2493
+
2494
+ IF (DABS(ar1) .GT. DABS(ar2)) THEN
2495
+ amult = -ar2 / ar1
2496
+ d0dT = (b2 + amult*b1) / (a02 + amult*a01)
2497
+ drdT = (b1 - a01*d0dT) / ar1
2498
+ ELSE
2499
+ amult = -ar1 / ar2
2500
+ d0dT = (b1 + amult*b2) / (a01 + amult*a02)
2501
+ drdT = (b2 - a02*d0dT) / ar2
2502
+ END IF
2503
+
2504
+ *********************************************************************
2505
+ ***
2506
+ *** Compute theta polynomials and their tempertaure derivatives
2507
+ ***
2508
+
2509
+ dsdT(1) = 2.0d0*s20*th*d0dT
2510
+ dsdT(2) = 2.0d0*s21*th*d0dT
2511
+ dspdT(1) = 2.0d0*s20*d0dT
2512
+ dspdT(2) = 2.0d0*s21*d0dT
2513
+
2514
+ q = 1.0d0 + (bsq*(2.0d0*cbeta(1)*delta - 1.0d0) - 3.0d0)*
2515
+ 1 th**2 - bsq*(2.0d0*cbeta(1)*delta - 3.0d0)*th**4
2516
+
2517
+ dqdT = 2.0d0*(bsq*(2.0d0*cbeta(1)*delta - 1.0d0) - 3.0d0)*
2518
+ 1 th*d0dT - 4.0d0*bsq*(2.0d0*cbeta(1)*delta - 3.0d0)*
2519
+ 2 th**3*d0dT
2520
+
2521
+ DO 20 i = 1,2
2522
+ u(i) = (1.0d0 - bsq*(1.0d0 - 2.0d0*cbeta(i))*th**2) / q
2523
+ dudT(i) = (-2.0d0*bsq*(1.0d0 - 2.0d0*cbeta(i))*th*d0dT -
2524
+ 1 u(i)*dqdT) / q
2525
+ v(i) = ((cbeta(i) - cbeta(1)*delta)*th +
2526
+ 1 (cbeta(1)*delta - 3.0d0*cbeta(i))*th**3) / q
2527
+ dvdT(i) = ((cbeta(i) - cbeta(1)*delta)*d0dT +
2528
+ 1 3.0d0*(cbeta(1)*delta - 3.0d0*cbeta(i))*
2529
+ 2 th**2*d0dT - v(i)*dqdT) / q
2530
+ w(i) = ((1.0d0 - calpha(i))*(1.0d0 - 3.0d0*th**2)*
2531
+ 1 s(i) - cbeta(1)*delta*(th - th**3)*sp(i)) / q
2532
+ dwdT(i) = ((1.0d0 - calpha(i))*((1.0d0 - 3.0d0*th**2)*
2533
+ 1 dsdT(i) - 6.0d0*th*s(i)*d0dT) - cbeta(1)*
2534
+ 2 delta*((th - th**3)*dspdT(i) + sp(i)*
2535
+ 3 (d0dT - 3.0d0*th**2*d0dT)) - w(i)*dqdT) / q
2536
+ 20 CONTINUE
2537
+
2538
+ *********************************************************************
2539
+ ***
2540
+ *** Compute dP0dTT, ddelMT, dPdTT, dPdMMT, dPdMTT, dPPTT
2541
+ ***
2542
+
2543
+ dP0dTT = Tc/T**2 * (2.0d0*P2 + 6.0d0*P3*delT)
2544
+
2545
+ ddelMT = a*power(r,cbeta(1)*delta)* (cbeta(1)*delta*th/r*
2546
+ 1 (1.0d0 - th**2)*drdT + (1.0d0 - 3.0d0*th**2)*d0dT)
2547
+
2548
+ dPdTT = 0.0d0
2549
+ dPdMMT = 0.0d0
2550
+ dPdMTT = 0.0d0
2551
+ DO 30 i = 1,2
2552
+ dPdTT = dPdTT + a*k(i) * (power(r,1.0d0-calpha(i))*
2553
+ 1 dsdT(i) + s(i)*(1.0d0 - calpha(i))*
2554
+ 2 power(r,-calpha(i))*drdT)
2555
+
2556
+ dPdMMT = dPdMMT + k(i) * ((power(r,-cgamma(i))*dudT(i) -
2557
+ 1 u(i)*cgamma(i)*power(r,-1.0d0-cgamma(i))*drdT) /
2558
+ 2 a + 2.0d0*c*(power(r,cbeta(i)-1.0d0)*dvdT(i) +
2559
+ 3 v(i)*(cbeta(i) - 1.0d0)*power(r,cbeta(i)-2.0d0)*
2560
+ 4 drdT) + a*c**2*(power(r,-calpha(i))*dwdT(i) -
2561
+ 5 calpha(i)*w(i)*power(r,-1.0d0-calpha(i))*drdT))
2562
+
2563
+ dPdMTT = dPdMTT + k(i) * (power(r,cbeta(i)-1.0d0)*dvdT(i) +
2564
+ 1 v(i)*(cbeta(i) - 1.0d0)*power(r,cbeta(i)-2.0d0)*
2565
+ 2 drdT + a*c*(power(r,-calpha(i))*dwdT(i) -
2566
+ 3 calpha(i)*power(r,-1.0d0-calpha(i))*drdT*w(i)))
2567
+
2568
+ 30 CONTINUE
2569
+
2570
+ dPPTT = dP0dTT + dPdTT + P11*ddelMT - D/Dc*dPdMTT/d2PdM2 +
2571
+ 1 (P11 + d2PdMT)*(D/Dc*alpha/d2PdM2 +
2572
+ 2 D/Dc*dPdMMT/d2PdM2**2)
2573
+
2574
+ pterm = P/Pc + dPdTcd
2575
+
2576
+ *** compute (d(alpha)/dT)P
2577
+
2578
+ dalLVS = Tc*Dc**2/D**2/T**2 * (-2.0d0/T*d2PdM2*pterm +
2579
+ 1 2.0d0*alpha*d2PdM2*pterm + pterm*dPdMMT +
2580
+ 2 d2PdM2*dPPTT)
2581
+
2582
+ RETURN
2583
+
2584
+ END
2585
+
2586
+ *********************************************************************
2587
+
2588
+ *** backup - Save Pfind COMMON values during saturation check.
2589
+
2590
+ SUBROUTINE backup
2591
+
2592
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
2593
+
2594
+ DOUBLE PRECISION s(2), xk(2)
2595
+
2596
+ COMMON /satur/ Dliq, Dvap, DH2O, iphase
2597
+ COMMON /param/ r1, th1
2598
+ COMMON /deriv/ amu, s, Pw, Tw, dTw, dM0dT, dP0dT,
2599
+ 1 d2PdM2, d2PdMT, d2PdT2, p0th, p1th, xk
2600
+ COMMON /deri2/ dPdD, dPdT
2601
+ COMMON /store/ sav2, sav3, sav4, sav5, sav6, sav7, sav8,
2602
+ 1 sav9, sav10, sav11, sav12, sav13, sav14, sav15,
2603
+ 2 sav16, sav17, sav18, sav19, isav1
2604
+
2605
+ SAVE
2606
+
2607
+
2608
+ isav1 = iphase
2609
+
2610
+ sav2 = r1
2611
+ sav3 = th1
2612
+
2613
+ sav4 = amu
2614
+ sav5 = s(1)
2615
+ sav6 = s(2)
2616
+ sav7 = Pw
2617
+ sav8 = Tw
2618
+ sav9 = dTw
2619
+ sav10 = dM0dT
2620
+ sav11 = dP0dT
2621
+ sav12 = d2PdM2
2622
+ sav13 = d2PdMT
2623
+ sav14 = d2PdT2
2624
+ sav15 = p0th
2625
+ sav16 = p1th
2626
+ sav17 = xk(1)
2627
+ sav18 = xk(2)
2628
+
2629
+ sav19 = dPdD
2630
+
2631
+ RETURN
2632
+ END
2633
+
2634
+ *********************************************************************
2635
+
2636
+ *** restor - Restore Pfind COMMON values after saturation check.
2637
+
2638
+
2639
+ SUBROUTINE restor
2640
+
2641
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
2642
+
2643
+ DOUBLE PRECISION s(2), xk(2)
2644
+
2645
+ COMMON /satur/ Dliq, Dvap, DH2O, iphase
2646
+ COMMON /param/ r1, th1
2647
+ COMMON /deriv/ amu, s, Pw, Tw, dTw, dM0dT, dP0dT,
2648
+ 1 d2PdM2, d2PdMT, d2PdT2, p0th, p1th, xk
2649
+ COMMON /deri2/ dPdD, dPdT
2650
+ COMMON /store/ sav2, sav3, sav4, sav5, sav6, sav7, sav8,
2651
+ 1 sav9, sav10, sav11, sav12, sav13, sav14, sav15,
2652
+ 2 sav16, sav17, sav18, sav19, isav1
2653
+
2654
+ SAVE
2655
+
2656
+
2657
+ iphase = isav1
2658
+
2659
+ r1 = sav2
2660
+ th1 = sav3
2661
+
2662
+ amu = sav4
2663
+ s(1) = sav5
2664
+ s(2) = sav6
2665
+ Pw = sav7
2666
+ Tw = sav8
2667
+ dTw = sav9
2668
+ dM0dT = sav10
2669
+ dP0dT = sav11
2670
+ d2PdM2 = sav12
2671
+ d2PdMT = sav13
2672
+ d2PdT2 = sav14
2673
+ p0th = sav15
2674
+ p1th = sav16
2675
+ xk(1) = sav17
2676
+ xk(2) = sav18
2677
+
2678
+ dPdD = sav19
2679
+
2680
+ RETURN
2681
+ END
2682
+
2683
+ **********************************************************************
2684
+
2685
+ *** load - Load thermodynamic and transport property values from
2686
+ * ptemp into props.
2687
+
2688
+ SUBROUTINE load(phase,ptemp,props)
2689
+
2690
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
2691
+
2692
+ PARAMETER (NPROP = 23, NPROP2 = 46)
2693
+
2694
+ DOUBLE PRECISION ptemp(NPROP), props(NPROP2)
2695
+ INTEGER phase, key(NPROP,2)
2696
+
2697
+ SAVE
2698
+
2699
+ DATA key
2700
+ 1 / 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23,
2701
+ 2 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45,
2702
+ 3 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24,
2703
+ 4 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46 /
2704
+
2705
+
2706
+ DO 10 i = 1,NPROP
2707
+ 10 props(key(i,phase)) = ptemp(i)
2708
+
2709
+ RETURN
2710
+ END
2711
+
2712
+ ******************************************************************
2713
+
2714
+ *** tpset - Dimension triple point U, S, H, A, G values (in J/g from
2715
+ * Table 2, Helgeson & Kirkham, 1974a) into user-specified units.
2716
+
2717
+ SUBROUTINE tpset
2718
+
2719
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
2720
+
2721
+ COMMON /units/ ft, fd, fvd, fvk, fs, fp, fh, fst, fc
2722
+ COMMON /tpoint/ Utripl, Stripl, Htripl, Atripl, Gtripl,
2723
+ 1 Ttripl, Ptripl, Dltrip, Dvtrip
2724
+
2725
+ SAVE
2726
+
2727
+ DATA Utr, Str, Htr, Atr, Gtr
2728
+ 1 / -15766.0d0, 3.5144d0, -15971.0d0, -12870.0d0, -13073.0d0 /
2729
+
2730
+
2731
+ Utripl = Utr * fh
2732
+ Stripl = Str * fh
2733
+ Htripl = Htr * fh
2734
+ Atripl = Atr * fh
2735
+ Gtripl = Gtr * fh
2736
+
2737
+ END
2738
+
2739
+ ****************************************************************************
2740
+
2741
+ *** triple - Convert U, S, H, A, G values computed with reference to
2742
+ * zero triple point properties (Haar et al., 1984;
2743
+ * Levelt Sengers et al., 1983) into values referenced to
2744
+ * triple point properties given by Helgeson and Kirkham, 1974a.
2745
+
2746
+ SUBROUTINE triple(T,wpzero)
2747
+
2748
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
2749
+
2750
+ PARAMETER (NPROP = 23)
2751
+
2752
+ DOUBLE PRECISION wpzero(NPROP)
2753
+ INTEGER A, G, S, U, H
2754
+
2755
+ COMMON /tpoint/ Utr, Str, Htr, Atr, Gtr,
2756
+ 1 Ttripl, Ptripl, Dltrip, Dvtrip
2757
+
2758
+ SAVE
2759
+
2760
+ DATA A, G, S, U, H
2761
+ 1 / 1, 2, 3, 4, 5 /
2762
+
2763
+
2764
+ wpzero(S) = wpzero(S) + Str
2765
+
2766
+ TS = T*wpzero(S) - Ttripl*Str
2767
+
2768
+ wpzero(G) = wpzero(H) - TS + Gtr
2769
+ wpzero(A) = wpzero(U) - TS + Atr
2770
+
2771
+ wpzero(H) = wpzero(H) + Htr
2772
+ wpzero(U) = wpzero(U) + Utr
2773
+
2774
+ END
2775
+
2776
+ *********************************************************************
2777
+
2778
+ *** power - Returns base**exp utilizing the intrinsic FORTRAN
2779
+ * exponentiation function in such a manner so as to
2780
+ * insure computation of machine-independent values
2781
+ * for all defined exponentiations. Attempted undefined
2782
+ * exponentiations produce an error message and cause
2783
+ * program termination.
2784
+
2785
+ DOUBLE PRECISION FUNCTION power(base,exp)
2786
+
2787
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
2788
+
2789
+ INTEGER rterm, wterm, reacf, pronf, tabf, plotf(6)
2790
+
2791
+ COMMON /io/ rterm, wterm, iconf, reacf, pronf, tabf, plotf
2792
+
2793
+ SAVE
2794
+
2795
+ DATA TOL / 1.0d-7 /
2796
+
2797
+
2798
+ IF (base .GT. 0.0d0) THEN
2799
+ power = base**exp
2800
+ ELSE
2801
+ IF (DABS(base) .GT. TOL) THEN
2802
+ IF (DBLE(INT(exp)) .NE. exp) THEN
2803
+ WRITE(wterm,10) base, exp
2804
+ 10 FORMAT(/,' neg base ** real exp is complex',
2805
+ 1 /,' base,exp: ',2e20.13,/)
2806
+ STOP
2807
+ ELSE
2808
+ IF (MOD(exp,2.0d0) .EQ. 0.0d0) THEN
2809
+ power = (-base)**exp
2810
+ ELSE
2811
+ power = -((-base)**exp)
2812
+ END IF
2813
+ END IF
2814
+ ELSE
2815
+ IF (exp .GT. 0.0d0) THEN
2816
+ power = 0.0d0
2817
+ ELSE
2818
+ WRITE(wterm,20) base, exp
2819
+ 20 FORMAT(/,' zero base ** (exp <= 0) is undefined',
2820
+ 1 /,' base,exp: ',2e20.13)
2821
+ STOP
2822
+ END IF
2823
+ END IF
2824
+ END IF
2825
+
2826
+ RETURN
2827
+ END
2828
+
2829
+ ***********************************************************************
2830
+
2831
+ *** TdegK - Returns input temperature t converted from
2832
+ * user-specified units to degK.
2833
+
2834
+ DOUBLE PRECISION FUNCTION TdegK(it,t)
2835
+
2836
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
2837
+
2838
+ SAVE
2839
+
2840
+
2841
+ GO TO (1,2,3,4), it
2842
+
2843
+ 1 TdegK = t
2844
+ RETURN
2845
+
2846
+ 2 TdegK = t + 273.15d0
2847
+ RETURN
2848
+
2849
+ 3 TdegK = t / 1.8d0
2850
+ RETURN
2851
+
2852
+ 4 TdegK = (t + 459.67d0) / 1.8d0
2853
+ RETURN
2854
+
2855
+ END
2856
+
2857
+ ***********************************************************************
2858
+
2859
+ *** TdegUS - Returns input temperature t converted
2860
+ * from degK to user-specified units.
2861
+
2862
+ DOUBLE PRECISION FUNCTION TdegUS(it,t)
2863
+
2864
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
2865
+
2866
+ SAVE
2867
+
2868
+
2869
+ GO TO (1,2,3,4), it
2870
+
2871
+ 1 TdegUS = t
2872
+ RETURN
2873
+
2874
+ 2 TdegUS = t - 273.15d0
2875
+ RETURN
2876
+
2877
+ 3 TdegUS = t * 1.8d0
2878
+ RETURN
2879
+
2880
+ 4 TdegUS = t * 1.8d0 - 459.67d0
2881
+ RETURN
2882
+
2883
+ END
2884
+
2885
+ *********************************************************************
2886
+
2887
+ *** dim[HGK,LVS] - Dimensioning routines for H2O88.
2888
+
2889
+ *********************************************************************
2890
+
2891
+ *** dimHGK - Dimensions thermodynamic and transport property values
2892
+ * computed from the HGK equation of state per user-specified
2893
+ * choice of units.
2894
+
2895
+ SUBROUTINE dimHGK(isat,itripl,t,p,d,epseqn)
2896
+
2897
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
2898
+
2899
+ PARAMETER (NPROP = 23)
2900
+
2901
+ DOUBLE PRECISION wprops(NPROP), wpliq(NPROP)
2902
+ INTEGER aw, gw, sw, uw, hw, cvw, cpw, vsw, alw, bew,
2903
+ 1 diw, viw, tcw, stw, tdw, Prw, vikw, albew,
2904
+ 2 ZBw, YBw, QBw, dalwdT, XBw
2905
+ INTEGER epseqn
2906
+
2907
+ COMMON /units/ ft, fd, fvd, fvk, fs, fp, fh, fst, fc
2908
+ COMMON /fcts/ ad, gd, sd, ud, hd, cvd, cpd, dpdt, dvdt, dpdd,
2909
+ 1 cjtt, cjth
2910
+ COMMON /aconst/ wm, gascon, tz, aa, z, dz, y, uref, sref
2911
+ COMMON /RTcurr/ rt
2912
+ COMMON /wpvals/ wprops, wpliq
2913
+
2914
+ SAVE
2915
+
2916
+ DATA aw, gw, sw, uw, hw, cvw, cpw, vsw, alw, bew, diw, viw,
2917
+ 1 tcw, stw, tdw, Prw, vikw, albew, ZBw, YBw, QBw,
2918
+ 2 dalwdT, XBw
2919
+ 3 / 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
2920
+ 4 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 /
2921
+
2922
+
2923
+ wprops(aw) = ad * rt * fh
2924
+ wprops(gw) = gd * rt * fh
2925
+ wprops(sw) = sd * gascon * fh * ft
2926
+ wprops(uw) = ud * rt * fh
2927
+ wprops(hw) = hd * rt * fh
2928
+ wprops(cvw) = cvd * gascon * fh * ft
2929
+ wprops(cpw) = cpd * gascon * fh * ft
2930
+ wprops(vsw) = DSQRT(DABS(cpd*dpdd*1.0d3/cvd)) * fs
2931
+ wprops(bew) = 1.0d0 / (d * dpdd * fp)
2932
+ wprops(alw) = d * dvdt
2933
+ wprops(dalwdT) = dalHGK(d,t,wprops(alw))
2934
+
2935
+
2936
+ pbars = p*1.0d1
2937
+ dkgm3 = d * 1.0d3
2938
+ betaPa = wprops(bew)*fp / 1.0d6
2939
+ betab = wprops(bew)*fp / 1.0d1
2940
+ CpJKkg = wprops(cpw)/fh/ft * 1.0d3
2941
+
2942
+ wprops(viw) = viscos(t,pbars,dkgm3,betaPa) * fvd
2943
+ wprops(tcw) = thcond(t,pbars,dkgm3,wprops(alw),betaPa) * fc * ft
2944
+ IF ((isat .EQ. 0) .OR. (isat .EQ. 2)) THEN
2945
+ wprops(stw) = 0.0d0
2946
+ ELSE
2947
+ wprops(stw) = surten(t) * fst
2948
+ END IF
2949
+
2950
+ CALL Born92(t,pbars,dkgm3/1.0d3,betab,wprops(alw),wprops(dalwdT),
2951
+ 1 wprops(diw),wprops(ZBw),wprops(QBw),wprops(YBw),
2952
+ 2 wprops(XBw),epseqn)
2953
+
2954
+ wprops(tdw) = wprops(tcw)/fc/ft / (dkgm3 * CpJKkg) * fvk
2955
+ IF (wprops(tcw) .NE. 0.0d0) THEN
2956
+ wprops(Prw) = wprops(viw)/fvd * CpJKkg / (wprops(tcw)/fc/ft)
2957
+ ELSE
2958
+ wprops(Prw) = 0.0d0
2959
+ END IF
2960
+ wprops(vikw) = wprops(viw)/fvd / dkgm3 * fvk
2961
+ wprops(albew) = wprops(alw) / wprops(bew)
2962
+
2963
+ IF (itripl .EQ. 1) CALL triple(t,wprops)
2964
+
2965
+ END
2966
+
2967
+ *****************************************************************************
2968
+
2969
+ *** dimLVS - Dimension critical region properties per user-specs
2970
+ * and load into tprops.
2971
+
2972
+ SUBROUTINE dimLVS(isat,itripl,theta,T,Pbars,dl,dv,tprops,epseqn)
2973
+
2974
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
2975
+
2976
+ PARAMETER (NPROP = 23)
2977
+
2978
+ DOUBLE PRECISION tprops(NPROP)
2979
+ INTEGER aw, gw, sw, uw, hw, cvw, cpw, vsw, alw, bew,
2980
+ 1 diw, viw, tcw, stw, tdw, Prw, vikw, albew,
2981
+ 2 ZBw, YBw, QBw, dalwdT, XBw
2982
+ INTEGER epseqn
2983
+
2984
+
2985
+ COMMON /therm/ AE, GE, U, H, Entrop, Cp, Cv, betaw, alphw,
2986
+ 1 heat, Speed
2987
+ COMMON /satur/ Dliq, Dvap, DH2O, iphase
2988
+ COMMON /units/ ft, fd, fvd, fvk, fs, fp, fh, fst, fc
2989
+ *****************************************************************
2990
+ COMMON /abc2/ r, th
2991
+ *****************************************************************
2992
+
2993
+ SAVE
2994
+
2995
+ DATA aw, gw, sw, uw, hw, cvw, cpw, vsw, alw, bew, diw, viw,
2996
+ 1 tcw, stw, tdw, Prw, vikw, albew, ZBw, YBw, QBw,
2997
+ 2 dalwdT, XBw
2998
+ 3 / 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
2999
+ 4 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 /
3000
+
3001
+
3002
+ IF (isat .EQ. 1) THEN
3003
+ dv = Dvap
3004
+ dl = Dliq
3005
+ END IF
3006
+
3007
+ tprops(aw) = AE * fh
3008
+ tprops(gw) = GE * fh
3009
+ tprops(sw) = Entrop * fh * ft
3010
+ tprops(uw) = U * fh
3011
+ tprops(hw) = H * fh
3012
+ tprops(cvw) = Cv * fh * ft
3013
+ tprops(cpw) = Cp * fh * ft
3014
+ tprops(vsw) = Speed * fs
3015
+ tprops(bew) = betaw / fp
3016
+ tprops(alw) = alphw
3017
+ *****************************************************************
3018
+ th = theta
3019
+ tprops(dalwdT) = dalLVS(DH2O,T,Pbars/1.0d1,tprops(alw))
3020
+ *****************************************************************
3021
+
3022
+ CpJKkg = Cp * 1.0d3
3023
+ betaPa = betaw / 1.0d6
3024
+ betab = betaw / 1.0d1
3025
+
3026
+ IF (DABS(theta) .NE. 1.0d0) THEN
3027
+ dkgm3 = DH2O
3028
+ tprops(stw) = 0.0d0
3029
+ ELSE
3030
+ IF (theta .LT. 0.0d0) THEN
3031
+ dkgm3 = Dvap
3032
+ tprops(stw) = 0.0d0
3033
+ ELSE
3034
+ dkgm3 = Dliq
3035
+ dkgm3 = Dliq
3036
+ tprops(stw) = surten(T) * fst
3037
+ END IF
3038
+ END IF
3039
+
3040
+ CALL Born92(T,Pbars,dkgm3/1.0d3,betab,tprops(alw),tprops(dalwdT),
3041
+ 1 tprops(diw),tprops(ZBw),tprops(QBw),tprops(YBw),
3042
+ 2 tprops(XBw),epseqn)
3043
+
3044
+ tprops(viw) = viscos(T,Pbars,dkgm3,betaPa) * fvd
3045
+ tprops(tcw) = thcond(T,Pbars,dkgm3,tprops(alw),betaPa) * fc * ft
3046
+
3047
+ tprops(tdw) = tprops(tcw)/fc/ft / (dkgm3 * CpJKkg) * fvk
3048
+ tprops(Prw) = tprops(viw)/fvd * CpJKkg / (tprops(tcw)/fc/ft)
3049
+ tprops(vikw) = tprops(viw)/fvd / dkgm3 * fvk
3050
+ tprops(albew) = tprops(alw) / tprops(bew)
3051
+
3052
+ IF (itripl .EQ. 1) CALL triple(T,tprops)
3053
+
3054
+ END
3055
+
3056
+ **********************************************************************
3057
+
3058
+ *** tran88 - Set of FORTRAN77 functions that compute transport
3059
+ * properties of fluid H2O. Input state parameters
3060
+ * should be computed from the Haar et al. (1984)
3061
+ * and Levelt Sengers et al. (1983) equations of state in
3062
+ * order to facilitate comparision with published tabular
3063
+ * values referenced below for each function.
3064
+ *
3065
+ **********************************************************************
3066
+
3067
+ *** programmer: James W. Johnson
3068
+ *** abandoned: 20 January 1988
3069
+
3070
+ **********************************************************************
3071
+
3072
+ *** viscos - Returns dynamic viscosity of H2O in kg/m*s (= Pa*s)
3073
+ * if Tk, Pbars falls within the validity region (specified
3074
+ * by the initial IF statement) of the Watson et al. (1980)
3075
+ * equation; otherwise returns zero. See equations 3.1-2 and
3076
+ * 4.1-5 and Tables 1, 6, and 8 from Sengers and
3077
+ * Kamgar-Parsi (1984).
3078
+
3079
+ DOUBLE PRECISION FUNCTION viscos(Tk,Pbars,Dkgm3,betaPa)
3080
+
3081
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
3082
+
3083
+ PARAMETER (Tstar = 647.270d0)
3084
+ PARAMETER (Dstar = 317.763d0)
3085
+ PARAMETER (Pstar = 22.1150d6)
3086
+ PARAMETER (ustar = 1.0d-6)
3087
+
3088
+ DOUBLE PRECISION a(4), b(6,7)
3089
+
3090
+ SAVE
3091
+
3092
+ DATA a / 0.0181583d0, 0.0177624d0, 0.0105287d0, -0.0036744d0 /
3093
+
3094
+ DATA b / 0.5132047d0, 0.3205656d0, 0.0d0, 0.0d0,
3095
+ 1 -0.7782567d0, 0.1885447d0, 0.2151778d0, 0.7317883d0,
3096
+ 2 1.2410440d0, 1.4767830d0, 0.0d0, 0.0d0,
3097
+ 3 -0.2818107d0, -1.0707860d0, -1.2631840d0, 0.0d0,
3098
+ 4 0.0d0, 0.0d0, 0.1778064d0, 0.4605040d0,
3099
+ 5 0.2340379d0, -0.4924179d0, 0.0d0, 0.0d0,
3100
+ 6 -0.0417661d0, 0.0d0, 0.0d0, 0.1600435d0,
3101
+ 7 0.0d0, 0.0d0, 0.0d0, -0.01578386d0,
3102
+ 8 0.0d0, 0.0d0, 0.0d0, 0.0d0,
3103
+ 9 0.0d0, 0.0d0, 0.0d0, -0.003629481d0,
3104
+ 1 0.0d0, 0.0d0 /
3105
+
3106
+ DATA TOL /1.0d-2/
3107
+
3108
+
3109
+ viscos = 0.0d0
3110
+ TdegC = Tk - 273.15d0
3111
+
3112
+ IF ((Pbars .GT. 5000.0d0+TOL) .OR.
3113
+ 1 ((Pbars .GT. 3500.0d0+TOL).AND.(TdegC .GT. 150.0d0+TOL)).OR.
3114
+ 2 ((Pbars .GT. 3000.0d0+TOL).AND.(TdegC .GT. 600.0d0+TOL)) .OR.
3115
+ 3 (TdegC .GT. 900.0d0+TOL)) RETURN
3116
+
3117
+ T = Tk / Tstar
3118
+ D = Dkgm3 / Dstar
3119
+
3120
+ sum = 0.0d0
3121
+ DO 10 i=0,3
3122
+ 10 sum = sum + a(i+1)/T**i
3123
+ u0 = ustar * DSQRT(T) / sum
3124
+
3125
+ sum = 0.0d0
3126
+ DO 20 i=0,5
3127
+ DO 20 j=0,6
3128
+ 20 sum = sum + b(i+1,j+1) * (1.0d0/T-1)**i * (D-1)**j
3129
+ u1 = DEXP(D*sum)
3130
+
3131
+ IF ((0.997d0 .LE. T) .AND. (T .LE. 1.0082d0) .AND.
3132
+ 1 (0.755d0 .LE. D) .AND. (D .LE. 1.2900d0)) THEN
3133
+ xt = Pstar/Dstar**2 * betaPa * Dkgm3**2
3134
+ IF (xt .LT. 22.0d0) THEN
3135
+ u2 = 1.0d0
3136
+ ELSE
3137
+ u2 = 0.922 * power(xt,0.0263d0)
3138
+ END IF
3139
+ ELSE
3140
+ u2 = 1.0d0
3141
+ END IF
3142
+
3143
+ viscos = u0 * u1 * u2
3144
+
3145
+ RETURN
3146
+ END
3147
+
3148
+ *****************************************************************
3149
+
3150
+ *** thcond - Returns thermal conductivity of H2O in J/m*deg*s (=W/m*deg)
3151
+ * if Tk, Pbars falls within the validity region (specified
3152
+ * by the initial IF statement) of the Sengers et al. (1984)
3153
+ * equation; returns zero otherwise. See equations 3.2-14
3154
+ * and tables 2-5 and I.5-6 from the above reference.
3155
+
3156
+ DOUBLE PRECISION FUNCTION thcond(Tk,Pbars,Dkgm3,alph,betaPa)
3157
+
3158
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
3159
+
3160
+ PARAMETER (Tstar = 647.270d0)
3161
+ PARAMETER (Dstar = 317.763d0)
3162
+ PARAMETER (Pstar = 22.1150d6)
3163
+ PARAMETER (ustar = 1.0d-6)
3164
+ PARAMETER (C = 3.7711d-8)
3165
+
3166
+ DOUBLE PRECISION aL(4), au(4), bL(6,5), bu(5,6), L0, L1, L2
3167
+
3168
+ SAVE
3169
+
3170
+ DATA aL / 0.2022230d1, 0.1411166d2, 0.5255970d1, -0.2018700d1 /
3171
+
3172
+ DATA au / 0.0181583d0, 0.0177624d0, 0.0105287d0, -0.0036744d0 /
3173
+
3174
+ DATA bL / 1.329304600d0, -0.404524370d0, 0.244094900d0,
3175
+ 1 0.018660751d0, -0.129610680d0, 0.044809953d0,
3176
+ 2 1.701836300d0, -2.215684500d0, 1.651105700d0,
3177
+ 3 -0.767360020d0, 0.372833440d0, -0.112031600d0,
3178
+ 4 5.224615800d0, -1.012411100d1, 4.987468700d0,
3179
+ 5 -0.272976940d0, -0.430833930d0, 0.133338490d0,
3180
+ 6 8.712767500d0, -9.500061100d0, 4.378660600d0,
3181
+ 7 -0.917837820d0, 0.0d0, 0.0d0,
3182
+ 8 -1.852599900d0, 0.934046900d0, 0.0d0,
3183
+ 9 0.0d0, 0.0d0, 0.0d0 /
3184
+
3185
+ DATA bu / 0.5019380d0, 0.2356220d0, -0.2746370d0, 0.1458310d0,
3186
+ 1 -0.0270448d0, 0.1628880d0, 0.7893930d0, -0.7435390d0,
3187
+ 2 0.2631290d0, -0.0253093d0, -0.1303560d0, 0.6736650d0,
3188
+ 3 -0.9594560d0, 0.3472470d0, -0.0267758d0, 0.9079190d0,
3189
+ 4 1.2075520d0, -0.6873430d0, 0.2134860d0, -0.0822904d0,
3190
+ 5 -0.5511190d0, 0.0670665d0, -0.4970890d0, 0.1007540d0,
3191
+ 6 0.0602253d0, 0.1465430d0, -0.0843370d0, 0.1952860d0,
3192
+ 7 -0.0329320d0, -0.0202595d0 /
3193
+
3194
+ DATA TOL /1.0d-2/
3195
+
3196
+
3197
+ thcond = 0.0d0
3198
+ TdegC = Tk - 273.15d0
3199
+
3200
+ IF ((Pbars .GT. 4000.0d0+TOL) .OR.
3201
+ 1 ((Pbars .GT. 2000.0d0+TOL).AND.(TdegC .GT. 125.0d0+TOL)).OR.
3202
+ 2 ((Pbars .GT. 1500.0d0+TOL).AND.(TdegC .GT. 400.0d0+TOL)).OR.
3203
+ 3 (TdegC .GT. 800.0d0+TOL)) RETURN
3204
+
3205
+ T = Tk / Tstar
3206
+ D = Dkgm3 / Dstar
3207
+
3208
+ sum = 0.0d0
3209
+ DO 10 i=0,3
3210
+ 10 sum = sum + aL(i+1)/T**i
3211
+ L0 = DSQRT(T) / sum
3212
+
3213
+ sum = 0.0d0
3214
+ DO 20 i=0,4
3215
+ DO 20 j=0,5
3216
+ 20 sum = sum + bL(j+1,i+1) * (1.0d0/T-1)**i * (D-1)**j
3217
+ L1 = DEXP(D*sum)
3218
+
3219
+ sum = 0.0d0
3220
+ DO 40 i=0,3
3221
+ 40 sum = sum + au(i+1)/T**i
3222
+ u0 = ustar * DSQRT(T) / sum
3223
+
3224
+ sum = 0.0d0
3225
+ DO 50 i=0,5
3226
+ DO 50 j=0,4
3227
+ 50 sum = sum + bu(j+1,i+1) * (1.0d0/T-1)**i * (D-1)**j
3228
+ u1 = DEXP(D*sum)
3229
+
3230
+ xt = Pstar/Dstar**2 * betaPa * Dkgm3**2
3231
+ dPdT = Tstar/Pstar * alph/betaPa
3232
+
3233
+ L2 = C / (u0*u1) * (T/D)**2 * dPdT**2 * power(xt,0.4678d0) *
3234
+ 1 DSQRT(D) * DEXP(-18.66d0*(T-1)**2 - (D-1)**4)
3235
+
3236
+ thcond = L0 * L1 + L2
3237
+
3238
+ RETURN
3239
+ END
3240
+
3241
+ ******************************************************************
3242
+
3243
+ *** surten - Returns the surface tension of vapor-saturated liquid
3244
+ * H2O in MPa*cm (converted from N/m) as computed from
3245
+ * the Vargaftik et al. (1983) equation. See equations
3246
+ * 10.1-2, Kestin et al. (1984); compare also equation
3247
+ * C.5 and table 11, Haar et al. (1984).
3248
+
3249
+ DOUBLE PRECISION FUNCTION surten(Tsatur)
3250
+
3251
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
3252
+
3253
+ PARAMETER (Ttripl = 273.16d0)
3254
+ PARAMETER (Tcrit = 647.067d0)
3255
+ PARAMETER (Tstar = 647.27d0)
3256
+ PARAMETER (Tcstar = 0.999686d0)
3257
+ PARAMETER (v = 1.256d0)
3258
+ PARAMETER (B = -0.625d0)
3259
+ PARAMETER (stref = 0.2358d0)
3260
+ PARAMETER (FPTOL = 1.0d-10)
3261
+
3262
+ SAVE
3263
+
3264
+
3265
+ IF ((Tsatur .LT. Ttripl) .OR. (Tsatur .GT. Tcrit)) THEN
3266
+ surten = 0.0d0
3267
+ RETURN
3268
+ END IF
3269
+
3270
+ IF (Tsatur .GE. Tcrit-FPTOL) THEN
3271
+ Tnorm = 0.0d0
3272
+ ELSE
3273
+ Tnorm = (Tcstar - Tsatur/Tstar) / Tcstar
3274
+ END IF
3275
+
3276
+ surten = stref * power(Tnorm,v) * (1.0d0 + B*Tnorm)
3277
+
3278
+ RETURN
3279
+
3280
+ END
3281
+
3282
+ ******************************************************************
3283
+
3284
+ *** Born92 - Computes the Z, Q, Y, and X Born functions at TK, Pbars.
3285
+ ***
3286
+ *** epseqn = 1 ...... use Helgeson-Kirkham (1974) equation
3287
+ *** epseqn = 2 ...... use Pitzer (1983) equation
3288
+ *** epseqn = 3 ...... use Uematsu-Franck (1980) equation
3289
+ *** epseqn = 4 ...... use Johnson-Norton (1991) equation
3290
+ *** epseqn = 5 ...... use Archer-Wang (1990) equation
3291
+ ***
3292
+ SUBROUTINE Born92(TK,Pbars,Dgcm3,betab,alphaK,daldT,
3293
+ 1 eps,Z,Q,Y,X,epseqn)
3294
+
3295
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
3296
+
3297
+ PARAMETER (TMAX = 1000.0d0, PMAX = 5000.0d0, TOL = 1.0d-3)
3298
+
3299
+ INTEGER epseqn
3300
+
3301
+ SAVE
3302
+
3303
+
3304
+ eps = 0.0d0
3305
+ Z = 0.0d0
3306
+ Y = 0.0d0
3307
+ Q = 0.0d0
3308
+ X = 0.0d0
3309
+
3310
+ TdegC = TK - 273.15d0
3311
+
3312
+ *** The following line can be commented out to facilitate probably
3313
+ *** unreliable, yet potentially useful, predictive calculations
3314
+ *** at state conditions beyond the validity limits of the aqueous
3315
+ *** species equation of state.
3316
+
3317
+ IF ((TdegC .GT. TMAX+TOL) .OR. (Pbars .GT. PMAX+TOL)) RETURN
3318
+
3319
+ * IF (epseqn .EQ. 1) THEN
3320
+ * CALL HK74(TK,Dgcm3,betab,alphaK,daldT,
3321
+ * 1 eps,dedP,dedT,d2edT2)
3322
+ * CALL epsBrn(eps,dedP,dedT,d2edT2,Z,Q,Y,X)
3323
+ * RETURN
3324
+ * END IF
3325
+
3326
+ * IF (epseqn .EQ. 2) THEN
3327
+ * CALL Pitz83(TK,Dgcm3,betab,alphaK,daldT,
3328
+ * 1 eps,dedP,dedT,d2edT2)
3329
+ * CALL epsBrn(eps,dedP,dedT,d2edT2,Z,Q,Y,X)
3330
+ * RETURN
3331
+ * END IF
3332
+
3333
+ * IF (epseqn .EQ. 3) THEN
3334
+ * CALL UF80(TK,Dgcm3,betab,alphaK,daldT,
3335
+ * 1 eps,dedP,dedT,d2edT2)
3336
+ * CALL epsBrn(eps,dedP,dedT,d2edT2,Z,Q,Y,X)
3337
+ * RETURN
3338
+ * END IF
3339
+
3340
+ IF (epseqn .EQ. 4) THEN
3341
+ CALL JN91(TK,Dgcm3,betab,alphaK,daldT,
3342
+ 1 eps,dedP,dedT,d2edT2)
3343
+ CALL epsBrn(eps,dedP,dedT,d2edT2,Z,Q,Y,X)
3344
+ RETURN
3345
+ END IF
3346
+
3347
+ * IF (epseqn .EQ. 5) THEN
3348
+ * Dkgm3 = Dgcm3 * 1.0d3
3349
+ * PMPa = Pbars / 1.0d1
3350
+ * betam = betab * 1.0d1
3351
+ * CALL AW90(TK,PMPa,Dkgm3,betam,alphaK,daldT,
3352
+ * 1 eps,dedP,dedT,d2edT2)
3353
+ **** convert dedP FROM MPa**-1 TO bars**-1
3354
+ * dedP = dedP / 1.0d1
3355
+ * CALL epsBrn(eps,dedP,dedT,d2edT2,Z,Q,Y,X)
3356
+ * RETURN
3357
+ * END IF
3358
+
3359
+ END
3360
+
3361
+ *********************************************************************
3362
+
3363
+ *** JN91 - Compute (eps, dedP, dedT, d2edT2)(T,D) using equations
3364
+ *** given by Johnson and Norton (1991); fit parameters
3365
+ *** regressed from least squares fit to dielectric data
3366
+ *** consistent with the HK74 equation and low temperatures,
3367
+ *** and with the Pitz83 equation at high temperatures.
3368
+ ***
3369
+ *** Units: T ............... K
3370
+ *** D ............... g/cm**3
3371
+ *** beta, dedP ...... bar**(-1)
3372
+ *** alpha, dedT ..... K**(-1)
3373
+ *** daldT, d2edT2 ... K**(-2)
3374
+
3375
+
3376
+ SUBROUTINE JN91(T,D,beta,alpha,daldT,eps,dedP,dedT,d2edT2)
3377
+
3378
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
3379
+
3380
+ DOUBLE PRECISION a(10), c(5), dcdT(5), dc2dTT(5)
3381
+
3382
+ SAVE
3383
+
3384
+ DATA Tref / 298.15d0 /
3385
+
3386
+ DATA a /
3387
+ 1 0.1470333593E+02,
3388
+ 2 0.2128462733E+03,
3389
+ 3 -0.1154445173E+03,
3390
+ 4 0.1955210915E+02,
3391
+ 5 -0.8330347980E+02,
3392
+ 6 0.3213240048E+02,
3393
+ 7 -0.6694098645E+01,
3394
+ 8 -0.3786202045E+02,
3395
+ 9 0.6887359646E+02,
3396
+ 1 -0.2729401652E+02 /
3397
+
3398
+ Tn = T / Tref
3399
+
3400
+ c(1) = 1.0d0
3401
+ dcdT(1) = 0.0d0
3402
+ dc2dTT(1) = 0.0d0
3403
+
3404
+ c(2) = a(1)/Tn
3405
+ dcdT(2) = -a(1)*Tref/T**2
3406
+ dc2dTT(2) = 2.0d0*a(1)*Tref/T**3
3407
+
3408
+ c(3) = a(2)/Tn + a(3) + a(4)*Tn
3409
+ dcdT(3) = -a(2)*Tref/T**2 + a(4)/Tref
3410
+ dc2dTT(3) = 2.0d0*a(2)*Tref/T**3
3411
+
3412
+ c(4) = a(5)/Tn + a(6)*Tn + a(7)*Tn**2
3413
+ dcdT(4) = -a(5)*Tref/T**2 + a(6)/Tref
3414
+ 1 + 2.0d0*a(7)*T/Tref**2
3415
+ dc2dTT(4) = 2.0d0*a(5)*Tref/T**3 + 2.0d0*a(7)/Tref**2
3416
+
3417
+ c(5) = a(8)/Tn**2 + a(9)/Tn + a(10)
3418
+ dcdT(5) = -2.0d0*a(8)*Tref**2/T**3 - a(9)*Tref/T**2
3419
+ dc2dTT(5) = 6.0d0*a(8)*Tref**2/T**4 + 2.0d0*a(9)*Tref/T**3
3420
+
3421
+ eps = 0.0d0
3422
+ DO 50 k=1,5
3423
+ 50 eps = eps + c(k)*D**(k-1)
3424
+
3425
+ dedP = 0.0d0
3426
+ DO 100 j = 0,4
3427
+ 100 dedP = dedP + j*c(j+1)*D**j
3428
+ dedP = beta * dedP
3429
+
3430
+ dedT = 0.0d0
3431
+ DO 200 j = 0,4
3432
+ 200 dedT = dedT + D**j*(dcdT(j+1) - j*alpha*c(j+1))
3433
+
3434
+ d2edT2 = 0.0d0
3435
+ DO 300 j = 0,4
3436
+ 300 d2edT2 = d2edT2 + D**j*(dc2dTT(j+1) - j*(alpha*dcdT(j+1) +
3437
+ 1 c(j+1)*daldT) - j*alpha*(dcdT(j+1) - j*alpha*c(j+1)))
3438
+
3439
+ END
3440
+
3441
+ ***************************************************************
3442
+
3443
+ *** epsBrn - Compute the Z, Q, Y, and X Born functions from their
3444
+ *** eps, dedP, dedT, and d2edT2 counterparts.
3445
+
3446
+ SUBROUTINE epsBrn(eps,dedP,dedT,d2edT2,Z,Q,Y,X)
3447
+
3448
+ IMPLICIT DOUBLE PRECISION (a-h,o-z)
3449
+
3450
+ SAVE
3451
+
3452
+ Z = -1.0d0/eps
3453
+ Q = 1.0d0/eps**2 * dedP
3454
+ Y = 1.0d0/eps**2 * dedT
3455
+ X = 1.0d0/eps**2 * d2edT2 - 2.0d0*eps*Y**2
3456
+
3457
+ END