Changeset 2046


Ignore:
Timestamp:
May 18, 2014, 3:18:19 PM (10 years ago)
Author:
fhourdin
Message:

Nouvelles options des thermiques en route vers les stratocumulus

+ sorties de la discretisation verticale dans le vieux disvert_old

New options in thermals for stratocumulus

Location:
LMDZ5/trunk/libf/phylmd
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • LMDZ5/trunk/libf/phylmd/1DUTILS.h

    r2019 r2046  
    822822      INTEGER np,ierr
    823823      REAL pi,x
     824      REAL :: scaleheight=8.
    824825 
    825826!-----------------------------------------------------------------------
     
    924925      PRINT *,  ap
    925926 
    926       DO l = 1, llm
    927        dpres(l) = bp(l) - bp(l+1)
    928        presnivs(l) = 0.5 *( ap(l)+bp(l)*preff + ap(l+1)+bp(l+1)*preff )
    929       ENDDO
     927   print*,'scaleheight=',scaleheight
     928  DO l = 1, llm
     929     dpres(l) = bp(l) - bp(l+1)
     930     presnivs(l) = 0.5 *( ap(l)+bp(l)*preff + ap(l+1)+bp(l+1)*preff )
     931     write(*, *)'PRESNIVS(', l, ')=', presnivs(l), ' Z ~ ', &
     932          log(preff/presnivs(l))*scaleheight &
     933          , ' DZ ~ ', scaleheight*log((ap(l)+bp(l)*preff)/ &
     934          max(ap(l+1)+bp(l+1)*preff, 1.e-10))
     935  ENDDO
     936
    930937 
    931938      PRINT *,' PRESNIVS '
  • LMDZ5/trunk/libf/phylmd/thermcell_plume.F90

    r2000 r2046  
    66     &           lalim,f0,detr_star,entr_star,f_star,csc,ztva,  &
    77     &           ztla,zqla,zqta,zha,zw2,w_est,ztva_est,zqsatth,lmix,lmix_bis,linter &
    8      &           ,lev_out,lunout1,igout) 
     8     &           ,lev_out,lunout1,igout)
    99!--------------------------------------------------------------------------
    1010!thermcell_plume: calcule les valeurs de qt, thetal et w dans l ascendance
     
    8080      real zbuoyjam(ngrid,klev)
    8181      real zbuoybis,zdz2,zdz3,lmel,entrbis,zdzbis
     82      real fact_shell
     83      real ztv1,ztv2,factinv,zinv,zlmel
     84      real ztv_est1,ztv_est2
    8285      real zcor,zdelta,zcvm5,qlbef
    8386      real betalpha,zbetalpha
     
    9295! Initialisation
    9396
    94 !     print*,'THERMCELL PLUME OK'
    9597      RLvCp = RLVTT/RCPD
    9698      fact_epsilon=0.002
    9799      betalpha=0.9
    98       afact=2./3.           
     100      afact=2./3.   
     101      fact_shell=0.85       
    99102
    100103      zbetalpha=betalpha/(1.+betalpha)
     
    162165               lalim(ig)=l+1
    163166               alim_star_tot(ig)=alim_star_tot(ig)+alim_star(ig,l)
    164 !              print*,'alim2',l,ztv(ig,l),ztv(ig,l+1),alim_star(ig,l)
     167!               print*,'alim2',l,ztv(ig,l),ztv(ig,l+1),alim_star(ig,l)
    165168            endif
    166169         enddo
     
    232235   call thermcell_qsat(ngrid,active,pplev(:,l),ztemp,zqta(:,l-1),zqsat(:))
    233236    do ig=1,ngrid
    234 !      print*,'active',active(ig),ig,l
     237!       print*,'active',active(ig),ig,l
    235238        if(active(ig)) then
    236239        zqla_est(ig,l)=max(0.,zqta(ig,l-1)-zqsat(ig))
     
    258261!    &                     Max(0.0001,exp(-zw2factbis)*(w_est(ig,l-1)-zdw2bis)+zdw2)
    259262!              w_est(ig,l+1)=Max(0.0001,(1-exp(-zw2fact))*zdw2+w_est(ig,l)*exp(-zw2fact))
     263
     264!--------------------------------------------------
     265!AJ052014: J'ai remplac? w_est(ig,l) par zw2(ig,l)
     266!--------------------------------------------------
     267         if (iflag_thermals_ed==8) then
     268! Ancienne version
    260269             w_est(ig,l+1)=Max(0.0001,(zdz/zdzbis)*(exp(-zw2fact)* &
    261270    &                     (w_est(ig,l)-zdw2)+zdw2)+(zdzbis-zdz)/zdzbis* &
    262271    &                     (exp(-zw2factbis)*(w_est(ig,l-1)-zdw2bis)+zdw2))
    263              if (w_est(ig,l+1).lt.0.) then
     272 
     273! Nouvelle version Arnaud
     274         else
     275              w_est(ig,l+1)=Max(0.0001,(zdz/zdzbis)*(exp(-zw2fact)* &
     276    &                     (zw2(ig,l)-zdw2)+zdw2)+(zdzbis-zdz)/zdzbis* &
     277    &                     (exp(-zw2factbis)*(zw2(ig,l-1)-zdw2bis)+zdw2))
     278         endif
     279
     280
     281         if (iflag_thermals_ed<6) then
     282             zalpha=f0(ig)*f_star(ig,l)/sqrt(w_est(ig,l+1))/rhobarz(ig,l)
     283!              fact_epsilon=0.0005/(zalpha+0.025)**0.5
     284!              fact_epsilon=Min(0.003,0.0004/(zalpha)**0.5)
     285              fact_epsilon=0.0002/(zalpha+0.1)
     286              zw2fact=fact_epsilon*2.*zdz/(1.+betalpha)
     287              zw2factbis=fact_epsilon*2.*zdzbis/(1.+betalpha)
     288              zdw2=afact*zbuoy(ig,l)/fact_epsilon
     289              zdw2bis=afact*zbuoy(ig,l-1)/fact_epsilon
     290              w_est(ig,l+1)=Max(0.0001,(zdz/zdzbis)*(exp(-zw2fact)* &
     291    &                     (zw2(ig,l)-zdw2)+zdw2)+(zdzbis-zdz)/zdzbis* &
     292    &                     (exp(-zw2factbis)*(zw2(ig,l-1)-zdw2bis)+zdw2))
     293
     294         endif
     295!--------------------------------------------------
     296!AJ052014: J'ai comment? ce if plus n?cessaire puisqu'
     297!on fait max(0.0001,.....)
     298!--------------------------------------------------     
     299
     300!             if (w_est(ig,l+1).lt.0.) then
    264301!               w_est(ig,l+1)=zw2(ig,l)
    265                 w_est(ig,l+1)=0.0001
    266              endif
     302!                w_est(ig,l+1)=0.0001
     303!             endif
     304
    267305       endif
    268306    enddo
     
    296334         
    297335        lmel=fact_thermals_ed_dz*zlev(ig,l)
     336        zlmel=zlev(ig,l)+lmel
    298337!        lmel=2.5*(zlev(ig,l)-zlev(ig,l-1))
    299338        lt=l+1
    300          do it=1,klev-(l+1)
    301           zdz2=zlev(ig,lt)-zlev(ig,l)
    302           if (zdz2.gt.lmel) then
    303           zdz3=zlev(ig,lt)-zlev(ig,lt-1)
     339        zdz2=zlev(ig,lt)-zlev(ig,l)
     340!--------------------------------------------------
     341!AJ052014: J'ai remplac? la boucle do par un do while
     342! afin de faire moins de calcul dans la boucle
     343!--------------------------------------------------
     344         do while (zdz2.lt.lmel)
     345         lt=lt+1
     346         zdz2=zlev(ig,lt)-zlev(ig,l)
     347         end do
     348
     349         zdz3=zlev(ig,lt)-zlev(ig,lt-1)
     350
     351!--------------------------------------------------
     352!AJ052014: Si iflag_thermals_ed<8 (par ex 6), alors
     353! on cherche o? se trouve l'altitude d'inversion
     354! en calculant ztv1 (interpolation de la valeur de
     355! theta au niveau lt en utilisant les niveaux lt-1 et
     356! lt-2) et ztv2 (interpolation avec les niveaux lt+1
     357! et lt+2). Si theta r?ellement calcul?e au niveau lt
     358! comprise entre ztv1 et ztv2, alors il y a inversion
     359! et on calcule son altitude zinv en supposant que ztv(lt)
     360! est une combinaison lin?aire de ztv1 et ztv2.
     361! Ensuite, on calcule la flottabilit? en comparant
     362! la temp?rature de la couche l ? celle de l'air situ?
     363! l+lmel plus haut, ce qui n?cessite de savoir quel fraction
     364! de cet air est au-dessus ou en-dessous de l'inversion   
     365!--------------------------------------------------
     366
     367
     368         if (iflag_thermals_ed.lt.8) then
     369
     370          ztv1=(ztv(ig,lt-1)-ztv(ig,lt-2))*zlev(ig,lt)/(zlev(ig,lt-1)-zlev(ig,lt-2)) &
     371    &          +(ztv(ig,lt-2)*zlev(ig,lt-1)-ztv(ig,lt-1)*zlev(ig,lt-2)) &
     372    &          /(zlev(ig,lt-1)-zlev(ig,lt-2))
     373
     374          ztv2=(ztv(ig,lt+2)-ztv(ig,lt+1))*zlev(ig,lt)/(zlev(ig,lt+2)-zlev(ig,lt+1)) &
     375    &          +(ztv(ig,lt+1)*zlev(ig,lt+2)-ztv(ig,lt+2)*zlev(ig,lt+1)) &
     376    &          /(zlev(ig,lt+2)-zlev(ig,lt+1))
     377
     378          if (ztv(ig,lt).gt.ztv1.and.ztv(ig,lt).lt.ztv2) then 
     379
     380          factinv=(ztv2-ztv(ig,lt))/(ztv2-ztv1)
     381          zinv=zlev(ig,lt-1)+factinv*(zlev(ig,lt)-zlev(ig,lt-1))
     382
     383          if (zlmel+0.5*zdz.ge.zinv) then
     384           if (zlmel-0.5*zdz.ge.zinv) then
     385
     386          ztv_est(ig,l)=(ztv(ig,lt+2)-ztv(ig,lt+1))*(zlmel-0.*zdz)/(zlev(ig,lt+2)-zlev(ig,lt+1)) &
     387    &          +(ztv(ig,lt+1)*zlev(ig,lt+2)-ztv(ig,lt+2)*zlev(ig,lt+1)) &
     388    &          /(zlev(ig,lt+2)-zlev(ig,lt+1))
     389
     390          zbuoyjam(ig,l)=fact_shell*RG*(ztva_est(ig,l)-ztv_est(ig,l))/ztv_est(ig,l)+(1.-fact_shell)*zbuoy(ig,l)
     391
     392          else
     393
     394          ztv_est1=(ztv(ig,lt+2)-ztv(ig,lt+1))*0.5*(zlmel+zinv+0.5*zdz)/(zlev(ig,lt+2)-zlev(ig,lt+1)) &
     395    &          +(ztv(ig,lt+1)*zlev(ig,lt+2)-ztv(ig,lt+2)*zlev(ig,lt+1)) &
     396    &          /(zlev(ig,lt+2)-zlev(ig,lt+1))
     397          ztv_est2=(ztv(ig,lt-1)-ztv(ig,lt-2))*0.5*(zinv+zlmel-0.5*zdz)/(zlev(ig,lt-1)-zlev(ig,lt-2)) &
     398    &          +(ztv(ig,lt-2)*zlev(ig,lt-1)-ztv(ig,lt-1)*zlev(ig,lt-2)) &
     399    &          /(zlev(ig,lt-1)-zlev(ig,lt-2))
     400          zbuoyjam(ig,l)=fact_shell*RG*(((zlmel+0.5*zdz-zinv)/zdz)*(ztva_est(ig,l)- &
     401    &          ztv_est1)/ztv_est1+((zinv-zlmel+0.5*zdz)/zdz)*(ztva_est(ig,l)- &
     402    &          ztv_est2)/ztv_est2)+(1.-fact_shell)*zbuoy(ig,l)
     403
     404           endif
     405
     406          else
     407
     408          ztv_est(ig,l)=(ztv(ig,lt-1)-ztv(ig,lt-2))*(zlmel-0.*zdz)/(zlev(ig,lt-1)-zlev(ig,lt-2)) &
     409    &          +(ztv(ig,lt-2)*zlev(ig,lt-1)-ztv(ig,lt-1)*zlev(ig,lt-2)) &
     410    &          /(zlev(ig,lt-1)-zlev(ig,lt-2))
     411
     412          zbuoyjam(ig,l)=fact_shell*RG*(ztva_est(ig,l)-ztv_est(ig,l))/ztv_est(ig,l)+(1.-fact_shell)*zbuoy(ig,l)
     413!         ztv_est1=(ztv(ig,lt+2)-ztv(ig,lt+1))*0.5*(zlmel+zinv+0.5*zdz)/(zlev(ig,lt+2)-zlev(ig,lt+1)) &
     414!    &          +(ztv(ig,lt+1)*zlev(ig,lt+2)-ztv(ig,lt+2)*zlev(ig,lt+1)) &
     415!    &          /(zlev(ig,lt+2)-zlev(ig,lt+1))
     416!          ztv_est2=(ztv(ig,lt-1)-ztv(ig,lt-2))*0.5*(zinv+zlmel-0.5*zdz)/(zlev(ig,lt-1)-zlev(ig,lt-2)) &
     417!    &          +(ztv(ig,lt-2)*zlev(ig,lt-1)-ztv(ig,lt-1)*zlev(ig,lt-2)) &
     418!    &          /(zlev(ig,lt-1)-zlev(ig,lt-2))
     419!          zbuoyjam(ig,l)=fact_shell*RG*(((zlmel+0.5*zdz-zinv)/zdz)*(ztva_est(ig,l)- &
     420!    &          ztv_est1)/ztv_est1+((zinv-zlmel+0.5*zdz)/zdz)*(ztva_est(ig,l)- &
     421!    &          ztv_est2)/ztv_est2)+(1.-fact_shell)*zbuoy(ig,l)
     422
     423
     424
     425
     426!          print*,'on est pass? par l?',l,lt,zbuoyjam(ig,l),zbuoy(ig,l)
     427          endif
     428
     429
     430          else
     431         
    304432!          ztv_est(ig,l)=(lmel/zdz2)*(ztv(ig,lt)-ztv(ig,l))+ztv(ig,l)
    305433!          zbuoyjam(ig,l)=RG*(ztva_est(ig,l)-ztv_est(ig,l))/ztv_est(ig,l)
     434
     435         zbuoyjam(ig,l)=fact_shell*RG*(((lmel+zdz3-zdz2)/zdz3)*(ztva_est(ig,l)- &
     436    &          ztv(ig,lt))/ztv(ig,lt)+((zdz2-lmel)/zdz3)*(ztva_est(ig,l)- &
     437    &          ztv(ig,lt-1))/ztv(ig,lt-1))+(1.-fact_shell)*zbuoy(ig,l)
     438
     439!         zdqt(ig,l)=Max(0.,((lmel+zdz3-zdz2)/zdz3)*(zqta(ig,l-1)- &
     440!    &          po(ig,lt))/po(ig,lt)+((zdz2-lmel)/zdz3)*(zqta(ig,l-1)- &
     441!     &          po(ig,lt-1))/po(ig,lt-1))
     442
     443          endif
     444
     445          else
    306446
    307447         zbuoyjam(ig,l)=1.*RG*(((lmel+zdz3-zdz2)/zdz3)*(ztva_est(ig,l)- &
     
    309449    &          ztv(ig,lt-1))/ztv(ig,lt-1))+0.*zbuoy(ig,l)
    310450
    311 !         zdqt(ig,l)=Max(0.,((lmel+zdz3-zdz2)/zdz3)*(zqta(ig,l-1)- &
    312 !    &          po(ig,lt))/po(ig,lt)+((zdz2-lmel)/zdz3)*(zqta(ig,l-1)- &
    313 !    &          po(ig,lt-1))/po(ig,lt-1))
     451          endif
    314452         
    315           else
    316           lt=lt+1
    317           endif
    318           enddo
    319453
    320454!          zbuoyjam(ig,l)=RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l)
     
    325459!          entrbis=entr_star(ig,l)
    326460
    327 
    328           detr_star(ig,l)=f_star(ig,l)*zdz                        &
     461          if (iflag_thermals_ed.lt.6) then
     462          fact_epsilon=0.0002/(zalpha+0.1)
     463          endif
     464
     465          detr_star(ig,l)=f_star(ig,l)*zdz             &
    329466    &     *MAX(1.e-4, -afact*zbetalpha*zbuoyjam(ig,l)/zw2m          &
    330     &     + 0.012*(zdqt(ig,l)/zw2m)**0.5 )
     467    &     + 0.012*(zdqt(ig,l)/zw2m)**0.5)
    331468
    332469          zbuoy(ig,l)=RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l)
    333470
    334471          entr_star(ig,l)=f_star(ig,l)*zdz*zbetalpha*MAX(0.,  &
    335     &     afact*zbuoy(ig,l)/zw2m - fact_epsilon )
    336 !   &     afact*zbuoy(ig,l)/zw2m - fact_epsilon+ 0.012*(zdqt(ig,l)/zw2m)**0.5)
    337 
     472    &     afact*zbuoy(ig,l)/zw2m - fact_epsilon)
    338473
    339474!          entr_star(ig,l)=Max(0.,f_star(ig,l)*zdz*zbetalpha*  &     
     
    352487!        endif
    353488
    354 !print*,'alim0',zlev(ig,l),entr_star(ig,l),detr_star(ig,l),zw2m,zbuoy(ig,l),f_star(ig,l)
     489!       print*,'alim0',zlev(ig,l),entr_star(ig,l),detr_star(ig,l),zw2m,zbuoy(ig,l),f_star(ig,l)
    355490! Calcul du flux montant normalise
    356491      f_star(ig,l+1)=f_star(ig,l)+alim_star(ig,l)+entr_star(ig,l)  &
     
    395530           zdzbis=zlev(ig,l+1)-zlev(ig,l-1)
    396531           zeps(ig,l)=(entr_star(ig,l)+alim_star(ig,l))/(f_star(ig,l)*zdz)
    397 
     532           fact_epsilon=0.002
    398533            zw2fact=fact_epsilon*2.*zdz/(1.+betalpha)
    399534            zw2factbis=fact_epsilon*2.*zdzbis/(1.+betalpha)
     
    404539    &                     (zw2(ig,l)-zdw2)+zdw2)+(zdzbis-zdz)/zdzbis* &
    405540    &                     (exp(-zw2factbis)*(zw2(ig,l-1)-zdw2bis)+zdw2))
     541
     542           if (iflag_thermals_ed.lt.6) then
     543           zalpha=f0(ig)*f_star(ig,l)/sqrt(zw2(ig,l+1))/rhobarz(ig,l)
     544!           fact_epsilon=0.0005/(zalpha+0.025)**0.5
     545!           fact_epsilon=Min(0.003,0.0004/(zalpha)**0.5)
     546           fact_epsilon=0.0002/(zalpha+0.1)**1
     547            zw2fact=fact_epsilon*2.*zdz/(1.+betalpha)
     548            zw2factbis=fact_epsilon*2.*zdzbis/(1.+betalpha)
     549            zdw2= afact*zbuoy(ig,l)/(fact_epsilon)
     550            zdw2bis= afact*zbuoy(ig,l-1)/(fact_epsilon)
     551
     552            zw2(ig,l+1)=Max(0.0001,(zdz/zdzbis)*(exp(-zw2fact)* &
     553    &                     (zw2(ig,l)-zdw2)+zdw2)+(zdzbis-zdz)/zdzbis* &
     554    &                     (exp(-zw2factbis)*(zw2(ig,l-1)-zdw2bis)+zdw2))
     555
     556           endif
     557
     558
    406559      endif
    407560   enddo
     
    470623        if (prt_level.ge.20) print*,'coucou calcul detr 470: ig, l', ig, l
    471624
     625#undef wrgrads_thermcell
     626#ifdef wrgrads_thermcell
     627         call wrgradsfi(1,klev,entr_star(igout,1:klev),'esta      ','esta      ')
     628         call wrgradsfi(1,klev,detr_star(igout,1:klev),'dsta      ','dsta      ')
     629         call wrgradsfi(1,klev,zbuoy(igout,1:klev),'buoy      ','buoy      ')
     630         call wrgradsfi(1,klev,zdqt(igout,1:klev),'dqt      ','dqt      ')
     631         call wrgradsfi(1,klev,w_est(igout,1:klev),'w_est     ','w_est     ')
     632         call wrgradsfi(1,klev,w_est(igout,2:klev+1),'w_es2     ','w_es2     ')
     633         call wrgradsfi(1,klev,zw2(igout,1:klev),'zw2A      ','zw2A      ')
     634#endif
     635
     636
    472637     return
    473638     end
     639
     640
     641
     642
     643
     644
     645
     646
     647
     648
     649
     650
     651
     652
     653
     654
     655
     656
     657
     658
     659
     660
     661
     662
     663
     664
     665
     666
     667
     668
     669
    474670
    475671
     
    8311027                zw2(ig,l+1)=0.
    8321028                linter(ig)=l+1
    833 !CR:04/05/12:calcul linter
    834         elseif (f_star(ig,l+1).lt.0.) then
    835            linter(ig)=(l*(f_star(ig,l+1)-f_star(ig,l))  &
    836      &               -f_star(ig,l))/(f_star(ig,l+1)-f_star(ig,l))
    837            zw2(ig,l+1)=0.
    838 !fin CR:04/05/12
    839         endif
    840 
     1029            endif
    8411030
    8421031        if (zw2(ig,l+1).lt.0.) then
     
    8811070        if (prt_level.ge.20) print*,'coucou calcul detr 470: ig, l', ig, l
    8821071
     1072#undef wrgrads_thermcell
     1073#ifdef wrgrads_thermcell
     1074         call wrgradsfi(1,klev,entr_star(igout,1:klev),'esta      ','esta      ')
     1075         call wrgradsfi(1,klev,detr_star(igout,1:klev),'dsta      ','dsta      ')
     1076         call wrgradsfi(1,klev,zbuoy(igout,1:klev),'buoy      ','buoy      ')
     1077         call wrgradsfi(1,klev,zdqt(igout,1:klev),'dqt      ','dqt      ')
     1078         call wrgradsfi(1,klev,w_est(igout,1:klev),'w_est     ','w_est     ')
     1079         call wrgradsfi(1,klev,w_est(igout,2:klev+1),'w_es2     ','w_es2     ')
     1080         call wrgradsfi(1,klev,zw2(igout,1:klev),'zw2A      ','zw2A      ')
     1081#endif
    8831082
    8841083
Note: See TracChangeset for help on using the changeset viewer.