summaryrefslogtreecommitdiff
path: root/Utilib/src/HEAVYSTEAM.f90
diff options
context:
space:
mode:
Diffstat (limited to 'Utilib/src/HEAVYSTEAM.f90')
-rw-r--r--Utilib/src/HEAVYSTEAM.f90390
1 files changed, 390 insertions, 0 deletions
diff --git a/Utilib/src/HEAVYSTEAM.f90 b/Utilib/src/HEAVYSTEAM.f90
new file mode 100644
index 0000000..62c97d5
--- /dev/null
+++ b/Utilib/src/HEAVYSTEAM.f90
@@ -0,0 +1,390 @@
+!
+!-----------------------------------------------------------------------
+!
+!Purpose:
+! Heavy water properties
+!
+!Copyright:
+! Copyright (C) 2018 Ecole Polytechnique de Montreal
+! This library is free software; you can redistribute it and/or
+! modIFy it under the terms of the GNU Lesser General Public
+! License as published by the Free Software Foundation; either
+! version 2.1 of the License, or (at your option) any later version.
+!
+!Author(s): G. Marleau and A. Hebert
+!
+!-----------------------------------------------------------------------
+!
+subroutine THMHSP(p, t)
+! return the saturation pressure (Pa) as a function of the temperature (K)
+! Ref: Ji. Zhang, January 20, 98
+ real :: p, t
+ double precision :: tcd,zd,pd
+ character hsmg*131
+ !
+ tcd=dble(t-273.16)
+ pd=0.0D0
+ IF(tcd .LT. 90.5D0 .OR. tcd.GT.370.74D0) THEN
+ WRITE(hsmg,*) 'THMHSP: T =',tcd,'C exceeds the valid temperature range', &
+ & ' for automatic pressure evaluation (90.5<T<370.74)'
+ call XABORT(hsmg)
+ ELSEIF (tcd .GT. 320.0D0) THEN
+ zd = (tcd - 320.0D0)/46.0D0
+ pd = 11.442428D6 + (7.0289472D6 + 1.7422423D6*zd)*zd &
+ + 0.2384117D6*zd**3.680D0
+ ELSEIF (tcd .GT. 252.0D0) THEN
+ zd = (tcd - 252.0D0)/68.0D0
+ pd = 4.1333143D6 + (4.75435D6 + 2.124772D6*zd)*zd &
+ + 0.4299918D6*zd**3.2250D0
+ ELSEIF (tcd .GT. 179.0D0) THEN
+ zd = (tcd - 179.0D0)/73.0D0
+ pd = 0.9682855D6 + (1.6569005D6 + 1.1322316D6*zd)*zd &
+ + 0.3758966D6*zd**3.1460D0
+ ELSEIF (tcd .GT. 127.0D0) THEN
+ zd = (tcd - 127.0D0)/52.0D0
+ pd =0.2385152D6 + (0.384338812D6 + 0.2559459D6*zd)*zd &
+ + 0.089485567D6*zd**3.1740D0
+ ELSE
+ zd = (tcd - 90.50D0)/36.50D0
+ pd =0.06736076D6 + (0.09519366D6 + 0.05709235D6*zd)*zd &
+ + 0.01886846D6*zd**3.2010D0
+ ENDIF
+ p =real(pd)
+end subroutine THMHSP
+!
+subroutine THMHST(p, t)
+! return the saturation temperature (K) as a function of the pressure (Pa)
+! Ref: Ji. Zhang, January 20, 98
+ real :: p, t
+ double precision :: pd,z,td
+ character hsmg*131
+ !
+ pd=p
+ td=0.0d0
+ IF (0.0741494D6 .GT. pd .OR. pd .GT. 21.2082144D6) THEN
+ WRITE(hsmg,*) 'THMHST: P =',pd,'Pa exceeds the valid pressure range', &
+ & ' for temperature evaluation (0.0741494<P<21.2082144) MPa'
+ call XABORT(hsmg)
+ ELSEIF (pd .GT. 6.9829216D6) THEN
+ z = (pd - 6.9829216D6)/14.2252928D6
+ td = 2.85D2 + (136.2916149D0 - 517.5749172D0*z)*z &
+ + 465.2833023D0*z**2.0509579D0
+ ELSEIF (pd .GT. 2.2074482D6) THEN
+ z = (pd - 2.2074482D6)/4.7754734D6
+ td = 2.175D2 + (110.6079115D0 - 414.5685862D0*z)*z &
+ + 371.4606747D0*z**2.0575065D0
+ ELSEIF (pd .GT. 0.6891798D6) THEN
+ z = (pd - 0.6891798D6)/1.5182684D6
+ td = 1.65D2 + (87.5356881D0 - 423.3068041D0*z)*z &
+ + 388.271116D0*z**2.0455901D0
+ ELSEIF (pd .GT. 0.2241012D6) THEN
+ z = (pd - 0.2241012D6)/0.4650786D6
+ td = 1.25D2 + (66.1987487D0 - 225.285045D0*z)*z &
+ + 199.0862962D0*z**2.0653628D0
+ ELSE
+ z = (pd - 0.0741494D6)/0.1499518D6
+ td = 9.3D1 + (53.0754191D0 - 165.0407938D0*z)*z &
+ + 143.9653747D0*z**2.0723743D0
+ ENDIF
+ t=REAL(td)+273.16
+end subroutine THMHST
+!
+subroutine THMHPT(p, t, rho, h, zk, zmu, cp)
+! return the remaining thermohydraulics parameters as a function of the pressure (Pa)
+! and temperature (K)
+! Ref: Ji. Zhang, January 20, 98
+ use, intrinsic :: iso_c_binding
+ implicit real*8(a-h,o-z)
+ real :: p, t, rho, h, zk, zmu, cp, ps
+ interface
+ subroutine free_pT (pd, td, rhod, hd, zkd, zmud, cpd) bind(c, name='free_pT')
+ use, intrinsic :: iso_c_binding
+ real(c_double) :: pd, td, rhod, hd, zkd, zmud, cpd
+ end subroutine free_pT
+ end interface
+ !
+ tcd=dble(t-273.16)
+ pd=dble(p)
+ call THMHSP(ps, t)
+ psd=dble(ps)
+ !
+ ! compute density in kg/m3
+ drho=0.0d0
+ IF (90.50D0 .GT. tcd .OR. tcd .GT. 369.0D0) THEN
+ call XABORT('THMHPT: exceed the valid temperature range')
+ ELSEIF (tcd .LT. 307.50D0) THEN
+ zd = (tcd - 90.50D0)/217.0D0
+ drho = 1.07065471D3 - (0.1611572D3 + 0.12188254D3*zd)*zd &
+ - 0.2106382D2*zd**6.830
+ ELSEIF (tcd .LT. 350.0D0) THEN
+ zd = (tcd - 307.50D0)/42.50D0
+ drho = 0.7665511D3 - (0.1074816D3 + 0.2506107D2*zd)*zd &
+ - 0.1042465D2*zd**4.640
+ ELSEIF (tcd .LT. 364.0D0) THEN
+ zd = (tcd - 350.0D0)/14.0D0
+ drho = 0.6235838D3 - (0.0678503D3 + 0.01551348D3*zd)*zd &
+ - 0.7259508D1*zd**4.470
+ ELSE
+ zd = (tcd - 364.0D0)/4.50D0
+ drho = 0.5329606D3 - (0.4286569D2 + 0.1064107D2*zd)*zd &
+ - 0.4761284D1*zd**5
+ ENDIF
+ A = (0.91725D0+0.61D-7*(drho-825.0D0)**2)*(drho+103.65D0)-drho
+ B = 0.12D-6*psd-0.3D0
+ DT = 1.0D6*(370.74D0-tcd)
+ RR = (B+DT/(22.13D6 - psd))/(B+DT/(pd - psd))
+ rho = REAL((drho+(A*RR)))
+ !
+ ! compute specific enthalpy, in J/kg
+ IF (90.5D0 .GT. tcd .OR. tcd .GT. 358.5D0) THEN
+ call XABORT('THMHPT: exceed the valid temperature range(1).')
+ ELSEIF (p .GT. 22.131475E6) THEN
+ call XABORT('THMHPT: exceed the valid pressure range(1).')
+ ELSE
+ H0=0.0d0
+ IF (tcd .LT. 257.5D0) THEN
+ Z = (tcd - 90.5D0)/167.D0
+ H0 = 365.515323D0 + (696.60209D0 - 9.3229851D0*Z)*Z &
+ + 30.7092221D0*Z**3.535D0
+ ELSEIF (tcd .LT. 340.D0) THEN
+ Z = (tcd - 257.5D0)/82.5D0
+ H0 = 1083.50185D0 + (388.54695D0 + 40.6830346D0*Z)*Z &
+ + 21.4058154D0*Z**4.79D0
+ ELSEIF (tcd .LT. 364.D0) THEN
+ Z = (tcd - 340.D0)/24.D0
+ H0 = 1534.137695D0 + (166.53D0 + 27.8460448D0*Z)*Z &
+ + 15.9652752D0*Z**5.67D0
+ ELSE
+ Z = (tcd - 364.D0)/5.D0
+ H0 = 1744.47897D0 + (65.11525D0 + 15.3342016D0*Z)*Z &
+ + 8.2093984D0*Z**5.74D0
+ ENDIF
+ A = (0.9769D0 - 0.695D-6*(tcd - 199.4D0)**2)*(H0+27.93D0) - H0
+ B = 0.13D-1*tcd - 2.D0
+ DT = 1.D06*(370.74D0 - tcd)
+ HH = (B + DT/(22.131475D06 - psd))/(B+DT/(pd - psd))
+ h = REAL(H0 + A*HH)*1.0E3
+ ENDIF
+ !
+ ! compute specific heat capacity, in J/kg.K
+ IF (90.5 .GT. tcd .OR. tcd .GT. 354.5) THEN
+ call XABORT('THMHPT: exceed the valid temperature range(2).')
+ ELSEIF (p .GT. 20.06E6) THEN
+ call XABORT('THMHPT: exceed the valid pressure range(2).')
+ ELSE
+ CP0=0.0d0
+ IF (tcd .LT. 216.D0) THEN
+ Z = (tcd - 90.5D0)/125.5D0
+ CP0 = 0.2398399D0 + (0.7260874D-2 - 0.8715753D-2*Z)*Z &
+ - 0.1067229D-1*Z**2.43D0
+ CP0 = 1.D0/CP0
+ ELSEIF (tcd .LT. 289.D0) THEN
+ Z = (tcd - 216.D0)/73.D0
+ CP0 = 4.3914986D0 + (0.4050098D0 + 0.2650923D0*Z)*Z &
+ + 0.152426D0*Z**4.26D0
+ ELSEIF (tcd .LT. 334.D0) THEN
+ Z = (tcd - 289.D0)/45.D0
+ CP0 = 0.1917903D0 - (0.3592811D-1 + 0.1396726D-1*Z)*Z &
+ - 0.5187553D-2*Z**4.07D0
+ CP0 = 1.D0/CP0
+ ELSEIF (tcd .LT. 357.D0) THEN
+ Z = (tcd - 334.D0)/23.D0
+ CP0 = 0.1367074D0 - (0.4343216D-1 + 0.1360508D-1*Z)*Z &
+ - 0.5536208D-2*Z**3.82D0
+ CP0 = 1.D0/CP0
+ ELSE
+ Z = (tcd - 357.D0)/9.5D0
+ CP0 = 0.07413399D0 - (0.3791352D-1 + 0.6539416D-2*Z)*Z &
+ - 0.2756629D-2*Z**2.58D0
+ CP0 = 1.D0/CP0
+ ENDIF
+ A = -0.19878D0 + (1.521D0 - 0.393D0*CP0)*CP0
+ B = -0.293594D0 + (0.45876D0 + 0.57448D-02*CP0)*CP0
+ DT = 1.D06*(370.74D0 - tcd)
+ CC = B + DT/(pd - psd)
+ cp = REAL(CP0 + A/CC)*1.0E3
+ ENDIF
+ !
+ ! use thermal conductivity and dynamic viscosity of light water
+ td=dble(t)
+ call free_pT(pd, td, rhod, hd, zkd, zmud, cpd)
+ zk=real(zkd)
+ zmu=real(zmud)
+end subroutine THMHPT
+!
+subroutine THMHTX(t, x, rho, h, zk, zmu, cp)
+! return the remaining thermohydraulics parameters as a function of the temperature (K)
+! and quality
+! Ref: Ji. Zhang, January 20, 98
+ use, intrinsic :: iso_c_binding
+ implicit real*8(a-h,o-z)
+ real :: t, x, rho, h, zk, zmu, cp
+ interface
+ subroutine free_Tx (td, xd, rhod, hd, zkd, zmud, cpd) bind(c, name='free_Tx')
+ use, intrinsic :: iso_c_binding
+ real(c_double) :: td, xd, rhod, hd, zkd, zmud, cpd
+ end subroutine free_Tx
+ end interface
+ !
+ tcd=dble(t-273.16)
+ RO = 0.0D0
+ H0 = 0.0D0
+ CP0 = 0.0D0
+ IF (x.EQ.0.0) THEN
+ ! saturated liquid
+ if (90.5D0 .GT. tcd .OR. tcd .GT. 367.D0) then
+ call XABORT('THMHTX: the valid range of temperature is exceeded(1).')
+ ENDIF
+ !
+ ! compute density in kg/m3
+ IF (tcd .LT. 307.5D0) then
+ Z = (tcd - 90.5D0)/217.D0
+ RO = 1.07065471D3 - (0.1611572D3 + 0.12188254D3*Z)*Z &
+ - 0.2106382D2*Z**6.83D0
+ ELSEIF (tcd .LT. 350.D0) then
+ Z = (tcd - 307.5D0)/42.5D0
+ RO = 0.7665511D3 - (0.1074816D3 + 0.2506107D2*Z)*Z &
+ - 0.1042465D2*Z**4.64D0
+ ELSEIF (tcd .LT. 364.D0) then
+ Z = (tcd - 350.D0)/14.D0
+ RO = 0.6235838D3 - (0.0678503D3 + 0.01551348D3*Z)*Z &
+ - 0.7259508D1*Z**4.47D0
+ ELSE
+ Z = (tcd - 364.D0)/4.5D0
+ RO = 0.5329606D3 - (0.4286569D2 + 0.1064107D2*Z)*Z &
+ - 0.4761284D1*Z**5
+ ENDIF
+ !
+ ! compute specific enthalpy, in J/kg
+ IF (tcd .LT. 257.5D0) then
+ Z = (tcd - 90.5D0)/167.D0
+ H0 = 365.515323D0 + (696.60209D0 - 9.3229851D0*Z)*Z &
+ + 30.7092221D0*Z**3.535D0
+ ELSEIF (tcd .LT. 340.D0) then
+ Z = (tcd - 257.5D0)/82.5D0
+ H0 = 1083.50185D0 + (388.54695D0 + 40.6830346D0*Z)*Z &
+ + 21.4058154D0*Z**4.79D0
+ ELSEIF (tcd .LT. 364.D0) then
+ Z = (tcd - 340.D0)/24.D0
+ H0 = 1534.137695D0 + (166.53D0 + 27.8460448D0*Z)*Z &
+ + 15.9652752D0*Z**5.67D0
+ ELSE
+ Z = (tcd - 364.D0)/5.D0
+ H0 = 1744.47897D0 + (65.11525D0 + 15.3342016D0*Z)*Z &
+ + 8.2093984D0*Z**5.74D0
+ ENDIF
+ !
+ ! compute specific heat capacity at constant pressure, in J/kg/K
+ IF (tcd .LT. 216.D0) then
+ Z = (tcd - 90.5D0)/125.5D0
+ CP0 = 0.2398399D0 + (0.7260874D-2 - 0.8715753D-2*Z)*Z &
+ - 0.1067229D-1*Z**2.43D0
+ CP0 = 1.D0/CP0
+ ELSEIF (tcd .LT. 289.D0) then
+ Z = (tcd - 216.D0)/73.D0
+ CP0 = 4.3914986D0 + (0.4050098D0 + 0.2650923D0*Z)*Z &
+ + 0.152426D0*Z**4.26D0
+ ELSEIF (tcd .LT. 334.D0) then
+ Z = (tcd - 289.D0)/45.D0
+ CP0 = 0.1917903D0 - (0.3592811D-1 + 0.1396726D-1*Z)*Z &
+ - 0.5187553D-2*Z**4.07D0
+ CP0 = 1.D0/CP0
+ ELSEIF (tcd .LT. 357.D0) then
+ Z = (tcd - 334.D0)/23.D0
+ CP0 = 0.1367074D0 - (0.4343216D-1 + 0.1360508D-1*Z)*Z &
+ - 0.5536208D-2*Z**3.82D0
+ CP0 = 1.D0/CP0
+ ELSE
+ Z = (tcd - 357.D0)/9.5D0
+ CP0 = 0.07413399D0 - (0.3791352D-1 + 0.6539416D-2*Z)*Z &
+ - 0.2756629D-2*Z**2.58D0
+ CP0 = 1.D0/CP0
+ ENDIF
+ ELSEIF (x.EQ.1.0) THEN
+ ! saturated steam
+ IF (90.5D0 .GT. tcd .OR. tcd .GT. 367.D0) then
+ call XABORT('THMHTX: the valid range of temperature is exceeded(2).')
+ ENDIF
+ !
+ ! compute density in kg/m3
+ IF (tcd .GT. 350.D0) then
+ Z = (tcd - 350.D0)/16.D0
+ RO = 7.5017113D0 - (2.7448665D0 - 0.4712976D-1*Z)*Z &
+ - 0.1461081D0*Z**5.45D0
+ RO = 1.D3/RO
+ ELSEIF (tcd .GT. 288.D0) then
+ Z = (tcd - 288.D0)/62.D0
+ RO = 23.2557129D0 - (24.2703096D0 - 12.7121893D0*Z)*Z &
+ - 4.1958813D0*Z**2.81D0
+ RO = 1.D3/RO
+ ELSEIF (tcd .GT. 221.D0) then
+ Z = (tcd - 221.D0)/67.D0
+ RO = 0.01319205D3 + (0.1687167D2 + 0.9533432D1*Z)*Z &
+ + 0.3402844D1*Z**3.69D0
+ ELSEIF (tcd .GT. 147.5D0) then
+ Z = (tcd - 147.5D0)/73.5D0
+ RO = 0.2595185D1 + (0.4966204D1 + 0.3980025D1*Z)*Z &
+ + 0.1650632D1*Z**3.382D0
+ ELSE
+ Z = (tcd - 90.5D0)/57.D0
+ RO = 0.451542D0 + (0.9337486D0 + 0.8179223D0*Z)*Z &
+ + 0.3919721D0*Z**3.27D0
+ ENDIF
+ !
+ ! compute specific enthalpy, in J/kg
+ IF (tcd .LT. 259.D0) then
+ Z = (tcd - 90.5D0)/168.5D0
+ H0 = 2465.02D0 + (257.038325D0 - 69.298269D0*Z)*Z &
+ - 59.547036D0*Z**3.39D0
+ ELSEIF (tcd .LT. 333.D0) then
+ Z = (tcd - 259.D0)/74.D0
+ H0 = 2593.21302D0 - (36.63666D0 + 70.6712028D0*Z)*Z &
+ - 26.1578672D0*Z**4.41D0
+ ELSEIF (tcd .LT. 359.D0) then
+ Z = (tcd - 333.D0)/26.D0
+ H0 = 2459.74729D0 - (103.06374D0 + 40.5743371D0*Z)*Z &
+ - 17.2902029D0*Z**4.76D0
+ ELSE
+ Z = (tcd - 359.D0)/8.5D0
+ H0 = 2298.81901D0 - (87.129505D0 + 27.7163491D0*Z)*Z &
+ - 14.0347359D0*Z**5.2D0
+ ENDIF
+ !
+ ! compute specific heat capacity at constant pressure, in J/kg/K
+ IF (tcd .LT. 208.D0) then
+ Z = (tcd - 90.5D0)/117.5D0
+ CP0 = 1.8689755D0 + (0.3394869D0 + 0.2728998D0*Z)*Z &
+ + 0.2686182D0*Z**3.507D0
+ ELSEIF (tcd .LT. 270.D0) then
+ Z = (tcd - 208.D0)/62.D0
+ CP0 = 2.7499805D0 + (0.9642085D0 + 0.4429098D0*Z)*Z &
+ + 0.141205D0*Z**3.945D0
+ ELSEIF (tcd .LT. 339.D0) then
+ Z = (tcd - 270.D0)/69.D0
+ CP0 = 0.2326499D0 - (0.1449925D0 - 0.19935345D-2*Z)*Z &
+ - 0.441272D-2*Z**3.96D0
+ CP0 = 1.D0/CP0
+ ELSEIF (tcd .LT. 363.D0) then
+ Z = (tcd - 339.D0)/24.D0
+ CP0 = 0.08523823D0 - (0.5512341D-1 + 0.3706342D-2*Z)*Z &
+ - 0.2012056D-2*Z**4.26D0
+ ELSE
+ Z = (tcd - 363.D0)/4.D0
+ CP0 = 0.02439642D0 - (0.1185124D-1 + 0.4619397D-3*Z)*Z &
+ - 0.1003777D-3*Z**2.4D0
+ CP0 = 1.D0/CP0
+ ENDIF
+ ELSE
+ CALL XABORT('THMHTX: quality = 0.0 or 1.0 expected.')
+ ENDIF
+ rho = REAL(RO)
+ h = REAL(H0)*1.0E3
+ cp = REAL(CP0)*1.0E3
+ !
+ ! use thermal conductivity and dynamic viscosity of light water
+ td=dble(t)
+ xd=dble(x)
+ call free_Tx(td, xd, rhod, hd, zkd, zmud, cpd)
+ zk=real(zkd)
+ zmu=real(zmud)
+end subroutine THMHTX