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

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

  ViewVC Help
Powered by ViewVC 1.1.21