GCC Code Coverage Report


Directory: ./
File: phys/conflx.f90
Date: 2022-01-11 19:19:34
Exec Total Coverage
Lines: 0 738 0.0%
Branches: 0 506 0.0%

Line Branch Exec Source
1
2 ! $Header$
3
4 SUBROUTINE conflx(dtime, pres_h, pres_f, t, q, con_t, con_q, pqhfl, w, d_t, &
5 d_q, rain, snow, pmfu, pmfd, pen_u, pde_u, pen_d, pde_d, kcbot, kctop, &
6 kdtop, pmflxr, pmflxs)
7
8 USE dimphy
9 IMPLICIT NONE
10 ! ======================================================================
11 ! Auteur(s): Z.X. Li (LMD/CNRS) date: 19941014
12 ! Objet: Schema flux de masse pour la convection
13 ! (schema de Tiedtke avec qqs modifications mineures)
14 ! Dec.97: Prise en compte des modifications introduites par
15 ! Olivier Boucher et Alexandre Armengaud pour melange
16 ! et lessivage des traceurs passifs.
17 ! ======================================================================
18 include "YOMCST.h"
19 include "YOETHF.h"
20 ! Entree:
21 REAL dtime ! pas d'integration (s)
22 REAL pres_h(klon, klev+1) ! pression half-level (Pa)
23 REAL pres_f(klon, klev) ! pression full-level (Pa)
24 REAL t(klon, klev) ! temperature (K)
25 REAL q(klon, klev) ! humidite specifique (g/g)
26 REAL w(klon, klev) ! vitesse verticale (Pa/s)
27 REAL con_t(klon, klev) ! convergence de temperature (K/s)
28 REAL con_q(klon, klev) ! convergence de l'eau vapeur (g/g/s)
29 REAL pqhfl(klon) ! evaporation (negative vers haut) mm/s
30 ! Sortie:
31 REAL d_t(klon, klev) ! incrementation de temperature
32 REAL d_q(klon, klev) ! incrementation d'humidite
33 REAL pmfu(klon, klev) ! flux masse (kg/m2/s) panache ascendant
34 REAL pmfd(klon, klev) ! flux masse (kg/m2/s) panache descendant
35 REAL pen_u(klon, klev)
36 REAL pen_d(klon, klev)
37 REAL pde_u(klon, klev)
38 REAL pde_d(klon, klev)
39 REAL rain(klon) ! pluie (mm/s)
40 REAL snow(klon) ! neige (mm/s)
41 REAL pmflxr(klon, klev+1)
42 REAL pmflxs(klon, klev+1)
43 INTEGER kcbot(klon) ! niveau du bas de la convection
44 INTEGER kctop(klon) ! niveau du haut de la convection
45 INTEGER kdtop(klon) ! niveau du haut des downdrafts
46 ! Local:
47 REAL pt(klon, klev)
48 REAL pq(klon, klev)
49 REAL pqs(klon, klev)
50 REAL pvervel(klon, klev)
51 LOGICAL land(klon)
52
53 REAL d_t_bis(klon, klev)
54 REAL d_q_bis(klon, klev)
55 REAL paprs(klon, klev+1)
56 REAL paprsf(klon, klev)
57 REAL zgeom(klon, klev)
58 REAL zcvgq(klon, klev)
59 REAL zcvgt(klon, klev)
60 ! AA
61 REAL zmfu(klon, klev)
62 REAL zmfd(klon, klev)
63 REAL zen_u(klon, klev)
64 REAL zen_d(klon, klev)
65 REAL zde_u(klon, klev)
66 REAL zde_d(klon, klev)
67 REAL zmflxr(klon, klev+1)
68 REAL zmflxs(klon, klev+1)
69 ! AA
70
71
72 INTEGER i, k
73 REAL zdelta, zqsat
74
75 include "FCTTRE.h"
76
77 ! initialiser les variables de sortie (pour securite)
78 DO i = 1, klon
79 rain(i) = 0.0
80 snow(i) = 0.0
81 kcbot(i) = 0
82 kctop(i) = 0
83 kdtop(i) = 0
84 END DO
85 DO k = 1, klev
86 DO i = 1, klon
87 d_t(i, k) = 0.0
88 d_q(i, k) = 0.0
89 pmfu(i, k) = 0.0
90 pmfd(i, k) = 0.0
91 pen_u(i, k) = 0.0
92 pde_u(i, k) = 0.0
93 pen_d(i, k) = 0.0
94 pde_d(i, k) = 0.0
95 zmfu(i, k) = 0.0
96 zmfd(i, k) = 0.0
97 zen_u(i, k) = 0.0
98 zde_u(i, k) = 0.0
99 zen_d(i, k) = 0.0
100 zde_d(i, k) = 0.0
101 END DO
102 END DO
103 DO k = 1, klev + 1
104 DO i = 1, klon
105 zmflxr(i, k) = 0.0
106 zmflxs(i, k) = 0.0
107 END DO
108 END DO
109
110 ! calculer la nature du sol (pour l'instant, ocean partout)
111 DO i = 1, klon
112 land(i) = .FALSE.
113 END DO
114
115 ! preparer les variables d'entree (attention: l'ordre des niveaux
116 ! verticaux augmente du haut vers le bas)
117 DO k = 1, klev
118 DO i = 1, klon
119 pt(i, k) = t(i, klev-k+1)
120 pq(i, k) = q(i, klev-k+1)
121 paprsf(i, k) = pres_f(i, klev-k+1)
122 paprs(i, k) = pres_h(i, klev+1-k+1)
123 pvervel(i, k) = w(i, klev+1-k)
124 zcvgt(i, k) = con_t(i, klev-k+1)
125 zcvgq(i, k) = con_q(i, klev-k+1)
126
127 zdelta = max(0., sign(1.,rtt-pt(i,k)))
128 zqsat = r2es*foeew(pt(i,k), zdelta)/paprsf(i, k)
129 zqsat = min(0.5, zqsat)
130 zqsat = zqsat/(1.-retv*zqsat)
131 pqs(i, k) = zqsat
132 END DO
133 END DO
134 DO i = 1, klon
135 paprs(i, klev+1) = pres_h(i, 1)
136 zgeom(i, klev) = rd*pt(i, klev)/(0.5*(paprs(i,klev+1)+paprsf(i, &
137 klev)))*(paprs(i,klev+1)-paprsf(i,klev))
138 END DO
139 DO k = klev - 1, 1, -1
140 DO i = 1, klon
141 zgeom(i, k) = zgeom(i, k+1) + rd*0.5*(pt(i,k+1)+pt(i,k))/paprs(i, k+1)* &
142 (paprsf(i,k+1)-paprsf(i,k))
143 END DO
144 END DO
145
146 ! appeler la routine principale
147
148 CALL flxmain(dtime, pt, pq, pqs, pqhfl, paprsf, paprs, zgeom, land, zcvgt, &
149 zcvgq, pvervel, rain, snow, kcbot, kctop, kdtop, zmfu, zmfd, zen_u, &
150 zde_u, zen_d, zde_d, d_t_bis, d_q_bis, zmflxr, zmflxs)
151
152 ! AA--------------------------------------------------------
153 ! AA rem : De la meme facon que l'on effectue le reindicage
154 ! AA pour la temperature t et le champ q
155 ! AA on reindice les flux necessaires a la convection
156 ! AA des traceurs
157 ! AA--------------------------------------------------------
158 DO k = 1, klev
159 DO i = 1, klon
160 d_q(i, klev+1-k) = dtime*d_q_bis(i, k)
161 d_t(i, klev+1-k) = dtime*d_t_bis(i, k)
162 END DO
163 END DO
164
165 DO i = 1, klon
166 pmfu(i, 1) = 0.
167 pmfd(i, 1) = 0.
168 pen_d(i, 1) = 0.
169 pde_d(i, 1) = 0.
170 END DO
171
172 DO k = 2, klev
173 DO i = 1, klon
174 pmfu(i, klev+2-k) = zmfu(i, k)
175 pmfd(i, klev+2-k) = zmfd(i, k)
176 END DO
177 END DO
178
179 DO k = 1, klev
180 DO i = 1, klon
181 pen_u(i, klev+1-k) = zen_u(i, k)
182 pde_u(i, klev+1-k) = zde_u(i, k)
183 END DO
184 END DO
185
186 DO k = 1, klev - 1
187 DO i = 1, klon
188 pen_d(i, klev+1-k) = -zen_d(i, k+1)
189 pde_d(i, klev+1-k) = -zde_d(i, k+1)
190 END DO
191 END DO
192
193 DO k = 1, klev + 1
194 DO i = 1, klon
195 pmflxr(i, klev+2-k) = zmflxr(i, k)
196 pmflxs(i, klev+2-k) = zmflxs(i, k)
197 END DO
198 END DO
199
200 RETURN
201 END SUBROUTINE conflx
202 ! --------------------------------------------------------------------
203 SUBROUTINE flxmain(pdtime, pten, pqen, pqsen, pqhfl, pap, paph, pgeo, ldland, &
204 ptte, pqte, pvervel, prsfc, pssfc, kcbot, kctop, kdtop, & ! *
205 ! ldcum, ktype,
206 pmfu, pmfd, pen_u, pde_u, pen_d, pde_d, dt_con, dq_con, pmflxr, pmflxs)
207 USE dimphy
208 IMPLICIT NONE
209 ! ------------------------------------------------------------------
210 include "YOMCST.h"
211 include "YOETHF.h"
212 include "YOECUMF.h"
213 ! ----------------------------------------------------------------
214 REAL pten(klon, klev), pqen(klon, klev), pqsen(klon, klev)
215 REAL ptte(klon, klev)
216 REAL pqte(klon, klev)
217 REAL pvervel(klon, klev)
218 REAL pgeo(klon, klev), pap(klon, klev), paph(klon, klev+1)
219 REAL pqhfl(klon)
220
221 REAL ptu(klon, klev), pqu(klon, klev), plu(klon, klev)
222 REAL plude(klon, klev)
223 REAL pmfu(klon, klev)
224 REAL prsfc(klon), pssfc(klon)
225 INTEGER kcbot(klon), kctop(klon), ktype(klon)
226 LOGICAL ldland(klon), ldcum(klon)
227
228 REAL ztenh(klon, klev), zqenh(klon, klev), zqsenh(klon, klev)
229 REAL zgeoh(klon, klev)
230 REAL zmfub(klon), zmfub1(klon)
231 REAL zmfus(klon, klev), zmfuq(klon, klev), zmful(klon, klev)
232 REAL zdmfup(klon, klev), zdpmel(klon, klev)
233 REAL zentr(klon), zhcbase(klon)
234 REAL zdqpbl(klon), zdqcv(klon), zdhpbl(klon)
235 REAL zrfl(klon)
236 REAL pmflxr(klon, klev+1)
237 REAL pmflxs(klon, klev+1)
238 INTEGER ilab(klon, klev), ictop0(klon)
239 LOGICAL llo1
240 REAL dt_con(klon, klev), dq_con(klon, klev)
241 REAL zmfmax, zdh
242 REAL pdtime, zqumqe, zdqmin, zalvdcp, zhsat, zzz
243 REAL zhhat, zpbmpt, zgam, zeps, zfac
244 INTEGER i, k, ikb, itopm2, kcum
245
246 REAL pen_u(klon, klev), pde_u(klon, klev)
247 REAL pen_d(klon, klev), pde_d(klon, klev)
248
249 REAL ptd(klon, klev), pqd(klon, klev), pmfd(klon, klev)
250 REAL zmfds(klon, klev), zmfdq(klon, klev), zdmfdp(klon, klev)
251 INTEGER kdtop(klon)
252 LOGICAL lddraf(klon)
253 ! ---------------------------------------------------------------------
254 LOGICAL firstcal
255 SAVE firstcal
256 DATA firstcal/.TRUE./
257 !$OMP THREADPRIVATE(firstcal)
258 ! ---------------------------------------------------------------------
259 IF (firstcal) THEN
260 CALL flxsetup
261 firstcal = .FALSE.
262 END IF
263 ! ---------------------------------------------------------------------
264 DO i = 1, klon
265 ldcum(i) = .FALSE.
266 END DO
267 DO k = 1, klev
268 DO i = 1, klon
269 dt_con(i, k) = 0.0
270 dq_con(i, k) = 0.0
271 END DO
272 END DO
273 ! ----------------------------------------------------------------------
274 ! initialiser les variables et faire l'interpolation verticale
275 ! ----------------------------------------------------------------------
276 CALL flxini(pten, pqen, pqsen, pgeo, paph, zgeoh, ztenh, zqenh, zqsenh, &
277 ptu, pqu, ptd, pqd, pmfd, zmfds, zmfdq, zdmfdp, pmfu, zmfus, zmfuq, &
278 zdmfup, zdpmel, plu, plude, ilab, pen_u, pde_u, pen_d, pde_d)
279 ! ---------------------------------------------------------------------
280 ! determiner les valeurs au niveau de base de la tour convective
281 ! ---------------------------------------------------------------------
282 CALL flxbase(ztenh, zqenh, zgeoh, paph, ptu, pqu, plu, ldcum, kcbot, ilab)
283 ! ---------------------------------------------------------------------
284 ! calculer la convergence totale de l'humidite et celle en provenance
285 ! de la couche limite, plus precisement, la convergence integree entre
286 ! le sol et la base de la convection. Cette derniere convergence est
287 ! comparee avec l'evaporation obtenue dans la couche limite pour
288 ! determiner le type de la convection
289 ! ---------------------------------------------------------------------
290 k = 1
291 DO i = 1, klon
292 zdqcv(i) = pqte(i, k)*(paph(i,k+1)-paph(i,k))
293 zdhpbl(i) = 0.0
294 zdqpbl(i) = 0.0
295 END DO
296
297 DO k = 2, klev
298 DO i = 1, klon
299 zdqcv(i) = zdqcv(i) + pqte(i, k)*(paph(i,k+1)-paph(i,k))
300 IF (k>=kcbot(i)) THEN
301 zdqpbl(i) = zdqpbl(i) + pqte(i, k)*(paph(i,k+1)-paph(i,k))
302 zdhpbl(i) = zdhpbl(i) + (rcpd*ptte(i,k)+rlvtt*pqte(i,k))*(paph(i,k+1) &
303 -paph(i,k))
304 END IF
305 END DO
306 END DO
307
308 DO i = 1, klon
309 ktype(i) = 2
310 IF (zdqcv(i)>max(0.,-1.5*pqhfl(i)*rg)) ktype(i) = 1
311 ! cc if (zdqcv(i).GT.MAX(0.,-1.1*pqhfl(i)*RG)) ktype(i) = 1
312 END DO
313
314 ! ---------------------------------------------------------------------
315 ! determiner le flux de masse entrant a travers la base.
316 ! on ignore, pour l'instant, l'effet du panache descendant
317 ! ---------------------------------------------------------------------
318 DO i = 1, klon
319 ikb = kcbot(i)
320 zqumqe = pqu(i, ikb) + plu(i, ikb) - zqenh(i, ikb)
321 zdqmin = max(0.01*zqenh(i,ikb), 1.E-10)
322 IF (zdqpbl(i)>0. .AND. zqumqe>zdqmin .AND. ldcum(i)) THEN
323 zmfub(i) = zdqpbl(i)/(rg*max(zqumqe,zdqmin))
324 ELSE
325 zmfub(i) = 0.01
326 ldcum(i) = .FALSE.
327 END IF
328 IF (ktype(i)==2) THEN
329 zdh = rcpd*(ptu(i,ikb)-ztenh(i,ikb)) + rlvtt*zqumqe
330 zdh = rg*max(zdh, 1.0E5*zdqmin)
331 IF (zdhpbl(i)>0. .AND. ldcum(i)) zmfub(i) = zdhpbl(i)/zdh
332 END IF
333 zmfmax = (paph(i,ikb)-paph(i,ikb-1))/(rg*pdtime)
334 zmfub(i) = min(zmfub(i), zmfmax)
335 zentr(i) = entrscv
336 IF (ktype(i)==1) zentr(i) = entrpen
337 END DO
338 ! -----------------------------------------------------------------------
339 ! DETERMINE CLOUD ASCENT FOR ENTRAINING PLUME
340 ! -----------------------------------------------------------------------
341 ! (A) calculer d'abord la hauteur "theorique" de la tour convective sans
342 ! considerer l'entrainement ni le detrainement du panache, sachant
343 ! ces derniers peuvent abaisser la hauteur theorique.
344
345 DO i = 1, klon
346 ikb = kcbot(i)
347 zhcbase(i) = rcpd*ptu(i, ikb) + zgeoh(i, ikb) + rlvtt*pqu(i, ikb)
348 ictop0(i) = kcbot(i) - 1
349 END DO
350
351 zalvdcp = rlvtt/rcpd
352 DO k = klev - 1, 3, -1
353 DO i = 1, klon
354 zhsat = rcpd*ztenh(i, k) + zgeoh(i, k) + rlvtt*zqsenh(i, k)
355 zgam = r5les*zalvdcp*zqsenh(i, k)/((1.-retv*zqsenh(i,k))*(ztenh(i, &
356 k)-r4les)**2)
357 zzz = rcpd*ztenh(i, k)*0.608
358 zhhat = zhsat - (zzz+zgam*zzz)/(1.+zgam*zzz/rlvtt)*max(zqsenh(i,k)- &
359 zqenh(i,k), 0.)
360 IF (k<ictop0(i) .AND. zhcbase(i)>zhhat) ictop0(i) = k
361 END DO
362 END DO
363
364 ! (B) calculer le panache ascendant
365
366 CALL flxasc(pdtime, ztenh, zqenh, pten, pqen, pqsen, pgeo, zgeoh, pap, &
367 paph, pqte, pvervel, ldland, ldcum, ktype, ilab, ptu, pqu, plu, pmfu, &
368 zmfub, zentr, zmfus, zmfuq, zmful, plude, zdmfup, kcbot, kctop, ictop0, &
369 kcum, pen_u, pde_u)
370 IF (kcum==0) GO TO 1000
371
372 ! verifier l'epaisseur de la convection et changer eventuellement
373 ! le taux d'entrainement/detrainement
374
375 DO i = 1, klon
376 zpbmpt = paph(i, kcbot(i)) - paph(i, kctop(i))
377 IF (ldcum(i) .AND. ktype(i)==1 .AND. zpbmpt<2.E4) ktype(i) = 2
378 IF (ldcum(i)) ictop0(i) = kctop(i)
379 IF (ktype(i)==2) zentr(i) = entrscv
380 END DO
381
382 IF (lmfdd) THEN ! si l'on considere le panache descendant
383
384 ! calculer la precipitation issue du panache ascendant pour
385 ! determiner l'existence du panache descendant dans la convection
386 DO i = 1, klon
387 zrfl(i) = zdmfup(i, 1)
388 END DO
389 DO k = 2, klev
390 DO i = 1, klon
391 zrfl(i) = zrfl(i) + zdmfup(i, k)
392 END DO
393 END DO
394
395 ! determiner le LFS (level of free sinking: niveau de plonge libre)
396 CALL flxdlfs(ztenh, zqenh, zgeoh, paph, ptu, pqu, ldcum, kcbot, kctop, &
397 zmfub, zrfl, ptd, pqd, pmfd, zmfds, zmfdq, zdmfdp, kdtop, lddraf)
398
399 ! calculer le panache descendant
400 CALL flxddraf(ztenh, zqenh, zgeoh, paph, zrfl, ptd, pqd, pmfd, zmfds, &
401 zmfdq, zdmfdp, lddraf, pen_d, pde_d)
402
403 ! calculer de nouveau le flux de masse entrant a travers la base
404 ! de la convection, sachant qu'il a ete modifie par le panache
405 ! descendant
406 DO i = 1, klon
407 IF (lddraf(i)) THEN
408 ikb = kcbot(i)
409 llo1 = pmfd(i, ikb) < 0.
410 zeps = 0.
411 IF (llo1) zeps = cmfdeps
412 zqumqe = pqu(i, ikb) + plu(i, ikb) - zeps*pqd(i, ikb) - &
413 (1.-zeps)*zqenh(i, ikb)
414 zdqmin = max(0.01*zqenh(i,ikb), 1.E-10)
415 zmfmax = (paph(i,ikb)-paph(i,ikb-1))/(rg*pdtime)
416 IF (zdqpbl(i)>0. .AND. zqumqe>zdqmin .AND. ldcum(i) .AND. &
417 zmfub(i)<zmfmax) THEN
418 zmfub1(i) = zdqpbl(i)/(rg*max(zqumqe,zdqmin))
419 ELSE
420 zmfub1(i) = zmfub(i)
421 END IF
422 IF (ktype(i)==2) THEN
423 zdh = rcpd*(ptu(i,ikb)-zeps*ptd(i,ikb)-(1.-zeps)*ztenh(i,ikb)) + &
424 rlvtt*zqumqe
425 zdh = rg*max(zdh, 1.0E5*zdqmin)
426 IF (zdhpbl(i)>0. .AND. ldcum(i)) zmfub1(i) = zdhpbl(i)/zdh
427 END IF
428 IF (.NOT. ((ktype(i)==1 .OR. ktype(i)==2) .AND. abs(zmfub1(i)-zmfub(i &
429 ))<0.2*zmfub(i))) zmfub1(i) = zmfub(i)
430 END IF
431 END DO
432 DO k = 1, klev
433 DO i = 1, klon
434 IF (lddraf(i)) THEN
435 zfac = zmfub1(i)/max(zmfub(i), 1.E-10)
436 pmfd(i, k) = pmfd(i, k)*zfac
437 zmfds(i, k) = zmfds(i, k)*zfac
438 zmfdq(i, k) = zmfdq(i, k)*zfac
439 zdmfdp(i, k) = zdmfdp(i, k)*zfac
440 pen_d(i, k) = pen_d(i, k)*zfac
441 pde_d(i, k) = pde_d(i, k)*zfac
442 END IF
443 END DO
444 END DO
445 DO i = 1, klon
446 IF (lddraf(i)) zmfub(i) = zmfub1(i)
447 END DO
448
449 END IF ! fin de test sur lmfdd
450
451 ! -----------------------------------------------------------------------
452 ! calculer de nouveau le panache ascendant
453 ! -----------------------------------------------------------------------
454 CALL flxasc(pdtime, ztenh, zqenh, pten, pqen, pqsen, pgeo, zgeoh, pap, &
455 paph, pqte, pvervel, ldland, ldcum, ktype, ilab, ptu, pqu, plu, pmfu, &
456 zmfub, zentr, zmfus, zmfuq, zmful, plude, zdmfup, kcbot, kctop, ictop0, &
457 kcum, pen_u, pde_u)
458
459 ! -----------------------------------------------------------------------
460 ! determiner les flux convectifs en forme finale, ainsi que
461 ! la quantite des precipitations
462 ! -----------------------------------------------------------------------
463 CALL flxflux(pdtime, pqen, pqsen, ztenh, zqenh, pap, paph, ldland, zgeoh, &
464 kcbot, kctop, lddraf, kdtop, ktype, ldcum, pmfu, pmfd, zmfus, zmfds, &
465 zmfuq, zmfdq, zmful, plude, zdmfup, zdmfdp, pten, prsfc, pssfc, zdpmel, &
466 itopm2, pmflxr, pmflxs)
467
468 ! ----------------------------------------------------------------------
469 ! calculer les tendances pour T et Q
470 ! ----------------------------------------------------------------------
471 CALL flxdtdq(pdtime, itopm2, paph, ldcum, pten, zmfus, zmfds, zmfuq, zmfdq, &
472 zmful, zdmfup, zdmfdp, zdpmel, dt_con, dq_con)
473
474 1000 CONTINUE
475 RETURN
476 END SUBROUTINE flxmain
477 SUBROUTINE flxini(pten, pqen, pqsen, pgeo, paph, pgeoh, ptenh, pqenh, pqsenh, &
478 ptu, pqu, ptd, pqd, pmfd, pmfds, pmfdq, pdmfdp, pmfu, pmfus, pmfuq, &
479 pdmfup, pdpmel, plu, plude, klab, pen_u, pde_u, pen_d, pde_d)
480 USE dimphy
481 IMPLICIT NONE
482 ! ----------------------------------------------------------------------
483 ! THIS ROUTINE INTERPOLATES LARGE-SCALE FIELDS OF T,Q ETC.
484 ! TO HALF LEVELS (I.E. GRID FOR MASSFLUX SCHEME),
485 ! AND INITIALIZES VALUES FOR UPDRAFTS
486 ! ----------------------------------------------------------------------
487 include "YOMCST.h"
488 include "YOETHF.h"
489
490 REAL pten(klon, klev) ! temperature (environnement)
491 REAL pqen(klon, klev) ! humidite (environnement)
492 REAL pqsen(klon, klev) ! humidite saturante (environnement)
493 REAL pgeo(klon, klev) ! geopotentiel (g * metre)
494 REAL pgeoh(klon, klev) ! geopotentiel aux demi-niveaux
495 REAL paph(klon, klev+1) ! pression aux demi-niveaux
496 REAL ptenh(klon, klev) ! temperature aux demi-niveaux
497 REAL pqenh(klon, klev) ! humidite aux demi-niveaux
498 REAL pqsenh(klon, klev) ! humidite saturante aux demi-niveaux
499
500 REAL ptu(klon, klev) ! temperature du panache ascendant (p-a)
501 REAL pqu(klon, klev) ! humidite du p-a
502 REAL plu(klon, klev) ! eau liquide du p-a
503 REAL pmfu(klon, klev) ! flux de masse du p-a
504 REAL pmfus(klon, klev) ! flux de l'energie seche dans le p-a
505 REAL pmfuq(klon, klev) ! flux de l'humidite dans le p-a
506 REAL pdmfup(klon, klev) ! quantite de l'eau precipitee dans p-a
507 REAL plude(klon, klev) ! quantite de l'eau liquide jetee du
508 ! p-a a l'environnement
509 REAL pdpmel(klon, klev) ! quantite de neige fondue
510
511 REAL ptd(klon, klev) ! temperature du panache descendant (p-d)
512 REAL pqd(klon, klev) ! humidite du p-d
513 REAL pmfd(klon, klev) ! flux de masse du p-d
514 REAL pmfds(klon, klev) ! flux de l'energie seche dans le p-d
515 REAL pmfdq(klon, klev) ! flux de l'humidite dans le p-d
516 REAL pdmfdp(klon, klev) ! quantite de precipitation dans p-d
517
518 REAL pen_u(klon, klev) ! quantite de masse entrainee pour p-a
519 REAL pde_u(klon, klev) ! quantite de masse detrainee pour p-a
520 REAL pen_d(klon, klev) ! quantite de masse entrainee pour p-d
521 REAL pde_d(klon, klev) ! quantite de masse detrainee pour p-d
522
523 INTEGER klab(klon, klev)
524 LOGICAL llflag(klon)
525 INTEGER k, i, icall
526 REAL zzs
527 ! ----------------------------------------------------------------------
528 ! SPECIFY LARGE SCALE PARAMETERS AT HALF LEVELS
529 ! ADJUST TEMPERATURE FIELDS IF STATICLY UNSTABLE
530 ! ----------------------------------------------------------------------
531 DO k = 2, klev
532
533 DO i = 1, klon
534 pgeoh(i, k) = pgeo(i, k) + (pgeo(i,k-1)-pgeo(i,k))*0.5
535 ptenh(i, k) = (max(rcpd*pten(i,k-1)+pgeo(i,k-1),rcpd*pten(i,k)+pgeo(i, &
536 k))-pgeoh(i,k))/rcpd
537 pqsenh(i, k) = pqsen(i, k-1)
538 llflag(i) = .TRUE.
539 END DO
540
541 icall = 0
542 CALL flxadjtq(paph(1,k), ptenh(1,k), pqsenh(1,k), llflag, icall)
543
544 DO i = 1, klon
545 pqenh(i, k) = min(pqen(i,k-1), pqsen(i,k-1)) + &
546 (pqsenh(i,k)-pqsen(i,k-1))
547 pqenh(i, k) = max(pqenh(i,k), 0.)
548 END DO
549
550 END DO
551
552 DO i = 1, klon
553 ptenh(i, klev) = (rcpd*pten(i,klev)+pgeo(i,klev)-pgeoh(i,klev))/rcpd
554 pqenh(i, klev) = pqen(i, klev)
555 ptenh(i, 1) = pten(i, 1)
556 pqenh(i, 1) = pqen(i, 1)
557 pgeoh(i, 1) = pgeo(i, 1)
558 END DO
559
560 DO k = klev - 1, 2, -1
561 DO i = 1, klon
562 zzs = max(rcpd*ptenh(i,k)+pgeoh(i,k), rcpd*ptenh(i,k+1)+pgeoh(i,k+1))
563 ptenh(i, k) = (zzs-pgeoh(i,k))/rcpd
564 END DO
565 END DO
566
567 ! -----------------------------------------------------------------------
568 ! INITIALIZE VALUES FOR UPDRAFTS AND DOWNDRAFTS
569 ! -----------------------------------------------------------------------
570 DO k = 1, klev
571 DO i = 1, klon
572 ptu(i, k) = ptenh(i, k)
573 pqu(i, k) = pqenh(i, k)
574 plu(i, k) = 0.
575 pmfu(i, k) = 0.
576 pmfus(i, k) = 0.
577 pmfuq(i, k) = 0.
578 pdmfup(i, k) = 0.
579 pdpmel(i, k) = 0.
580 plude(i, k) = 0.
581
582 klab(i, k) = 0
583
584 ptd(i, k) = ptenh(i, k)
585 pqd(i, k) = pqenh(i, k)
586 pmfd(i, k) = 0.0
587 pmfds(i, k) = 0.0
588 pmfdq(i, k) = 0.0
589 pdmfdp(i, k) = 0.0
590
591 pen_u(i, k) = 0.0
592 pde_u(i, k) = 0.0
593 pen_d(i, k) = 0.0
594 pde_d(i, k) = 0.0
595 END DO
596 END DO
597
598 RETURN
599 END SUBROUTINE flxini
600 SUBROUTINE flxbase(ptenh, pqenh, pgeoh, paph, ptu, pqu, plu, ldcum, kcbot, &
601 klab)
602 USE dimphy
603 IMPLICIT NONE
604 ! ----------------------------------------------------------------------
605 ! THIS ROUTINE CALCULATES CLOUD BASE VALUES (T AND Q)
606
607 ! INPUT ARE ENVIRONM. VALUES OF T,Q,P,PHI AT HALF LEVELS.
608 ! IT RETURNS CLOUD BASE VALUES AND FLAGS AS FOLLOWS;
609 ! klab=1 FOR SUBCLOUD LEVELS
610 ! klab=2 FOR CONDENSATION LEVEL
611
612 ! LIFT SURFACE AIR DRY-ADIABATICALLY TO CLOUD BASE
613 ! (NON ENTRAINING PLUME,I.E.CONSTANT MASSFLUX)
614 ! ----------------------------------------------------------------------
615 include "YOMCST.h"
616 include "YOETHF.h"
617 ! ----------------------------------------------------------------
618 REAL ptenh(klon, klev), pqenh(klon, klev)
619 REAL pgeoh(klon, klev), paph(klon, klev+1)
620
621 REAL ptu(klon, klev), pqu(klon, klev), plu(klon, klev)
622 INTEGER klab(klon, klev), kcbot(klon)
623
624 LOGICAL llflag(klon), ldcum(klon)
625 INTEGER i, k, icall, is
626 REAL zbuo, zqold(klon)
627 ! ----------------------------------------------------------------------
628 ! INITIALIZE VALUES AT LIFTING LEVEL
629 ! ----------------------------------------------------------------------
630 DO i = 1, klon
631 klab(i, klev) = 1
632 kcbot(i) = klev - 1
633 ldcum(i) = .FALSE.
634 END DO
635 ! ----------------------------------------------------------------------
636 ! DO ASCENT IN SUBCLOUD LAYER,
637 ! CHECK FOR EXISTENCE OF CONDENSATION LEVEL,
638 ! ADJUST T,Q AND L ACCORDINGLY
639 ! CHECK FOR BUOYANCY AND SET FLAGS
640 ! ----------------------------------------------------------------------
641 DO k = klev - 1, 2, -1
642
643 is = 0
644 DO i = 1, klon
645 IF (klab(i,k+1)==1) is = is + 1
646 llflag(i) = .FALSE.
647 IF (klab(i,k+1)==1) llflag(i) = .TRUE.
648 END DO
649 IF (is==0) GO TO 290
650
651 DO i = 1, klon
652 IF (llflag(i)) THEN
653 pqu(i, k) = pqu(i, k+1)
654 ptu(i, k) = ptu(i, k+1) + (pgeoh(i,k+1)-pgeoh(i,k))/rcpd
655 zbuo = ptu(i, k)*(1.+retv*pqu(i,k)) - ptenh(i, k)*(1.+retv*pqenh(i,k) &
656 ) + 0.5
657 IF (zbuo>0.) klab(i, k) = 1
658 zqold(i) = pqu(i, k)
659 END IF
660 END DO
661
662 icall = 1
663 CALL flxadjtq(paph(1,k), ptu(1,k), pqu(1,k), llflag, icall)
664
665 DO i = 1, klon
666 IF (llflag(i) .AND. pqu(i,k)/=zqold(i)) THEN
667 klab(i, k) = 2
668 plu(i, k) = plu(i, k) + zqold(i) - pqu(i, k)
669 zbuo = ptu(i, k)*(1.+retv*pqu(i,k)) - ptenh(i, k)*(1.+retv*pqenh(i,k) &
670 ) + 0.5
671 IF (zbuo>0.) kcbot(i) = k
672 IF (zbuo>0.) ldcum(i) = .TRUE.
673 END IF
674 END DO
675
676 290 END DO
677
678 RETURN
679 END SUBROUTINE flxbase
680 SUBROUTINE flxasc(pdtime, ptenh, pqenh, pten, pqen, pqsen, pgeo, pgeoh, pap, &
681 paph, pqte, pvervel, ldland, ldcum, ktype, klab, ptu, pqu, plu, pmfu, &
682 pmfub, pentr, pmfus, pmfuq, pmful, plude, pdmfup, kcbot, kctop, kctop0, &
683 kcum, pen_u, pde_u)
684 USE dimphy
685 IMPLICIT NONE
686 ! ----------------------------------------------------------------------
687 ! THIS ROUTINE DOES THE CALCULATIONS FOR CLOUD ASCENTS
688 ! FOR CUMULUS PARAMETERIZATION
689 ! ----------------------------------------------------------------------
690 include "YOMCST.h"
691 include "YOETHF.h"
692 include "YOECUMF.h"
693
694 REAL pdtime
695 REAL pten(klon, klev), ptenh(klon, klev)
696 REAL pqen(klon, klev), pqenh(klon, klev), pqsen(klon, klev)
697 REAL pgeo(klon, klev), pgeoh(klon, klev)
698 REAL pap(klon, klev), paph(klon, klev+1)
699 REAL pqte(klon, klev)
700 REAL pvervel(klon, klev) ! vitesse verticale en Pa/s
701
702 REAL pmfub(klon), pentr(klon)
703 REAL ptu(klon, klev), pqu(klon, klev), plu(klon, klev)
704 REAL plude(klon, klev)
705 REAL pmfu(klon, klev), pmfus(klon, klev)
706 REAL pmfuq(klon, klev), pmful(klon, klev)
707 REAL pdmfup(klon, klev)
708 INTEGER ktype(klon), klab(klon, klev), kcbot(klon), kctop(klon)
709 INTEGER kctop0(klon)
710 LOGICAL ldland(klon), ldcum(klon)
711
712 REAL pen_u(klon, klev), pde_u(klon, klev)
713 REAL zqold(klon)
714 REAL zdland(klon)
715 LOGICAL llflag(klon)
716 INTEGER k, i, is, icall, kcum
717 REAL ztglace, zdphi, zqeen, zseen, zscde, zqude
718 REAL zmfusk, zmfuqk, zmfulk, zbuo, zdnoprc, zprcon, zlnew
719
720 REAL zpbot(klon), zptop(klon), zrho(klon)
721 REAL zdprho, zentr, zpmid, zmftest, zmfmax
722 LOGICAL llo1, llo2
723
724 REAL zwmax(klon), zzzmb
725 INTEGER klwmin(klon) ! level of maximum vertical velocity
726 REAL fact
727 ! ----------------------------------------------------------------------
728 ztglace = rtt - 13.
729
730 ! Chercher le niveau ou la vitesse verticale est maximale:
731 DO i = 1, klon
732 klwmin(i) = klev
733 zwmax(i) = 0.0
734 END DO
735 DO k = klev, 3, -1
736 DO i = 1, klon
737 IF (pvervel(i,k)<zwmax(i)) THEN
738 zwmax(i) = pvervel(i, k)
739 klwmin(i) = k
740 END IF
741 END DO
742 END DO
743 ! ----------------------------------------------------------------------
744 ! SET DEFAULT VALUES
745 ! ----------------------------------------------------------------------
746 DO i = 1, klon
747 IF (.NOT. ldcum(i)) ktype(i) = 0
748 END DO
749
750 DO k = 1, klev
751 DO i = 1, klon
752 plu(i, k) = 0.
753 pmfu(i, k) = 0.
754 pmfus(i, k) = 0.
755 pmfuq(i, k) = 0.
756 pmful(i, k) = 0.
757 plude(i, k) = 0.
758 pdmfup(i, k) = 0.
759 IF (.NOT. ldcum(i) .OR. ktype(i)==3) klab(i, k) = 0
760 IF (.NOT. ldcum(i) .AND. paph(i,k)<4.E4) kctop0(i) = k
761 END DO
762 END DO
763
764 DO i = 1, klon
765 IF (ldland(i)) THEN
766 zdland(i) = 3.0E4
767 zdphi = pgeoh(i, kctop0(i)) - pgeoh(i, kcbot(i))
768 IF (ptu(i,kctop0(i))>=ztglace) zdland(i) = zdphi
769 zdland(i) = max(3.0E4, zdland(i))
770 zdland(i) = min(5.0E4, zdland(i))
771 END IF
772 END DO
773
774 ! Initialiser les valeurs au niveau d'ascendance
775
776 DO i = 1, klon
777 kctop(i) = klev - 1
778 IF (.NOT. ldcum(i)) THEN
779 kcbot(i) = klev - 1
780 pmfub(i) = 0.
781 pqu(i, klev) = 0.
782 END IF
783 pmfu(i, klev) = pmfub(i)
784 pmfus(i, klev) = pmfub(i)*(rcpd*ptu(i,klev)+pgeoh(i,klev))
785 pmfuq(i, klev) = pmfub(i)*pqu(i, klev)
786 END DO
787
788 DO i = 1, klon
789 ldcum(i) = .FALSE.
790 END DO
791 ! ----------------------------------------------------------------------
792 ! DO ASCENT: SUBCLOUD LAYER (klab=1) ,CLOUDS (klab=2)
793 ! BY DOING FIRST DRY-ADIABATIC ASCENT AND THEN
794 ! BY ADJUSTING T,Q AND L ACCORDINGLY IN *flxadjtq*,
795 ! THEN CHECK FOR BUOYANCY AND SET FLAGS ACCORDINGLY
796 ! ----------------------------------------------------------------------
797 DO k = klev - 1, 3, -1
798
799 IF (lmfmid .AND. k<klev-1) THEN
800 DO i = 1, klon
801 IF (.NOT. ldcum(i) .AND. klab(i,k+1)==0 .AND. &
802 pqen(i,k)>0.9*pqsen(i,k) .AND. pap(i,k)/paph(i,klev+1)>0.4) THEN
803 ptu(i, k+1) = pten(i, k) + (pgeo(i,k)-pgeoh(i,k+1))/rcpd
804 pqu(i, k+1) = pqen(i, k)
805 plu(i, k+1) = 0.0
806 zzzmb = max(cmfcmin, -pvervel(i,k)/rg)
807 zmfmax = (paph(i,k)-paph(i,k-1))/(rg*pdtime)
808 pmfub(i) = min(zzzmb, zmfmax)
809 pmfu(i, k+1) = pmfub(i)
810 pmfus(i, k+1) = pmfub(i)*(rcpd*ptu(i,k+1)+pgeoh(i,k+1))
811 pmfuq(i, k+1) = pmfub(i)*pqu(i, k+1)
812 pmful(i, k+1) = 0.0
813 pdmfup(i, k+1) = 0.0
814 kcbot(i) = k
815 klab(i, k+1) = 1
816 ktype(i) = 3
817 pentr(i) = entrmid
818 END IF
819 END DO
820 END IF
821
822 is = 0
823 DO i = 1, klon
824 is = is + klab(i, k+1)
825 IF (klab(i,k+1)==0) klab(i, k) = 0
826 llflag(i) = .FALSE.
827 IF (klab(i,k+1)>0) llflag(i) = .TRUE.
828 END DO
829 IF (is==0) GO TO 480
830
831 ! calculer le taux d'entrainement et de detrainement
832
833 DO i = 1, klon
834 pen_u(i, k) = 0.0
835 pde_u(i, k) = 0.0
836 zrho(i) = paph(i, k+1)/(rd*ptenh(i,k+1))
837 zpbot(i) = paph(i, kcbot(i))
838 zptop(i) = paph(i, kctop0(i))
839 END DO
840
841 DO i = 1, klon
842 IF (ldcum(i)) THEN
843 zdprho = (paph(i,k+1)-paph(i,k))/(rg*zrho(i))
844 zentr = pentr(i)*pmfu(i, k+1)*zdprho
845 llo1 = k < kcbot(i)
846 IF (llo1) pde_u(i, k) = zentr
847 zpmid = 0.5*(zpbot(i)+zptop(i))
848 llo2 = llo1 .AND. ktype(i) == 2 .AND. (zpbot(i)-paph(i,k)<0.2E5 .OR. &
849 paph(i,k)>zpmid)
850 IF (llo2) pen_u(i, k) = zentr
851 llo2 = llo1 .AND. (ktype(i)==1 .OR. ktype(i)==3) .AND. &
852 (k>=max(klwmin(i),kctop0(i)+2) .OR. pap(i,k)>zpmid)
853 IF (llo2) pen_u(i, k) = zentr
854 llo1 = pen_u(i, k) > 0. .AND. (ktype(i)==1 .OR. ktype(i)==2)
855 IF (llo1) THEN
856 fact = 1. + 3.*(1.-min(1.,(zpbot(i)-pap(i,k))/1.5E4))
857 zentr = zentr*fact
858 pen_u(i, k) = pen_u(i, k)*fact
859 pde_u(i, k) = pde_u(i, k)*fact
860 END IF
861 IF (llo2 .AND. pqenh(i,k+1)>1.E-5) pen_u(i, k) = zentr + &
862 max(pqte(i,k), 0.)/pqenh(i, k+1)*zrho(i)*zdprho
863 END IF
864 END DO
865
866 ! ----------------------------------------------------------------------
867 ! DO ADIABATIC ASCENT FOR ENTRAINING/DETRAINING PLUME
868 ! ----------------------------------------------------------------------
869
870 DO i = 1, klon
871 IF (llflag(i)) THEN
872 IF (k<kcbot(i)) THEN
873 zmftest = pmfu(i, k+1) + pen_u(i, k) - pde_u(i, k)
874 zmfmax = min(zmftest, (paph(i,k)-paph(i,k-1))/(rg*pdtime))
875 pen_u(i, k) = max(pen_u(i,k)-max(0.0,zmftest-zmfmax), 0.0)
876 END IF
877 pde_u(i, k) = min(pde_u(i,k), 0.75*pmfu(i,k+1))
878 ! calculer le flux de masse du niveau k a partir de celui du k+1
879 pmfu(i, k) = pmfu(i, k+1) + pen_u(i, k) - pde_u(i, k)
880 ! calculer les valeurs Su, Qu et l du niveau k dans le panache
881 ! montant
882 zqeen = pqenh(i, k+1)*pen_u(i, k)
883 zseen = (rcpd*ptenh(i,k+1)+pgeoh(i,k+1))*pen_u(i, k)
884 zscde = (rcpd*ptu(i,k+1)+pgeoh(i,k+1))*pde_u(i, k)
885 zqude = pqu(i, k+1)*pde_u(i, k)
886 plude(i, k) = plu(i, k+1)*pde_u(i, k)
887 zmfusk = pmfus(i, k+1) + zseen - zscde
888 zmfuqk = pmfuq(i, k+1) + zqeen - zqude
889 zmfulk = pmful(i, k+1) - plude(i, k)
890 plu(i, k) = zmfulk*(1./max(cmfcmin,pmfu(i,k)))
891 pqu(i, k) = zmfuqk*(1./max(cmfcmin,pmfu(i,k)))
892 ptu(i, k) = (zmfusk*(1./max(cmfcmin,pmfu(i,k)))-pgeoh(i,k))/rcpd
893 ptu(i, k) = max(100., ptu(i,k))
894 ptu(i, k) = min(400., ptu(i,k))
895 zqold(i) = pqu(i, k)
896 ELSE
897 zqold(i) = 0.0
898 END IF
899 END DO
900
901 ! ----------------------------------------------------------------------
902 ! DO CORRECTIONS FOR MOIST ASCENT BY ADJUSTING T,Q AND L
903 ! ----------------------------------------------------------------------
904
905 icall = 1
906 CALL flxadjtq(paph(1,k), ptu(1,k), pqu(1,k), llflag, icall)
907
908 DO i = 1, klon
909 IF (llflag(i) .AND. pqu(i,k)/=zqold(i)) THEN
910 klab(i, k) = 2
911 plu(i, k) = plu(i, k) + zqold(i) - pqu(i, k)
912 zbuo = ptu(i, k)*(1.+retv*pqu(i,k)) - ptenh(i, k)*(1.+retv*pqenh(i,k) &
913 )
914 IF (klab(i,k+1)==1) zbuo = zbuo + 0.5
915 IF (zbuo>0. .AND. pmfu(i,k)>=0.1*pmfub(i)) THEN
916 kctop(i) = k
917 ldcum(i) = .TRUE.
918 zdnoprc = 1.5E4
919 IF (ldland(i)) zdnoprc = zdland(i)
920 zprcon = cprcon
921 IF ((zpbot(i)-paph(i,k))<zdnoprc) zprcon = 0.0
922 zlnew = plu(i, k)/(1.+zprcon*(pgeoh(i,k)-pgeoh(i,k+1)))
923 pdmfup(i, k) = max(0., (plu(i,k)-zlnew)*pmfu(i,k))
924 plu(i, k) = zlnew
925 ELSE
926 klab(i, k) = 0
927 pmfu(i, k) = 0.
928 END IF
929 END IF
930 END DO
931 DO i = 1, klon
932 IF (llflag(i)) THEN
933 pmful(i, k) = plu(i, k)*pmfu(i, k)
934 pmfus(i, k) = (rcpd*ptu(i,k)+pgeoh(i,k))*pmfu(i, k)
935 pmfuq(i, k) = pqu(i, k)*pmfu(i, k)
936 END IF
937 END DO
938
939 480 END DO
940 ! ----------------------------------------------------------------------
941 ! DETERMINE CONVECTIVE FLUXES ABOVE NON-BUOYANCY LEVEL
942 ! (NOTE: CLOUD VARIABLES LIKE T,Q AND L ARE NOT
943 ! AFFECTED BY DETRAINMENT AND ARE ALREADY KNOWN
944 ! FROM PREVIOUS CALCULATIONS ABOVE)
945 ! ----------------------------------------------------------------------
946 DO i = 1, klon
947 IF (kctop(i)==klev-1) ldcum(i) = .FALSE.
948 kcbot(i) = max(kcbot(i), kctop(i))
949 END DO
950
951 ldcum(1) = ldcum(1)
952
953 is = 0
954 DO i = 1, klon
955 IF (ldcum(i)) is = is + 1
956 END DO
957 kcum = is
958 IF (is==0) GO TO 800
959
960 DO i = 1, klon
961 IF (ldcum(i)) THEN
962 k = kctop(i) - 1
963 pde_u(i, k) = (1.-cmfctop)*pmfu(i, k+1)
964 plude(i, k) = pde_u(i, k)*plu(i, k+1)
965 pmfu(i, k) = pmfu(i, k+1) - pde_u(i, k)
966 zlnew = plu(i, k)
967 pdmfup(i, k) = max(0., (plu(i,k)-zlnew)*pmfu(i,k))
968 plu(i, k) = zlnew
969 pmfus(i, k) = (rcpd*ptu(i,k)+pgeoh(i,k))*pmfu(i, k)
970 pmfuq(i, k) = pqu(i, k)*pmfu(i, k)
971 pmful(i, k) = plu(i, k)*pmfu(i, k)
972 plude(i, k-1) = pmful(i, k)
973 END IF
974 END DO
975
976 800 CONTINUE
977 RETURN
978 END SUBROUTINE flxasc
979 SUBROUTINE flxflux(pdtime, pqen, pqsen, ptenh, pqenh, pap, paph, ldland, &
980 pgeoh, kcbot, kctop, lddraf, kdtop, ktype, ldcum, pmfu, pmfd, pmfus, &
981 pmfds, pmfuq, pmfdq, pmful, plude, pdmfup, pdmfdp, pten, prfl, psfl, &
982 pdpmel, ktopm2, pmflxr, pmflxs)
983 USE dimphy
984 USE print_control_mod, ONLY: prt_level
985 IMPLICIT NONE
986 ! ----------------------------------------------------------------------
987 ! THIS ROUTINE DOES THE FINAL CALCULATION OF CONVECTIVE
988 ! FLUXES IN THE CLOUD LAYER AND IN THE SUBCLOUD LAYER
989 ! ----------------------------------------------------------------------
990 include "YOMCST.h"
991 include "YOETHF.h"
992 include "YOECUMF.h"
993
994 REAL cevapcu(klon, klev)
995 ! -----------------------------------------------------------------
996 REAL pqen(klon, klev), pqenh(klon, klev), pqsen(klon, klev)
997 REAL pten(klon, klev), ptenh(klon, klev)
998 REAL paph(klon, klev+1), pgeoh(klon, klev)
999
1000 REAL pap(klon, klev)
1001 REAL ztmsmlt, zdelta, zqsat
1002
1003 REAL pmfu(klon, klev), pmfus(klon, klev)
1004 REAL pmfd(klon, klev), pmfds(klon, klev)
1005 REAL pmfuq(klon, klev), pmful(klon, klev)
1006 REAL pmfdq(klon, klev)
1007 REAL plude(klon, klev)
1008 REAL pdmfup(klon, klev), pdpmel(klon, klev)
1009 ! jq The variable maxpdmfdp(klon) has been introduced by Olivier Boucher
1010 ! jq 14/11/00 to fix the problem with the negative precipitation.
1011 REAL pdmfdp(klon, klev), maxpdmfdp(klon, klev)
1012 REAL prfl(klon), psfl(klon)
1013 REAL pmflxr(klon, klev+1), pmflxs(klon, klev+1)
1014 INTEGER kcbot(klon), kctop(klon), ktype(klon)
1015 LOGICAL ldland(klon), ldcum(klon)
1016 INTEGER k, kp, i
1017 REAL zcons1, zcons2, zcucov, ztmelp2
1018 REAL pdtime, zdp, zzp, zfac, zsnmlt, zrfl, zrnew
1019 REAL zrmin, zrfln, zdrfl
1020 REAL zpds, zpdr, zdenom
1021 INTEGER ktopm2, itop, ikb
1022
1023 LOGICAL lddraf(klon)
1024 INTEGER kdtop(klon)
1025
1026 include "FCTTRE.h"
1027
1028 DO k = 1, klev
1029 DO i = 1, klon
1030 cevapcu(i, k) = 1.93E-6*261.*sqrt(1.E3/(38.3*0.293)*sqrt(0.5*(paph(i,k) &
1031 +paph(i,k+1))/paph(i,klev+1)))*0.5/rg
1032 END DO
1033 END DO
1034
1035 ! SPECIFY CONSTANTS
1036
1037 zcons1 = rcpd/(rlmlt*rg*pdtime)
1038 zcons2 = 1./(rg*pdtime)
1039 zcucov = 0.05
1040 ztmelp2 = rtt + 2.
1041
1042 ! DETERMINE FINAL CONVECTIVE FLUXES
1043
1044 itop = klev
1045 DO i = 1, klon
1046 itop = min(itop, kctop(i))
1047 IF (.NOT. ldcum(i) .OR. kdtop(i)<kctop(i)) lddraf(i) = .FALSE.
1048 IF (.NOT. ldcum(i)) ktype(i) = 0
1049 END DO
1050
1051 ktopm2 = itop - 2
1052 DO k = ktopm2, klev
1053 DO i = 1, klon
1054 IF (ldcum(i) .AND. k>=kctop(i)-1) THEN
1055 pmfus(i, k) = pmfus(i, k) - pmfu(i, k)*(rcpd*ptenh(i,k)+pgeoh(i,k))
1056 pmfuq(i, k) = pmfuq(i, k) - pmfu(i, k)*pqenh(i, k)
1057 zdp = 1.5E4
1058 IF (ldland(i)) zdp = 3.E4
1059
1060 ! l'eau liquide detrainee est precipitee quand certaines
1061 ! conditions sont reunies (sinon, elle est consideree
1062 ! evaporee dans l'environnement)
1063
1064 IF (paph(i,kcbot(i))-paph(i,kctop(i))>=zdp .AND. pqen(i,k-1)>0.8* &
1065 pqsen(i,k-1)) pdmfup(i, k-1) = pdmfup(i, k-1) + plude(i, k-1)
1066
1067 IF (lddraf(i) .AND. k>=kdtop(i)) THEN
1068 pmfds(i, k) = pmfds(i, k) - pmfd(i, k)*(rcpd*ptenh(i,k)+pgeoh(i,k))
1069 pmfdq(i, k) = pmfdq(i, k) - pmfd(i, k)*pqenh(i, k)
1070 ELSE
1071 pmfd(i, k) = 0.
1072 pmfds(i, k) = 0.
1073 pmfdq(i, k) = 0.
1074 pdmfdp(i, k-1) = 0.
1075 END IF
1076 ELSE
1077 pmfu(i, k) = 0.
1078 pmfus(i, k) = 0.
1079 pmfuq(i, k) = 0.
1080 pmful(i, k) = 0.
1081 pdmfup(i, k-1) = 0.
1082 plude(i, k-1) = 0.
1083 pmfd(i, k) = 0.
1084 pmfds(i, k) = 0.
1085 pmfdq(i, k) = 0.
1086 pdmfdp(i, k-1) = 0.
1087 END IF
1088 END DO
1089 END DO
1090
1091 DO k = ktopm2, klev
1092 DO i = 1, klon
1093 IF (ldcum(i) .AND. k>kcbot(i)) THEN
1094 ikb = kcbot(i)
1095 zzp = ((paph(i,klev+1)-paph(i,k))/(paph(i,klev+1)-paph(i,ikb)))
1096 IF (ktype(i)==3) zzp = zzp**2
1097 pmfu(i, k) = pmfu(i, ikb)*zzp
1098 pmfus(i, k) = pmfus(i, ikb)*zzp
1099 pmfuq(i, k) = pmfuq(i, ikb)*zzp
1100 pmful(i, k) = pmful(i, ikb)*zzp
1101 END IF
1102 END DO
1103 END DO
1104
1105 ! CALCULATE RAIN/SNOW FALL RATES
1106 ! CALCULATE MELTING OF SNOW
1107 ! CALCULATE EVAPORATION OF PRECIP
1108
1109 DO k = 1, klev + 1
1110 DO i = 1, klon
1111 pmflxr(i, k) = 0.0
1112 pmflxs(i, k) = 0.0
1113 END DO
1114 END DO
1115 DO k = ktopm2, klev
1116 DO i = 1, klon
1117 IF (ldcum(i)) THEN
1118 IF (pmflxs(i,k)>0.0 .AND. pten(i,k)>ztmelp2) THEN
1119 zfac = zcons1*(paph(i,k+1)-paph(i,k))
1120 zsnmlt = min(pmflxs(i,k), zfac*(pten(i,k)-ztmelp2))
1121 pdpmel(i, k) = zsnmlt
1122 ztmsmlt = pten(i, k) - zsnmlt/zfac
1123 zdelta = max(0., sign(1.,rtt-ztmsmlt))
1124 zqsat = r2es*foeew(ztmsmlt, zdelta)/pap(i, k)
1125 zqsat = min(0.5, zqsat)
1126 zqsat = zqsat/(1.-retv*zqsat)
1127 pqsen(i, k) = zqsat
1128 END IF
1129 IF (pten(i,k)>rtt) THEN
1130 pmflxr(i, k+1) = pmflxr(i, k) + pdmfup(i, k) + pdmfdp(i, k) + &
1131 pdpmel(i, k)
1132 pmflxs(i, k+1) = pmflxs(i, k) - pdpmel(i, k)
1133 ELSE
1134 pmflxs(i, k+1) = pmflxs(i, k) + pdmfup(i, k) + pdmfdp(i, k)
1135 pmflxr(i, k+1) = pmflxr(i, k)
1136 END IF
1137 ! si la precipitation est negative, on ajuste le plux du
1138 ! panache descendant pour eliminer la negativite
1139 IF ((pmflxr(i,k+1)+pmflxs(i,k+1))<0.0) THEN
1140 pdmfdp(i, k) = -pmflxr(i, k) - pmflxs(i, k) - pdmfup(i, k)
1141 pmflxr(i, k+1) = 0.0
1142 pmflxs(i, k+1) = 0.0
1143 pdpmel(i, k) = 0.0
1144 END IF
1145 END IF
1146 END DO
1147 END DO
1148
1149 ! jq The new variable is initialized here.
1150 ! jq It contains the humidity which is fed to the downdraft
1151 ! jq by evaporation of precipitation in the column below the base
1152 ! jq of convection.
1153 ! jq
1154 ! jq In the former version, this term has been subtracted from precip
1155 ! jq as well as the evaporation.
1156 ! jq
1157 DO k = 1, klev
1158 DO i = 1, klon
1159 maxpdmfdp(i, k) = 0.0
1160 END DO
1161 END DO
1162 DO k = 1, klev
1163 DO kp = k, klev
1164 DO i = 1, klon
1165 maxpdmfdp(i, k) = maxpdmfdp(i, k) + pdmfdp(i, kp)
1166 END DO
1167 END DO
1168 END DO
1169 ! jq End of initialization
1170
1171 DO k = ktopm2, klev
1172 DO i = 1, klon
1173 IF (ldcum(i) .AND. k>=kcbot(i)) THEN
1174 zrfl = pmflxr(i, k) + pmflxs(i, k)
1175 IF (zrfl>1.0E-20) THEN
1176 zrnew = (max(0.,sqrt(zrfl/zcucov)-cevapcu(i, &
1177 k)*(paph(i,k+1)-paph(i,k))*max(0.,pqsen(i,k)-pqen(i,k))))**2* &
1178 zcucov
1179 zrmin = zrfl - zcucov*max(0., 0.8*pqsen(i,k)-pqen(i,k))*zcons2*( &
1180 paph(i,k+1)-paph(i,k))
1181 zrnew = max(zrnew, zrmin)
1182 zrfln = max(zrnew, 0.)
1183 zdrfl = min(0., zrfln-zrfl)
1184 ! jq At least the amount of precipiation needed to feed the
1185 ! downdraft
1186 ! jq with humidity below the base of convection has to be left and
1187 ! can't
1188 ! jq be evaporated (surely the evaporation can't be positive):
1189 zdrfl = max(zdrfl, min(-pmflxr(i,k)-pmflxs(i,k)-maxpdmfdp(i, &
1190 k),0.0))
1191 ! jq End of insertion
1192
1193 zdenom = 1.0/max(1.0E-20, pmflxr(i,k)+pmflxs(i,k))
1194 IF (pten(i,k)>rtt) THEN
1195 zpdr = pdmfdp(i, k)
1196 zpds = 0.0
1197 ELSE
1198 zpdr = 0.0
1199 zpds = pdmfdp(i, k)
1200 END IF
1201 pmflxr(i, k+1) = pmflxr(i, k) + zpdr + pdpmel(i, k) + &
1202 zdrfl*pmflxr(i, k)*zdenom
1203 pmflxs(i, k+1) = pmflxs(i, k) + zpds - pdpmel(i, k) + &
1204 zdrfl*pmflxs(i, k)*zdenom
1205 pdmfup(i, k) = pdmfup(i, k) + zdrfl
1206 ELSE
1207 pmflxr(i, k+1) = 0.0
1208 pmflxs(i, k+1) = 0.0
1209 pdmfdp(i, k) = 0.0
1210 pdpmel(i, k) = 0.0
1211 END IF
1212 IF (pmflxr(i,k)+pmflxs(i,k)<-1.E-26 .AND. prt_level>=1) WRITE (*, *) &
1213 'precip. < 1e-16 ', pmflxr(i, k) + pmflxs(i, k)
1214 END IF
1215 END DO
1216 END DO
1217
1218 DO i = 1, klon
1219 prfl(i) = pmflxr(i, klev+1)
1220 psfl(i) = pmflxs(i, klev+1)
1221 END DO
1222
1223 RETURN
1224 END SUBROUTINE flxflux
1225 SUBROUTINE flxdtdq(pdtime, ktopm2, paph, ldcum, pten, pmfus, pmfds, pmfuq, &
1226 pmfdq, pmful, pdmfup, pdmfdp, pdpmel, dt_con, dq_con)
1227 USE dimphy
1228 IMPLICIT NONE
1229 ! ----------------------------------------------------------------------
1230 ! calculer les tendances T et Q
1231 ! ----------------------------------------------------------------------
1232 include "YOMCST.h"
1233 include "YOETHF.h"
1234 include "YOECUMF.h"
1235 ! -----------------------------------------------------------------
1236 LOGICAL llo1
1237
1238 REAL pten(klon, klev), paph(klon, klev+1)
1239 REAL pmfus(klon, klev), pmfuq(klon, klev), pmful(klon, klev)
1240 REAL pmfds(klon, klev), pmfdq(klon, klev)
1241 REAL pdmfup(klon, klev)
1242 REAL pdmfdp(klon, klev)
1243 REAL pdpmel(klon, klev)
1244 LOGICAL ldcum(klon)
1245 REAL dt_con(klon, klev), dq_con(klon, klev)
1246
1247 INTEGER ktopm2
1248 REAL pdtime
1249
1250 INTEGER i, k
1251 REAL zalv, zdtdt, zdqdt
1252
1253 DO k = ktopm2, klev - 1
1254 DO i = 1, klon
1255 IF (ldcum(i)) THEN
1256 llo1 = (pten(i,k)-rtt) > 0.
1257 zalv = rlstt
1258 IF (llo1) zalv = rlvtt
1259 zdtdt = rg/(paph(i,k+1)-paph(i,k))/rcpd*(pmfus(i,k+1)-pmfus(i,k)+ &
1260 pmfds(i,k+1)-pmfds(i,k)-rlmlt*pdpmel(i,k)-zalv*(pmful(i, &
1261 k+1)-pmful(i,k)-pdmfup(i,k)-pdmfdp(i,k)))
1262 dt_con(i, k) = zdtdt
1263 zdqdt = rg/(paph(i,k+1)-paph(i,k))*(pmfuq(i,k+1)-pmfuq(i,k)+pmfdq(i,k &
1264 +1)-pmfdq(i,k)+pmful(i,k+1)-pmful(i,k)-pdmfup(i,k)-pdmfdp(i,k))
1265 dq_con(i, k) = zdqdt
1266 END IF
1267 END DO
1268 END DO
1269
1270 k = klev
1271 DO i = 1, klon
1272 IF (ldcum(i)) THEN
1273 llo1 = (pten(i,k)-rtt) > 0.
1274 zalv = rlstt
1275 IF (llo1) zalv = rlvtt
1276 zdtdt = -rg/(paph(i,k+1)-paph(i,k))/rcpd*(pmfus(i,k)+pmfds(i,k)+rlmlt* &
1277 pdpmel(i,k)-zalv*(pmful(i,k)+pdmfup(i,k)+pdmfdp(i,k)))
1278 dt_con(i, k) = zdtdt
1279 zdqdt = -rg/(paph(i,k+1)-paph(i,k))*(pmfuq(i,k)+pmfdq(i,k)+pmful(i,k)+ &
1280 pdmfup(i,k)+pdmfdp(i,k))
1281 dq_con(i, k) = zdqdt
1282 END IF
1283 END DO
1284
1285 RETURN
1286 END SUBROUTINE flxdtdq
1287 SUBROUTINE flxdlfs(ptenh, pqenh, pgeoh, paph, ptu, pqu, ldcum, kcbot, kctop, &
1288 pmfub, prfl, ptd, pqd, pmfd, pmfds, pmfdq, pdmfdp, kdtop, lddraf)
1289 USE dimphy
1290 IMPLICIT NONE
1291
1292 ! ----------------------------------------------------------------------
1293 ! THIS ROUTINE CALCULATES LEVEL OF FREE SINKING FOR
1294 ! CUMULUS DOWNDRAFTS AND SPECIFIES T,Q,U AND V VALUES
1295
1296 ! TO PRODUCE LFS-VALUES FOR CUMULUS DOWNDRAFTS
1297 ! FOR MASSFLUX CUMULUS PARAMETERIZATION
1298
1299 ! INPUT ARE ENVIRONMENTAL VALUES OF T,Q,U,V,P,PHI
1300 ! AND UPDRAFT VALUES T,Q,U AND V AND ALSO
1301 ! CLOUD BASE MASSFLUX AND CU-PRECIPITATION RATE.
1302 ! IT RETURNS T,Q,U AND V VALUES AND MASSFLUX AT LFS.
1303
1304 ! CHECK FOR NEGATIVE BUOYANCY OF AIR OF EQUAL PARTS OF
1305 ! MOIST ENVIRONMENTAL AIR AND CLOUD AIR.
1306 ! ----------------------------------------------------------------------
1307 include "YOMCST.h"
1308 include "YOETHF.h"
1309 include "YOECUMF.h"
1310
1311 REAL ptenh(klon, klev)
1312 REAL pqenh(klon, klev)
1313 REAL pgeoh(klon, klev), paph(klon, klev+1)
1314 REAL ptu(klon, klev), pqu(klon, klev)
1315 REAL pmfub(klon)
1316 REAL prfl(klon)
1317
1318 REAL ptd(klon, klev), pqd(klon, klev)
1319 REAL pmfd(klon, klev), pmfds(klon, klev), pmfdq(klon, klev)
1320 REAL pdmfdp(klon, klev)
1321 INTEGER kcbot(klon), kctop(klon), kdtop(klon)
1322 LOGICAL ldcum(klon), lddraf(klon)
1323
1324 REAL ztenwb(klon, klev), zqenwb(klon, klev), zcond(klon)
1325 REAL zttest, zqtest, zbuo, zmftop
1326 LOGICAL llo2(klon)
1327 INTEGER i, k, is, icall
1328 ! ----------------------------------------------------------------------
1329 DO i = 1, klon
1330 lddraf(i) = .FALSE.
1331 kdtop(i) = klev + 1
1332 END DO
1333
1334 ! ----------------------------------------------------------------------
1335 ! DETERMINE LEVEL OF FREE SINKING BY
1336 ! DOING A SCAN FROM TOP TO BASE OF CUMULUS CLOUDS
1337
1338 ! FOR EVERY POINT AND PROCEED AS FOLLOWS:
1339 ! (1) DETEMINE WET BULB ENVIRONMENTAL T AND Q
1340 ! (2) DO MIXING WITH CUMULUS CLOUD AIR
1341 ! (3) CHECK FOR NEGATIVE BUOYANCY
1342
1343 ! THE ASSUMPTION IS THAT AIR OF DOWNDRAFTS IS MIXTURE
1344 ! OF 50% CLOUD AIR + 50% ENVIRONMENTAL AIR AT WET BULB
1345 ! TEMPERATURE (I.E. WHICH BECAME SATURATED DUE TO
1346 ! EVAPORATION OF RAIN AND CLOUD WATER)
1347 ! ----------------------------------------------------------------------
1348
1349 DO k = 3, klev - 3
1350
1351 is = 0
1352 DO i = 1, klon
1353 ztenwb(i, k) = ptenh(i, k)
1354 zqenwb(i, k) = pqenh(i, k)
1355 llo2(i) = ldcum(i) .AND. prfl(i) > 0. .AND. .NOT. lddraf(i) .AND. &
1356 (k<kcbot(i) .AND. k>kctop(i))
1357 IF (llo2(i)) is = is + 1
1358 END DO
1359 IF (is==0) GO TO 290
1360
1361 icall = 2
1362 CALL flxadjtq(paph(1,k), ztenwb(1,k), zqenwb(1,k), llo2, icall)
1363
1364 ! ----------------------------------------------------------------------
1365 ! DO MIXING OF CUMULUS AND ENVIRONMENTAL AIR
1366 ! AND CHECK FOR NEGATIVE BUOYANCY.
1367 ! THEN SET VALUES FOR DOWNDRAFT AT LFS.
1368 ! ----------------------------------------------------------------------
1369 DO i = 1, klon
1370 IF (llo2(i)) THEN
1371 zttest = 0.5*(ptu(i,k)+ztenwb(i,k))
1372 zqtest = 0.5*(pqu(i,k)+zqenwb(i,k))
1373 zbuo = zttest*(1.+retv*zqtest) - ptenh(i, k)*(1.+retv*pqenh(i,k))
1374 zcond(i) = pqenh(i, k) - zqenwb(i, k)
1375 zmftop = -cmfdeps*pmfub(i)
1376 IF (zbuo<0. .AND. prfl(i)>10.*zmftop*zcond(i)) THEN
1377 kdtop(i) = k
1378 lddraf(i) = .TRUE.
1379 ptd(i, k) = zttest
1380 pqd(i, k) = zqtest
1381 pmfd(i, k) = zmftop
1382 pmfds(i, k) = pmfd(i, k)*(rcpd*ptd(i,k)+pgeoh(i,k))
1383 pmfdq(i, k) = pmfd(i, k)*pqd(i, k)
1384 pdmfdp(i, k-1) = -0.5*pmfd(i, k)*zcond(i)
1385 prfl(i) = prfl(i) + pdmfdp(i, k-1)
1386 END IF
1387 END IF
1388 END DO
1389
1390 290 END DO
1391
1392 RETURN
1393 END SUBROUTINE flxdlfs
1394 SUBROUTINE flxddraf(ptenh, pqenh, pgeoh, paph, prfl, ptd, pqd, pmfd, pmfds, &
1395 pmfdq, pdmfdp, lddraf, pen_d, pde_d)
1396 USE dimphy
1397 IMPLICIT NONE
1398
1399 ! ----------------------------------------------------------------------
1400 ! THIS ROUTINE CALCULATES CUMULUS DOWNDRAFT DESCENT
1401
1402 ! TO PRODUCE THE VERTICAL PROFILES FOR CUMULUS DOWNDRAFTS
1403 ! (I.E. T,Q,U AND V AND FLUXES)
1404
1405 ! INPUT IS T,Q,P,PHI,U,V AT HALF LEVELS.
1406 ! IT RETURNS FLUXES OF S,Q AND EVAPORATION RATE
1407 ! AND U,V AT LEVELS WHERE DOWNDRAFT OCCURS
1408
1409 ! CALCULATE MOIST DESCENT FOR ENTRAINING/DETRAINING PLUME BY
1410 ! A) MOVING AIR DRY-ADIABATICALLY TO NEXT LEVEL BELOW AND
1411 ! B) CORRECTING FOR EVAPORATION TO OBTAIN SATURATED STATE.
1412
1413 ! ----------------------------------------------------------------------
1414 include "YOMCST.h"
1415 include "YOETHF.h"
1416 include "YOECUMF.h"
1417
1418 REAL ptenh(klon, klev), pqenh(klon, klev)
1419 REAL pgeoh(klon, klev), paph(klon, klev+1)
1420
1421 REAL ptd(klon, klev), pqd(klon, klev)
1422 REAL pmfd(klon, klev), pmfds(klon, klev), pmfdq(klon, klev)
1423 REAL pdmfdp(klon, klev)
1424 REAL prfl(klon)
1425 LOGICAL lddraf(klon)
1426
1427 REAL pen_d(klon, klev), pde_d(klon, klev), zcond(klon)
1428 LOGICAL llo2(klon), llo1
1429 INTEGER i, k, is, icall, itopde
1430 REAL zentr, zseen, zqeen, zsdde, zqdde, zmfdsk, zmfdqk, zdmfdp
1431 REAL zbuo
1432 ! ----------------------------------------------------------------------
1433 ! CALCULATE MOIST DESCENT FOR CUMULUS DOWNDRAFT BY
1434 ! (A) CALCULATING ENTRAINMENT RATES, ASSUMING
1435 ! LINEAR DECREASE OF MASSFLUX IN PBL
1436 ! (B) DOING MOIST DESCENT - EVAPORATIVE COOLING
1437 ! AND MOISTENING IS CALCULATED IN *flxadjtq*
1438 ! (C) CHECKING FOR NEGATIVE BUOYANCY AND
1439 ! SPECIFYING FINAL T,Q,U,V AND DOWNWARD FLUXES
1440
1441 DO k = 3, klev
1442
1443 is = 0
1444 DO i = 1, klon
1445 llo2(i) = lddraf(i) .AND. pmfd(i, k-1) < 0.
1446 IF (llo2(i)) is = is + 1
1447 END DO
1448 IF (is==0) GO TO 180
1449
1450 DO i = 1, klon
1451 IF (llo2(i)) THEN
1452 zentr = entrdd*pmfd(i, k-1)*rd*ptenh(i, k-1)/(rg*paph(i,k-1))* &
1453 (paph(i,k)-paph(i,k-1))
1454 pen_d(i, k) = zentr
1455 pde_d(i, k) = zentr
1456 END IF
1457 END DO
1458
1459 itopde = klev - 2
1460 IF (k>itopde) THEN
1461 DO i = 1, klon
1462 IF (llo2(i)) THEN
1463 pen_d(i, k) = 0.
1464 pde_d(i, k) = pmfd(i, itopde)*(paph(i,k)-paph(i,k-1))/ &
1465 (paph(i,klev+1)-paph(i,itopde))
1466 END IF
1467 END DO
1468 END IF
1469
1470 DO i = 1, klon
1471 IF (llo2(i)) THEN
1472 pmfd(i, k) = pmfd(i, k-1) + pen_d(i, k) - pde_d(i, k)
1473 zseen = (rcpd*ptenh(i,k-1)+pgeoh(i,k-1))*pen_d(i, k)
1474 zqeen = pqenh(i, k-1)*pen_d(i, k)
1475 zsdde = (rcpd*ptd(i,k-1)+pgeoh(i,k-1))*pde_d(i, k)
1476 zqdde = pqd(i, k-1)*pde_d(i, k)
1477 zmfdsk = pmfds(i, k-1) + zseen - zsdde
1478 zmfdqk = pmfdq(i, k-1) + zqeen - zqdde
1479 pqd(i, k) = zmfdqk*(1./min(-cmfcmin,pmfd(i,k)))
1480 ptd(i, k) = (zmfdsk*(1./min(-cmfcmin,pmfd(i,k)))-pgeoh(i,k))/rcpd
1481 ptd(i, k) = min(400., ptd(i,k))
1482 ptd(i, k) = max(100., ptd(i,k))
1483 zcond(i) = pqd(i, k)
1484 END IF
1485 END DO
1486
1487 icall = 2
1488 CALL flxadjtq(paph(1,k), ptd(1,k), pqd(1,k), llo2, icall)
1489
1490 DO i = 1, klon
1491 IF (llo2(i)) THEN
1492 zcond(i) = zcond(i) - pqd(i, k)
1493 zbuo = ptd(i, k)*(1.+retv*pqd(i,k)) - ptenh(i, k)*(1.+retv*pqenh(i,k) &
1494 )
1495 llo1 = zbuo < 0. .AND. (prfl(i)-pmfd(i,k)*zcond(i)>0.)
1496 IF (.NOT. llo1) pmfd(i, k) = 0.0
1497 pmfds(i, k) = (rcpd*ptd(i,k)+pgeoh(i,k))*pmfd(i, k)
1498 pmfdq(i, k) = pqd(i, k)*pmfd(i, k)
1499 zdmfdp = -pmfd(i, k)*zcond(i)
1500 pdmfdp(i, k-1) = zdmfdp
1501 prfl(i) = prfl(i) + zdmfdp
1502 END IF
1503 END DO
1504
1505 180 END DO
1506 RETURN
1507 END SUBROUTINE flxddraf
1508 SUBROUTINE flxadjtq(pp, pt, pq, ldflag, kcall)
1509 USE dimphy
1510 IMPLICIT NONE
1511 ! ======================================================================
1512 ! Objet: ajustement entre T et Q
1513 ! ======================================================================
1514 ! NOTE: INPUT PARAMETER kcall DEFINES CALCULATION AS
1515 ! kcall=0 ENV. T AND QS IN*CUINI*
1516 ! kcall=1 CONDENSATION IN UPDRAFTS (E.G. CUBASE, CUASC)
1517 ! kcall=2 EVAPORATION IN DOWNDRAFTS (E.G. CUDLFS,CUDDRAF)
1518
1519 include "YOMCST.h"
1520
1521 REAL pt(klon), pq(klon), pp(klon)
1522 LOGICAL ldflag(klon)
1523 INTEGER kcall
1524
1525 REAL zcond(klon), zcond1
1526 REAL z5alvcp, z5alscp, zalvdcp, zalsdcp
1527 REAL zdelta, zcvm5, zldcp, zqsat, zcor
1528 INTEGER is, i
1529 include "YOETHF.h"
1530 include "FCTTRE.h"
1531
1532 z5alvcp = r5les*rlvtt/rcpd
1533 z5alscp = r5ies*rlstt/rcpd
1534 zalvdcp = rlvtt/rcpd
1535 zalsdcp = rlstt/rcpd
1536
1537
1538 DO i = 1, klon
1539 zcond(i) = 0.0
1540 END DO
1541
1542 DO i = 1, klon
1543 IF (ldflag(i)) THEN
1544 zdelta = max(0., sign(1.,rtt-pt(i)))
1545 zcvm5 = z5alvcp*(1.-zdelta) + zdelta*z5alscp
1546 zldcp = zalvdcp*(1.-zdelta) + zdelta*zalsdcp
1547 zqsat = r2es*foeew(pt(i), zdelta)/pp(i)
1548 zqsat = min(0.5, zqsat)
1549 zcor = 1./(1.-retv*zqsat)
1550 zqsat = zqsat*zcor
1551 zcond(i) = (pq(i)-zqsat)/(1.+foede(pt(i),zdelta,zcvm5,zqsat,zcor))
1552 IF (kcall==1) zcond(i) = max(zcond(i), 0.)
1553 IF (kcall==2) zcond(i) = min(zcond(i), 0.)
1554 pt(i) = pt(i) + zldcp*zcond(i)
1555 pq(i) = pq(i) - zcond(i)
1556 END IF
1557 END DO
1558
1559 is = 0
1560 DO i = 1, klon
1561 IF (zcond(i)/=0.) is = is + 1
1562 END DO
1563 IF (is==0) GO TO 230
1564
1565 DO i = 1, klon
1566 IF (ldflag(i) .AND. zcond(i)/=0.) THEN
1567 zdelta = max(0., sign(1.,rtt-pt(i)))
1568 zcvm5 = z5alvcp*(1.-zdelta) + zdelta*z5alscp
1569 zldcp = zalvdcp*(1.-zdelta) + zdelta*zalsdcp
1570 zqsat = r2es*foeew(pt(i), zdelta)/pp(i)
1571 zqsat = min(0.5, zqsat)
1572 zcor = 1./(1.-retv*zqsat)
1573 zqsat = zqsat*zcor
1574 zcond1 = (pq(i)-zqsat)/(1.+foede(pt(i),zdelta,zcvm5,zqsat,zcor))
1575 pt(i) = pt(i) + zldcp*zcond1
1576 pq(i) = pq(i) - zcond1
1577 END IF
1578 END DO
1579
1580 230 CONTINUE
1581 RETURN
1582 END SUBROUTINE flxadjtq
1583 SUBROUTINE flxsetup
1584 IMPLICIT NONE
1585
1586 ! THIS ROUTINE DEFINES DISPOSABLE PARAMETERS FOR MASSFLUX SCHEME
1587
1588 include "YOECUMF.h"
1589
1590 entrpen = 1.0E-4 ! ENTRAINMENT RATE FOR PENETRATIVE CONVECTION
1591 entrscv = 3.0E-4 ! ENTRAINMENT RATE FOR SHALLOW CONVECTION
1592 entrmid = 1.0E-4 ! ENTRAINMENT RATE FOR MIDLEVEL CONVECTION
1593 entrdd = 2.0E-4 ! ENTRAINMENT RATE FOR DOWNDRAFTS
1594 cmfctop = 0.33 ! RELATIVE CLOUD MASSFLUX AT LEVEL ABOVE NONBUO LEVEL
1595 cmfcmax = 1.0 ! MAXIMUM MASSFLUX VALUE ALLOWED FOR UPDRAFTS ETC
1596 cmfcmin = 1.E-10 ! MINIMUM MASSFLUX VALUE (FOR SAFETY)
1597 cmfdeps = 0.3 ! FRACTIONAL MASSFLUX FOR DOWNDRAFTS AT LFS
1598 cprcon = 2.0E-4 ! CONVERSION FROM CLOUD WATER TO RAIN
1599 rhcdd = 1. ! RELATIVE SATURATION IN DOWNDRAFRS (NO LONGER USED)
1600 ! (FORMULATION IMPLIES SATURATION)
1601 lmfpen = .TRUE.
1602 lmfscv = .TRUE.
1603 lmfmid = .TRUE.
1604 lmfdd = .TRUE.
1605 lmfdudv = .TRUE.
1606
1607 RETURN
1608 END SUBROUTINE flxsetup
1609