GCC Code Coverage Report


Directory: ./
File: phys/thermcell.f90
Date: 2022-01-11 19:19:34
Exec Total Coverage
Lines: 0 238 0.0%
Branches: 0 210 0.0%

Line Branch Exec Source
1
2 ! $Id: thermcell.F90 3102 2017-12-03 20:27:42Z oboucher $
3
4 SUBROUTINE calcul_sec(ngrid, nlay, ptimestep, pplay, pplev, pphi, zlev, pu, &
5 pv, pt, po, zmax, wmax, zw2, lmix & ! s
6 ! ,pu_therm,pv_therm
7 , r_aspect, l_mix, w2di, tho)
8
9 USE dimphy
10 IMPLICIT NONE
11
12 ! =======================================================================
13
14 ! Calcul du transport verticale dans la couche limite en presence
15 ! de "thermiques" explicitement representes
16
17 ! R��criture � partir d'un listing papier � Habas, le 14/02/00
18
19 ! le thermique est suppos� homog�ne et dissip� par m�lange avec
20 ! son environnement. la longueur l_mix contr�le l'efficacit� du
21 ! m�lange
22
23 ! Le calcul du transport des diff�rentes esp�ces se fait en prenant
24 ! en compte:
25 ! 1. un flux de masse montant
26 ! 2. un flux de masse descendant
27 ! 3. un entrainement
28 ! 4. un detrainement
29
30 ! =======================================================================
31
32 ! -----------------------------------------------------------------------
33 ! declarations:
34 ! -------------
35
36 include "YOMCST.h"
37
38 ! arguments:
39 ! ----------
40
41 INTEGER ngrid, nlay, w2di
42 REAL tho
43 REAL ptimestep, l_mix, r_aspect
44 REAL pt(ngrid, nlay), pdtadj(ngrid, nlay)
45 REAL pu(ngrid, nlay), pduadj(ngrid, nlay)
46 REAL pv(ngrid, nlay), pdvadj(ngrid, nlay)
47 REAL po(ngrid, nlay), pdoadj(ngrid, nlay)
48 REAL pplay(ngrid, nlay), pplev(ngrid, nlay+1)
49 REAL pphi(ngrid, nlay)
50
51 INTEGER idetr
52 SAVE idetr
53 DATA idetr/3/
54 !$OMP THREADPRIVATE(idetr)
55 ! local:
56 ! ------
57
58 INTEGER ig, k, l, lmaxa(klon), lmix(klon)
59 REAL zsortie1d(klon)
60 ! CR: on remplace lmax(klon,klev+1)
61 INTEGER lmax(klon), lmin(klon), lentr(klon)
62 REAL linter(klon)
63 REAL zmix(klon), fracazmix(klon)
64 ! RC
65 REAL zmax(klon), zw, zw2(klon, klev+1), ztva(klon, klev)
66
67 REAL zlev(klon, klev+1), zlay(klon, klev)
68 REAL zh(klon, klev), zdhadj(klon, klev)
69 REAL ztv(klon, klev)
70 REAL zu(klon, klev), zv(klon, klev), zo(klon, klev)
71 REAL wh(klon, klev+1)
72 REAL wu(klon, klev+1), wv(klon, klev+1), wo(klon, klev+1)
73 REAL zla(klon, klev+1)
74 REAL zwa(klon, klev+1)
75 REAL zld(klon, klev+1)
76 ! real zwd(klon,klev+1)
77 REAL zsortie(klon, klev)
78 REAL zva(klon, klev)
79 REAL zua(klon, klev)
80 REAL zoa(klon, klev)
81
82 REAL zha(klon, klev)
83 REAL wa_moy(klon, klev+1)
84 REAL fraca(klon, klev+1)
85 REAL fracc(klon, klev+1)
86 REAL zf, zf2
87 REAL thetath2(klon, klev), wth2(klon, klev)
88 ! common/comtherm/thetath2,wth2
89
90 REAL count_time
91 ! integer isplit,nsplit
92 INTEGER isplit, nsplit, ialt
93 PARAMETER (nsplit=10)
94 DATA isplit/0/
95 SAVE isplit
96 !$OMP THREADPRIVATE(isplit)
97
98 LOGICAL sorties
99 REAL rho(klon, klev), rhobarz(klon, klev+1), masse(klon, klev)
100 REAL zpspsk(klon, klev)
101
102 ! real wmax(klon,klev),wmaxa(klon)
103 REAL wmax(klon), wmaxa(klon)
104 REAL wa(klon, klev, klev+1)
105 REAL wd(klon, klev+1)
106 REAL larg_part(klon, klev, klev+1)
107 REAL fracd(klon, klev+1)
108 REAL xxx(klon, klev+1)
109 REAL larg_cons(klon, klev+1)
110 REAL larg_detr(klon, klev+1)
111 REAL fm0(klon, klev+1), entr0(klon, klev), detr(klon, klev)
112 REAL pu_therm(klon, klev), pv_therm(klon, klev)
113 REAL fm(klon, klev+1), entr(klon, klev)
114 REAL fmc(klon, klev+1)
115
116 ! CR:nouvelles variables
117 REAL f_star(klon, klev+1), entr_star(klon, klev)
118 REAL entr_star_tot(klon), entr_star2(klon)
119 REAL zalim(klon)
120 INTEGER lalim(klon)
121 REAL norme(klon)
122 REAL f(klon), f0(klon)
123 REAL zlevinter(klon)
124 LOGICAL therm
125 LOGICAL first
126 DATA first/.FALSE./
127 SAVE first
128 !$OMP THREADPRIVATE(first)
129 ! RC
130
131 CHARACTER *2 str2
132 CHARACTER *10 str10
133
134 CHARACTER (LEN=20) :: modname = 'calcul_sec'
135 CHARACTER (LEN=80) :: abort_message
136
137
138 ! LOGICAL vtest(klon),down
139
140 EXTERNAL scopy
141
142 INTEGER ncorrec
143 SAVE ncorrec
144 DATA ncorrec/0/
145 !$OMP THREADPRIVATE(ncorrec)
146
147
148 ! -----------------------------------------------------------------------
149 ! initialisation:
150 ! ---------------
151
152 sorties = .TRUE.
153 IF (ngrid/=klon) THEN
154 PRINT *
155 PRINT *, 'STOP dans convadj'
156 PRINT *, 'ngrid =', ngrid
157 PRINT *, 'klon =', klon
158 END IF
159
160 ! -----------------------------------------------------------------------
161 ! incrementation eventuelle de tendances precedentes:
162 ! ---------------------------------------------------
163
164 ! print*,'0 OK convect8'
165
166 DO l = 1, nlay
167 DO ig = 1, ngrid
168 zpspsk(ig, l) = (pplay(ig,l)/pplev(ig,1))**rkappa
169 zh(ig, l) = pt(ig, l)/zpspsk(ig, l)
170 zu(ig, l) = pu(ig, l)
171 zv(ig, l) = pv(ig, l)
172 zo(ig, l) = po(ig, l)
173 ztv(ig, l) = zh(ig, l)*(1.+0.61*zo(ig,l))
174 END DO
175 END DO
176
177 ! print*,'1 OK convect8'
178 ! --------------------
179
180
181 ! + + + + + + + + + + +
182
183
184 ! wa, fraca, wd, fracd -------------------- zlev(2), rhobarz
185 ! wh,wt,wo ...
186
187 ! + + + + + + + + + + + zh,zu,zv,zo,rho
188
189
190 ! -------------------- zlev(1)
191 ! \\\\\\\\\\\\\\\\\\\
192
193
194 ! -----------------------------------------------------------------------
195 ! Calcul des altitudes des couches
196 ! -----------------------------------------------------------------------
197
198 DO l = 2, nlay
199 DO ig = 1, ngrid
200 zlev(ig, l) = 0.5*(pphi(ig,l)+pphi(ig,l-1))/rg
201 END DO
202 END DO
203 DO ig = 1, ngrid
204 zlev(ig, 1) = 0.
205 zlev(ig, nlay+1) = (2.*pphi(ig,klev)-pphi(ig,klev-1))/rg
206 END DO
207 DO l = 1, nlay
208 DO ig = 1, ngrid
209 zlay(ig, l) = pphi(ig, l)/rg
210 END DO
211 END DO
212
213 ! print*,'2 OK convect8'
214 ! -----------------------------------------------------------------------
215 ! Calcul des densites
216 ! -----------------------------------------------------------------------
217
218 DO l = 1, nlay
219 DO ig = 1, ngrid
220 rho(ig, l) = pplay(ig, l)/(zpspsk(ig,l)*rd*zh(ig,l))
221 END DO
222 END DO
223
224 DO l = 2, nlay
225 DO ig = 1, ngrid
226 rhobarz(ig, l) = 0.5*(rho(ig,l)+rho(ig,l-1))
227 END DO
228 END DO
229
230 DO k = 1, nlay
231 DO l = 1, nlay + 1
232 DO ig = 1, ngrid
233 wa(ig, k, l) = 0.
234 END DO
235 END DO
236 END DO
237
238 ! print*,'3 OK convect8'
239 ! ------------------------------------------------------------------
240 ! Calcul de w2, quarre de w a partir de la cape
241 ! a partir de w2, on calcule wa, vitesse de l'ascendance
242
243 ! ATTENTION: Dans cette version, pour cause d'economie de memoire,
244 ! w2 est stoke dans wa
245
246 ! ATTENTION: dans convect8, on n'utilise le calcule des wa
247 ! independants par couches que pour calculer l'entrainement
248 ! a la base et la hauteur max de l'ascendance.
249
250 ! Indicages:
251 ! l'ascendance provenant du niveau k traverse l'interface l avec
252 ! une vitesse wa(k,l).
253
254 ! --------------------
255
256 ! + + + + + + + + + +
257
258 ! wa(k,l) ---- -------------------- l
259 ! / ! /||\ + + + + + + + + + +
260 ! ||
261 ! || --------------------
262 ! ||
263 ! || + + + + + + + + + +
264 ! ||
265 ! || --------------------
266 ! ||__
267 ! |___ + + + + + + + + + + k
268
269 ! --------------------
270
271
272
273 ! ------------------------------------------------------------------
274
275 ! CR: ponderation entrainement des couches instables
276 ! def des entr_star tels que entr=f*entr_star
277 DO l = 1, klev
278 DO ig = 1, ngrid
279 entr_star(ig, l) = 0.
280 END DO
281 END DO
282 ! determination de la longueur de la couche d entrainement
283 DO ig = 1, ngrid
284 lentr(ig) = 1
285 END DO
286
287 ! on ne considere que les premieres couches instables
288 therm = .FALSE.
289 DO k = nlay - 2, 1, -1
290 DO ig = 1, ngrid
291 IF (ztv(ig,k)>ztv(ig,k+1) .AND. ztv(ig,k+1)<=ztv(ig,k+2)) THEN
292 lentr(ig) = k + 1
293 therm = .TRUE.
294 END IF
295 END DO
296 END DO
297 ! limitation de la valeur du lentr
298 ! do ig=1,ngrid
299 ! lentr(ig)=min(5,lentr(ig))
300 ! enddo
301 ! determination du lmin: couche d ou provient le thermique
302 DO ig = 1, ngrid
303 lmin(ig) = 1
304 END DO
305 DO ig = 1, ngrid
306 DO l = nlay, 2, -1
307 IF (ztv(ig,l-1)>ztv(ig,l)) THEN
308 lmin(ig) = l - 1
309 END IF
310 END DO
311 END DO
312 ! initialisations
313 DO ig = 1, ngrid
314 zalim(ig) = 0.
315 norme(ig) = 0.
316 lalim(ig) = 1
317 END DO
318 DO k = 1, klev - 1
319 DO ig = 1, ngrid
320 zalim(ig) = zalim(ig) + zlev(ig, k)*max(0., (ztv(ig,k)-ztv(ig, &
321 k+1))/(zlev(ig,k+1)-zlev(ig,k)))
322 ! s *(zlev(ig,k+1)-zlev(ig,k))
323 norme(ig) = norme(ig) + max(0., (ztv(ig,k)-ztv(ig,k+1))/(zlev(ig, &
324 k+1)-zlev(ig,k)))
325 ! s *(zlev(ig,k+1)-zlev(ig,k))
326 END DO
327 END DO
328 DO ig = 1, ngrid
329 IF (norme(ig)>1.E-10) THEN
330 zalim(ig) = max(10.*zalim(ig)/norme(ig), zlev(ig,2))
331 ! zalim(ig)=min(zalim(ig),zlev(ig,lentr(ig)))
332 END IF
333 END DO
334 ! d�termination du lalim correspondant
335 DO k = 1, klev - 1
336 DO ig = 1, ngrid
337 IF ((zalim(ig)>zlev(ig,k)) .AND. (zalim(ig)<=zlev(ig,k+1))) THEN
338 lalim(ig) = k
339 END IF
340 END DO
341 END DO
342
343 ! definition de l'entrainement des couches
344 DO l = 1, klev - 1
345 DO ig = 1, ngrid
346 IF (ztv(ig,l)>ztv(ig,l+1) .AND. l>=lmin(ig) .AND. l<lentr(ig)) THEN
347 entr_star(ig, l) = max((ztv(ig,l)-ztv(ig,l+1)), 0.) & ! s
348 ! *(zlev(ig,l+1)-zlev(ig,l))
349 *sqrt(zlev(ig,l+1))
350 ! autre def
351 ! entr_star(ig,l)=zlev(ig,l+1)*(1.-(zlev(ig,l+1)
352 ! s /zlev(ig,lentr(ig)+2)))**(3./2.)
353 END IF
354 END DO
355 END DO
356 ! nouveau test
357 ! if (therm) then
358 DO l = 1, klev - 1
359 DO ig = 1, ngrid
360 IF (ztv(ig,l)>ztv(ig,l+1) .AND. l>=lmin(ig) .AND. l<=lalim(ig) .AND. &
361 zalim(ig)>1.E-10) THEN
362 ! if (l.le.lentr(ig)) then
363 ! entr_star(ig,l)=zlev(ig,l+1)*(1.-(zlev(ig,l+1)
364 ! s /zalim(ig)))**(3./2.)
365 ! write(10,*)zlev(ig,l),entr_star(ig,l)
366 END IF
367 END DO
368 END DO
369 ! endif
370 ! pas de thermique si couche 1 stable
371 DO ig = 1, ngrid
372 IF (lmin(ig)>5) THEN
373 DO l = 1, klev
374 entr_star(ig, l) = 0.
375 END DO
376 END IF
377 END DO
378 ! calcul de l entrainement total
379 DO ig = 1, ngrid
380 entr_star_tot(ig) = 0.
381 END DO
382 DO ig = 1, ngrid
383 DO k = 1, klev
384 entr_star_tot(ig) = entr_star_tot(ig) + entr_star(ig, k)
385 END DO
386 END DO
387 ! Calcul entrainement normalise
388 DO ig = 1, ngrid
389 IF (entr_star_tot(ig)>1.E-10) THEN
390 ! do l=1,lentr(ig)
391 DO l = 1, klev
392 ! def possibles pour entr_star: zdthetadz, dthetadz, zdtheta
393 entr_star(ig, l) = entr_star(ig, l)/entr_star_tot(ig)
394 END DO
395 END IF
396 END DO
397
398 ! print*,'fin calcul entr_star'
399 DO k = 1, klev
400 DO ig = 1, ngrid
401 ztva(ig, k) = ztv(ig, k)
402 END DO
403 END DO
404 ! RC
405 ! print*,'7 OK convect8'
406 DO k = 1, klev + 1
407 DO ig = 1, ngrid
408 zw2(ig, k) = 0.
409 fmc(ig, k) = 0.
410 ! CR
411 f_star(ig, k) = 0.
412 ! RC
413 larg_cons(ig, k) = 0.
414 larg_detr(ig, k) = 0.
415 wa_moy(ig, k) = 0.
416 END DO
417 END DO
418
419 ! print*,'8 OK convect8'
420 DO ig = 1, ngrid
421 linter(ig) = 1.
422 lmaxa(ig) = 1
423 lmix(ig) = 1
424 wmaxa(ig) = 0.
425 END DO
426
427 ! CR:
428 DO l = 1, nlay - 2
429 DO ig = 1, ngrid
430 IF (ztv(ig,l)>ztv(ig,l+1) .AND. entr_star(ig,l)>1.E-10 .AND. &
431 zw2(ig,l)<1E-10) THEN
432 f_star(ig, l+1) = entr_star(ig, l)
433 ! test:calcul de dteta
434 zw2(ig, l+1) = 2.*rg*(ztv(ig,l)-ztv(ig,l+1))/ztv(ig, l+1)* &
435 (zlev(ig,l+1)-zlev(ig,l))*0.4*pphi(ig, l)/(pphi(ig,l+1)-pphi(ig,l))
436 larg_detr(ig, l) = 0.
437 ELSE IF ((zw2(ig,l)>=1E-10) .AND. (f_star(ig,l)+entr_star(ig, &
438 l)>1.E-10)) THEN
439 f_star(ig, l+1) = f_star(ig, l) + entr_star(ig, l)
440 ztva(ig, l) = (f_star(ig,l)*ztva(ig,l-1)+entr_star(ig,l)*ztv(ig,l))/ &
441 f_star(ig, l+1)
442 zw2(ig, l+1) = zw2(ig, l)*(f_star(ig,l)/f_star(ig,l+1))**2 + &
443 2.*rg*(ztva(ig,l)-ztv(ig,l))/ztv(ig, l)*(zlev(ig,l+1)-zlev(ig,l))
444 END IF
445 ! determination de zmax continu par interpolation lineaire
446 IF (zw2(ig,l+1)<0.) THEN
447 ! test
448 IF (abs(zw2(ig,l+1)-zw2(ig,l))<1E-10) THEN
449 ! print*,'pb linter'
450 END IF
451 linter(ig) = (l*(zw2(ig,l+1)-zw2(ig,l))-zw2(ig,l))/(zw2(ig,l+1)-zw2( &
452 ig,l))
453 zw2(ig, l+1) = 0.
454 lmaxa(ig) = l
455 ELSE
456 IF (zw2(ig,l+1)<0.) THEN
457 ! print*,'pb1 zw2<0'
458 END IF
459 wa_moy(ig, l+1) = sqrt(zw2(ig,l+1))
460 END IF
461 IF (wa_moy(ig,l+1)>wmaxa(ig)) THEN
462 ! lmix est le niveau de la couche ou w (wa_moy) est maximum
463 lmix(ig) = l + 1
464 wmaxa(ig) = wa_moy(ig, l+1)
465 END IF
466 END DO
467 END DO
468 ! print*,'fin calcul zw2'
469
470 ! Calcul de la couche correspondant a la hauteur du thermique
471 DO ig = 1, ngrid
472 lmax(ig) = lentr(ig)
473 ! lmax(ig)=lalim(ig)
474 END DO
475 DO ig = 1, ngrid
476 DO l = nlay, lentr(ig) + 1, -1
477 ! do l=nlay,lalim(ig)+1,-1
478 IF (zw2(ig,l)<=1.E-10) THEN
479 lmax(ig) = l - 1
480 END IF
481 END DO
482 END DO
483 ! pas de thermique si couche 1 stable
484 DO ig = 1, ngrid
485 IF (lmin(ig)>5) THEN
486 lmax(ig) = 1
487 lmin(ig) = 1
488 lentr(ig) = 1
489 lalim(ig) = 1
490 END IF
491 END DO
492
493 ! Determination de zw2 max
494 DO ig = 1, ngrid
495 wmax(ig) = 0.
496 END DO
497
498 DO l = 1, nlay
499 DO ig = 1, ngrid
500 IF (l<=lmax(ig)) THEN
501 IF (zw2(ig,l)<0.) THEN
502 ! print*,'pb2 zw2<0'
503 END IF
504 zw2(ig, l) = sqrt(zw2(ig,l))
505 wmax(ig) = max(wmax(ig), zw2(ig,l))
506 ELSE
507 zw2(ig, l) = 0.
508 END IF
509 END DO
510 END DO
511
512 ! Longueur caracteristique correspondant a la hauteur des thermiques.
513 DO ig = 1, ngrid
514 zmax(ig) = 0.
515 zlevinter(ig) = zlev(ig, 1)
516 END DO
517 DO ig = 1, ngrid
518 ! calcul de zlevinter
519 zlevinter(ig) = (zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))*linter(ig) + &
520 zlev(ig, lmax(ig)) - lmax(ig)*(zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))
521 zmax(ig) = max(zmax(ig), zlevinter(ig)-zlev(ig,lmin(ig)))
522 END DO
523 DO ig = 1, ngrid
524 ! write(8,*)zmax(ig),lmax(ig),lentr(ig),lmin(ig)
525 END DO
526 ! on stope apr�s les calculs de zmax et wmax
527 RETURN
528
529 ! print*,'avant fermeture'
530 ! Fermeture,determination de f
531 ! Attention! entrainement normalis� ou pas?
532 DO ig = 1, ngrid
533 entr_star2(ig) = 0.
534 END DO
535 DO ig = 1, ngrid
536 IF (entr_star_tot(ig)<1.E-10) THEN
537 f(ig) = 0.
538 ELSE
539 DO k = lmin(ig), lentr(ig)
540 ! do k=lmin(ig),lalim(ig)
541 entr_star2(ig) = entr_star2(ig) + entr_star(ig, k)**2/(rho(ig,k)*( &
542 zlev(ig,k+1)-zlev(ig,k)))
543 END DO
544 ! Nouvelle fermeture
545 f(ig) = wmax(ig)/(max(500.,zmax(ig))*r_aspect*entr_star2(ig))
546 ! s *entr_star_tot(ig)
547 ! test
548 ! if (first) then
549 f(ig) = f(ig) + (f0(ig)-f(ig))*exp(-ptimestep/zmax(ig)*wmax(ig))
550 ! endif
551 END IF
552 f0(ig) = f(ig)
553 ! first=.true.
554 END DO
555 ! print*,'apres fermeture'
556 ! on stoppe apr�s la fermeture
557 RETURN
558 ! Calcul de l'entrainement
559 DO k = 1, klev
560 DO ig = 1, ngrid
561 entr(ig, k) = f(ig)*entr_star(ig, k)
562 END DO
563 END DO
564 ! on stoppe apr�s le calcul de entr
565 ! RETURN
566 ! CR:test pour entrainer moins que la masse
567 ! do ig=1,ngrid
568 ! do l=1,lentr(ig)
569 ! if ((entr(ig,l)*ptimestep).gt.(0.9*masse(ig,l))) then
570 ! entr(ig,l+1)=entr(ig,l+1)+entr(ig,l)
571 ! s -0.9*masse(ig,l)/ptimestep
572 ! entr(ig,l)=0.9*masse(ig,l)/ptimestep
573 ! endif
574 ! enddo
575 ! enddo
576 ! CR: fin test
577 ! Calcul des flux
578 DO ig = 1, ngrid
579 DO l = 1, lmax(ig) - 1
580 fmc(ig, l+1) = fmc(ig, l) + entr(ig, l)
581 END DO
582 END DO
583
584 ! RC
585
586
587 ! print*,'9 OK convect8'
588 ! print*,'WA1 ',wa_moy
589
590 ! determination de l'indice du debut de la mixed layer ou w decroit
591
592 ! calcul de la largeur de chaque ascendance dans le cas conservatif.
593 ! dans ce cas simple, on suppose que la largeur de l'ascendance provenant
594 ! d'une couche est �gale � la hauteur de la couche alimentante.
595 ! La vitesse maximale dans l'ascendance est aussi prise comme estimation
596 ! de la vitesse d'entrainement horizontal dans la couche alimentante.
597
598 DO l = 2, nlay
599 DO ig = 1, ngrid
600 IF (l<=lmaxa(ig)) THEN
601 zw = max(wa_moy(ig,l), 1.E-10)
602 larg_cons(ig, l) = zmax(ig)*r_aspect*fmc(ig, l)/(rhobarz(ig,l)*zw)
603 END IF
604 END DO
605 END DO
606
607 DO l = 2, nlay
608 DO ig = 1, ngrid
609 IF (l<=lmaxa(ig)) THEN
610 ! if (idetr.eq.0) then
611 ! cette option est finalement en dur.
612 IF ((l_mix*zlev(ig,l))<0.) THEN
613 ! print*,'pb l_mix*zlev<0'
614 END IF
615 ! CR: test: nouvelle def de lambda
616 ! larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l))
617 IF (zw2(ig,l)>1.E-10) THEN
618 larg_detr(ig, l) = sqrt((l_mix/zw2(ig,l))*zlev(ig,l))
619 ELSE
620 larg_detr(ig, l) = sqrt(l_mix*zlev(ig,l))
621 END IF
622 ! RC
623 ! else if (idetr.eq.1) then
624 ! larg_detr(ig,l)=larg_cons(ig,l)
625 ! s *sqrt(l_mix*zlev(ig,l))/larg_cons(ig,lmix(ig))
626 ! else if (idetr.eq.2) then
627 ! larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l))
628 ! s *sqrt(wa_moy(ig,l))
629 ! else if (idetr.eq.4) then
630 ! larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l))
631 ! s *wa_moy(ig,l)
632 ! endif
633 END IF
634 END DO
635 END DO
636
637 ! print*,'10 OK convect8'
638 ! print*,'WA2 ',wa_moy
639 ! calcul de la fraction de la maille concern�e par l'ascendance en tenant
640 ! compte de l'epluchage du thermique.
641
642 ! CR def de zmix continu (profil parabolique des vitesses)
643 DO ig = 1, ngrid
644 IF (lmix(ig)>1.) THEN
645 ! test
646 IF (((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))*((zlev(ig,lmix(ig)))- &
647 (zlev(ig,lmix(ig)+1)))-(zw2(ig,lmix(ig))- &
648 zw2(ig,lmix(ig)+1))*((zlev(ig,lmix(ig)-1))- &
649 (zlev(ig,lmix(ig)))))>1E-10) THEN
650
651 zmix(ig) = ((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))*((zlev(ig,lmix(ig)) &
652 )**2-(zlev(ig,lmix(ig)+1))**2)-(zw2(ig,lmix(ig))-zw2(ig, &
653 lmix(ig)+1))*((zlev(ig,lmix(ig)-1))**2-(zlev(ig,lmix(ig)))**2))/ &
654 (2.*((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))*((zlev(ig,lmix(ig)))- &
655 (zlev(ig,lmix(ig)+1)))-(zw2(ig,lmix(ig))- &
656 zw2(ig,lmix(ig)+1))*((zlev(ig,lmix(ig)-1))-(zlev(ig,lmix(ig))))))
657 ELSE
658 zmix(ig) = zlev(ig, lmix(ig))
659 ! print*,'pb zmix'
660 END IF
661 ELSE
662 zmix(ig) = 0.
663 END IF
664 ! test
665 IF ((zmax(ig)-zmix(ig))<0.) THEN
666 zmix(ig) = 0.99*zmax(ig)
667 ! print*,'pb zmix>zmax'
668 END IF
669 END DO
670
671 ! calcul du nouveau lmix correspondant
672 DO ig = 1, ngrid
673 DO l = 1, klev
674 IF (zmix(ig)>=zlev(ig,l) .AND. zmix(ig)<zlev(ig,l+1)) THEN
675 lmix(ig) = l
676 END IF
677 END DO
678 END DO
679
680 DO l = 2, nlay
681 DO ig = 1, ngrid
682 IF (larg_cons(ig,l)>1.) THEN
683 ! print*,ig,l,lmix(ig),lmaxa(ig),larg_cons(ig,l),' KKK'
684 fraca(ig, l) = (larg_cons(ig,l)-larg_detr(ig,l))/(r_aspect*zmax(ig))
685 ! test
686 fraca(ig, l) = max(fraca(ig,l), 0.)
687 fraca(ig, l) = min(fraca(ig,l), 0.5)
688 fracd(ig, l) = 1. - fraca(ig, l)
689 fracc(ig, l) = larg_cons(ig, l)/(r_aspect*zmax(ig))
690 ELSE
691 ! wa_moy(ig,l)=0.
692 fraca(ig, l) = 0.
693 fracc(ig, l) = 0.
694 fracd(ig, l) = 1.
695 END IF
696 END DO
697 END DO
698 ! CR: calcul de fracazmix
699 DO ig = 1, ngrid
700 fracazmix(ig) = (fraca(ig,lmix(ig)+1)-fraca(ig,lmix(ig)))/ &
701 (zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig)))*zmix(ig) + &
702 fraca(ig, lmix(ig)) - zlev(ig, lmix(ig))*(fraca(ig,lmix(ig)+1)-fraca(ig &
703 ,lmix(ig)))/(zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig)))
704 END DO
705
706 DO l = 2, nlay
707 DO ig = 1, ngrid
708 IF (larg_cons(ig,l)>1.) THEN
709 IF (l>lmix(ig)) THEN
710 ! test
711 IF (zmax(ig)-zmix(ig)<1.E-10) THEN
712 ! print*,'pb xxx'
713 xxx(ig, l) = (lmaxa(ig)+1.-l)/(lmaxa(ig)+1.-lmix(ig))
714 ELSE
715 xxx(ig, l) = (zmax(ig)-zlev(ig,l))/(zmax(ig)-zmix(ig))
716 END IF
717 IF (idetr==0) THEN
718 fraca(ig, l) = fracazmix(ig)
719 ELSE IF (idetr==1) THEN
720 fraca(ig, l) = fracazmix(ig)*xxx(ig, l)
721 ELSE IF (idetr==2) THEN
722 fraca(ig, l) = fracazmix(ig)*(1.-(1.-xxx(ig,l))**2)
723 ELSE
724 fraca(ig, l) = fracazmix(ig)*xxx(ig, l)**2
725 END IF
726 ! print*,ig,l,lmix(ig),lmaxa(ig),xxx(ig,l),'LLLLLLL'
727 fraca(ig, l) = max(fraca(ig,l), 0.)
728 fraca(ig, l) = min(fraca(ig,l), 0.5)
729 fracd(ig, l) = 1. - fraca(ig, l)
730 fracc(ig, l) = larg_cons(ig, l)/(r_aspect*zmax(ig))
731 END IF
732 END IF
733 END DO
734 END DO
735
736 ! print*,'fin calcul fraca'
737 ! print*,'11 OK convect8'
738 ! print*,'Ea3 ',wa_moy
739 ! ------------------------------------------------------------------
740 ! Calcul de fracd, wd
741 ! somme wa - wd = 0
742 ! ------------------------------------------------------------------
743
744
745 DO ig = 1, ngrid
746 fm(ig, 1) = 0.
747 fm(ig, nlay+1) = 0.
748 END DO
749
750 DO l = 2, nlay
751 DO ig = 1, ngrid
752 fm(ig, l) = fraca(ig, l)*wa_moy(ig, l)*rhobarz(ig, l)
753 ! CR:test
754 IF (entr(ig,l-1)<1E-10 .AND. fm(ig,l)>fm(ig,l-1) .AND. l>lmix(ig)) THEN
755 fm(ig, l) = fm(ig, l-1)
756 ! write(1,*)'ajustement fm, l',l
757 END IF
758 ! write(1,*)'ig,l,fm(ig,l)',ig,l,fm(ig,l)
759 ! RC
760 END DO
761 DO ig = 1, ngrid
762 IF (fracd(ig,l)<0.1) THEN
763 abort_message = 'fracd trop petit'
764 CALL abort_physic(modname, abort_message, 1)
765
766 ELSE
767 ! vitesse descendante "diagnostique"
768 wd(ig, l) = fm(ig, l)/(fracd(ig,l)*rhobarz(ig,l))
769 END IF
770 END DO
771 END DO
772
773 DO l = 1, nlay
774 DO ig = 1, ngrid
775 ! masse(ig,l)=rho(ig,l)*(zlev(ig,l+1)-zlev(ig,l))
776 masse(ig, l) = (pplev(ig,l)-pplev(ig,l+1))/rg
777 END DO
778 END DO
779
780 ! print*,'12 OK convect8'
781 ! print*,'WA4 ',wa_moy
782 ! c------------------------------------------------------------------
783 ! calcul du transport vertical
784 ! ------------------------------------------------------------------
785
786 GO TO 4444
787 ! print*,'XXXXXXXXXXXXXXX ptimestep= ',ptimestep
788 DO l = 2, nlay - 1
789 DO ig = 1, ngrid
790 IF (fm(ig,l+1)*ptimestep>masse(ig,l) .AND. fm(ig,l+1)*ptimestep>masse( &
791 ig,l+1)) THEN
792 ! print*,'WARN!!! FM>M ig=',ig,' l=',l,' FM='
793 ! s ,fm(ig,l+1)*ptimestep
794 ! s ,' M=',masse(ig,l),masse(ig,l+1)
795 END IF
796 END DO
797 END DO
798
799 DO l = 1, nlay
800 DO ig = 1, ngrid
801 IF (entr(ig,l)*ptimestep>masse(ig,l)) THEN
802 ! print*,'WARN!!! E>M ig=',ig,' l=',l,' E=='
803 ! s ,entr(ig,l)*ptimestep
804 ! s ,' M=',masse(ig,l)
805 END IF
806 END DO
807 END DO
808
809 DO l = 1, nlay
810 DO ig = 1, ngrid
811 IF (.NOT. fm(ig,l)>=0. .OR. .NOT. fm(ig,l)<=10.) THEN
812 ! print*,'WARN!!! fm exagere ig=',ig,' l=',l
813 ! s ,' FM=',fm(ig,l)
814 END IF
815 IF (.NOT. masse(ig,l)>=1.E-10 .OR. .NOT. masse(ig,l)<=1.E4) THEN
816 ! print*,'WARN!!! masse exagere ig=',ig,' l=',l
817 ! s ,' M=',masse(ig,l)
818 ! print*,'rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l)',
819 ! s rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l)
820 ! print*,'zlev(ig,l+1),zlev(ig,l)'
821 ! s ,zlev(ig,l+1),zlev(ig,l)
822 ! print*,'pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1)'
823 ! s ,pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1)
824 END IF
825 IF (.NOT. entr(ig,l)>=0. .OR. .NOT. entr(ig,l)<=10.) THEN
826 ! print*,'WARN!!! entr exagere ig=',ig,' l=',l
827 ! s ,' E=',entr(ig,l)
828 END IF
829 END DO
830 END DO
831
832 4444 CONTINUE
833
834 ! CR:redefinition du entr
835 DO l = 1, nlay
836 DO ig = 1, ngrid
837 detr(ig, l) = fm(ig, l) + entr(ig, l) - fm(ig, l+1)
838 IF (detr(ig,l)<0.) THEN
839 ! entr(ig,l)=entr(ig,l)-detr(ig,l)
840 fm(ig, l+1) = fm(ig, l) + entr(ig, l)
841 detr(ig, l) = 0.
842 ! print*,'WARNING !!! detrainement negatif ',ig,l
843 END IF
844 END DO
845 END DO
846 ! RC
847 IF (w2di==1) THEN
848 fm0 = fm0 + ptimestep*(fm-fm0)/tho
849 entr0 = entr0 + ptimestep*(entr-entr0)/tho
850 ELSE
851 fm0 = fm
852 entr0 = entr
853 END IF
854
855 IF (1==1) THEN
856 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zh, zdhadj, &
857 zha)
858 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zo, pdoadj, &
859 zoa)
860 ELSE
861 CALL dqthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zh, &
862 zdhadj, zha)
863 CALL dqthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zo, &
864 pdoadj, zoa)
865 END IF
866
867 IF (1==0) THEN
868 CALL dvthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zmax, &
869 zu, zv, pduadj, pdvadj, zua, zva)
870 ELSE
871 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zu, pduadj, &
872 zua)
873 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zv, pdvadj, &
874 zva)
875 END IF
876
877 DO l = 1, nlay
878 DO ig = 1, ngrid
879 zf = 0.5*(fracc(ig,l)+fracc(ig,l+1))
880 zf2 = zf/(1.-zf)
881 thetath2(ig, l) = zf2*(zha(ig,l)-zh(ig,l))**2
882 wth2(ig, l) = zf2*(0.5*(wa_moy(ig,l)+wa_moy(ig,l+1)))**2
883 END DO
884 END DO
885
886
887
888 ! print*,'13 OK convect8'
889 ! print*,'WA5 ',wa_moy
890 DO l = 1, nlay
891 DO ig = 1, ngrid
892 pdtadj(ig, l) = zdhadj(ig, l)*zpspsk(ig, l)
893 END DO
894 END DO
895
896
897 ! do l=1,nlay
898 ! do ig=1,ngrid
899 ! if(abs(pdtadj(ig,l))*86400..gt.500.) then
900 ! print*,'WARN!!! ig=',ig,' l=',l
901 ! s ,' pdtadj=',pdtadj(ig,l)
902 ! endif
903 ! if(abs(pdoadj(ig,l))*86400..gt.1.) then
904 ! print*,'WARN!!! ig=',ig,' l=',l
905 ! s ,' pdoadj=',pdoadj(ig,l)
906 ! endif
907 ! enddo
908 ! enddo
909
910 ! print*,'14 OK convect8'
911 ! ------------------------------------------------------------------
912 ! Calculs pour les sorties
913 ! ------------------------------------------------------------------
914
915 IF (sorties) THEN
916 DO l = 1, nlay
917 DO ig = 1, ngrid
918 zla(ig, l) = (1.-fracd(ig,l))*zmax(ig)
919 zld(ig, l) = fracd(ig, l)*zmax(ig)
920 IF (1.-fracd(ig,l)>1.E-10) zwa(ig, l) = wd(ig, l)*fracd(ig, l)/ &
921 (1.-fracd(ig,l))
922 END DO
923 END DO
924
925 ! deja fait
926 ! do l=1,nlay
927 ! do ig=1,ngrid
928 ! detr(ig,l)=fm(ig,l)+entr(ig,l)-fm(ig,l+1)
929 ! if (detr(ig,l).lt.0.) then
930 ! entr(ig,l)=entr(ig,l)-detr(ig,l)
931 ! detr(ig,l)=0.
932 ! print*,'WARNING !!! detrainement negatif ',ig,l
933 ! endif
934 ! enddo
935 ! enddo
936
937 ! print*,'15 OK convect8'
938
939 isplit = isplit + 1
940
941
942 ! #define und
943 GO TO 123
944 123 CONTINUE
945
946 END IF
947
948 ! if(wa_moy(1,4).gt.1.e-10) stop
949
950 ! print*,'19 OK convect8'
951 RETURN
952 END SUBROUTINE calcul_sec
953
954 SUBROUTINE fermeture_seche(ngrid, nlay, pplay, pplev, pphi, zlev, rhobarz, &
955 f0, zpspsk, alim_star, zh, zo, lentr, lmin, nu_min, nu_max, r_aspect, &
956 zmax, wmax)
957
958 USE dimphy
959 IMPLICIT NONE
960
961 include "YOMCST.h"
962
963 INTEGER ngrid, nlay
964 REAL pplay(ngrid, nlay), pplev(ngrid, nlay+1)
965 REAL pphi(ngrid, nlay)
966 REAL zlev(klon, klev+1)
967 REAL alim_star(klon, klev)
968 REAL f0(klon)
969 INTEGER lentr(klon)
970 INTEGER lmin(klon)
971 REAL zmax(klon)
972 REAL wmax(klon)
973 REAL nu_min
974 REAL nu_max
975 REAL r_aspect
976 REAL rhobarz(klon, klev+1)
977 REAL zh(klon, klev)
978 REAL zo(klon, klev)
979 REAL zpspsk(klon, klev)
980
981 INTEGER ig, l
982
983 REAL f_star(klon, klev+1)
984 REAL detr_star(klon, klev)
985 REAL entr_star(klon, klev)
986 REAL zw2(klon, klev+1)
987 REAL linter(klon)
988 INTEGER lmix(klon)
989 INTEGER lmax(klon)
990 REAL zlevinter(klon)
991 REAL wa_moy(klon, klev+1)
992 REAL wmaxa(klon)
993 REAL ztv(klon, klev)
994 REAL ztva(klon, klev)
995 REAL nu(klon, klev)
996 ! real zmax0_sec(klon)
997 ! save zmax0_sec
998 REAL, SAVE, ALLOCATABLE :: zmax0_sec(:)
999 !$OMP THREADPRIVATE(zmax0_sec)
1000 LOGICAL, SAVE :: first = .TRUE.
1001 !$OMP THREADPRIVATE(first)
1002
1003 IF (first) THEN
1004 ALLOCATE (zmax0_sec(klon))
1005 first = .FALSE.
1006 END IF
1007
1008 DO l = 1, nlay
1009 DO ig = 1, ngrid
1010 ztv(ig, l) = zh(ig, l)/zpspsk(ig, l)
1011 ztv(ig, l) = ztv(ig, l)*(1.+retv*zo(ig,l))
1012 END DO
1013 END DO
1014 DO l = 1, nlay - 2
1015 DO ig = 1, ngrid
1016 IF (ztv(ig,l)>ztv(ig,l+1) .AND. alim_star(ig,l)>1.E-10 .AND. &
1017 zw2(ig,l)<1E-10) THEN
1018 f_star(ig, l+1) = alim_star(ig, l)
1019 ! test:calcul de dteta
1020 zw2(ig, l+1) = 2.*rg*(ztv(ig,l)-ztv(ig,l+1))/ztv(ig, l+1)* &
1021 (zlev(ig,l+1)-zlev(ig,l))*0.4*pphi(ig, l)/(pphi(ig,l+1)-pphi(ig,l))
1022 ELSE IF ((zw2(ig,l)>=1E-10) .AND. (f_star(ig,l)+alim_star(ig, &
1023 l))>1.E-10) THEN
1024 ! estimation du detrainement a partir de la geometrie du pas
1025 ! precedent
1026 ! tests sur la definition du detr
1027 nu(ig, l) = (nu_min+nu_max)/2.*(1.-(nu_max-nu_min)/(nu_max+nu_min)* &
1028 tanh((((ztva(ig,l-1)-ztv(ig,l))/ztv(ig,l))/0.0005)))
1029
1030 detr_star(ig, l) = rhobarz(ig, l)*sqrt(zw2(ig,l))/ &
1031 (r_aspect*zmax0_sec(ig))* & ! s
1032 ! /(r_aspect*zmax0(ig))*
1033 (sqrt(nu(ig,l)*zlev(ig,l+1)/sqrt(zw2(ig,l)))-sqrt(nu(ig,l)*zlev(ig, &
1034 l)/sqrt(zw2(ig,l))))
1035 detr_star(ig, l) = detr_star(ig, l)/f0(ig)
1036 IF ((detr_star(ig,l))>f_star(ig,l)) THEN
1037 detr_star(ig, l) = f_star(ig, l)
1038 END IF
1039 entr_star(ig, l) = 0.9*detr_star(ig, l)
1040 IF ((l<lentr(ig))) THEN
1041 entr_star(ig, l) = 0.
1042 ! detr_star(ig,l)=0.
1043 END IF
1044 ! print*,'ok detr_star'
1045 ! prise en compte du detrainement dans le calcul du flux
1046 f_star(ig, l+1) = f_star(ig, l) + alim_star(ig, l) + &
1047 entr_star(ig, l) - detr_star(ig, l)
1048 ! test sur le signe de f_star
1049 IF ((f_star(ig,l+1)+detr_star(ig,l))>1.E-10) THEN
1050 ! AM on melange Tl et qt du thermique
1051 ztva(ig, l) = (f_star(ig,l)*ztva(ig,l-1)+(entr_star(ig, &
1052 l)+alim_star(ig,l))*ztv(ig,l))/(f_star(ig,l+1)+detr_star(ig,l))
1053 zw2(ig, l+1) = zw2(ig, l)*(f_star(ig,l)/(f_star(ig, &
1054 l+1)+detr_star(ig,l)))**2 + 2.*rg*(ztva(ig,l)-ztv(ig,l))/ztv(ig, &
1055 l)*(zlev(ig,l+1)-zlev(ig,l))
1056 END IF
1057 END IF
1058
1059 IF (zw2(ig,l+1)<0.) THEN
1060 linter(ig) = (l*(zw2(ig,l+1)-zw2(ig,l))-zw2(ig,l))/(zw2(ig,l+1)-zw2( &
1061 ig,l))
1062 zw2(ig, l+1) = 0.
1063 ! print*,'linter=',linter(ig)
1064 ELSE
1065 wa_moy(ig, l+1) = sqrt(zw2(ig,l+1))
1066 END IF
1067 IF (wa_moy(ig,l+1)>wmaxa(ig)) THEN
1068 ! lmix est le niveau de la couche ou w (wa_moy) est maximum
1069 lmix(ig) = l + 1
1070 wmaxa(ig) = wa_moy(ig, l+1)
1071 END IF
1072 END DO
1073 END DO
1074 ! print*,'fin calcul zw2'
1075
1076 ! Calcul de la couche correspondant a la hauteur du thermique
1077 DO ig = 1, ngrid
1078 lmax(ig) = lentr(ig)
1079 END DO
1080 DO ig = 1, ngrid
1081 DO l = nlay, lentr(ig) + 1, -1
1082 IF (zw2(ig,l)<=1.E-10) THEN
1083 lmax(ig) = l - 1
1084 END IF
1085 END DO
1086 END DO
1087 ! pas de thermique si couche 1 stable
1088 DO ig = 1, ngrid
1089 IF (lmin(ig)>1) THEN
1090 lmax(ig) = 1
1091 lmin(ig) = 1
1092 lentr(ig) = 1
1093 END IF
1094 END DO
1095
1096 ! Determination de zw2 max
1097 DO ig = 1, ngrid
1098 wmax(ig) = 0.
1099 END DO
1100
1101 DO l = 1, nlay
1102 DO ig = 1, ngrid
1103 IF (l<=lmax(ig)) THEN
1104 IF (zw2(ig,l)<0.) THEN
1105 ! print*,'pb2 zw2<0'
1106 END IF
1107 zw2(ig, l) = sqrt(zw2(ig,l))
1108 wmax(ig) = max(wmax(ig), zw2(ig,l))
1109 ELSE
1110 zw2(ig, l) = 0.
1111 END IF
1112 END DO
1113 END DO
1114
1115 ! Longueur caracteristique correspondant a la hauteur des thermiques.
1116 DO ig = 1, ngrid
1117 zmax(ig) = 0.
1118 zlevinter(ig) = zlev(ig, 1)
1119 END DO
1120 DO ig = 1, ngrid
1121 ! calcul de zlevinter
1122 zlevinter(ig) = (zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))*linter(ig) + &
1123 zlev(ig, lmax(ig)) - lmax(ig)*(zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))
1124 ! pour le cas ou on prend tjs lmin=1
1125 ! zmax(ig)=max(zmax(ig),zlevinter(ig)-zlev(ig,lmin(ig)))
1126 zmax(ig) = max(zmax(ig), zlevinter(ig)-zlev(ig,1))
1127 zmax0_sec(ig) = zmax(ig)
1128 END DO
1129
1130 RETURN
1131 END SUBROUTINE fermeture_seche
1132