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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3 - (hide 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 guez 3 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