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

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

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

trunk/libf/phylmd/coefkzmin.f revision 3 by guez, Wed Feb 27 13:16:39 2008 UTC trunk/Sources/phylmd/coefkzmin.f revision 251 by guez, Mon Jan 8 14:12:02 2018 UTC
# Line 1  Line 1 
1  !  module coefkzmin_m
 ! $Header: /home/cvsroot/LMDZ4/libf/phylmd/coefkzmin.F,v 1.1.1.1 2004/05/19 12:53:08 lmdzadmin Exp $  
 !  
        SUBROUTINE coefkzmin(ngrid,ypaprs,ypplay,yu,yv,yt,yq,ycoefm  
      .   ,km,kn)  
 c      SUBROUTINE coefkzmin(ngrid,zlev,teta,ustar,km,kn)  
       use dimens_m  
       use dimphy  
       use YOMCST  
       IMPLICIT NONE  
   
   
 c.......................................................................  
 c  Entrees modifies en attendant une version ou les zlev, et zlay soient  
 c  disponibles.  
   
       REAL  ycoefm(klon,klev)  
   
       REAL yu(klon,klev), yv(klon,klev)  
       REAL yt(klon,klev), yq(klon,klev)  
       REAL ypaprs(klon,klev+1), ypplay(klon,klev)  
       REAL yustar(klon)  
       real yzlay(klon,klev),yzlev(klon,klev+1),yteta(klon,klev)  
   
       integer i  
   
 c.......................................................................  
 c  
 c  En entree :  
 c  -----------  
 c  
 c zlev : altitude a chaque niveau (interface inferieure de la couche  
 c        de meme indice)  
 c ustar : u*  
 c  
 c teta : temperature potentielle au centre de chaque couche  
 c        (en entree : la valeur au debut du pas de temps)  
 c  
 c  en sortier :  
 c  ------------  
 c  
 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 ustar(klon)  
       real kmin,qmin,pblhmin(klon),coriol(klon)  
       REAL zlev(klon,klev+1)  
       REAL teta(klon,klev)  
   
       REAL km(klon,klev+1)  
       REAL kn(klon,klev+1)  
       integer l_mix,ngrid  
   
   
       integer nlay,nlev  
       PARAMETER (nlay=klev)  
       PARAMETER (nlev=klev+1)  
   
       integer ig,k  
   
       real kap  
       save kap  
       data kap/0.4/  
   
       real frif,falpha,fsm  
       real fl,zzz,zl0,zq2,zn2  
   
   
 c.......................................................................  
 c  en attendant une version ou les zlev, et zlay soient  
 c  disponibles.  
 c  Debut de la partie qui doit etre unclue a terme dans clmain.  
 c  
          do i=1,ngrid  
             yzlay(i,1)=RD*yt(i,1)/(0.5*(ypaprs(i,1)+ypplay(i,1)))  
      .                *(ypaprs(i,1)-ypplay(i,1))/RG  
          enddo  
          do k=2,klev  
             do i=1,ngrid  
                yzlay(i,k)=yzlay(i,k-1)+RD*0.5*(yt(i,k-1)+yt(i,k))  
      s                /ypaprs(i,k)*(ypplay(i,k-1)-ypplay(i,k))/RG  
             enddo  
          enddo  
          do k=1,klev  
             do i=1,ngrid  
 cATTENTION:on passe la temperature potentielle virt. pour le calcul de K  
              yteta(i,k)=yt(i,k)*(ypaprs(i,1)/ypplay(i,k))**rkappa  
      s          *(1.+0.61*yq(i,k))  
             enddo  
          enddo  
          do i=1,ngrid  
             yzlev(i,1)=0.  
             yzlev(i,klev+1)=2.*yzlay(i,klev)-yzlay(i,klev-1)  
          enddo  
          do k=2,klev  
             do i=1,ngrid  
                yzlev(i,k)=0.5*(yzlay(i,k)+yzlay(i,k-1))  
             enddo  
          enddo  
   
   
 cIM cf FH   yustar(:) =SQRT(ycoefm(:,1)*(yu(:,1)*yu(:,1)+yv(:,1)*yv(:,1)))  
       yustar(1:ngrid) =SQRT(ycoefm(1:ngrid,1)*  
      $       (yu(1:ngrid,1)*yu(1:ngrid,1)+yv(1:ngrid,1)*yv(1:ngrid,1)))  
   
 c  Fin de la partie qui doit etre unclue a terme dans clmain.  
   
 Cette routine est ecrite pour avoir en entree ustar, teta et zlev  
 c  Ici, on a inclut le calcul de ces trois variables dans la routine  
 c  coefkzmin en attendant une nouvelle version de la couche limite  
 c  ou ces variables seront disponibles.  
   
 c Debut de la routine coefkzmin proprement dite.  
   
       ustar=yustar  
       teta=yteta  
       zlev=yzlev  
   
       do ig=1,ngrid  
       coriol(ig)=1.e-4  
       pblhmin(ig)=0.07*ustar(ig)/max(abs(coriol(ig)),2.546e-5)  
       enddo  
         
       do k=2,klev  
          do ig=1,ngrid  
             if (teta(ig,2).gt.teta(ig,1)) then  
                qmin=ustar(ig)*(max(1.-zlev(ig,k)/pblhmin(ig),0.))**2  
                kmin=kap*zlev(ig,k)*qmin  
             else  
                kmin=0. ! kmin n'est utilise que pour les SL stables.  
             endif  
             kn(ig,k)=kmin  
             km(ig,k)=kmin  
          enddo  
       enddo  
2    
3      IMPLICIT NONE
4    
5        return  contains
6        end  
7      SUBROUTINE coefkzmin(ypaprs, ypplay, yu, yv, yt, yq, ycoefm, kn)
8    
9        ! From LMDZ4/libf/phylmd/coefkzmin.F, version 1.1.1.1, 2004/05/19 12:53:08
10    
11        ! Entrées modifiées en attendant une version où les zlev et zlay
12        ! soient disponibles.
13    
14        USE dimphy, ONLY: klev
15        USE suphec_m, ONLY: rd, rg, rkappa
16    
17        REAL, intent(in):: ypaprs(:, :) ! (knon, klev+1)
18        REAL, intent(in):: ypplay(:, :) ! (knon, klev)
19        REAL, intent(in):: yu(:, :), yv(:, :) ! (knon, klev) wind, in m s-1
20        REAL, intent(in):: yt(:, :) ! (knon, klev) temperature, in K
21        REAL, intent(in):: yq(:, :) ! (knon, klev)
22        REAL, intent(in):: ycoefm(:) ! (knon) drag coefficient
23    
24        REAL, intent(out):: kn(:, 2:) ! (knon, 2:klev) coefficient de
25        ! diffusion turbulente de la quantité de mouvement et des
26        ! scalaires (au bas de chaque couche) (en sortie : la valeur à la
27        ! fin du pas de temps), m2 s-1
28    
29        ! Local:
30    
31        integer knon
32        real ustar(size(ypaprs, 1)) ! (knon) u*
33        real zlay(size(ypaprs, 1), klev) ! (knon, klev) in m
34        integer i, k
35        real pblhmin(size(ypaprs, 1)) ! (knon)
36        real, parameter:: coriol = 1e-4
37    
38        REAL zlev(size(ypaprs, 1), 2: klev) ! (knon, 2: klev)
39        ! altitude at level (interface between layer with same index), in m
40    
41        REAL teta(size(ypaprs, 1), klev) ! (knon, klev)
42        ! température potentielle au centre de chaque couche (la valeur au
43        ! debut du pas de temps)
44    
45        real, PARAMETER:: kap = 0.4
46    
47        !---------------------------------------------------------------------
48    
49        knon = size(ypaprs, 1)
50        
51        ! Debut de la partie qui doit etre incluse a terme dans clmain.
52    
53        do i = 1, knon
54           zlay(i, 1) = RD * yt(i, 1) * 2 / (ypaprs(i, 1) + ypplay(i, 1)) &
55                * (ypaprs(i, 1) - ypplay(i, 1)) / RG
56        enddo
57    
58        do k = 2, klev
59           do i = 1, knon
60              zlay(i, k) = zlay(i, k-1) + RD * 0.5 * (yt(i, k - 1) + yt(i, k)) &
61                   / ypaprs(i, k) * (ypplay(i, k - 1) - ypplay(i, k)) / RG
62           enddo
63        enddo
64    
65        do k=1, klev
66           do i = 1, knon
67              ! Attention : on passe la temperature potentielle virtuelle
68              ! pour le calcul de K.
69              teta(i, k) = yt(i, k) * (ypaprs(i, 1) / ypplay(i, k))**rkappa &
70                   * (1. + 0.61 * yq(i, k))
71           enddo
72        enddo
73    
74        forall (k = 2: klev) zlev(:, k) = 0.5 * (zlay(:, k) + zlay(:, k-1))
75        ustar = SQRT(ycoefm * (yu(:, 1)**2 + yv(:, 1)**2))
76    
77        ! Fin de la partie qui doit être incluse à terme dans clmain
78    
79        ! Cette routine est ecrite pour avoir en entree ustar, teta et zlev
80        ! Ici, on a inclus le calcul de ces trois variables dans la routine
81        ! coefkzmin en attendant une nouvelle version de la couche limite
82        ! ou ces variables seront disponibles.
83    
84        ! Debut de la routine coefkzmin proprement dite
85    
86        pblhmin = 0.07 * ustar / coriol
87    
88        do k = 2, klev
89           do i = 1, knon
90              if (teta(i, 2) > teta(i, 1)) then
91                 kn(i, k) = kap * zlev(i, k) * ustar(i) &
92                      * (max(1. - zlev(i, k) / pblhmin(i), 0.))**2
93              else
94                 kn(i, k) = 0. ! min n'est utilisé que pour les SL stables
95              endif
96           enddo
97        enddo
98    
99      end SUBROUTINE coefkzmin
100    
101    end module coefkzmin_m

Legend:
Removed from v.3  
changed lines
  Added in v.251

  ViewVC Help
Powered by ViewVC 1.1.21