/[lmdze]/trunk/libf/phylmd/thermcell.f
ViewVC logotype

Contents of /trunk/libf/phylmd/thermcell.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 38 - (show annotations)
Thu Jan 6 17:52:19 2011 UTC (13 years, 3 months ago) by guez
File size: 32614 byte(s)
Extracted ASCII art from "inigeom" into a separate text file in the
documentation.

"test_disvert" now creates a separate file for layer thicknesses.

Moved variables from module "yomcst" to module "suphec_m" because this
is where those variables are defined. Kept in "yomcst" only parameters
of Earth orbit. Gave the attribute "parameter" to some variables of
module "suphec_m".

Variables of module "yoethf" were defined in procedure "suphec". Moved
these definitions to a new procedure "yoethf" in module "yoethf_m".

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 SUPHEC_M
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, intent(in):: 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 endif
726 if(.not.entr(ig,l).ge.0..or..not.entr(ig,l).le.10.) then
727 c print*,'WARN!!! entr exagere ig=',ig,' l=',l
728 c s ,' E=',entr(ig,l)
729 endif
730 enddo
731 enddo
732
733 4444 continue
734
735 cCR:redefinition du entr
736 do l=1,nlay
737 do ig=1,ngrid
738 detr(ig,l)=fm(ig,l)+entr(ig,l)-fm(ig,l+1)
739 if (detr(ig,l).lt.0.) then
740 entr(ig,l)=entr(ig,l)-detr(ig,l)
741 detr(ig,l)=0.
742 c print*,'WARNING !!! detrainement negatif ',ig,l
743 endif
744 enddo
745 enddo
746 cRC
747 if (w2di.eq.1) then
748 fm0=fm0+ptimestep*(fm-fm0)/float(tho)
749 entr0=entr0+ptimestep*(entr-entr0)/float(tho)
750 else
751 fm0=fm
752 entr0=entr
753 endif
754
755 if (1.eq.1) then
756 call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse
757 . ,zh,zdhadj,zha)
758 call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse
759 . ,zo,pdoadj,zoa)
760 else
761 call dqthermcell2(ngrid,nlay,ptimestep,fm0,entr0,masse,fraca
762 . ,zh,zdhadj,zha)
763 call dqthermcell2(ngrid,nlay,ptimestep,fm0,entr0,masse,fraca
764 . ,zo,pdoadj,zoa)
765 endif
766
767 if (1.eq.0) then
768 call dvthermcell2(ngrid,nlay,ptimestep,fm0,entr0,masse
769 . ,fraca,zmax
770 . ,zu,zv,pduadj,pdvadj,zua,zva)
771 else
772 call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse
773 . ,zu,pduadj,zua)
774 call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse
775 . ,zv,pdvadj,zva)
776 endif
777
778 do l=1,nlay
779 do ig=1,ngrid
780 zf=0.5*(fracc(ig,l)+fracc(ig,l+1))
781 zf2=zf/(1.-zf)
782 thetath2(ig,l)=zf2*(zha(ig,l)-zh(ig,l))**2
783 wth2(ig,l)=zf2*(0.5*(wa_moy(ig,l)+wa_moy(ig,l+1)))**2
784 enddo
785 enddo
786
787
788
789 c print*,'13 OK convect8'
790 c print*,'WA5 ',wa_moy
791 do l=1,nlay
792 do ig=1,ngrid
793 pdtadj(ig,l)=zdhadj(ig,l)*zpspsk(ig,l)
794 enddo
795 enddo
796
797
798 c do l=1,nlay
799 c do ig=1,ngrid
800 c if(abs(pdtadj(ig,l))*86400..gt.500.) then
801 c print*,'WARN!!! ig=',ig,' l=',l
802 c s ,' pdtadj=',pdtadj(ig,l)
803 c endif
804 c if(abs(pdoadj(ig,l))*86400..gt.1.) then
805 c print*,'WARN!!! ig=',ig,' l=',l
806 c s ,' pdoadj=',pdoadj(ig,l)
807 c endif
808 c enddo
809 c enddo
810
811 print*,'14 OK convect8'
812 c------------------------------------------------------------------
813 c Calculs pour les sorties
814 c------------------------------------------------------------------
815
816 if(sorties) then
817 do l=1,nlay
818 do ig=1,ngrid
819 zla(ig,l)=(1.-fracd(ig,l))*zmax(ig)
820 zld(ig,l)=fracd(ig,l)*zmax(ig)
821 if(1.-fracd(ig,l).gt.1.e-10)
822 s zwa(ig,l)=wd(ig,l)*fracd(ig,l)/(1.-fracd(ig,l))
823 enddo
824 enddo
825
826 cdeja fait
827 c do l=1,nlay
828 c do ig=1,ngrid
829 c detr(ig,l)=fm(ig,l)+entr(ig,l)-fm(ig,l+1)
830 c if (detr(ig,l).lt.0.) then
831 c entr(ig,l)=entr(ig,l)-detr(ig,l)
832 c detr(ig,l)=0.
833 c print*,'WARNING !!! detrainement negatif ',ig,l
834 c endif
835 c enddo
836 c enddo
837
838 c print*,'15 OK convect8'
839
840 isplit=isplit+1
841
842
843 goto 123
844 123 continue
845
846 endif
847
848 c if(wa_moy(1,4).gt.1.e-10) stop
849
850 print*,'19 OK convect8'
851 return
852 end
853
854 subroutine dqthermcell(ngrid,nlay,ptimestep,fm,entr,masse
855 . ,q,dq,qa)
856 use dimens_m
857 use dimphy
858 implicit none
859
860 c=======================================================================
861 c
862 c Calcul du transport verticale dans la couche limite en presence
863 c de "thermiques" explicitement representes
864 c calcul du dq/dt une fois qu'on connait les ascendances
865 c
866 c=======================================================================
867
868
869 integer ngrid,nlay
870
871 real ptimestep
872 real, intent(in):: masse(ngrid,nlay)
873 real fm(ngrid,nlay+1)
874 real entr(ngrid,nlay)
875 real q(ngrid,nlay)
876 real dq(ngrid,nlay)
877
878 real qa(klon,klev),detr(klon,klev),wqd(klon,klev+1)
879
880 integer ig,k
881
882 c calcul du detrainement
883
884 do k=1,nlay
885 do ig=1,ngrid
886 detr(ig,k)=fm(ig,k)-fm(ig,k+1)+entr(ig,k)
887 enddo
888 enddo
889
890 c calcul de la valeur dans les ascendances
891 do ig=1,ngrid
892 qa(ig,1)=q(ig,1)
893 enddo
894
895 do k=2,nlay
896 do ig=1,ngrid
897 if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt.
898 s 1.e-5*masse(ig,k)) then
899 qa(ig,k)=(fm(ig,k)*qa(ig,k-1)+entr(ig,k)*q(ig,k))
900 s /(fm(ig,k+1)+detr(ig,k))
901 else
902 qa(ig,k)=q(ig,k)
903 endif
904 enddo
905 enddo
906
907 do k=2,nlay
908 do ig=1,ngrid
909 c wqd(ig,k)=fm(ig,k)*0.5*(q(ig,k-1)+q(ig,k))
910 wqd(ig,k)=fm(ig,k)*q(ig,k)
911 enddo
912 enddo
913 do ig=1,ngrid
914 wqd(ig,1)=0.
915 wqd(ig,nlay+1)=0.
916 enddo
917
918 do k=1,nlay
919 do ig=1,ngrid
920 dq(ig,k)=(detr(ig,k)*qa(ig,k)-entr(ig,k)*q(ig,k)
921 s -wqd(ig,k)+wqd(ig,k+1))
922 s /masse(ig,k)
923 enddo
924 enddo
925
926 return
927 end
928
929 subroutine dqthermcell2(ngrid,nlay,ptimestep,fm,entr,masse,frac
930 . ,q,dq,qa)
931 use dimens_m
932 use dimphy
933 implicit none
934
935 c=======================================================================
936 c
937 c Calcul du transport verticale dans la couche limite en presence
938 c de "thermiques" explicitement representes
939 c calcul du dq/dt une fois qu'on connait les ascendances
940 c
941 c=======================================================================
942
943
944 integer ngrid,nlay
945
946 real ptimestep
947 real masse(ngrid,nlay),fm(ngrid,nlay+1)
948 real entr(ngrid,nlay),frac(ngrid,nlay)
949 real q(ngrid,nlay)
950 real dq(ngrid,nlay)
951
952 real qa(klon,klev),detr(klon,klev),wqd(klon,klev+1)
953 real qe(klon,klev),zf,zf2
954
955 integer ig,k
956
957 c calcul du detrainement
958
959 do k=1,nlay
960 do ig=1,ngrid
961 detr(ig,k)=fm(ig,k)-fm(ig,k+1)+entr(ig,k)
962 enddo
963 enddo
964
965 c calcul de la valeur dans les ascendances
966 do ig=1,ngrid
967 qa(ig,1)=q(ig,1)
968 qe(ig,1)=q(ig,1)
969 enddo
970
971 do k=2,nlay
972 do ig=1,ngrid
973 if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt.
974 s 1.e-5*masse(ig,k)) then
975 zf=0.5*(frac(ig,k)+frac(ig,k+1))
976 zf2=1./(1.-zf)
977 qa(ig,k)=(fm(ig,k)*qa(ig,k-1)+zf2*entr(ig,k)*q(ig,k))
978 s /(fm(ig,k+1)+detr(ig,k)+entr(ig,k)*zf*zf2)
979 qe(ig,k)=(q(ig,k)-zf*qa(ig,k))*zf2
980 else
981 qa(ig,k)=q(ig,k)
982 qe(ig,k)=q(ig,k)
983 endif
984 enddo
985 enddo
986
987 do k=2,nlay
988 do ig=1,ngrid
989 c wqd(ig,k)=fm(ig,k)*0.5*(q(ig,k-1)+q(ig,k))
990 wqd(ig,k)=fm(ig,k)*qe(ig,k)
991 enddo
992 enddo
993 do ig=1,ngrid
994 wqd(ig,1)=0.
995 wqd(ig,nlay+1)=0.
996 enddo
997
998 do k=1,nlay
999 do ig=1,ngrid
1000 dq(ig,k)=(detr(ig,k)*qa(ig,k)-entr(ig,k)*qe(ig,k)
1001 s -wqd(ig,k)+wqd(ig,k+1))
1002 s /masse(ig,k)
1003 enddo
1004 enddo
1005
1006 return
1007 end
1008 subroutine dvthermcell2(ngrid,nlay,ptimestep,fm,entr,masse
1009 . ,fraca,larga
1010 . ,u,v,du,dv,ua,va)
1011 use dimens_m
1012 use dimphy
1013 implicit none
1014
1015 c=======================================================================
1016 c
1017 c Calcul du transport verticale dans la couche limite en presence
1018 c de "thermiques" explicitement representes
1019 c calcul du dq/dt une fois qu'on connait les ascendances
1020 c
1021 c=======================================================================
1022
1023
1024 integer ngrid,nlay
1025
1026 real ptimestep
1027 real masse(ngrid,nlay),fm(ngrid,nlay+1)
1028 real fraca(ngrid,nlay+1)
1029 real larga(ngrid)
1030 real entr(ngrid,nlay)
1031 real u(ngrid,nlay)
1032 real ua(ngrid,nlay)
1033 real du(ngrid,nlay)
1034 real v(ngrid,nlay)
1035 real va(ngrid,nlay)
1036 real dv(ngrid,nlay)
1037
1038 real qa(klon,klev),detr(klon,klev),zf,zf2
1039 real wvd(klon,klev+1),wud(klon,klev+1)
1040 real gamma0,gamma(klon,klev+1)
1041 real ue(klon,klev),ve(klon,klev)
1042 real dua,dva
1043 integer iter
1044
1045 integer ig,k
1046
1047 c calcul du detrainement
1048
1049 do k=1,nlay
1050 do ig=1,ngrid
1051 detr(ig,k)=fm(ig,k)-fm(ig,k+1)+entr(ig,k)
1052 enddo
1053 enddo
1054
1055 c calcul de la valeur dans les ascendances
1056 do ig=1,ngrid
1057 ua(ig,1)=u(ig,1)
1058 va(ig,1)=v(ig,1)
1059 ue(ig,1)=u(ig,1)
1060 ve(ig,1)=v(ig,1)
1061 enddo
1062
1063 do k=2,nlay
1064 do ig=1,ngrid
1065 if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt.
1066 s 1.e-5*masse(ig,k)) then
1067 c On itère sur la valeur du coeff de freinage.
1068 c gamma0=rho(ig,k)*(zlev(ig,k+1)-zlev(ig,k))
1069 gamma0=masse(ig,k)
1070 s *sqrt( 0.5*(fraca(ig,k+1)+fraca(ig,k)) )
1071 s *0.5/larga(ig)
1072 s *1.
1073 c s *0.5
1074 c gamma0=0.
1075 zf=0.5*(fraca(ig,k)+fraca(ig,k+1))
1076 zf=0.
1077 zf2=1./(1.-zf)
1078 c la première fois on multiplie le coefficient de freinage
1079 c par le module du vent dans la couche en dessous.
1080 dua=ua(ig,k-1)-u(ig,k-1)
1081 dva=va(ig,k-1)-v(ig,k-1)
1082 do iter=1,5
1083 c On choisit une relaxation lineaire.
1084 gamma(ig,k)=gamma0
1085 c On choisit une relaxation quadratique.
1086 gamma(ig,k)=gamma0*sqrt(dua**2+dva**2)
1087 ua(ig,k)=(fm(ig,k)*ua(ig,k-1)
1088 s +(zf2*entr(ig,k)+gamma(ig,k))*u(ig,k))
1089 s /(fm(ig,k+1)+detr(ig,k)+entr(ig,k)*zf*zf2
1090 s +gamma(ig,k))
1091 va(ig,k)=(fm(ig,k)*va(ig,k-1)
1092 s +(zf2*entr(ig,k)+gamma(ig,k))*v(ig,k))
1093 s /(fm(ig,k+1)+detr(ig,k)+entr(ig,k)*zf*zf2
1094 s +gamma(ig,k))
1095 c print*,k,ua(ig,k),va(ig,k),u(ig,k),v(ig,k),dua,dva
1096 dua=ua(ig,k)-u(ig,k)
1097 dva=va(ig,k)-v(ig,k)
1098 ue(ig,k)=(u(ig,k)-zf*ua(ig,k))*zf2
1099 ve(ig,k)=(v(ig,k)-zf*va(ig,k))*zf2
1100 enddo
1101 else
1102 ua(ig,k)=u(ig,k)
1103 va(ig,k)=v(ig,k)
1104 ue(ig,k)=u(ig,k)
1105 ve(ig,k)=v(ig,k)
1106 gamma(ig,k)=0.
1107 endif
1108 enddo
1109 enddo
1110
1111 do k=2,nlay
1112 do ig=1,ngrid
1113 wud(ig,k)=fm(ig,k)*ue(ig,k)
1114 wvd(ig,k)=fm(ig,k)*ve(ig,k)
1115 enddo
1116 enddo
1117 do ig=1,ngrid
1118 wud(ig,1)=0.
1119 wud(ig,nlay+1)=0.
1120 wvd(ig,1)=0.
1121 wvd(ig,nlay+1)=0.
1122 enddo
1123
1124 do k=1,nlay
1125 do ig=1,ngrid
1126 du(ig,k)=((detr(ig,k)+gamma(ig,k))*ua(ig,k)
1127 s -(entr(ig,k)+gamma(ig,k))*ue(ig,k)
1128 s -wud(ig,k)+wud(ig,k+1))
1129 s /masse(ig,k)
1130 dv(ig,k)=((detr(ig,k)+gamma(ig,k))*va(ig,k)
1131 s -(entr(ig,k)+gamma(ig,k))*ve(ig,k)
1132 s -wvd(ig,k)+wvd(ig,k+1))
1133 s /masse(ig,k)
1134 enddo
1135 enddo
1136
1137 return
1138 end

Properties

Name Value
svn:executable

  ViewVC Help
Powered by ViewVC 1.1.21