/[lmdze]/trunk/phylmd/vdif_kcay.f
ViewVC logotype

Diff of /trunk/phylmd/vdif_kcay.f

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

trunk/libf/phylmd/vdif_kcay.f revision 17 by guez, Tue Aug 5 13:31:32 2008 UTC trunk/libf/phylmd/vdif_kcay.f90 revision 62 by guez, Thu Jul 26 14:37:37 2012 UTC
# Line 1  Line 1 
1  !  module vdif_kcay_m
 ! $Header: /home/cvsroot/LMDZ4/libf/phylmd/vdif_kcay.F,v 1.1 2004/06/22 11:45:36 lmdzadmin Exp $  
 !  
       SUBROUTINE vdif_kcay(ngrid,dt,g,rconst,plev,temp  
      s   ,zlev,zlay,u,v,teta,cd,q2,q2diag,km,kn,ustar  
      s   ,l_mix)  
       use dimens_m  
       use dimphy  
       IMPLICIT NONE  
 c.......................................................................  
 c.......................................................................  
 c  
 c dt : pas de temps  
 c g  : g  
 c zlev : altitude a chaque niveau (interface inferieure de la couche  
 c        de meme indice)  
 c zlay : altitude au centre de chaque couche  
 c u,v : vitesse au centre de chaque couche  
 c       (en entree : la valeur au debut du pas de temps)  
 c teta : temperature potentielle au centre de chaque couche  
 c        (en entree : la valeur au debut du pas de temps)  
 c cd : cdrag  
 c      (en entree : la valeur au debut du pas de temps)  
 c q2 : $q^2$ au bas de chaque couche  
 c      (en entree : la valeur au debut du pas de temps)  
 c      (en sortie : la valeur a la fin du pas de temps)  
 c km : diffusivite turbulente de quantite de mouvement (au bas de chaque  
 c      couche)  
 c      (en sortie : la valeur a la fin du pas de temps)  
 c kn : diffusivite turbulente des scalaires (au bas de chaque couche)  
 c      (en sortie : la valeur a la fin du pas de temps)  
 c  
 c.......................................................................  
       REAL, intent(in):: dt  
       real, intent(in):: g  
       real rconst  
       real plev(klon,klev+1),temp(klon,klev)  
       real ustar(klon),snstable  
       REAL zlev(klon,klev+1)  
       REAL zlay(klon,klev)  
       REAL u(klon,klev)  
       REAL v(klon,klev)  
       REAL teta(klon,klev)  
       REAL cd(klon)  
       REAL q2(klon,klev+1),q2s(klon,klev+1)  
       REAL q2diag(klon,klev+1)  
       REAL km(klon,klev+1)  
       REAL kn(klon,klev+1)  
       real sq(klon),sqz(klon),zz(klon,klev+1),zq,long0(klon)  
   
       integer l_mix,iii  
 c.......................................................................  
 c  
 c nlay : nombre de couches          
 c nlev : nombre de niveaux  
 c ngrid : nombre de points de grille        
 c unsdz : 1 sur l'epaisseur de couche  
 c unsdzdec : 1 sur la distance entre le centre de la couche et le  
 c            centre de la couche inferieure  
 c q : echelle de vitesse au bas de chaque couche  
 c     (valeur a la fin du pas de temps)  
 c  
 c.......................................................................  
       INTEGER nlay,nlev,ngrid  
       REAL unsdz(klon,klev)  
       REAL unsdzdec(klon,klev+1)  
       REAL q(klon,klev+1)  
   
 c.......................................................................  
 c  
 c kmpre : km au debut du pas de temps  
 c qcstat : q : solution stationnaire du probleme couple  
 c          (valeur a la fin du pas de temps)  
 c q2cstat : q2 : solution stationnaire du probleme couple  
 c           (valeur a la fin du pas de temps)  
 c  
 c.......................................................................  
       REAL kmpre(klon,klev+1)  
       REAL qcstat  
       REAL q2cstat  
       real sss,sssq  
 c.......................................................................  
 c  
 c long : longueur de melange calculee selon Blackadar  
 c  
 c.......................................................................  
       REAL long(klon,klev+1)  
 c.......................................................................  
 c  
 c kmq3 : terme en q^3 dans le developpement de km  
 c        (valeur au debut du pas de temps)  
 c kmcstat : valeur de km solution stationnaire du systeme {q2 ; du/dz}  
 c           (valeur a la fin du pas de temps)  
 c knq3 : terme en q^3 dans le developpement de kn  
 c mcstat : valeur de m solution stationnaire du systeme {q2 ; du/dz}  
 c          (valeur a la fin du pas de temps)  
 c m2cstat : valeur de m2 solution stationnaire du systeme {q2 ; du/dz}  
 c           (valeur a la fin du pas de temps)  
 c m : valeur a la fin du pas de temps  
 c mpre : valeur au debut du pas de temps  
 c m2 : valeur a la fin du pas de temps  
 c n2 : valeur a la fin du pas de temps  
 c  
 c.......................................................................  
       REAL kmq3  
       REAL kmcstat  
       REAL knq3  
       REAL mcstat  
       REAL m2cstat  
       REAL m(klon,klev+1)  
       REAL mpre(klon,klev+1)  
       REAL m2(klon,klev+1)  
       REAL n2(klon,klev+1)  
 c.......................................................................  
 c  
 c gn : intermediaire pour les coefficients de stabilite  
 c gnmin : borne inferieure de gn (-0.23 ou -0.28)  
 c gnmax : borne superieure de gn (0.0233)  
 c gninf : vrai si gn est en dessous de sa borne inferieure  
 c gnsup : vrai si gn est en dessus de sa borne superieure  
 c gm : drole d'objet bien utile  
 c ri : nombre de Richardson  
 c sn : coefficient de stabilite pour n  
 c snq2 : premier terme du developement limite de sn en q2  
 c sm : coefficient de stabilite pour m  
 c smq2 : premier terme du developement limite de sm en q2  
 c  
 c.......................................................................  
       REAL gn  
       REAL gnmin  
       REAL gnmax  
       LOGICAL gninf  
       LOGICAL gnsup  
       REAL gm  
 c      REAL ri(klon,klev+1)  
       REAL sn(klon,klev+1)  
       REAL snq2(klon,klev+1)  
       REAL sm(klon,klev+1)  
       REAL smq2(klon,klev+1)  
 c.......................................................................  
 c  
 c kappa : consatnte de Von Karman (0.4)  
 c long00 : longueur de reference pour le calcul de long (160)  
 c a1,a2,b1,b2,c1 : constantes d'origine pour les  coefficients  
 c                  de stabilite (0.92/0.74/16.6/10.1/0.08)  
 c cn1,cn2 : constantes pour sn  
 c cm1,cm2,cm3,cm4 : constantes pour sm  
 c  
 c.......................................................................  
       REAL kappa  
       REAL long00  
       REAL a1,a2,b1,b2,c1  
       REAL cn1,cn2  
       REAL cm1,cm2,cm3,cm4  
 c.......................................................................  
 c  
 c termq : termes en $q$ dans l'equation de q2  
 c termq3 : termes en $q^3$ dans l'equation de q2  
 c termqm2 : termes en $q*m^2$ dans l'equation de q2  
 c termq3m2 : termes en $q^3*m^2$ dans l'equation de q2  
 c  
 c.......................................................................  
       REAL termq  
       REAL termq3  
       REAL termqm2  
       REAL termq3m2  
 c.......................................................................  
 c  
 c q2min : borne inferieure de q2  
 c q2max : borne superieure de q2  
 c  
 c.......................................................................  
       REAL q2min  
       REAL q2max  
 c.......................................................................  
 c knmin : borne inferieure de kn  
 c kmmin : borne inferieure de km  
 c.......................................................................  
       REAL knmin  
       REAL kmmin  
 c.......................................................................  
       INTEGER ilay,ilev,igrid  
       REAL tmp1,tmp2  
 c.......................................................................  
       PARAMETER (kappa=0.4E+0)  
       PARAMETER (long00=160.E+0)  
 c     PARAMETER (gnmin=-10.E+0)  
       PARAMETER (gnmin=-0.28)  
       PARAMETER (gnmax=0.0233E+0)  
       PARAMETER (a1=0.92E+0)  
       PARAMETER (a2=0.74E+0)  
       PARAMETER (b1=16.6E+0)  
       PARAMETER (b2=10.1E+0)  
       PARAMETER (c1=0.08E+0)  
       PARAMETER (knmin=1.E-5)  
       PARAMETER (kmmin=1.E-5)  
       PARAMETER (q2min=1.e-5)  
       PARAMETER (q2max=1.E+2)  
       PARAMETER (nlay=klev)  
       PARAMETER (nlev=klev+1)  
 c  
       PARAMETER (  
      &  cn1=a2*(1.E+0 -6.E+0 *a1/b1)  
      &          )  
       PARAMETER (  
      &  cn2=-3.E+0 *a2*(6.E+0 *a1+b2)  
      &          )  
       PARAMETER (  
      &  cm1=a1*(1.E+0 -3.E+0 *c1-6.E+0 *a1/b1)  
      &          )  
       PARAMETER (  
      &  cm2=a1*(-3.E+0 *a2*((b2-3.E+0 *a2)*(1.E+0 -6.E+0 *a1/b1)  
      &          -3.E+0 *c1*(b2+6.E+0 *a1)))  
      &          )  
       PARAMETER (  
      &  cm3=-3.E+0 *a2*(6.E+0 *a1+b2)  
      &          )  
       PARAMETER (  
      &  cm4=-9.E+0 *a1*a2  
      &          )  
   
       logical first  
       save first  
       data first/.true./  
 c.......................................................................  
 c  traitment des valeur de q2 en entree  
 c.......................................................................  
 c  
 c   Initialisation de q2  
   
       call yamada(ngrid,g,rconst,plev,temp  
      s   ,zlev,zlay,u,v,teta,cd,q2diag,km,kn,ustar  
      s   ,l_mix)  
       if (first.and.1.eq.1) then  
       first=.false.  
       q2=q2diag  
       endif  
   
       DO ilev=1,nlev  
                                                       DO igrid=1,ngrid  
         q2(igrid,ilev)=amax1(q2(igrid,ilev),q2min)  
         q(igrid,ilev)=sqrt(q2(igrid,ilev))  
                                                       ENDDO  
       ENDDO  
 c  
                                                       DO igrid=1,ngrid  
       tmp1=cd(igrid)*(u(igrid,1)**2+v(igrid,1)**2)  
       q2(igrid,1)=b1**(2.E+0/3.E+0)*tmp1  
       q2(igrid,1)=amax1(q2(igrid,1),q2min)  
       q(igrid,1)=sqrt(q2(igrid,1))  
                                                       ENDDO  
 c  
 c.......................................................................  
 c  les increments verticaux  
 c.......................................................................  
 c  
 c!!!!! allerte !!!!!c  
 c!!!!! zlev n'est pas declare a nlev !!!!!c  
 c!!!!! ---->  
                                                       DO igrid=1,ngrid  
             zlev(igrid,nlev)=zlay(igrid,nlay)  
      &             +( zlay(igrid,nlay) - zlev(igrid,nlev-1) )  
                                                       ENDDO              
 c!!!!! <----  
 c!!!!! allerte !!!!!c  
 c  
       DO ilay=1,nlay  
                                                       DO igrid=1,ngrid  
         unsdz(igrid,ilay)=1.E+0/(zlev(igrid,ilay+1)-zlev(igrid,ilay))  
                                                       ENDDO  
       ENDDO  
                                                       DO igrid=1,ngrid  
       unsdzdec(igrid,1)=1.E+0/(zlay(igrid,1)-zlev(igrid,1))  
                                                       ENDDO  
       DO ilay=2,nlay  
                                                       DO igrid=1,ngrid  
         unsdzdec(igrid,ilay)=1.E+0/(zlay(igrid,ilay)-zlay(igrid,ilay-1))  
                                                       ENDDO  
       ENDDO  
                                                       DO igrid=1,ngrid  
       unsdzdec(igrid,nlay+1)=1.E+0/(zlev(igrid,nlay+1)-zlay(igrid,nlay))  
                                                       ENDDO  
 c  
 c.......................................................................  
 c  le cisaillement et le gradient de temperature  
 c.......................................................................  
 c  
                                                       DO igrid=1,ngrid  
       m2(igrid,1)=(unsdzdec(igrid,1)  
      &                   *u(igrid,1))**2  
      &                 +(unsdzdec(igrid,1)  
      &                   *v(igrid,1))**2  
       m(igrid,1)=sqrt(m2(igrid,1))  
       mpre(igrid,1)=m(igrid,1)  
                                                       ENDDO  
 c  
 c-----------------------------------------------------------------------  
       DO ilev=2,nlev-1  
                                                       DO igrid=1,ngrid  
 c-----------------------------------------------------------------------  
 c  
         n2(igrid,ilev)=g*unsdzdec(igrid,ilev)  
      &                   *(teta(igrid,ilev)-teta(igrid,ilev-1))  
      &                   /(teta(igrid,ilev)+teta(igrid,ilev-1)) *2.E+0  
 c       n2(igrid,ilev)=0.  
 c  
 c --->  
 c       on ne sais traiter que les cas stratifies. et l'ajustement  
 c       convectif est cense faire en sorte que seul des configurations  
 c       stratifiees soient rencontrees en entree de cette routine.  
 c       mais, bon ... on sait jamais (meme on sait que n2 prends  
 c       quelques valeurs negatives ... parfois) alors :  
 c<---  
 c  
         IF (n2(igrid,ilev).lt.0.E+0) THEN  
           n2(igrid,ilev)=0.E+0  
         ENDIF  
 c  
         m2(igrid,ilev)=(unsdzdec(igrid,ilev)  
      &                     *(u(igrid,ilev)-u(igrid,ilev-1)))**2  
      &                   +(unsdzdec(igrid,ilev)  
      &                     *(v(igrid,ilev)-v(igrid,ilev-1)))**2  
         m(igrid,ilev)=sqrt(m2(igrid,ilev))  
         mpre(igrid,ilev)=m(igrid,ilev)  
 c  
 c-----------------------------------------------------------------------  
                                                       ENDDO  
       ENDDO  
 c-----------------------------------------------------------------------  
 c  
                                                       DO igrid=1,ngrid  
       m2(igrid,nlev)=m2(igrid,nlev-1)  
       m(igrid,nlev)=m(igrid,nlev-1)  
       mpre(igrid,nlev)=m(igrid,nlev)  
                                                       ENDDO  
 c  
 c.......................................................................  
 c  calcul des fonctions de stabilite  
 c.......................................................................  
 c  
       if (l_mix.eq.4) then  
                                                       DO igrid=1,ngrid  
          sqz(igrid)=1.e-10  
          sq(igrid)=1.e-10  
                                                       ENDDO  
          do ilev=2,nlev-1  
                                                       DO igrid=1,ngrid  
            zq=sqrt(q2(igrid,ilev))  
            sqz(igrid)  
      .     =sqz(igrid)+zq*zlev(igrid,ilev)  
      .     *(zlay(igrid,ilev)-zlay(igrid,ilev-1))  
            sq(igrid)=sq(igrid)+zq*(zlay(igrid,ilev)-zlay(igrid,ilev-1))  
                                                       ENDDO  
          enddo  
                                                       DO igrid=1,ngrid  
          long0(igrid)=0.2*sqz(igrid)/sq(igrid)  
                                                       ENDDO  
       else if (l_mix.eq.3) then  
          long0(igrid)=long00  
       endif  
   
 c (abd 5 2)      print*,'LONG0=',long0  
   
 c-----------------------------------------------------------------------  
       DO ilev=2,nlev-1  
                                                       DO igrid=1,ngrid  
 c-----------------------------------------------------------------------  
 c  
         tmp1=kappa*(zlev(igrid,ilev)-zlev(igrid,1))  
         if (l_mix.ge.10) then  
             long(igrid,ilev)=l_mix  
         else  
            long(igrid,ilev)=tmp1/(1.E+0 + tmp1/long0(igrid))  
         endif  
         long(igrid,ilev)=max(min(long(igrid,ilev)  
      s    ,0.5*sqrt(q2(igrid,ilev))/sqrt(max(n2(igrid,ilev),1.e-10)))  
      s    ,5.)  
   
         gn=-long(igrid,ilev)**2 / q2(igrid,ilev)  
      &                                           * n2(igrid,ilev)  
         gm=long(igrid,ilev)**2 / q2(igrid,ilev)  
      &                                           * m2(igrid,ilev)  
 c  
         gninf=.false.  
         gnsup=.false.  
         long(igrid,ilev)=long(igrid,ilev)  
         long(igrid,ilev)=long(igrid,ilev)  
 c  
         IF (gn.lt.gnmin) THEN  
           gninf=.true.  
           gn=gnmin  
         ENDIF  
 c  
         IF (gn.gt.gnmax) THEN  
           gnsup=.true.  
           gn=gnmax  
         ENDIF  
 c  
         sn(igrid,ilev)=cn1/(1.E+0 +cn2*gn)  
         sm(igrid,ilev)=  
      &    (cm1+cm2*gn)  
      &   /( (1.E+0 +cm3*gn)  
      &     *(1.E+0 +cm4*gn) )  
 c  
         IF ((gninf).or.(gnsup)) THEN  
           snq2(igrid,ilev)=0.E+0  
           smq2(igrid,ilev)=0.E+0  
         ELSE  
           snq2(igrid,ilev)=  
      &     -gn  
      &     *(-cn1*cn2/(1.E+0 +cn2*gn)**2 )  
           smq2(igrid,ilev)=  
      &     -gn  
      &     *( cm2*(1.E+0 +cm3*gn)  
      &           *(1.E+0 +cm4*gn)  
      &       -( cm3*(1.E+0 +cm4*gn)  
      &         +cm4*(1.E+0 +cm3*gn) )  
      &       *(cm1+cm2*gn)            )  
      &     /( (1.E+0 +cm3*gn)  
      &       *(1.E+0 +cm4*gn) )**2  
         ENDIF  
 c  
 c abd  
 c        if(ilev.le.57.and.ilev.ge.37) then  
 c            print*,'L=',ilev,'   GN=',gn,'  SM=',sm(igrid,ilev)  
 c        endif  
 c --->  
 c       la decomposition de Taylor en q2 n'a de sens que  
 c       dans les cas stratifies ou sn et sm sont quasi  
 c       proportionnels a q2. ailleurs on laisse le meme  
 c       algorithme car l'ajustement convectif fait le travail.  
 c       mais c'est delirant quand sn et snq2 n'ont pas le meme  
 c       signe : dans ces cas, on ne fait pas la decomposition.  
 c<---  
 c  
         IF (snq2(igrid,ilev)*sn(igrid,ilev).le.0.E+0)  
      &      snq2(igrid,ilev)=0.E+0  
         IF (smq2(igrid,ilev)*sm(igrid,ilev).le.0.E+0)  
      &      smq2(igrid,ilev)=0.E+0  
 c  
 C   Correction pour les couches stables.  
 C   Schema repris de JHoltzlag Boville, lui meme venant de...  
   
         if (1.eq.1) then  
         snstable=1.-zlev(igrid,ilev)  
      s     /(700.*max(ustar(igrid),0.0001))  
         snstable=1.-zlev(igrid,ilev)/400.  
         snstable=max(snstable,0.)  
         snstable=snstable*snstable  
   
 c abde       print*,'SN ',ilev,sn(1,ilev),snstable  
         if (sn(igrid,ilev).lt.snstable) then  
            sn(igrid,ilev)=snstable  
            snq2(igrid,ilev)=0.  
         endif  
   
         if (sm(igrid,ilev).lt.snstable) then  
            sm(igrid,ilev)=snstable  
            smq2(igrid,ilev)=0.  
         endif  
   
         endif  
   
 c sn : coefficient de stabilite pour n  
 c snq2 : premier terme du developement limite de sn en q2  
 c-----------------------------------------------------------------------  
                                                       ENDDO  
       ENDDO  
 c-----------------------------------------------------------------------  
 c  
 c.......................................................................  
 c  calcul de km et kn au debut du pas de temps  
 c.......................................................................  
 c  
                                                       DO igrid=1,ngrid  
       kn(igrid,1)=knmin  
       km(igrid,1)=kmmin  
       kmpre(igrid,1)=km(igrid,1)  
                                                       ENDDO  
 c  
 c-----------------------------------------------------------------------  
       DO ilev=2,nlev-1  
                                                       DO igrid=1,ngrid  
 c-----------------------------------------------------------------------  
 c  
         kn(igrid,ilev)=long(igrid,ilev)*q(igrid,ilev)  
      &                                         *sn(igrid,ilev)  
         km(igrid,ilev)=long(igrid,ilev)*q(igrid,ilev)  
      &                                         *sm(igrid,ilev)  
         kmpre(igrid,ilev)=km(igrid,ilev)  
 c  
 c-----------------------------------------------------------------------  
                                                       ENDDO  
       ENDDO  
 c-----------------------------------------------------------------------  
 c  
                                                       DO igrid=1,ngrid  
       kn(igrid,nlev)=kn(igrid,nlev-1)  
       km(igrid,nlev)=km(igrid,nlev-1)  
       kmpre(igrid,nlev)=km(igrid,nlev)  
                                                       ENDDO  
 c  
 c.......................................................................  
 c  boucle sur les niveaux 2 a nlev-1  
 c.......................................................................  
 c  
 c---->  
       DO 10001 ilev=2,nlev-1  
 c---->  
       DO 10002 igrid=1,ngrid  
 c  
 c.......................................................................  
 c  
 c  calcul des termes sources et puits de l'equation de q2  
 c  ------------------------------------------------------  
 c  
         knq3=kn(igrid,ilev)*snq2(igrid,ilev)  
      &                                    /sn(igrid,ilev)  
         kmq3=km(igrid,ilev)*smq2(igrid,ilev)  
      &                                    /sm(igrid,ilev)  
 c  
         termq=0.E+0  
         termq3=0.E+0  
         termqm2=0.E+0  
         termq3m2=0.E+0  
 c  
         tmp1=dt*2.E+0 *km(igrid,ilev)*m2(igrid,ilev)  
         tmp2=dt*2.E+0 *kmq3*m2(igrid,ilev)  
         termqm2=termqm2  
      &    +dt*2.E+0 *km(igrid,ilev)*m2(igrid,ilev)  
      &    -dt*2.E+0 *kmq3*m2(igrid,ilev)  
         termq3m2=termq3m2  
      &    +dt*2.E+0 *kmq3*m2(igrid,ilev)  
 c  
         termq=termq  
      &    -dt*2.E+0 *kn(igrid,ilev)*n2(igrid,ilev)  
      &    +dt*2.E+0 *knq3*n2(igrid,ilev)  
         termq3=termq3  
      &    -dt*2.E+0 *knq3*n2(igrid,ilev)  
 c  
         termq3=termq3  
      &    -dt*2.E+0 *q(igrid,ilev)**3 / (b1*long(igrid,ilev))  
 c  
 c.......................................................................  
 c  
 c  resolution stationnaire couplee avec le gradient de vitesse local  
 c  -----------------------------------------------------------------  
 c  
 c  -----{on cherche le cisaillement qui annule l'equation de q^2  
 c        supposee en q3}  
 c  
         tmp1=termq+termq3  
         tmp2=termqm2+termq3m2  
         m2cstat=m2(igrid,ilev)  
      &      -(tmp1+tmp2)/(dt*2.E+0*km(igrid,ilev))  
         mcstat=sqrt(m2cstat)  
   
 c  abde      print*,'M2 L=',ilev,mpre(igrid,ilev),mcstat  
 c  
 c  -----{puis on ecrit la valeur de q qui annule l'equation de m  
 c        supposee en q3}  
 c  
         IF (ilev.eq.2) THEN  
           kmcstat=1.E+0 / mcstat  
      &    *( unsdz(igrid,ilev)*kmpre(igrid,ilev+1)  
      &                        *mpre(igrid,ilev+1)  
      &      +unsdz(igrid,ilev-1)  
      &              *cd(igrid)  
      &              *( sqrt(u(igrid,3)**2+v(igrid,3)**2)  
      &                -mcstat/unsdzdec(igrid,ilev)  
      &                -mpre(igrid,ilev+1)/unsdzdec(igrid,ilev+1) )**2)  
      &      /( unsdz(igrid,ilev)+unsdz(igrid,ilev-1) )  
         ELSE  
           kmcstat=1.E+0 / mcstat  
      &    *( unsdz(igrid,ilev)*kmpre(igrid,ilev+1)  
      &                        *mpre(igrid,ilev+1)  
      &      +unsdz(igrid,ilev-1)*kmpre(igrid,ilev-1)  
      &                          *mpre(igrid,ilev-1) )  
      &      /( unsdz(igrid,ilev)+unsdz(igrid,ilev-1) )  
         ENDIF  
         tmp2=kmcstat  
      &      /( sm(igrid,ilev)/q2(igrid,ilev) )  
      &      /long(igrid,ilev)  
         qcstat=tmp2**(1.E+0/3.E+0)  
         q2cstat=qcstat**2  
 c  
 c.......................................................................  
 c  
 c  choix de la solution finale  
 c  ---------------------------  
 c  
           q(igrid,ilev)=qcstat  
           q2(igrid,ilev)=q2cstat  
           m(igrid,ilev)=mcstat  
 c abd       if(ilev.le.57.and.ilev.ge.37) then  
 c           print*,'L=',ilev,'   M2=',m2(igrid,ilev),m2cstat,  
 c     s     'N2=',n2(igrid,ilev)  
 c abd       endif  
           m2(igrid,ilev)=m2cstat  
 c  
 c --->  
 c       pour des raisons simples q2 est minore  
 c<---  
 c  
         IF (q2(igrid,ilev).lt.q2min) THEN  
           q2(igrid,ilev)=q2min  
           q(igrid,ilev)=sqrt(q2min)  
         ENDIF  
 c  
 c.......................................................................  
 c  
 c  calcul final de kn et km  
 c  ------------------------  
 c  
         gn=-long(igrid,ilev)**2 / q2(igrid,ilev)  
      &                                           * n2(igrid,ilev)  
         IF (gn.lt.gnmin) gn=gnmin  
         IF (gn.gt.gnmax) gn=gnmax  
         sn(igrid,ilev)=cn1/(1.E+0 +cn2*gn)  
         sm(igrid,ilev)=  
      &    (cm1+cm2*gn)  
      &   /( (1.E+0 +cm3*gn)*(1.E+0 +cm4*gn) )  
         kn(igrid,ilev)=long(igrid,ilev)*q(igrid,ilev)  
      &                 *sn(igrid,ilev)  
         km(igrid,ilev)=long(igrid,ilev)*q(igrid,ilev)  
      &                 *sm(igrid,ilev)  
 c abd  
 c        if(ilev.le.57.and.ilev.ge.37) then  
 c            print*,'L=',ilev,'   GN=',gn,'  SM=',sm(igrid,ilev)  
 c        endif  
 c  
 c.......................................................................  
 c  
 10002 CONTINUE  
 c  
 10001 CONTINUE  
 c  
 c.......................................................................  
 c  
 c  
                                                       DO igrid=1,ngrid  
       kn(igrid,1)=knmin  
       km(igrid,1)=kmmin  
 c     kn(igrid,1)=cd(igrid)  
 c     km(igrid,1)=cd(igrid)  
       q2(igrid,nlev)=q2(igrid,nlev-1)  
       q(igrid,nlev)=q(igrid,nlev-1)  
       kn(igrid,nlev)=kn(igrid,nlev-1)  
       km(igrid,nlev)=km(igrid,nlev-1)  
                                                       ENDDO  
 c  
 c  CALCUL DE LA DIFFUSION VERTICALE DE Q2  
       if (1.eq.1) then  
   
         do ilev=2,klev-1  
            sss=sss+plev(1,ilev-1)-plev(1,ilev+1)  
            sssq=sssq+(plev(1,ilev-1)-plev(1,ilev+1))*q2(1,ilev)  
         enddo  
         do ilev=2,klev-1  
            sss=sss+plev(1,ilev-1)-plev(1,ilev+1)  
            sssq=sssq+(plev(1,ilev-1)-plev(1,ilev+1))*q2(1,ilev)  
         enddo  
         print*,'Q2moy apres',sssq/sss  
 c  
 c  
         do ilev=1,nlev  
            do igrid=1,ngrid  
               q2(igrid,ilev)=max(q2(igrid,ilev),q2min)  
               q(igrid,ilev)=sqrt(q2(igrid,ilev))  
   
 c.......................................................................  
 c  
 c  calcul final de kn et km  
 c  ------------------------  
 c  
         gn=-long(igrid,ilev)**2 / q2(igrid,ilev)  
      &                                           * n2(igrid,ilev)  
         IF (gn.lt.gnmin) gn=gnmin  
         IF (gn.gt.gnmax) gn=gnmax  
         sn(igrid,ilev)=cn1/(1.E+0 +cn2*gn)  
         sm(igrid,ilev)=  
      &    (cm1+cm2*gn)  
      &   /( (1.E+0 +cm3*gn)*(1.E+0 +cm4*gn) )  
 C   Correction pour les couches stables.  
 C   Schema repris de JHoltzlag Boville, lui meme venant de...  
   
         if (1.eq.1) then  
         snstable=1.-zlev(igrid,ilev)  
      s     /(700.*max(ustar(igrid),0.0001))  
         snstable=1.-zlev(igrid,ilev)/400.  
         snstable=max(snstable,0.)  
         snstable=snstable*snstable  
   
 c abde      print*,'SN ',ilev,sn(1,ilev),snstable  
         if (sn(igrid,ilev).lt.snstable) then  
            sn(igrid,ilev)=snstable  
            snq2(igrid,ilev)=0.  
         endif  
   
         if (sm(igrid,ilev).lt.snstable) then  
            sm(igrid,ilev)=snstable  
            smq2(igrid,ilev)=0.  
         endif  
   
         endif  
   
 c sn : coefficient de stabilite pour n  
         kn(igrid,ilev)=long(igrid,ilev)*q(igrid,ilev)  
      &                 *sn(igrid,ilev)  
         km(igrid,ilev)=long(igrid,ilev)*q(igrid,ilev)  
 c  
            enddo  
         enddo  
 c       print*,'Q2km1 ',(km(1,ilev),ilev=1,10)  
2    
3        endif    IMPLICIT NONE
4    
5        RETURN  contains
6        END  
7      SUBROUTINE vdif_kcay(ngrid, dt, g, rconst, plev, temp, zlev, zlay, &
8           u, v, teta, cd, q2, q2diag, km, kn, ustar, l_mix)
9    
10        ! From LMDZ4/libf/phylmd/vdif_kcay.F, version 1.1 2004/06/22 11:45:36
11    
12        USE dimphy, ONLY: klev, klon
13    
14        ! dt : pas de temps
15        ! g : g
16        ! zlev : altitude a chaque niveau (interface inferieure de la couche
17        ! de meme indice)
18        ! zlay : altitude au centre de chaque couche
19        ! u, v : vitesse au centre de chaque couche
20        ! (en entree : la valeur au debut du pas de temps)
21        ! teta : temperature potentielle au centre de chaque couche
22        ! (en entree : la valeur au debut du pas de temps)
23        ! q2 : $q^2$ au bas de chaque couche
24        ! (en entree : la valeur au debut du pas de temps)
25        ! (en sortie : la valeur a la fin du pas de temps)
26        ! km : diffusivite turbulente de quantite de mouvement (au bas de chaque
27        ! couche)
28        ! (en sortie : la valeur a la fin du pas de temps)
29        ! kn : diffusivite turbulente des scalaires (au bas de chaque couche)
30        ! (en sortie : la valeur a la fin du pas de temps)
31    
32        REAL, intent(in):: dt
33        real, intent(in):: g
34        real rconst
35        real plev(klon, klev+1), temp(klon, klev)
36        real ustar(klon), snstable
37        REAL zlev(klon, klev+1)
38        REAL zlay(klon, klev)
39        REAL u(klon, klev)
40        REAL v(klon, klev)
41        REAL teta(klon, klev)
42        REAL, intent(in):: cd (:) ! (ngrid) cdrag, valeur au debut du pas de temps
43        REAL q2(klon, klev+1), q2s(klon, klev+1)
44        REAL q2diag(klon, klev+1)
45        REAL km(klon, klev+1)
46        REAL kn(klon, klev+1)
47        real sq(klon), sqz(klon), zz(klon, klev+1), zq, long0(klon)
48    
49        integer l_mix, iii
50    
51        ! nlay : nombre de couches
52        ! nlev : nombre de niveaux
53        ! ngrid : nombre de points de grille
54        ! unsdz : 1 sur l'epaisseur de couche
55        ! unsdzdec : 1 sur la distance entre le centre de la couche et le
56        ! centre de la couche inferieure
57        ! q : echelle de vitesse au bas de chaque couche
58        ! (valeur a la fin du pas de temps)
59    
60        INTEGER nlay, nlev, ngrid
61        REAL unsdz(klon, klev)
62        REAL unsdzdec(klon, klev+1)
63        REAL q(klon, klev+1)
64    
65        ! kmpre : km au debut du pas de temps
66        ! qcstat : q : solution stationnaire du probleme couple
67        ! (valeur a la fin du pas de temps)
68        ! q2cstat : q2 : solution stationnaire du probleme couple
69        ! (valeur a la fin du pas de temps)
70    
71        REAL kmpre(klon, klev+1)
72        REAL qcstat
73        REAL q2cstat
74        real sss, sssq
75    
76        ! long : longueur de melange calculee selon Blackadar
77    
78        REAL long(klon, klev+1)
79    
80        ! kmq3 : terme en q^3 dans le developpement de km
81        ! (valeur au debut du pas de temps)
82        ! kmcstat : valeur de km solution stationnaire du systeme {q2 ; du/dz}
83        ! (valeur a la fin du pas de temps)
84        ! knq3 : terme en q^3 dans le developpement de kn
85        ! mcstat : valeur de m solution stationnaire du systeme {q2 ; du/dz}
86        ! (valeur a la fin du pas de temps)
87        ! m2cstat : valeur de m2 solution stationnaire du systeme {q2 ; du/dz}
88        ! (valeur a la fin du pas de temps)
89        ! m : valeur a la fin du pas de temps
90        ! mpre : valeur au debut du pas de temps
91        ! m2 : valeur a la fin du pas de temps
92        ! n2 : valeur a la fin du pas de temps
93    
94        REAL kmq3
95        REAL kmcstat
96        REAL knq3
97        REAL mcstat
98        REAL m2cstat
99        REAL m(klon, klev+1)
100        REAL mpre(klon, klev+1)
101        REAL m2(klon, klev+1)
102        REAL n2(klon, klev+1)
103    
104        ! gn : intermediaire pour les coefficients de stabilite
105        ! gnmin : borne inferieure de gn (-0.23 ou -0.28)
106        ! gnmax : borne superieure de gn (0.0233)
107        ! gninf : vrai si gn est en dessous de sa borne inferieure
108        ! gnsup : vrai si gn est en dessus de sa borne superieure
109        ! gm : drole d'objet bien utile
110        ! ri : nombre de Richardson
111        ! sn : coefficient de stabilite pour n
112        ! snq2 : premier terme du developement limite de sn en q2
113        ! sm : coefficient de stabilite pour m
114        ! smq2 : premier terme du developement limite de sm en q2
115    
116        REAL gn
117        REAL gnmin
118        REAL gnmax
119        LOGICAL gninf
120        LOGICAL gnsup
121        REAL gm
122        ! REAL ri(klon, klev+1)
123        REAL sn(klon, klev+1)
124        REAL snq2(klon, klev+1)
125        REAL sm(klon, klev+1)
126        REAL smq2(klon, klev+1)
127    
128        ! kappa : consatnte de Von Karman (0.4)
129        ! long00 : longueur de reference pour le calcul de long (160)
130        ! a1, a2, b1, b2, c1 : constantes d'origine pour les coefficients
131        ! de stabilite (0.92/0.74/16.6/10.1/0.08)
132        ! cn1, cn2 : constantes pour sn
133        ! cm1, cm2, cm3, cm4 : constantes pour sm
134    
135        REAL kappa
136        REAL long00
137        REAL a1, a2, b1, b2, c1
138        REAL cn1, cn2
139        REAL cm1, cm2, cm3, cm4
140    
141        ! termq : termes en $q$ dans l'equation de q2
142        ! termq3 : termes en $q^3$ dans l'equation de q2
143        ! termqm2 : termes en $q*m^2$ dans l'equation de q2
144        ! termq3m2 : termes en $q^3*m^2$ dans l'equation de q2
145    
146        REAL termq
147        REAL termq3
148        REAL termqm2
149        REAL termq3m2
150    
151        ! q2min : borne inferieure de q2
152        ! q2max : borne superieure de q2
153    
154        REAL q2min
155        REAL q2max
156    
157        ! knmin : borne inferieure de kn
158        ! kmmin : borne inferieure de km
159    
160        REAL knmin
161        REAL kmmin
162    
163        INTEGER ilay, ilev, igrid
164        REAL tmp1, tmp2
165    
166        PARAMETER (kappa=0.4E+0)
167        PARAMETER (long00=160.E+0)
168        ! PARAMETER (gnmin=-10.E+0)
169        PARAMETER (gnmin=-0.28)
170        PARAMETER (gnmax=0.0233E+0)
171        PARAMETER (a1=0.92E+0)
172        PARAMETER (a2=0.74E+0)
173        PARAMETER (b1=16.6E+0)
174        PARAMETER (b2=10.1E+0)
175        PARAMETER (c1=0.08E+0)
176        PARAMETER (knmin=1.E-5)
177        PARAMETER (kmmin=1.E-5)
178        PARAMETER (q2min=1.e-5)
179        PARAMETER (q2max=1.E+2)
180        PARAMETER (nlay=klev)
181        PARAMETER (nlev=klev+1)
182    
183        PARAMETER (cn1=a2*(1.E+0 -6.E+0 *a1/b1))
184        PARAMETER (cn2=-3.E+0 *a2*(6.E+0 *a1+b2))
185        PARAMETER (cm1=a1*(1.E+0 -3.E+0 *c1-6.E+0 *a1/b1))
186        PARAMETER (cm2=a1*(-3.E+0 *a2*((b2-3.E+0 *a2)*(1.E+0 -6.E+0 *a1/b1) &
187             -3.E+0 *c1*(b2+6.E+0 *a1))))
188        PARAMETER (cm3=-3.E+0 *a2*(6.E+0 *a1+b2))
189        PARAMETER (cm4=-9.E+0 *a1*a2)
190    
191        logical:: first = .true.
192    
193        !------------------------------------------------------------
194    
195        ! traitment des valeur de q2 en entree
196    
197        ! Initialisation de q2
198    
199        call yamada(ngrid, g, rconst, plev, temp, zlev, zlay, u, v, teta, &
200             q2diag, km, kn, ustar, l_mix)
201        if (first.and.1.eq.1) then
202           first=.false.
203           q2=q2diag
204        endif
205    
206        DO ilev=1, nlev
207           DO igrid=1, ngrid
208              q2(igrid, ilev)=amax1(q2(igrid, ilev), q2min)
209              q(igrid, ilev)=sqrt(q2(igrid, ilev))
210           ENDDO
211        ENDDO
212    
213        DO igrid=1, ngrid
214           tmp1=cd(igrid)*(u(igrid, 1)**2+v(igrid, 1)**2)
215           q2(igrid, 1)=b1**(2.E+0/3.E+0)*tmp1
216           q2(igrid, 1)=amax1(q2(igrid, 1), q2min)
217           q(igrid, 1)=sqrt(q2(igrid, 1))
218        ENDDO
219    
220        ! les increments verticaux
221    
222        ! allerte !c
223        ! zlev n'est pas declare a nlev !c
224        DO igrid=1, ngrid
225           zlev(igrid, nlev)=zlay(igrid, nlay) &
226                +( zlay(igrid, nlay) - zlev(igrid, nlev-1) )
227        ENDDO
228        ! allerte !c
229    
230        DO ilay=1, nlay
231           DO igrid=1, ngrid
232              unsdz(igrid, ilay)=1.E+0/(zlev(igrid, ilay+1)-zlev(igrid, ilay))
233           ENDDO
234        ENDDO
235        DO igrid=1, ngrid
236           unsdzdec(igrid, 1)=1.E+0/(zlay(igrid, 1)-zlev(igrid, 1))
237        ENDDO
238        DO ilay=2, nlay
239           DO igrid=1, ngrid
240              unsdzdec(igrid, ilay)=1.E+0/(zlay(igrid, ilay)-zlay(igrid, ilay-1))
241           ENDDO
242        ENDDO
243        DO igrid=1, ngrid
244           unsdzdec(igrid, nlay+1)=1.E+0/(zlev(igrid, nlay+1)-zlay(igrid, nlay))
245        ENDDO
246    
247        ! le cisaillement et le gradient de temperature
248    
249        DO igrid=1, ngrid
250           m2(igrid, 1)=(unsdzdec(igrid, 1) &
251                *u(igrid, 1))**2 &
252                +(unsdzdec(igrid, 1) &
253                *v(igrid, 1))**2
254           m(igrid, 1)=sqrt(m2(igrid, 1))
255           mpre(igrid, 1)=m(igrid, 1)
256        ENDDO
257    
258        DO ilev=2, nlev-1
259           DO igrid=1, ngrid
260    
261              n2(igrid, ilev)=g*unsdzdec(igrid, ilev) &
262                   *(teta(igrid, ilev)-teta(igrid, ilev-1)) &
263                   /(teta(igrid, ilev)+teta(igrid, ilev-1)) *2.E+0
264    
265              ! on ne sais traiter que les cas stratifies. et l'ajustement
266              ! convectif est cense faire en sorte que seul des
267              ! configurations stratifiees soient rencontrees en entree de
268              ! cette routine. mais, bon ... on sait jamais (meme on sait
269              ! que n2 prends quelques valeurs negatives ... parfois)
270              ! alors :
271    
272              IF (n2(igrid, ilev).lt.0.E+0) THEN
273                 n2(igrid, ilev)=0.E+0
274              ENDIF
275    
276              m2(igrid, ilev)=(unsdzdec(igrid, ilev) &
277                   *(u(igrid, ilev)-u(igrid, ilev-1)))**2 &
278                   +(unsdzdec(igrid, ilev) &
279                   *(v(igrid, ilev)-v(igrid, ilev-1)))**2
280              m(igrid, ilev)=sqrt(m2(igrid, ilev))
281              mpre(igrid, ilev)=m(igrid, ilev)
282    
283           ENDDO
284        ENDDO
285    
286        DO igrid=1, ngrid
287           m2(igrid, nlev)=m2(igrid, nlev-1)
288           m(igrid, nlev)=m(igrid, nlev-1)
289           mpre(igrid, nlev)=m(igrid, nlev)
290        ENDDO
291    
292        ! calcul des fonctions de stabilite
293    
294        if (l_mix.eq.4) then
295           DO igrid=1, ngrid
296              sqz(igrid)=1.e-10
297              sq(igrid)=1.e-10
298           ENDDO
299           do ilev=2, nlev-1
300              DO igrid=1, ngrid
301                 zq=sqrt(q2(igrid, ilev))
302                 sqz(igrid) &
303                      =sqz(igrid)+zq*zlev(igrid, ilev) &
304                      *(zlay(igrid, ilev)-zlay(igrid, ilev-1))
305                 sq(igrid)=sq(igrid)+zq*(zlay(igrid, ilev)-zlay(igrid, ilev-1))
306              ENDDO
307           enddo
308           DO igrid=1, ngrid
309              long0(igrid)=0.2*sqz(igrid)/sq(igrid)
310           ENDDO
311        else if (l_mix.eq.3) then
312           long0(igrid)=long00
313        endif
314    
315        DO ilev=2, nlev-1
316           DO igrid=1, ngrid
317              tmp1=kappa*(zlev(igrid, ilev)-zlev(igrid, 1))
318              if (l_mix.ge.10) then
319                 long(igrid, ilev)=l_mix
320              else
321                 long(igrid, ilev)=tmp1/(1.E+0 + tmp1/long0(igrid))
322              endif
323              long(igrid, ilev)=max(min(long(igrid, ilev) &
324                   , 0.5*sqrt(q2(igrid, ilev))/sqrt(max(n2(igrid, ilev), 1.e-10))) &
325                   , 5.)
326    
327              gn=-long(igrid, ilev)**2 / q2(igrid, ilev) &
328                   * n2(igrid, ilev)
329              gm=long(igrid, ilev)**2 / q2(igrid, ilev) &
330                   * m2(igrid, ilev)
331    
332              gninf=.false.
333              gnsup=.false.
334              long(igrid, ilev)=long(igrid, ilev)
335              long(igrid, ilev)=long(igrid, ilev)
336    
337              IF (gn.lt.gnmin) THEN
338                 gninf=.true.
339                 gn=gnmin
340              ENDIF
341    
342              IF (gn.gt.gnmax) THEN
343                 gnsup=.true.
344                 gn=gnmax
345              ENDIF
346    
347              sn(igrid, ilev)=cn1/(1.E+0 +cn2*gn)
348              sm(igrid, ilev)= &
349                   (cm1+cm2*gn) &
350                   /( (1.E+0 +cm3*gn) &
351                   *(1.E+0 +cm4*gn) )
352    
353              IF ((gninf).or.(gnsup)) THEN
354                 snq2(igrid, ilev)=0.E+0
355                 smq2(igrid, ilev)=0.E+0
356              ELSE
357                 snq2(igrid, ilev)= &
358                      -gn &
359                      *(-cn1*cn2/(1.E+0 +cn2*gn)**2 )
360                 smq2(igrid, ilev)= &
361                      -gn &
362                      *( cm2*(1.E+0 +cm3*gn) &
363                      *(1.E+0 +cm4*gn) &
364                      -( cm3*(1.E+0 +cm4*gn) &
365                      +cm4*(1.E+0 +cm3*gn) ) &
366                      *(cm1+cm2*gn) ) &
367                      /( (1.E+0 +cm3*gn) &
368                      *(1.E+0 +cm4*gn) )**2
369              ENDIF
370              ! la decomposition de Taylor en q2 n'a de sens que dans les
371              ! cas stratifies ou sn et sm sont quasi proportionnels a
372              ! q2. ailleurs on laisse le meme algorithme car l'ajustement
373              ! convectif fait le travail.  mais c'est delirant quand sn
374              ! et snq2 n'ont pas le meme signe : dans ces cas, on ne fait
375              ! pas la decomposition.
376    
377              IF (snq2(igrid, ilev)*sn(igrid, ilev).le.0.E+0) &
378                   snq2(igrid, ilev)=0.E+0
379              IF (smq2(igrid, ilev)*sm(igrid, ilev).le.0.E+0) &
380                   smq2(igrid, ilev)=0.E+0
381    
382              ! Correction pour les couches stables.
383              ! Schema repris de JHoltzlag Boville, lui meme venant de...
384    
385              if (1.eq.1) then
386                 snstable=1.-zlev(igrid, ilev) &
387                      /(700.*max(ustar(igrid), 0.0001))
388                 snstable=1.-zlev(igrid, ilev)/400.
389                 snstable=max(snstable, 0.)
390                 snstable=snstable*snstable
391    
392                 if (sn(igrid, ilev).lt.snstable) then
393                    sn(igrid, ilev)=snstable
394                    snq2(igrid, ilev)=0.
395                 endif
396    
397                 if (sm(igrid, ilev).lt.snstable) then
398                    sm(igrid, ilev)=snstable
399                    smq2(igrid, ilev)=0.
400                 endif
401              endif
402    
403              ! sn : coefficient de stabilite pour n
404              ! snq2 : premier terme du developement limite de sn en q2
405           ENDDO
406        ENDDO
407    
408        ! calcul de km et kn au debut du pas de temps
409    
410        DO igrid=1, ngrid
411           kn(igrid, 1)=knmin
412           km(igrid, 1)=kmmin
413           kmpre(igrid, 1)=km(igrid, 1)
414        ENDDO
415    
416        DO ilev=2, nlev-1
417           DO igrid=1, ngrid
418              kn(igrid, ilev)=long(igrid, ilev)*q(igrid, ilev) &
419                   *sn(igrid, ilev)
420              km(igrid, ilev)=long(igrid, ilev)*q(igrid, ilev) &
421                   *sm(igrid, ilev)
422              kmpre(igrid, ilev)=km(igrid, ilev)
423           ENDDO
424        ENDDO
425    
426        DO igrid=1, ngrid
427           kn(igrid, nlev)=kn(igrid, nlev-1)
428           km(igrid, nlev)=km(igrid, nlev-1)
429           kmpre(igrid, nlev)=km(igrid, nlev)
430        ENDDO
431    
432        ! boucle sur les niveaux 2 a nlev-1
433    
434        DO ilev=2, nlev-1
435           DO igrid=1, ngrid
436              ! calcul des termes sources et puits de l'equation de q2
437    
438              knq3=kn(igrid, ilev)*snq2(igrid, ilev) &
439                   /sn(igrid, ilev)
440              kmq3=km(igrid, ilev)*smq2(igrid, ilev) &
441                   /sm(igrid, ilev)
442    
443              termq=0.E+0
444              termq3=0.E+0
445              termqm2=0.E+0
446              termq3m2=0.E+0
447    
448              tmp1=dt*2.E+0 *km(igrid, ilev)*m2(igrid, ilev)
449              tmp2=dt*2.E+0 *kmq3*m2(igrid, ilev)
450              termqm2=termqm2 &
451                   +dt*2.E+0 *km(igrid, ilev)*m2(igrid, ilev) &
452                   -dt*2.E+0 *kmq3*m2(igrid, ilev)
453              termq3m2=termq3m2 &
454                   +dt*2.E+0 *kmq3*m2(igrid, ilev)
455    
456              termq=termq &
457                   -dt*2.E+0 *kn(igrid, ilev)*n2(igrid, ilev) &
458                   +dt*2.E+0 *knq3*n2(igrid, ilev)
459              termq3=termq3 &
460                   -dt*2.E+0 *knq3*n2(igrid, ilev)
461    
462              termq3=termq3 &
463                   -dt*2.E+0 *q(igrid, ilev)**3 / (b1*long(igrid, ilev))
464    
465              ! resolution stationnaire couplee avec le gradient de vitesse local
466    
467              ! on cherche le cisaillement qui annule l'equation de q^2
468              ! supposee en q3
469    
470              tmp1=termq+termq3
471              tmp2=termqm2+termq3m2
472              m2cstat=m2(igrid, ilev) &
473                   -(tmp1+tmp2)/(dt*2.E+0*km(igrid, ilev))
474              mcstat=sqrt(m2cstat)
475    
476              ! puis on ecrit la valeur de q qui annule l'equation de m
477              ! supposee en q3
478    
479              IF (ilev.eq.2) THEN
480                 kmcstat=1.E+0 / mcstat &
481                      *( unsdz(igrid, ilev)*kmpre(igrid, ilev+1) &
482                      *mpre(igrid, ilev+1) &
483                      +unsdz(igrid, ilev-1) &
484                      *cd(igrid) &
485                      *( sqrt(u(igrid, 3)**2+v(igrid, 3)**2) &
486                      -mcstat/unsdzdec(igrid, ilev) &
487                      -mpre(igrid, ilev+1)/unsdzdec(igrid, ilev+1) )**2) &
488                      /( unsdz(igrid, ilev)+unsdz(igrid, ilev-1) )
489              ELSE
490                 kmcstat=1.E+0 / mcstat &
491                      *( unsdz(igrid, ilev)*kmpre(igrid, ilev+1) &
492                      *mpre(igrid, ilev+1) &
493                      +unsdz(igrid, ilev-1)*kmpre(igrid, ilev-1) &
494                      *mpre(igrid, ilev-1) ) &
495                      /( unsdz(igrid, ilev)+unsdz(igrid, ilev-1) )
496              ENDIF
497              tmp2=kmcstat &
498                   /( sm(igrid, ilev)/q2(igrid, ilev) ) &
499                   /long(igrid, ilev)
500              qcstat=tmp2**(1.E+0/3.E+0)
501              q2cstat=qcstat**2
502    
503              ! choix de la solution finale
504    
505              q(igrid, ilev)=qcstat
506              q2(igrid, ilev)=q2cstat
507              m(igrid, ilev)=mcstat
508              m2(igrid, ilev)=m2cstat
509    
510              ! pour des raisons simples q2 est minore
511    
512              IF (q2(igrid, ilev).lt.q2min) THEN
513                 q2(igrid, ilev)=q2min
514                 q(igrid, ilev)=sqrt(q2min)
515              ENDIF
516    
517              ! calcul final de kn et km
518    
519              gn=-long(igrid, ilev)**2 / q2(igrid, ilev) &
520                   * n2(igrid, ilev)
521              IF (gn.lt.gnmin) gn=gnmin
522              IF (gn.gt.gnmax) gn=gnmax
523              sn(igrid, ilev)=cn1/(1.E+0 +cn2*gn)
524              sm(igrid, ilev)= &
525                   (cm1+cm2*gn) &
526                   /( (1.E+0 +cm3*gn)*(1.E+0 +cm4*gn) )
527              kn(igrid, ilev)=long(igrid, ilev)*q(igrid, ilev) &
528                   *sn(igrid, ilev)
529              km(igrid, ilev)=long(igrid, ilev)*q(igrid, ilev) &
530                   *sm(igrid, ilev)
531           end DO
532        end DO
533    
534        DO igrid=1, ngrid
535           kn(igrid, 1)=knmin
536           km(igrid, 1)=kmmin
537           q2(igrid, nlev)=q2(igrid, nlev-1)
538           q(igrid, nlev)=q(igrid, nlev-1)
539           kn(igrid, nlev)=kn(igrid, nlev-1)
540           km(igrid, nlev)=km(igrid, nlev-1)
541        ENDDO
542    
543        ! CALCUL DE LA DIFFUSION VERTICALE DE Q2
544        if (1.eq.1) then
545           do ilev=2, klev-1
546              sss=sss+plev(1, ilev-1)-plev(1, ilev+1)
547              sssq=sssq+(plev(1, ilev-1)-plev(1, ilev+1))*q2(1, ilev)
548           enddo
549           do ilev=2, klev-1
550              sss=sss+plev(1, ilev-1)-plev(1, ilev+1)
551              sssq=sssq+(plev(1, ilev-1)-plev(1, ilev+1))*q2(1, ilev)
552           enddo
553           print*, 'Q2moy apres', sssq/sss
554    
555           do ilev=1, nlev
556              do igrid=1, ngrid
557                 q2(igrid, ilev)=max(q2(igrid, ilev), q2min)
558                 q(igrid, ilev)=sqrt(q2(igrid, ilev))
559    
560                 ! calcul final de kn et km
561    
562                 gn=-long(igrid, ilev)**2 / q2(igrid, ilev) &
563                      * n2(igrid, ilev)
564                 IF (gn.lt.gnmin) gn=gnmin
565                 IF (gn.gt.gnmax) gn=gnmax
566                 sn(igrid, ilev)=cn1/(1.E+0 +cn2*gn)
567                 sm(igrid, ilev)= &
568                      (cm1+cm2*gn) &
569                      /( (1.E+0 +cm3*gn)*(1.E+0 +cm4*gn) )
570                 ! Correction pour les couches stables.
571                 ! Schema repris de JHoltzlag Boville, lui meme venant de...
572    
573                 if (1.eq.1) then
574                    snstable=1.-zlev(igrid, ilev) &
575                         /(700.*max(ustar(igrid), 0.0001))
576                    snstable=1.-zlev(igrid, ilev)/400.
577                    snstable=max(snstable, 0.)
578                    snstable=snstable*snstable
579    
580                    if (sn(igrid, ilev).lt.snstable) then
581                       sn(igrid, ilev)=snstable
582                       snq2(igrid, ilev)=0.
583                    endif
584    
585                    if (sm(igrid, ilev).lt.snstable) then
586                       sm(igrid, ilev)=snstable
587                       smq2(igrid, ilev)=0.
588                    endif
589                 endif
590    
591                 ! sn : coefficient de stabilite pour n
592                 kn(igrid, ilev)=long(igrid, ilev)*q(igrid, ilev) &
593                      *sn(igrid, ilev)
594                 km(igrid, ilev)=long(igrid, ilev)*q(igrid, ilev)
595              enddo
596           enddo
597        endif
598    
599      END SUBROUTINE vdif_kcay
600    
601    end module vdif_kcay_m

Legend:
Removed from v.17  
changed lines
  Added in v.62

  ViewVC Help
Powered by ViewVC 1.1.21