/[lmdze]/trunk/Sources/phylmd/CV30_routines/cv30_undilute2.f
ViewVC logotype

Contents of /trunk/Sources/phylmd/CV30_routines/cv30_undilute2.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 195 - (show annotations)
Wed May 18 17:56:44 2016 UTC (8 years ago) by guez
File size: 5864 byte(s)
In cv30_feed, iflag1 is 0 on entry so we can simplify the test for
iflag1 = 7.

In cv30_feed, for the computation of icb, replaced sequential search
(with a useless end of loop on k) by a call to locate.

In CV30 routines, replaced len, nloc, nd, na by klon or
klev. Philosophy: no more generality than actually necessary.

Converted as many variables as possible to named constants in
cv30_param_m and downgraded pbcrit, ptcrit, dtovsh, dpbase, dttrig,
tau, delta to local objects in procedures. spfac, betad and omtrain
are useless and removed.

Instead of filling the array sigp with the constant spfac in
cv30_undilute2, just made sigp a constant in cv30_unsat.

In cv_driver, define as allocatable variables that are only
used on the range (ncum, nl).

1 module cv30_undilute2_m
2
3 implicit none
4
5 contains
6
7 SUBROUTINE cv30_undilute2(icb, icbs, nk, tnk, qnk, gznk, t, qs, gz, p, h, &
8 tv, lv, pbase, buoybase, plcl, inb, tp, tvp, clw, hp, ep, buoy)
9
10 ! Undilute (adiabatic) updraft, second part. Purpose: find the
11 ! rest of the lifted parcel temperatures; compute the
12 ! precipitation efficiencies and the fraction of precipitation
13 ! falling outside of cloud; find the level of neutral buoyancy.
14
15 ! Vertical profile of buoyancy computed here (use of buoybase).
16
17 use conema3_m, only: epmax
18 use cv30_param_m, only: minorig, nl
19 use cv_thermo_m, only: cl, clmcpv, cpd, cpv, eps, lv0, rrv
20 USE dimphy, ONLY: klon, klev
21
22 integer, intent(in):: icb(:), icbs(:) ! (ncum)
23 ! icbs is the first level above LCL (may differ from icb)
24
25 integer, intent(in):: nk(klon)
26 real, intent(in):: tnk(klon), qnk(klon), gznk(klon)
27 real, intent(in):: t(klon, klev), qs(klon, klev), gz(klon, klev)
28 real, intent(in):: p(klon, klev), h(klon, klev)
29 real, intent(in):: tv(klon, klev), lv(klon, klev)
30 real, intent(in):: pbase(klon), buoybase(klon), plcl(klon)
31
32 ! outputs:
33 integer, intent(out):: inb(:) ! (ncum)
34 ! first model level above the level of neutral buoyancy of the
35 ! parcel (1 <= inb <= nl - 1)
36
37 real tp(klon, klev), tvp(klon, klev), clw(klon, klev)
38 ! condensed water not removed from tvp
39 real hp(klon, klev), ep(klon, klev)
40 real buoy(klon, klev)
41
42 ! Local:
43
44 integer ncum
45
46 real, parameter:: pbcrit = 150.
47 ! critical cloud depth (mbar) beneath which the precipitation
48 ! efficiency is assumed to be zero
49
50 real, parameter:: ptcrit = 500.
51 ! cloud depth (mbar) above which the precipitation efficiency is
52 ! assumed to be unity
53
54 real, parameter:: dtovsh = - 0.2 ! dT for overshoot
55
56 integer i, k
57 real tg, qg, ahg, alv, s, tc, es, denom
58 real pden
59 real ah0(klon)
60
61 !---------------------------------------------------------------------
62
63 ncum = size(icb)
64
65 ! SOME INITIALIZATIONS
66
67 do k = 1, nl
68 do i = 1, ncum
69 ep(i, k) = 0.
70 end do
71 end do
72
73 ! FIND THE REST OF THE LIFTED PARCEL TEMPERATURES
74
75 ! The procedure is to solve the equation.
76 ! cp * tp + L * qp + phi = cp * tnk + L * qnk + gznk.
77
78 ! Calculate certain parcel quantities, including static energy
79
80 do i = 1, ncum
81 ah0(i) = (cpd * (1. - qnk(i)) + cl * qnk(i)) * tnk(i) &
82 + qnk(i) * (lv0 - clmcpv * (tnk(i) - 273.15)) + gznk(i)
83 end do
84
85 ! Find lifted parcel quantities above cloud base
86
87 do k = minorig + 1, nl
88 do i = 1, ncum
89 if (k >= (icbs(i) + 1)) then
90 tg = t(i, k)
91 qg = qs(i, k)
92 alv = lv0 - clmcpv * (t(i, k) - 273.15)
93
94 ! First iteration.
95
96 s = cpd * (1. - qnk(i)) + cl * qnk(i) &
97 + alv * alv * qg / (rrv * t(i, k) * t(i, k))
98 s = 1. / s
99
100 ahg = cpd * tg + (cl - cpd) * qnk(i) * tg + alv * qg + gz(i, k)
101 tg = tg + s * (ah0(i) - ahg)
102
103 tc = tg - 273.15
104 denom = 243.5 + tc
105 denom = MAX(denom, 1.)
106
107 es = 6.112 * exp(17.67 * tc / denom)
108
109 qg = eps * es / (p(i, k) - es * (1. - eps))
110
111 ! Second iteration.
112
113 ahg = cpd * tg + (cl - cpd) * qnk(i) * tg + alv * qg + gz(i, k)
114 tg = tg + s * (ah0(i) - ahg)
115
116 tc = tg - 273.15
117 denom = 243.5 + tc
118 denom = MAX(denom, 1.)
119
120 es = 6.112 * exp(17.67 * tc / denom)
121
122 qg = eps * es / (p(i, k) - es * (1. - eps))
123
124 alv = lv0 - clmcpv * (t(i, k) - 273.15)
125
126 ! no approximation:
127 tp(i, k) = (ah0(i) - gz(i, k) - alv * qg) &
128 / (cpd + (cl - cpd) * qnk(i))
129
130 clw(i, k) = qnk(i) - qg
131 clw(i, k) = max(0., clw(i, k))
132 ! qg utilise au lieu du vrai mixing ratio rg:
133 tvp(i, k) = tp(i, k) * (1. + qg / eps - qnk(i)) ! whole thing
134 endif
135 end do
136 end do
137
138 ! SET THE PRECIPITATION EFFICIENCIES
139 ! It MAY BE a FUNCTION OF TP(I), P(I) AND CLW(I)
140 do k = 1, nl
141 do i = 1, ncum
142 pden = ptcrit - pbcrit
143 ep(i, k) = (plcl(i) - p(i, k) - pbcrit) / pden * epmax
144 ep(i, k) = max(ep(i, k), 0.)
145 ep(i, k) = min(ep(i, k), epmax)
146 end do
147 end do
148
149 ! CALCULATE VIRTUAL TEMPERATURE AND LIFTED PARCEL
150 ! VIRTUAL TEMPERATURE
151
152 ! tvp est calcule en une seule fois, et sans retirer
153 ! l'eau condensee (~> reversible CAPE)
154 do i = 1, ncum
155 tp(i, nl + 1) = tp(i, nl)
156 end do
157
158 ! EFFECTIVE VERTICAL PROFILE OF BUOYANCY:
159
160 ! first estimate of buoyancy:
161 do i = 1, ncum
162 do k = 1, nl
163 buoy(i, k) = tvp(i, k) - tv(i, k)
164 end do
165 end do
166
167 ! set buoyancy = buoybase for all levels below base
168 ! for safety, set buoy(icb) = buoybase
169 do i = 1, ncum
170 do k = 1, nl
171 if ((k >= icb(i)) .and. (k <= nl) .and. (p(i, k) >= pbase(i))) then
172 buoy(i, k) = buoybase(i)
173 endif
174 end do
175 buoy(icb(i), k) = buoybase(i)
176 end do
177
178 ! Compute inb:
179
180 inb = nl - 1
181
182 do i = 1, ncum
183 do k = 1, nl - 1
184 if ((k >= icb(i)) .and. (buoy(i, k) < dtovsh)) then
185 inb(i) = MIN(inb(i), k)
186 endif
187 end do
188 end do
189
190 ! CALCULATE LIQUID WATER STATIC ENERGY OF LIFTED PARCEL
191
192 do k = 1, nl + 1
193 do i = 1, ncum
194 hp(i, k) = h(i, k)
195 enddo
196 enddo
197
198 do k = minorig + 1, nl
199 do i = 1, ncum
200 if (k >= icb(i) .and. k <= inb(i)) hp(i, k) = h(i, nk(i)) &
201 + (lv(i, k) + (cpd - cpv) * t(i, k)) * ep(i, k) * clw(i, k)
202 end do
203 end do
204
205 end SUBROUTINE cv30_undilute2
206
207 end module cv30_undilute2_m

  ViewVC Help
Powered by ViewVC 1.1.21