source: lmdz_wrf/branches/LMDZ_WRFmeas/WRFV3/lmdz/thermcell_flux2.F90 @ 107

Last change on this file since 107 was 107, checked in by lfita, 10 years ago

Fixing wrong CALL to 'check_var'

  • Property svn:executable set to *
File size: 19.3 KB
Line 
1!
2! $Id: thermcell_flux2.F90 1403 2010-07-01 09:02:53Z fairhead $
3!
4      SUBROUTINE thermcell_flux2(ngrid,klev,ptimestep,masse, &
5     &       lalim,lmax,alim_star,  &
6     &       entr_star,detr_star,f,rhobarz,zlev,zw2,fm,entr,  &
7     &       detr,zqla,lev_out,lunout1,igout)
8!IM 060508    &       detr,zqla,zmax,lev_out,lunout,igout)
9
10
11!---------------------------------------------------------------------------
12!thermcell_flux: deduction des flux
13!---------------------------------------------------------------------------
14
15      IMPLICIT NONE
16#include "iniprint.h"
17#include "thermcell.h"
18     
19      INTEGER ig,l
20      INTEGER ngrid,klev
21     
22      REAL alim_star(ngrid,klev),entr_star(ngrid,klev)
23      REAL detr_star(ngrid,klev)
24      REAL zw2(ngrid,klev+1)
25      REAL zlev(ngrid,klev+1)
26      REAL masse(ngrid,klev)
27      REAL ptimestep
28      REAL rhobarz(ngrid,klev)
29      REAL f(ngrid)
30      INTEGER lmax(ngrid)
31      INTEGER lalim(ngrid)
32      REAL zqla(ngrid,klev)
33      REAL zmax(ngrid)
34
35      integer ncorecfm1,ncorecfm2,ncorecfm3,ncorecalpha
36      integer ncorecfm4,ncorecfm5,ncorecfm6,ncorecfm7,ncorecfm8
37     
38
39      REAL entr(ngrid,klev),detr(ngrid,klev)
40      REAL fm(ngrid,klev+1)
41      REAL zfm
42
43      integer igout,lout
44      integer lev_out
45      integer lunout1
46
47      REAL f_old,ddd0,eee0,ddd,eee,zzz
48
49      REAL fomass_max,alphamax
50      save fomass_max,alphamax
51
52      logical check_debug,labort_gcm
53
54      character (len=20) :: modname='thermcell_flux2'
55      character (len=80) :: abort_message
56
57! Lluis
58      INTEGER                                            :: llp
59      CHARACTER(LEN=50)                                  :: lvarname, lfname
60      REAL                                               :: largest
61      CHARACTER(LEN=4)                                   :: lS
62
63      llp = 734
64      lfname = 'physiq'
65      largest = 10.e5
66
67      fomass_max=0.5
68      alphamax=0.7
69
70      ncorecfm1=0
71      ncorecfm2=0
72      ncorecfm3=0
73      ncorecfm4=0
74      ncorecfm5=0
75      ncorecfm6=0
76      ncorecfm7=0
77      ncorecfm8=0
78      ncorecalpha=0
79
80!initialisation
81      fm(:,:)=0.
82     
83      if (prt_level.ge.10) then
84         write(lunout1,*) 'Dans thermcell_flux 0'
85         write(lunout1,*) 'flux base ',f(igout)
86         write(lunout1,*) 'lmax ',lmax(igout)
87         write(lunout1,*) 'lalim ',lalim(igout)
88         write(lunout1,*) 'ig= ',igout
89         write(lunout1,*) ' l E*    A*     D*  '
90         write(lunout1,'(i4,3e15.5)') (l,entr_star(igout,l),alim_star(igout,l),detr_star(igout,l) &
91     &    ,l=1,lmax(igout))
92      endif
93
94
95!-------------------------------------------------------------------------
96! Verification de la nullite des entrainement et detrainement au dessus
97! de lmax(ig)
98! Active uniquement si check_debug=.true. ou prt_level>=10
99!-------------------------------------------------------------------------
100
101      check_debug=.false..or.prt_level>=10
102
103      if (check_debug) then
104      do l=1,klev
105         do ig=1,ngrid
106            if (l.le.lmax(ig)) then
107               if (entr_star(ig,l).gt.1.) then
108                    print*,'WARNING thermcell_flux 1 ig,l,lmax(ig)',ig,l,lmax(ig)
109                    print*,'entr_star(ig,l)',entr_star(ig,l)
110                    print*,'alim_star(ig,l)',alim_star(ig,l)
111                    print*,'detr_star(ig,l)',detr_star(ig,l)
112               endif
113            else
114               if (abs(entr_star(ig,l))+abs(alim_star(ig,l))+abs(detr_star(ig,l)).gt.0.) then
115                    print*,'cas 1 : ig,l,lmax(ig)',ig,l,lmax(ig)
116                    print*,'entr_star(ig,l)',entr_star(ig,l)
117                    print*,'alim_star(ig,l)',alim_star(ig,l)
118                    print*,'detr_star(ig,l)',detr_star(ig,l)
119                    abort_message = ''
120                    labort_gcm=.true.
121                    CALL abort_gcm (modname,abort_message,1)
122               endif
123            endif
124         enddo
125      enddo
126      endif
127
128!-------------------------------------------------------------------------
129! Multiplication par le flux de masse issu de la femreture
130!-------------------------------------------------------------------------
131
132      do l=1,klev
133         entr(:,l)=f(:)*(entr_star(:,l)+alim_star(:,l))
134         detr(:,l)=f(:)*detr_star(:,l)
135      enddo
136
137      if (prt_level.ge.10) then
138         write(lunout1,*) 'Dans thermcell_flux 1'
139         write(lunout1,*) 'flux base ',f(igout)
140         write(lunout1,*) 'lmax ',lmax(igout)
141         write(lunout1,*) 'lalim ',lalim(igout)
142         write(lunout1,*) 'ig= ',igout
143         write(lunout1,*) ' l   E    D     W2'
144         write(lunout1,'(i4,3e15.5)') (l,entr(igout,l),detr(igout,l) &
145     &    ,zw2(igout,l+1),l=1,lmax(igout))
146      endif
147
148      fm(:,1)=0.
149      do l=1,klev
150         do ig=1,ngrid
151            if (l.lt.lmax(ig)) then
152               fm(ig,l+1)=fm(ig,l)+entr(ig,l)-detr(ig,l)
153            elseif(l.eq.lmax(ig)) then
154               fm(ig,l+1)=0.
155               detr(ig,l)=fm(ig,l)+entr(ig,l)
156            else
157               fm(ig,l+1)=0.
158            endif
159         enddo
160      enddo
161
162
163
164! Test provisoire : pour comprendre pourquoi on corrige plein de fois
165! le cas fm6, on commence par regarder une premiere fois avant les
166! autres corrections.
167
168      do l=1,klev
169         do ig=1,ngrid
170            if (detr(ig,l).gt.fm(ig,l)) then
171               ncorecfm8=ncorecfm8+1
172!              igout=ig
173            endif
174         enddo
175      enddo
176
177!      if (prt_level.ge.10) &
178!    &    call printflux(ngrid,klev,lunout1,igout,f,lmax,lalim, &
179!    &    ptimestep,masse,entr,detr,fm,'2  ')
180
181
182
183!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
184! FH Version en cours de test;
185! par rapport a thermcell_flux, on fait une grande boucle sur "l"
186! et on modifie le flux avec tous les contrï¿œles appliques d'affilee
187! pour la meme couche
188! Momentanement, on duplique le calcule du flux pour pouvoir comparer
189! les flux avant et apres modif
190!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
191      lfname='thermcell_flux2 before first loop'
192      lvarname = 'fm'
193      CALL check_var3D(lfname, lvarname, fm, ngrid, klev+1, largest, .FALSE.)
194      lvarname = 'entr'
195      CALL check_var3D(lfname, lvarname, entr, ngrid, klev, largest, .FALSE.)
196      lvarname = 'detr'
197      CALL check_var3D(lfname, lvarname, detr, ngrid, klev, largest, .FALSE.)
198
199      do l=1,klev
200         WRITE(lS,'(I4)')l
201         do ig=1,ngrid
202            if (l.lt.lmax(ig)) then
203               fm(ig,l+1)=fm(ig,l)+entr(ig,l)-detr(ig,l)
204            elseif(l.eq.lmax(ig)) then
205               fm(ig,l+1)=0.
206               detr(ig,l)=fm(ig,l)+entr(ig,l)
207            else
208               fm(ig,l+1)=0.
209            endif
210         enddo
211
212      lfname='thermcell_flux2 after first loop ' // lS
213      lvarname = 'fm'
214      CALL check_var(lfname, lvarname, fm(:,l), ngrid, largest, .FALSE.)
215      lvarname = 'entr'
216      CALL check_var(lfname, lvarname, entr(:,l), ngrid, largest, .FALSE.)
217      lvarname = 'detr'
218      CALL check_var(lfname, lvarname, detr(:,l), ngrid, largest, .FALSE.)
219
220!-------------------------------------------------------------------------
221! Verification de la positivite des flux de masse
222!-------------------------------------------------------------------------
223
224!     do l=1,klev
225         do ig=1,ngrid
226            if (fm(ig,l+1).lt.0.) then
227!              print*,'fm1<0',l+1,lmax(ig),fm(ig,l+1)
228                ncorecfm1=ncorecfm1+1
229               fm(ig,l+1)=fm(ig,l)
230               detr(ig,l)=entr(ig,l)
231            endif
232         enddo
233!     enddo
234
235      if (prt_level.ge.10) &
236     &   write(lunout1,'(i4,4e14.4)') l,masse(igout,l)/ptimestep, &
237     &     entr(igout,l),detr(igout,l),fm(igout,l+1)
238
239!-------------------------------------------------------------------------
240!Test sur fraca croissant
241!-------------------------------------------------------------------------
242      if (iflag_thermals_optflux==0) then
243!     do l=1,klev
244         do ig=1,ngrid
245          if (l.ge.lalim(ig).and.l.le.lmax(ig) &
246     &    .and.(zw2(ig,l+1).gt.1.e-10).and.(zw2(ig,l).gt.1.e-10) ) then
247!  zzz est le flux en l+1 a frac constant
248             zzz=fm(ig,l)*rhobarz(ig,l+1)*zw2(ig,l+1)  &
249     &                          /(rhobarz(ig,l)*zw2(ig,l))
250             IF (zzz /= zzz .OR. zw2(ig,l) == 0. ) THEN
251               PRINT *,'  Lluis ', ig,',',l,' wrong zzz: ',zzz,' zw2: ',zw2(ig,l),' fm: ',fm(ig,l)
252             END IF
253             if (fm(ig,l+1).gt.zzz) then
254                detr(ig,l)=detr(ig,l)+fm(ig,l+1)-zzz
255                fm(ig,l+1)=zzz
256                ncorecfm4=ncorecfm4+1
257             endif
258          endif
259        enddo
260!     enddo
261      endif
262
263      lfname='thermcell_flux2 after fraca croissant ' //lS
264      lvarname = 'fm'
265      CALL check_var(lfname, lvarname, fm(:,l), ngrid, largest, .FALSE.)
266!      lvarname = '1/zw2'
267!      CALL check_var(lfname, lvarname, 1./zw2(:,l), ngrid, largest, .FALSE.)
268!      lvarname = '1/rhobarz'
269!      CALL check_var(lfname, lvarname, 1./rhobarz(:,l), ngrid, largest, .FALSE.)
270      lvarname = 'entr'
271      CALL check_var(lfname, lvarname, entr(:,l), ngrid, largest, .FALSE.)
272      lvarname = 'detr'
273      CALL check_var(lfname, lvarname, detr(:,l), ngrid, largest, .FALSE.)
274
275      if (prt_level.ge.10) &
276     &   write(lunout1,'(i4,4e14.4)') l,masse(igout,l)/ptimestep, &
277     &     entr(igout,l),detr(igout,l),fm(igout,l+1)
278
279
280!-------------------------------------------------------------------------
281!test sur flux de masse croissant
282!-------------------------------------------------------------------------
283      if (iflag_thermals_optflux==0) then
284!     do l=1,klev
285         do ig=1,ngrid
286            if ((fm(ig,l+1).gt.fm(ig,l)).and.(l.gt.lalim(ig))) then
287              f_old=fm(ig,l+1)
288              fm(ig,l+1)=fm(ig,l)
289              detr(ig,l)=detr(ig,l)+f_old-fm(ig,l+1)
290               ncorecfm5=ncorecfm5+1
291            endif
292         enddo
293!     enddo
294      endif
295
296      lfname='thermcell_flux2 after massa croissant ' // lS
297      lvarname = 'fm'
298      CALL check_var(lfname, lvarname, fm(:,l), ngrid, largest, .FALSE.)
299      lvarname = 'entr'
300      CALL check_var(lfname, lvarname, entr(:,l), ngrid, largest, .FALSE.)
301      lvarname = 'detr'
302      CALL check_var(lfname, lvarname, detr(:,l), ngrid, largest, .FALSE.)
303
304      if (prt_level.ge.10) &
305     &   write(lunout1,'(i4,4e14.4)') l,masse(igout,l)/ptimestep, &
306     &     entr(igout,l),detr(igout,l),fm(igout,l+1)
307
308!fin 1.eq.0
309!-------------------------------------------------------------------------
310!detr ne peut pas etre superieur a fm
311!-------------------------------------------------------------------------
312
313      if(1.eq.1) then
314
315!     do l=1,klev
316
317
318
319         labort_gcm=.false.
320         do ig=1,ngrid
321            if (entr(ig,l)<0.) then
322               labort_gcm=.true.
323               igout=ig
324               lout=l
325            endif
326         enddo
327
328         if (labort_gcm) then
329            print*,'N1 ig,l,entr',igout,lout,entr(igout,lout)
330            abort_message = 'entr negatif'
331            CALL abort_gcm (modname,abort_message,1)
332         endif
333
334         do ig=1,ngrid
335            if (detr(ig,l).gt.fm(ig,l)) then
336               ncorecfm6=ncorecfm6+1
337               detr(ig,l)=fm(ig,l)
338               entr(ig,l)=fm(ig,l+1)
339
340! Dans le cas ou on est au dessus de la couche d'alimentation et que le
341! detrainement est plus fort que le flux de masse, on stope le thermique.
342!test:on commente
343!               if (l.gt.lalim(ig)) then
344!                  lmax(ig)=l
345!                  fm(ig,l+1)=0.
346!                  entr(ig,l)=0.
347!               else
348!                  ncorecfm7=ncorecfm7+1
349!               endif
350            endif
351
352            if(l.gt.lmax(ig)) then
353               detr(ig,l)=0.
354               fm(ig,l+1)=0.
355               entr(ig,l)=0.
356            endif
357         enddo
358
359         labort_gcm=.false.
360         do ig=1,ngrid
361            if (entr(ig,l).lt.0.) then
362               labort_gcm=.true.
363               igout=ig
364            endif
365         enddo
366         if (labort_gcm) then
367            ig=igout
368            print*,'ig,l,lmax(ig)',ig,l,lmax(ig)
369            print*,'entr(ig,l)',entr(ig,l)
370            print*,'fm(ig,l)',fm(ig,l)
371            abort_message = 'probleme dans thermcell flux'
372            CALL abort_gcm (modname,abort_message,1)
373         endif
374
375
376!     enddo
377      endif
378
379
380      if (prt_level.ge.10) &
381     &   write(lunout1,'(i4,4e14.4)') l,masse(igout,l)/ptimestep, &
382     &     entr(igout,l),detr(igout,l),fm(igout,l+1)
383
384!-------------------------------------------------------------------------
385!fm ne peut pas etre negatif
386!-------------------------------------------------------------------------
387
388!     do l=1,klev
389         do ig=1,ngrid
390            if (fm(ig,l+1).lt.0.) then
391               detr(ig,l)=detr(ig,l)+fm(ig,l+1)
392               fm(ig,l+1)=0.
393               ncorecfm2=ncorecfm2+1
394            endif
395         enddo
396
397         labort_gcm=.false.
398         do ig=1,ngrid
399            if (detr(ig,l).lt.0.) then
400               labort_gcm=.true.
401               igout=ig
402            endif
403        enddo
404        if (labort_gcm) then
405               ig=igout
406               print*,'cas 2 : ig,l,lmax(ig)',ig,l,lmax(ig)
407               print*,'detr(ig,l)',detr(ig,l)
408               print*,'fm(ig,l)',fm(ig,l)
409               abort_message = 'probleme dans thermcell flux'
410               CALL abort_gcm (modname,abort_message,1)
411        endif
412!    enddo
413
414      if (prt_level.ge.10) &
415     &   write(lunout1,'(i4,4e14.4)') l,masse(igout,l)/ptimestep, &
416     &     entr(igout,l),detr(igout,l),fm(igout,l+1)
417
418!-----------------------------------------------------------------------
419!la fraction couverte ne peut pas etre superieure a 1           
420!-----------------------------------------------------------------------
421
422
423!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
424! FH Partie a revisiter.
425! Il semble qu'etaient codees ici deux optiques dans le cas
426! F/ (rho *w) > 1
427! soit limiter la hauteur du thermique en considerant que c'est
428! la derniere chouche, soit limiter F a rho w.
429! Dans le second cas, il faut en fait limiter a un peu moins
430! que ca parce qu'on a des 1 / ( 1 -alpha) un peu plus loin
431! dans thermcell_main et qu'il semble de toutes facons deraisonable
432! d'avoir des fractions de 1..
433! Ci dessous, et dans l'etat actuel, le premier des  deux if est
434! sans doute inutile.
435!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
436
437!    do l=1,klev
438        do ig=1,ngrid
439           if (zw2(ig,l+1).gt.1.e-10) then
440           zfm=rhobarz(ig,l+1)*zw2(ig,l+1)*alphamax
441           if ( fm(ig,l+1) .gt. zfm) then
442              f_old=fm(ig,l+1)
443              fm(ig,l+1)=zfm
444!             zw2(ig,l+1)=0.
445!             zqla(ig,l+1)=0.
446              detr(ig,l)=detr(ig,l)+f_old-fm(ig,l+1)
447!             lmax(ig)=l+1
448!             zmax(ig)=zlev(ig,lmax(ig))
449!             print*,'alpha>1',l+1,lmax(ig)
450              ncorecalpha=ncorecalpha+1
451           endif
452           endif
453        enddo
454!    enddo
455!
456
457
458      if (prt_level.ge.10) &
459     &   write(lunout1,'(i4,4e14.4)') l,masse(igout,l)/ptimestep, &
460     &     entr(igout,l),detr(igout,l),fm(igout,l+1)
461
462! Fin de la grande boucle sur les niveaux verticaux
463      enddo
464      lfname='thermcell_flux2 after big loop'
465      lvarname = 'fm'
466      CALL check_var3D(lfname, lvarname, fm, ngrid, klev+1, largest, .FALSE.)
467      lvarname = 'rhobarz'
468      CALL check_var3D(lfname, lvarname, rhobarz, ngrid, klev+1, largest, .FALSE.)
469      lvarname = 'zw2'
470      CALL check_var3D(lfname, lvarname, zw2, ngrid, klev+1, largest, .FALSE.)
471      lvarname = 'entr'
472      CALL check_var3D(lfname, lvarname, entr, ngrid, klev, largest, .FALSE.)
473      lvarname = 'detr'
474      CALL check_var3D(lfname, lvarname, detr, ngrid, klev, largest, .FALSE.)
475
476!      if (prt_level.ge.10) &
477!    &    call printflux(ngrid,klev,lunout1,igout,f,lmax,lalim, &
478!    &    ptimestep,masse,entr,detr,fm,'8  ')
479
480
481!-----------------------------------------------------------------------
482! On fait en sorte que la quantite totale d'air entraine dans le
483! panache ne soit pas trop grande comparee a la masse de la maille
484!-----------------------------------------------------------------------
485
486      if (1.eq.1) then
487      labort_gcm=.false.
488      do l=1,klev-1
489         do ig=1,ngrid
490            eee0=entr(ig,l)
491            ddd0=detr(ig,l)
492            eee=entr(ig,l)-masse(ig,l)*fomass_max/ptimestep
493            ddd=detr(ig,l)-eee
494            if (eee.gt.0.) then
495                ncorecfm3=ncorecfm3+1
496                entr(ig,l)=entr(ig,l)-eee
497                if ( ddd.gt.0.) then
498!   l'entrainement est trop fort mais l'exces peut etre compense par une
499!   diminution du detrainement)
500                   detr(ig,l)=ddd
501                else
502!   l'entrainement est trop fort mais l'exces doit etre compense en partie
503!   par un entrainement plus fort dans la couche superieure
504                   if(l.eq.lmax(ig)) then
505                      detr(ig,l)=fm(ig,l)+entr(ig,l)
506                   else
507                      if(l.ge.lmax(ig).and.0.eq.1) then
508                         igout=ig
509                         lout=l
510                         labort_gcm=.true.
511                      endif
512                      entr(ig,l+1)=entr(ig,l+1)-ddd
513                      detr(ig,l)=0.
514                      fm(ig,l+1)=fm(ig,l)+entr(ig,l)
515                      detr(ig,l)=0.
516                   endif
517                endif
518            endif
519         enddo
520      enddo
521
522      lfname='thermcell_flux2 after quantile'
523      lvarname = 'fm'
524      CALL check_var3D(lfname, lvarname, fm, ngrid, klev+1, largest, .FALSE.)
525      lvarname = 'entr'
526      CALL check_var3D(lfname, lvarname, entr, ngrid, klev, largest, .FALSE.)
527      lvarname = 'detr'
528      CALL check_var3D(lfname, lvarname, detr, ngrid, klev, largest, .FALSE.)
529
530      if (labort_gcm) then
531                         ig=igout
532                         l=lout
533                         print*,'ig,l',ig,l
534                         print*,'eee0',eee0
535                         print*,'ddd0',ddd0
536                         print*,'eee',eee
537                         print*,'ddd',ddd
538                         print*,'entr',entr(ig,l)
539                         print*,'detr',detr(ig,l)
540                         print*,'masse',masse(ig,l)
541                         print*,'fomass_max',fomass_max
542                         print*,'masse(ig,l)*fomass_max/ptimestep',masse(ig,l)*fomass_max/ptimestep
543                         print*,'ptimestep',ptimestep
544                         print*,'lmax(ig)',lmax(ig)
545                         print*,'fm(ig,l+1)',fm(ig,l+1)
546                         print*,'fm(ig,l)',fm(ig,l)
547                         abort_message = 'probleme dans thermcell_flux'
548                         CALL abort_gcm (modname,abort_message,1)
549      endif
550      endif
551!                 
552!              ddd=detr(ig)-entre
553!on s assure que tout s annule bien en zmax
554      do ig=1,ngrid
555         fm(ig,lmax(ig)+1)=0.
556         entr(ig,lmax(ig))=0.
557         detr(ig,lmax(ig))=fm(ig,lmax(ig))+entr(ig,lmax(ig))
558      enddo
559
560!-----------------------------------------------------------------------
561! Impression du nombre de bidouilles qui ont ete necessaires
562!-----------------------------------------------------------------------
563
564!IM 090508 beg
565!     if (ncorecfm1+ncorecfm2+ncorecfm3+ncorecfm4+ncorecfm5+ncorecalpha > 0 ) then
566!
567!         print*,'PB thermcell : on a du coriger ',ncorecfm1,'x fm1',&
568!   &     ncorecfm2,'x fm2',ncorecfm3,'x fm3 et', &
569!   &     ncorecfm4,'x fm4',ncorecfm5,'x fm5 et', &
570!   &     ncorecfm6,'x fm6', &
571!   &     ncorecfm7,'x fm7', &
572!   &     ncorecfm8,'x fm8', &
573!   &     ncorecalpha,'x alpha'
574!     endif
575!IM 090508 end
576
577!      if (prt_level.ge.10) &
578!    &    call printflux(ngrid,klev,lunout1,igout,f,lmax,lalim, &
579!    &    ptimestep,masse,entr,detr,fm,'fin')
580
581
582      return
583      end
Note: See TracBrowser for help on using the repository browser.