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

Diff of /trunk/Sources/phylmd/vdif_kcay.f

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

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

Legend:
Removed from v.12  
changed lines
  Added in v.134

  ViewVC Help
Powered by ViewVC 1.1.21