/[lmdze]/trunk/libf/phylmd/Thermcell/thermcell.f90
ViewVC logotype

Contents of /trunk/libf/phylmd/Thermcell/thermcell.f90

Parent Directory Parent Directory | Revision Log Revision Log


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

Properties

Name Value
svn:executable

  ViewVC Help
Powered by ViewVC 1.1.21