/[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 32 - (hide annotations)
Tue Apr 6 17:52:58 2010 UTC (14 years, 1 month ago) by guez
Original Path: trunk/libf/phylmd/thermcell.f
File size: 32612 byte(s)
Split "stringop.f90" into single-procedure files. Gathered files in directory
"IOIPSL/Stringop".

Split "flincom.f90" into "flincom.f90" and "flinget.f90". Removed
unused procedures from module "flincom". Removed unused argument
"filename" of procedure "flinopen_nozoom".

Removed unused files.

Split "grid_change.f90" into "grid_change.f90" and
"gr_phy_write_3d.f90".

Removed unused procedures from modules "calendar", "ioipslmpp",
"grid_atob", "gath_cpl" and "getincom". Removed unused procedures in
files "ppm3d.f" and "thermcell.f".

Split "mathelp.f90" into "mathelp.f90" and "mathop.f90".

Removed unused variable "dpres" of module "comvert".

Use argument "itau" instead of local variables "iadvtr" and "first" to
control algorithm in procedure "fluxstokenc".

Removed unused arguments of procedure "integrd".

Removed useless computations at the end of procedure "leapfrog".

Merged common block "matrfil" into module "parafilt".

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 guez 10 REAL, intent(in):: pplay(ngrid,nlay)
49 guez 3 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