1 |
guez |
62 |
SUBROUTINE flxasc(pdtime, ptenh, pqenh, pten, pqen, pqsen, & |
2 |
|
|
pgeo, pgeoh, pap, paph, pqte, pvervel, & |
3 |
|
|
ldland, ldcum, ktype, klab, ptu, pqu, plu, & |
4 |
|
|
pmfu, pmfub, pentr, pmfus, pmfuq, & |
5 |
|
|
pmful, plude, pdmfup, kcbot, kctop, kctop0, kcum, & |
6 |
|
|
pen_u, pde_u) |
7 |
|
|
use dimens_m |
8 |
|
|
use dimphy |
9 |
|
|
use SUPHEC_M |
10 |
|
|
use yoethf_m |
11 |
|
|
use yoecumf |
12 |
|
|
IMPLICIT none |
13 |
|
|
!---------------------------------------------------------------------- |
14 |
|
|
! THIS ROUTINE DOES THE CALCULATIONS FOR CLOUD ASCENTS |
15 |
|
|
! FOR CUMULUS PARAMETERIZATION |
16 |
|
|
!---------------------------------------------------------------------- |
17 |
|
|
! |
18 |
|
|
REAL, intent(in):: pdtime |
19 |
|
|
REAL pten(klon,klev), ptenh(klon,klev) |
20 |
|
|
REAL pqen(klon,klev), pqenh(klon,klev), pqsen(klon,klev) |
21 |
|
|
REAL pgeo(klon,klev), pgeoh(klon,klev) |
22 |
|
|
REAL pap(klon,klev), paph(klon,klev+1) |
23 |
|
|
REAL pqte(klon,klev) |
24 |
|
|
REAL pvervel(klon,klev) ! vitesse verticale en Pa/s |
25 |
|
|
! |
26 |
|
|
REAL pmfub(klon), pentr(klon) |
27 |
|
|
REAL ptu(klon,klev), pqu(klon,klev), plu(klon,klev) |
28 |
|
|
REAL plude(klon,klev) |
29 |
|
|
REAL pmfu(klon,klev), pmfus(klon,klev) |
30 |
|
|
REAL pmfuq(klon,klev), pmful(klon,klev) |
31 |
|
|
REAL pdmfup(klon,klev) |
32 |
|
|
INTEGER ktype(klon), klab(klon,klev), kcbot(klon), kctop(klon) |
33 |
|
|
INTEGER kctop0(klon) |
34 |
|
|
LOGICAL ldland(klon), ldcum(klon) |
35 |
|
|
! |
36 |
|
|
REAL pen_u(klon,klev), pde_u(klon,klev) |
37 |
|
|
REAL zqold(klon) |
38 |
|
|
REAL zdland(klon) |
39 |
|
|
LOGICAL llflag(klon) |
40 |
|
|
INTEGER k, i, is, icall, kcum |
41 |
|
|
REAL ztglace, zdphi, zqeen, zseen, zscde, zqude |
42 |
|
|
REAL zmfusk, zmfuqk, zmfulk, zbuo, zdnoprc, zprcon, zlnew |
43 |
|
|
! |
44 |
|
|
REAL zpbot(klon), zptop(klon), zrho(klon) |
45 |
|
|
REAL zdprho, zentr, zpmid, zmftest, zmfmax |
46 |
|
|
LOGICAL llo1, llo2 |
47 |
|
|
! |
48 |
|
|
REAL zwmax(klon), zzzmb |
49 |
|
|
INTEGER klwmin(klon) ! level of maximum vertical velocity |
50 |
|
|
!---------------------------------------------------------------------- |
51 |
|
|
ztglace = RTT - 13. |
52 |
|
|
! |
53 |
|
|
! Chercher le niveau ou la vitesse verticale est maximale: |
54 |
|
|
DO i = 1, klon |
55 |
|
|
klwmin(i) = klev |
56 |
|
|
zwmax(i) = 0.0 |
57 |
|
|
ENDDO |
58 |
|
|
DO k = klev, 3, -1 |
59 |
|
|
DO i = 1, klon |
60 |
|
|
IF (pvervel(i,k).LT.zwmax(i)) THEN |
61 |
|
|
zwmax(i) = pvervel(i,k) |
62 |
|
|
klwmin(i) = k |
63 |
|
|
ENDIF |
64 |
|
|
ENDDO |
65 |
|
|
ENDDO |
66 |
|
|
!---------------------------------------------------------------------- |
67 |
|
|
! SET DEFAULT VALUES |
68 |
|
|
!---------------------------------------------------------------------- |
69 |
|
|
DO i = 1, klon |
70 |
|
|
IF (.NOT.ldcum(i)) ktype(i)=0 |
71 |
|
|
ENDDO |
72 |
|
|
! |
73 |
|
|
DO k=1,klev |
74 |
|
|
DO i = 1, klon |
75 |
|
|
plu(i,k)=0. |
76 |
|
|
pmfu(i,k)=0. |
77 |
|
|
pmfus(i,k)=0. |
78 |
|
|
pmfuq(i,k)=0. |
79 |
|
|
pmful(i,k)=0. |
80 |
|
|
plude(i,k)=0. |
81 |
|
|
pdmfup(i,k)=0. |
82 |
|
|
IF(.NOT.ldcum(i).OR.ktype(i).EQ.3) klab(i,k)=0 |
83 |
|
|
IF(.NOT.ldcum(i).AND.paph(i,k).LT.4.E4) kctop0(i)=k |
84 |
|
|
ENDDO |
85 |
|
|
ENDDO |
86 |
|
|
! |
87 |
|
|
DO i = 1, klon |
88 |
|
|
IF (ldland(i)) THEN |
89 |
|
|
zdland(i)=3.0E4 |
90 |
|
|
zdphi=pgeoh(i,kctop0(i))-pgeoh(i,kcbot(i)) |
91 |
|
|
IF (ptu(i,kctop0(i)).GE.ztglace) zdland(i)=zdphi |
92 |
|
|
zdland(i)=MAX(3.0E4,zdland(i)) |
93 |
|
|
zdland(i)=MIN(5.0E4,zdland(i)) |
94 |
|
|
ENDIF |
95 |
|
|
ENDDO |
96 |
|
|
! |
97 |
|
|
! Initialiser les valeurs au niveau d'ascendance |
98 |
|
|
! |
99 |
|
|
DO i = 1, klon |
100 |
|
|
kctop(i) = klev-1 |
101 |
|
|
IF (.NOT.ldcum(i)) THEN |
102 |
|
|
kcbot(i) = klev-1 |
103 |
|
|
pmfub(i) = 0. |
104 |
|
|
pqu(i,klev) = 0. |
105 |
|
|
ENDIF |
106 |
|
|
pmfu(i,klev) = pmfub(i) |
107 |
|
|
pmfus(i,klev) = pmfub(i)*(RCPD*ptu(i,klev)+pgeoh(i,klev)) |
108 |
|
|
pmfuq(i,klev) = pmfub(i)*pqu(i,klev) |
109 |
|
|
ENDDO |
110 |
|
|
! |
111 |
|
|
DO i = 1, klon |
112 |
|
|
ldcum(i) = .FALSE. |
113 |
|
|
ENDDO |
114 |
|
|
!---------------------------------------------------------------------- |
115 |
|
|
! DO ASCENT: SUBCLOUD LAYER (klab=1) ,CLOUDS (klab=2) |
116 |
|
|
! BY DOING FIRST DRY-ADIABATIC ASCENT AND THEN |
117 |
|
|
! BY ADJUSTING T,Q AND L ACCORDINGLY IN *flxadjtq*, |
118 |
|
|
! THEN CHECK FOR BUOYANCY AND SET FLAGS ACCORDINGLY |
119 |
|
|
!---------------------------------------------------------------------- |
120 |
|
|
DO k = klev-1,3,-1 |
121 |
|
|
! |
122 |
|
|
IF (LMFMID .AND. k.LT.klev-1 .AND. k.GT.klev/2) THEN |
123 |
|
|
DO i = 1, klon |
124 |
|
|
IF (.NOT.ldcum(i) .AND. klab(i,k+1).EQ.0 .AND. & |
125 |
|
|
pqen(i,k).GT.0.9*pqsen(i,k)) THEN |
126 |
|
|
ptu(i,k+1) = pten(i,k) +(pgeo(i,k)-pgeoh(i,k+1))/RCPD |
127 |
|
|
pqu(i,k+1) = pqen(i,k) |
128 |
|
|
plu(i,k+1) = 0.0 |
129 |
|
|
zzzmb = MAX(CMFCMIN, -pvervel(i,k)/RG) |
130 |
|
|
zmfmax = (paph(i,k)-paph(i,k-1))/(RG*pdtime) |
131 |
|
|
pmfub(i) = MIN(zzzmb,zmfmax) |
132 |
|
|
pmfu(i,k+1) = pmfub(i) |
133 |
|
|
pmfus(i,k+1) = pmfub(i)*(RCPD*ptu(i,k+1)+pgeoh(i,k+1)) |
134 |
|
|
pmfuq(i,k+1) = pmfub(i)*pqu(i,k+1) |
135 |
|
|
pmful(i,k+1) = 0.0 |
136 |
|
|
pdmfup(i,k+1) = 0.0 |
137 |
|
|
kcbot(i) = k |
138 |
|
|
klab(i,k+1) = 1 |
139 |
|
|
ktype(i) = 3 |
140 |
|
|
pentr(i) = ENTRMID |
141 |
|
|
ENDIF |
142 |
|
|
ENDDO |
143 |
|
|
ENDIF |
144 |
|
|
! |
145 |
|
|
is = 0 |
146 |
|
|
DO i = 1, klon |
147 |
|
|
is = is + klab(i,k+1) |
148 |
|
|
IF (klab(i,k+1) .EQ. 0) klab(i,k) = 0 |
149 |
|
|
llflag(i) = .FALSE. |
150 |
|
|
IF (klab(i,k+1) .GT. 0) llflag(i) = .TRUE. |
151 |
|
|
ENDDO |
152 |
|
|
IF (is .EQ. 0) cycle |
153 |
|
|
! |
154 |
|
|
! calculer le taux d'entrainement et de detrainement |
155 |
|
|
! |
156 |
|
|
DO i = 1, klon |
157 |
|
|
pen_u(i,k) = 0.0 |
158 |
|
|
pde_u(i,k) = 0.0 |
159 |
|
|
zrho(i)=paph(i,k+1)/(RD*ptenh(i,k+1)) |
160 |
|
|
zpbot(i)=paph(i,kcbot(i)) |
161 |
|
|
zptop(i)=paph(i,kctop0(i)) |
162 |
|
|
ENDDO |
163 |
|
|
! |
164 |
|
|
DO i = 1, klon |
165 |
|
|
IF(ldcum(i)) THEN |
166 |
|
|
zdprho=(paph(i,k+1)-paph(i,k))/(RG*zrho(i)) |
167 |
|
|
zentr=pentr(i)*pmfu(i,k+1)*zdprho |
168 |
|
|
llo1=k.LT.kcbot(i) |
169 |
|
|
IF(llo1) pde_u(i,k)=zentr |
170 |
|
|
zpmid=0.5*(zpbot(i)+zptop(i)) |
171 |
|
|
llo2=llo1.AND.ktype(i).EQ.2.AND. & |
172 |
|
|
(zpbot(i)-paph(i,k).LT.0.2E5.OR. & |
173 |
|
|
paph(i,k).GT.zpmid) |
174 |
|
|
IF(llo2) pen_u(i,k)=zentr |
175 |
|
|
llo2=llo1.AND.(ktype(i).EQ.1.OR.ktype(i).EQ.3).AND. & |
176 |
|
|
(k.GE.MAX(klwmin(i),kctop0(i)+2).OR.pap(i,k).GT.zpmid) |
177 |
|
|
IF(llo2) pen_u(i,k)=zentr |
178 |
|
|
llo1=pen_u(i,k).GT.0..AND.(ktype(i).EQ.1.OR.ktype(i).EQ.2) |
179 |
|
|
IF(llo1) THEN |
180 |
|
|
zentr=zentr*(1.+3.*(1.-MIN(1.,(zpbot(i)-pap(i,k))/1.5E4))) |
181 |
|
|
pen_u(i,k)=pen_u(i,k)*(1.+3.*(1.-MIN(1., & |
182 |
|
|
(zpbot(i)-pap(i,k))/1.5E4))) |
183 |
|
|
pde_u(i,k)=pde_u(i,k)*(1.+3.*(1.-MIN(1., & |
184 |
|
|
(zpbot(i)-pap(i,k))/1.5E4))) |
185 |
|
|
ENDIF |
186 |
|
|
IF(llo2.AND.pqenh(i,k+1).GT.1.E-5) & |
187 |
|
|
pen_u(i,k)=zentr+MAX(pqte(i,k),0.)/pqenh(i,k+1)* & |
188 |
|
|
zrho(i)*zdprho |
189 |
|
|
ENDIF |
190 |
|
|
end DO |
191 |
|
|
! |
192 |
|
|
!---------------------------------------------------------------------- |
193 |
|
|
! DO ADIABATIC ASCENT FOR ENTRAINING/DETRAINING PLUME |
194 |
|
|
!---------------------------------------------------------------------- |
195 |
|
|
! |
196 |
|
|
DO i = 1, klon |
197 |
|
|
IF (llflag(i)) THEN |
198 |
|
|
IF (k.LT.kcbot(i)) THEN |
199 |
|
|
zmftest = pmfu(i,k+1)+pen_u(i,k)-pde_u(i,k) |
200 |
|
|
zmfmax = MIN(zmftest,(paph(i,k)-paph(i,k-1))/(RG*pdtime)) |
201 |
|
|
pen_u(i,k)=MAX(pen_u(i,k)-MAX(0.0,zmftest-zmfmax),0.0) |
202 |
|
|
ENDIF |
203 |
|
|
pde_u(i,k)=MIN(pde_u(i,k),0.75*pmfu(i,k+1)) |
204 |
|
|
! calculer le flux de masse du niveau k a partir de celui du k+1 |
205 |
|
|
pmfu(i,k)=pmfu(i,k+1)+pen_u(i,k)-pde_u(i,k) |
206 |
|
|
! calculer les valeurs Su, Qu et l du niveau k dans le panache montant |
207 |
|
|
zqeen=pqenh(i,k+1)*pen_u(i,k) |
208 |
|
|
zseen=(RCPD*ptenh(i,k+1)+pgeoh(i,k+1))*pen_u(i,k) |
209 |
|
|
zscde=(RCPD*ptu(i,k+1)+pgeoh(i,k+1))*pde_u(i,k) |
210 |
|
|
zqude=pqu(i,k+1)*pde_u(i,k) |
211 |
|
|
plude(i,k)=plu(i,k+1)*pde_u(i,k) |
212 |
|
|
zmfusk=pmfus(i,k+1)+zseen-zscde |
213 |
|
|
zmfuqk=pmfuq(i,k+1)+zqeen-zqude |
214 |
|
|
zmfulk=pmful(i,k+1) -plude(i,k) |
215 |
|
|
plu(i,k)=zmfulk*(1./MAX(CMFCMIN,pmfu(i,k))) |
216 |
|
|
pqu(i,k)=zmfuqk*(1./MAX(CMFCMIN,pmfu(i,k))) |
217 |
|
|
ptu(i,k)=(zmfusk*(1./MAX(CMFCMIN,pmfu(i,k)))- & |
218 |
|
|
pgeoh(i,k))/RCPD |
219 |
|
|
ptu(i,k)=MAX(100.,ptu(i,k)) |
220 |
|
|
ptu(i,k)=MIN(400.,ptu(i,k)) |
221 |
|
|
zqold(i)=pqu(i,k) |
222 |
|
|
ELSE |
223 |
|
|
zqold(i)=0.0 |
224 |
|
|
ENDIF |
225 |
|
|
end DO |
226 |
|
|
! |
227 |
|
|
!---------------------------------------------------------------------- |
228 |
|
|
! DO CORRECTIONS FOR MOIST ASCENT BY ADJUSTING T,Q AND L |
229 |
|
|
!---------------------------------------------------------------------- |
230 |
|
|
! |
231 |
|
|
icall = 1 |
232 |
|
|
CALL flxadjtq(paph(1,k), ptu(1,k), pqu(1,k), llflag, icall) |
233 |
|
|
! |
234 |
|
|
DO i = 1, klon |
235 |
|
|
IF(llflag(i).AND.pqu(i,k).NE.zqold(i)) THEN |
236 |
|
|
klab(i,k) = 2 |
237 |
|
|
plu(i,k) = plu(i,k)+zqold(i)-pqu(i,k) |
238 |
|
|
zbuo = ptu(i,k)*(1.+RETV*pqu(i,k))- & |
239 |
guez |
52 |
ptenh(i,k)*(1.+RETV*pqenh(i,k)) |
240 |
guez |
62 |
IF (klab(i,k+1).EQ.1) zbuo=zbuo+0.5 |
241 |
|
|
IF (zbuo.GT.0..AND.pmfu(i,k).GE.0.1*pmfub(i)) THEN |
242 |
|
|
kctop(i) = k |
243 |
|
|
ldcum(i) = .TRUE. |
244 |
|
|
zdnoprc = 1.5E4 |
245 |
|
|
IF (ldland(i)) zdnoprc = zdland(i) |
246 |
|
|
zprcon = CPRCON |
247 |
|
|
IF ((zpbot(i)-paph(i,k)).LT.zdnoprc) zprcon = 0.0 |
248 |
|
|
zlnew=plu(i,k)/(1.+zprcon*(pgeoh(i,k)-pgeoh(i,k+1))) |
249 |
|
|
pdmfup(i,k)=MAX(0.,(plu(i,k)-zlnew)*pmfu(i,k)) |
250 |
|
|
plu(i,k)=zlnew |
251 |
|
|
ELSE |
252 |
|
|
klab(i,k)=0 |
253 |
|
|
pmfu(i,k)=0. |
254 |
|
|
ENDIF |
255 |
|
|
ENDIF |
256 |
|
|
end DO |
257 |
|
|
DO i = 1, klon |
258 |
|
|
IF (llflag(i)) THEN |
259 |
|
|
pmful(i,k)=plu(i,k)*pmfu(i,k) |
260 |
|
|
pmfus(i,k)=(RCPD*ptu(i,k)+pgeoh(i,k))*pmfu(i,k) |
261 |
|
|
pmfuq(i,k)=pqu(i,k)*pmfu(i,k) |
262 |
|
|
ENDIF |
263 |
|
|
end DO |
264 |
|
|
! |
265 |
|
|
end DO |
266 |
|
|
!---------------------------------------------------------------------- |
267 |
|
|
! DETERMINE CONVECTIVE FLUXES ABOVE NON-BUOYANCY LEVEL |
268 |
|
|
! (NOTE: CLOUD VARIABLES LIKE T,Q AND L ARE NOT |
269 |
|
|
! AFFECTED BY DETRAINMENT AND ARE ALREADY KNOWN |
270 |
|
|
! FROM PREVIOUS CALCULATIONS ABOVE) |
271 |
|
|
!---------------------------------------------------------------------- |
272 |
|
|
DO i = 1, klon |
273 |
|
|
IF (kctop(i).EQ.klev-1) ldcum(i) = .FALSE. |
274 |
|
|
kcbot(i) = MAX(kcbot(i),kctop(i)) |
275 |
|
|
ENDDO |
276 |
|
|
! |
277 |
|
|
ldcum(1)=ldcum(1) |
278 |
|
|
! |
279 |
|
|
is = 0 |
280 |
|
|
DO i = 1, klon |
281 |
|
|
if (ldcum(i)) is = is + 1 |
282 |
|
|
ENDDO |
283 |
|
|
kcum = is |
284 |
|
|
IF (is /= 0) then |
285 |
|
|
! |
286 |
|
|
DO i = 1, klon |
287 |
|
|
IF (ldcum(i)) THEN |
288 |
|
|
k=kctop(i)-1 |
289 |
|
|
pde_u(i,k)=(1.-CMFCTOP)*pmfu(i,k+1) |
290 |
|
|
plude(i,k)=pde_u(i,k)*plu(i,k+1) |
291 |
|
|
pmfu(i,k)=pmfu(i,k+1)-pde_u(i,k) |
292 |
|
|
zlnew=plu(i,k) |
293 |
|
|
pdmfup(i,k)=MAX(0.,(plu(i,k)-zlnew)*pmfu(i,k)) |
294 |
|
|
plu(i,k)=zlnew |
295 |
|
|
pmfus(i,k)=(RCPD*ptu(i,k)+pgeoh(i,k))*pmfu(i,k) |
296 |
|
|
pmfuq(i,k)=pqu(i,k)*pmfu(i,k) |
297 |
|
|
pmful(i,k)=plu(i,k)*pmfu(i,k) |
298 |
|
|
plude(i,k-1)=pmful(i,k) |
299 |
|
|
ENDIF |
300 |
|
|
end DO |
301 |
|
|
! |
302 |
|
|
end IF |
303 |
|
|
|
304 |
|
|
END SUBROUTINE flxasc |