FV3 Bundle
qsat_util.F90
Go to the documentation of this file.
1 MODULE qsat_util
2 
3 !This module contains the subroutines used to generate the lookup table for computing saturation vapour pressure.
4 !Variables designated as real*8 should be kept at least as so, even if ESTBLX is required in real*4.
5 
6 IMPLICIT NONE
7 
8 PRIVATE
9 PUBLIC esinit
10 
11 !Saturation vapor pressure table ESTBLX initialization.
12 !To be defined for entire module:
13 integer, parameter :: degsubs = 100
14 real(8), parameter :: tmintbl = 150.0, tmaxtbl = 333.0
15 integer, parameter :: tablesize = nint(tmaxtbl-tmintbl)*degsubs + 1
16 
17 CONTAINS
18 
19 subroutine esinit(ESTBLX)
20 
21  IMPLICIT NONE
22 
23  !OUTPUT
24  real(8), dimension(TABLESIZE) :: estblx
25 
26  !LOCALS
27  real(8), parameter :: zeroc = 273.16, tmix = -20.0
28 
29  real(8), dimension(TABLESIZE) :: estble, estblw
30 
31  integer :: i
32  real(8) :: t, delta_t
33 
34  delta_t = 1.0/degsubs
35 
36  do i=1,tablesize
37 
38  t = (i-1)*delta_t + tmintbl
39 
40  if(t>zeroc) then
41  call qsatlqu0(estble(i),t)
42  else
43  call qsatice0(estble(i),t)
44  end if
45 
46  call qsatlqu0(estblw(i),t)
47 
48  t = t-zeroc
49  if(t>=tmix .and. t<0.0) then
50  estblx(i) = ( t/tmix )*( estble(i) - estblw(i) ) + estblw(i)
51  else
52  estblx(i) = estble(i)
53  end if
54 
55  end do
56 
57  end subroutine esinit
58 
59 
60 subroutine qsatlqu0(QS,TL)
61 !SUPERSATURATED AS LIQUID
62 
63  IMPLICIT NONE
64 
65  !INPUTS
66  real(8) :: TL!, TMAXTBL
67 
68  !OUTPUTS
69  real(8) :: QS
70 
71  !LOCALS
72  real(8), parameter :: ZEROC = 273.16
73  real(8), parameter :: TMINLQU = zeroc - 40.0
74 
75  real*8, parameter :: B6 = 6.136820929e-11*100.0
76  real*8, parameter :: B5 = 2.034080948e-8 *100.0
77  real*8, parameter :: B4 = 3.031240396e-6 *100.0
78  real*8, parameter :: B3 = 2.650648471e-4 *100.0
79  real*8, parameter :: B2 = 1.428945805e-2 *100.0
80  real*8, parameter :: B1 = 4.436518521e-1 *100.0
81  real*8, parameter :: B0 = 6.107799961e+0 *100.0
82 
83  real(8) :: TX, EX, TI, TT
84 
85  tx = tl
86 
87  if (tx<tminlqu) then
88  ti = tminlqu
89  elseif(tx>tmaxtbl) then
90  ti = tmaxtbl
91  else
92  ti = tx
93  end if
94 
95  tt = ti-zeroc !Starr polynomial fit
96  ex = (tt*(tt*(tt*(tt*(tt*(tt*b6+b5)+b4)+b3)+b2)+b1)+b0)
97 
98  tl = tx
99  qs = ex
100 
101  return
102 
103 end subroutine qsatlqu0
104 
105 
106 subroutine qsatice0(QS,TL)
107 !SUPERSATURATED AS ICE
108 
109  IMPLICIT NONE
110 
111  !INPUTS
112  real(8) :: TL
113 
114  !OUTPUTS
115  real(8) :: QS
116 
117  !LOCALS
118  real(8), parameter :: ZEROC = 273.16, tminstr = -95.0
119  real(8), parameter :: TMINICE = zeroc + tminstr
120 
121  real(8), parameter :: TSTARR1 = -75.0, tstarr2 = -65.0, tstarr3 = -50.0, tstarr4 = -40.0
122 
123  real*8, parameter :: BI6= 1.838826904e-10*100.0
124  real*8, parameter :: BI5= 4.838803174e-8 *100.0
125  real*8, parameter :: BI4= 5.824720280e-6 *100.0
126  real*8, parameter :: BI3= 4.176223716e-4 *100.0
127  real*8, parameter :: BI2= 1.886013408e-2 *100.0
128  real*8, parameter :: BI1= 5.034698970e-1 *100.0
129  real*8, parameter :: BI0= 6.109177956e+0 *100.0
130  real*8, parameter :: S16= 0.516000335e-11*100.0
131  real*8, parameter :: S15= 0.276961083e-8 *100.0
132  real*8, parameter :: S14= 0.623439266e-6 *100.0
133  real*8, parameter :: S13= 0.754129933e-4 *100.0
134  real*8, parameter :: S12= 0.517609116e-2 *100.0
135  real*8, parameter :: S11= 0.191372282e+0 *100.0
136  real*8, parameter :: S10= 0.298152339e+1 *100.0
137  real*8, parameter :: S26= 0.314296723e-10*100.0
138  real*8, parameter :: S25= 0.132243858e-7 *100.0
139  real*8, parameter :: S24= 0.236279781e-5 *100.0
140  real*8, parameter :: S23= 0.230325039e-3 *100.0
141  real*8, parameter :: S22= 0.129690326e-1 *100.0
142  real*8, parameter :: S21= 0.401390832e+0 *100.0
143  real*8, parameter :: S20= 0.535098336e+1 *100.0
144 
145  real(8) :: TX, TI, TT, W, EX
146 
147  tx = tl
148 
149  if (tx<tminice) then
150  ti = tminice
151  elseif(tx>zeroc ) then
152  ti = zeroc
153  else
154  ti = tx
155  end if
156 
157  tt = ti - zeroc
158  if (tt < tstarr1 ) then
159  ex = (tt*(tt*(tt*(tt*(tt*(tt*s16+s15)+s14)+s13)+s12)+s11)+s10)
160  elseif(tt >= tstarr1 .and. tt < tstarr2) then
161  w = (tstarr2 - tt)/(tstarr2-tstarr1)
162  ex = w *(tt*(tt*(tt*(tt*(tt*(tt*s16+s15)+s14)+s13)+s12)+s11)+s10) &
163  + (1.-w)*(tt*(tt*(tt*(tt*(tt*(tt*s26+s25)+s24)+s23)+s22)+s21)+s20)
164  elseif(tt >= tstarr2 .and. tt < tstarr3) then
165  ex = (tt*(tt*(tt*(tt*(tt*(tt*s26+s25)+s24)+s23)+s22)+s21)+s20)
166  elseif(tt >= tstarr3 .and. tt < tstarr4) then
167  w = (tstarr4 - tt)/(tstarr4-tstarr3)
168  ex = w *(tt*(tt*(tt*(tt*(tt*(tt*s26+s25)+s24)+s23)+s22)+s21)+s20) &
169  + (1.-w)*(tt*(tt*(tt*(tt*(tt*(tt*bi6+bi5)+bi4)+bi3)+bi2)+bi1)+bi0)
170  else
171  ex = (tt*(tt*(tt*(tt*(tt*(tt*bi6+bi5)+bi4)+bi3)+bi2)+bi1)+bi0)
172  endif
173 
174  qs = ex
175 
176  return
177 
178 end subroutine qsatice0
179 
180 end MODULE qsat_util
integer, parameter tablesize
Definition: qsat_util.F90:15
real(8), parameter tmaxtbl
Definition: qsat_util.F90:14
subroutine qsatlqu0(QS, TL)
Definition: qsat_util.F90:61
subroutine qsatice0(QS, TL)
Definition: qsat_util.F90:107
integer, parameter degsubs
Definition: qsat_util.F90:13
subroutine, public esinit(ESTBLX)
Definition: qsat_util.F90:20
real(8), parameter tmintbl
Definition: qsat_util.F90:14