Ignore:
Timestamp:
Feb 18, 2010, 2:14:02 PM (14 years ago)
Author:
Laurent Fairhead
Message:

Modifications to thermals for TKE transport


Modifications aux thermiques pour le transport de la TKE

pbl_surface_mode.F90 : ok_flux_surf=.false. seulement pour klon>1
physiq.F : option iflag_pbl=10 pour transporter la TKE avec les thermiques.
calltherm.F90 : passage de iflag_thermals_ed en argument pour thermcell_plume
thermcell_main.F90 : Appel a plusieurs version de thermcell_plume en option
thermcell_plume.F90 : plusieurs versions dans le meme fichier (temporaire)
thermcell_height.F90 : verrue pour les cas ou les thermiques montent tout

en haut

yamada4 : inclusion de la diffusion verticale en option iflag_pbl=9

+ variables anciennement common, puis save/allocatable, remises en local

File:
1 edited

Legend:

Unmodified
Added
Removed
  • LMDZ4/branches/LMDZ4V5.0-dev/libf/phylmd/yamada4.F

    r1299 r1311  
    11!
    2 ! $Id$
     2! $Header$
    33!
    44      SUBROUTINE yamada4(ngrid,dt,g,rconst,plev,temp
     
    3838c    iflag_pbl=7 : MY 2.0.Fournier
    3939c    iflag_pbl=8 : MY 2.5
    40 c    iflag_pbl=9 : un test ?
     40c    iflag_pbl>=9 : MY 2.5 avec diffusion verticale
    4141
    4242c.......................................................................
     
    6666
    6767      integer nlay,nlev
    68 cym      PARAMETER (nlay=klev)
    69 cym      PARAMETER (nlev=klev+1)
    7068
    7169      logical first
     
    9896      real fl,zzz,zl0,zq2,zn2
    9997
    100 cym      real rino(klon,klev+1),smyam(klon,klev),styam(klon,klev)
    101 cym     s  ,lyam(klon,klev),knyam(klon,klev)
    102 cym     s  ,w2yam(klon,klev),t2yam(klon,klev)
    103       real,allocatable,save,dimension(:,:) :: rino,smyam,styam,lyam,
    104      s                                        knyam,w2yam,t2yam
    105 cym      common/pbldiag/rino,smyam,styam,lyam,knyam,w2yam,t2yam
    106 c$OMP THREADPRIVATE(rino,smyam,styam,lyam,knyam,w2yam,t2yam)
     98      real rino(klon,klev+1),smyam(klon,klev),styam(klon,klev)
     99     s  ,lyam(klon,klev),knyam(klon,klev)
     100     s  ,w2yam(klon,klev),t2yam(klon,klev)
    107101      logical,save :: firstcall=.true.
    108 
    109       character (len=20) :: modname='yamada4'
    110       character (len=80) :: abort_message
    111 
    112102c$OMP THREADPRIVATE(firstcall)       
    113103      frif(ri)=0.6588*(ri+0.1776-sqrt(ri*ri-0.3221*ri+0.03156))
     
    123113     
    124114      if (firstcall) then
    125         allocate(rino(klon,klev+1),smyam(klon,klev),styam(klon,klev))
    126         allocate(lyam(klon,klev),knyam(klon,klev))
    127         allocate(w2yam(klon,klev),t2yam(klon,klev))
    128115        allocate(l0(klon))
    129116        firstcall=.false.
     
    131118
    132119
    133       if (.not.(iflag_pbl.ge.6.and.iflag_pbl.le.9)) then
    134               abort_message = 'probleme de coherence dans appel a MY'
    135               CALL abort_gcm (modname,abort_message,1)
     120      if (.not.(iflag_pbl.ge.6.and.iflag_pbl.le.10)) then
     121           stop'probleme de coherence dans appel a MY'
    136122      endif
    137123
     
    417403      enddo
    418404
    419 c     if (iflag_pbl.ge.7..and.0.eq.1) then
    420 c        q2(:,1)=q2(:,2)
    421 c        call vdif_q2(dt,g,rconst,plev,temp,kq,q2)
    422 c     endif
     405      if (iflag_pbl.ge.9) then
     406!       print*,'YAMADA VDIF'
     407        q2(:,1)=q2(:,2)
     408        call vdif_q2(dt,g,rconst,ngrid,plev,temp,kq,q2)
     409      endif
    423410
    424411c   Traitement des cas noctrunes avec l'introduction d'une longueur
     
    497484      return
    498485      end
     486      SUBROUTINE vdif_q2(timestep,gravity,rconst,ngrid,plev,temp,
     487     &  kmy,q2)
     488      use dimphy
     489      IMPLICIT NONE
     490c.......................................................................
     491#include "dimensions.h"
     492cccc#include "dimphy.h"
     493c.......................................................................
     494c
     495c dt : pas de temps
     496
     497      real plev(klon,klev+1)
     498      real temp(klon,klev)
     499      real timestep
     500      real gravity,rconst
     501      real kstar(klon,klev+1),zz
     502      real kmy(klon,klev+1)
     503      real q2(klon,klev+1)
     504      real deltap(klon,klev+1)
     505      real denom(klon,klev+1),alpha(klon,klev+1),beta(klon,klev+1)
     506      integer ngrid
     507
     508      integer i,k
     509
     510!       print*,'RD=',rconst
     511      do k=1,klev
     512         do i=1,ngrid
     513c test
     514!       print*,'i,k',i,k
     515!       print*,'temp(i,k)=',temp(i,k)
     516!       print*,'(plev(i,k)-plev(i,k+1))=',plev(i,k),plev(i,k+1)
     517            zz=(plev(i,k)+plev(i,k+1))*gravity/(rconst*temp(i,k))
     518            kstar(i,k)=0.125*(kmy(i,k+1)+kmy(i,k))*zz*zz
     519     s      /(plev(i,k)-plev(i,k+1))*timestep
     520         enddo
     521      enddo
     522
     523      do k=2,klev
     524         do i=1,ngrid
     525            deltap(i,k)=0.5*(plev(i,k-1)-plev(i,k+1))
     526         enddo
     527      enddo
     528      do i=1,ngrid
     529         deltap(i,1)=0.5*(plev(i,1)-plev(i,2))
     530         deltap(i,klev+1)=0.5*(plev(i,klev)-plev(i,klev+1))
     531         denom(i,klev+1)=deltap(i,klev+1)+kstar(i,klev)
     532         alpha(i,klev+1)=deltap(i,klev+1)*q2(i,klev+1)/denom(i,klev+1)
     533         beta(i,klev+1)=kstar(i,klev)/denom(i,klev+1)
     534      enddo
     535
     536      do k=klev,2,-1
     537         do i=1,ngrid
     538            denom(i,k)=deltap(i,k)+(1.-beta(i,k+1))*
     539     s      kstar(i,k)+kstar(i,k-1)
     540c   correction d'un bug 10 01 2001
     541            alpha(i,k)=(q2(i,k)*deltap(i,k)
     542     s      +kstar(i,k)*alpha(i,k+1))/denom(i,k)
     543            beta(i,k)=kstar(i,k-1)/denom(i,k)
     544         enddo
     545      enddo
     546
     547c  Si on recalcule q2(1)
     548      if(1.eq.0) then
     549      do i=1,ngrid
     550         denom(i,1)=deltap(i,1)+(1-beta(i,2))*kstar(i,1)
     551         q2(i,1)=(q2(i,1)*deltap(i,1)
     552     s      +kstar(i,1)*alpha(i,2))/denom(i,1)
     553      enddo
     554      endif
     555c   sinon, on peut sauter cette boucle...
     556
     557      do k=2,klev+1
     558         do i=1,ngrid
     559            q2(i,k)=alpha(i,k)+beta(i,k)*q2(i,k-1)
     560         enddo
     561      enddo
     562
     563      return
     564      end
     565      SUBROUTINE vdif_q2e(timestep,gravity,rconst,ngrid,
     566     &   plev,temp,kmy,q2)
     567      use dimphy
     568      IMPLICIT NONE
     569c.......................................................................
     570#include "dimensions.h"
     571cccc#include "dimphy.h"
     572c.......................................................................
     573c
     574c dt : pas de temps
     575
     576      real plev(klon,klev+1)
     577      real temp(klon,klev)
     578      real timestep
     579      real gravity,rconst
     580      real kstar(klon,klev+1),zz
     581      real kmy(klon,klev+1)
     582      real q2(klon,klev+1)
     583      real deltap(klon,klev+1)
     584      real denom(klon,klev+1),alpha(klon,klev+1),beta(klon,klev+1)
     585      integer ngrid
     586
     587      integer i,k
     588
     589      do k=1,klev
     590         do i=1,ngrid
     591            zz=(plev(i,k)+plev(i,k+1))*gravity/(rconst*temp(i,k))
     592            kstar(i,k)=0.125*(kmy(i,k+1)+kmy(i,k))*zz*zz
     593     s      /(plev(i,k)-plev(i,k+1))*timestep
     594         enddo
     595      enddo
     596
     597      do k=2,klev
     598         do i=1,ngrid
     599            deltap(i,k)=0.5*(plev(i,k-1)-plev(i,k+1))
     600         enddo
     601      enddo
     602      do i=1,ngrid
     603         deltap(i,1)=0.5*(plev(i,1)-plev(i,2))
     604         deltap(i,klev+1)=0.5*(plev(i,klev)-plev(i,klev+1))
     605      enddo
     606
     607      do k=klev,2,-1
     608         do i=1,ngrid
     609            q2(i,k)=q2(i,k)+
     610     s      ( kstar(i,k)*(q2(i,k+1)-q2(i,k))
     611     s       -kstar(i,k-1)*(q2(i,k)-q2(i,k-1)) )
     612     s      /deltap(i,k)
     613         enddo
     614      enddo
     615
     616      do i=1,ngrid
     617         q2(i,1)=q2(i,1)+
     618     s   ( kstar(i,1)*(q2(i,2)-q2(i,1))
     619     s                                      )
     620     s   /deltap(i,1)
     621         q2(i,klev+1)=q2(i,klev+1)+
     622     s   (
     623     s    -kstar(i,klev)*(q2(i,klev+1)-q2(i,klev)) )
     624     s   /deltap(i,klev+1)
     625      enddo
     626
     627      return
     628      end
Note: See TracChangeset for help on using the changeset viewer.