source: LMDZ5/branches/LF-private/libf/phylmd/coefkzmin.F @ 5456

Last change on this file since 5456 was 1550, checked in by lguez, 13 years ago

Bug fix in "bilan_dyn_p". The index was out of bounds in the removed
assignment . Also, the removed assignment was useless.

Bug fix in "coefkzmin". The size of a dummy array cannot exceed the
size of the associated actual array. ("coefkzmin" is called by
"coef_diff_turb".) "km(:, klev+1)" and "kn(:, klev+1)" were not
defined in "coefkzmin" so this was maybe an innocuous bug.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 3.7 KB
Line 
1!
2       SUBROUTINE coefkzmin(knon,ypaprs,ypplay,yu,yv,yt,yq,ycdragm
3     .   ,km,kn)
4
5      USE dimphy
6      IMPLICIT NONE
7
8      include "YOMCST.h"
9
10c.......................................................................
11c  Entrees modifies en attendant une version ou les zlev, et zlay soient
12c  disponibles.
13
14      REAL  ycdragm(klon)
15
16      REAL yu(klon,klev), yv(klon,klev)
17      REAL yt(klon,klev), yq(klon,klev)
18      REAL ypaprs(klon,klev+1), ypplay(klon,klev)
19      REAL yustar(klon)
20      real yzlay(klon,klev),yzlev(klon,klev+1),yteta(klon,klev)
21
22      integer i
23
24c.......................................................................
25c
26c  En entree :
27c  -----------
28c
29c zlev : altitude a chaque niveau (interface inferieure de la couche
30c        de meme indice)
31c ustar : u*
32c
33c teta : temperature potentielle au centre de chaque couche
34c        (en entree : la valeur au debut du pas de temps)
35c
36c  en sortier :
37c  ------------
38c
39c km : diffusivite turbulente de quantite de mouvement (au bas de chaque
40c      couche)
41c      (en sortie : la valeur a la fin du pas de temps)
42c kn : diffusivite turbulente des scalaires (au bas de chaque couche)
43c      (en sortie : la valeur a la fin du pas de temps)
44c
45c.......................................................................
46
47      real ustar(klon)
48      real kmin,qmin,pblhmin(klon),coriol(klon)
49      REAL zlev(klon,klev+1)
50      REAL teta(klon,klev)
51
52      REAL km(klon,klev)
53      REAL kn(klon,klev)
54      integer knon
55
56
57      integer nlay,nlev
58      integer ig,k
59
60      real,parameter :: kap=0.4
61
62      nlay=klev
63      nlev=klev+1
64c.......................................................................
65c  en attendant une version ou les zlev, et zlay soient
66c  disponibles.
67c  Debut de la partie qui doit etre unclue a terme dans clmain.
68c
69         do i=1,knon
70            yzlay(i,1)=RD*yt(i,1)/(0.5*(ypaprs(i,1)+ypplay(i,1)))
71     .                *(ypaprs(i,1)-ypplay(i,1))/RG
72         enddo
73         do k=2,klev
74            do i=1,knon
75               yzlay(i,k)=yzlay(i,k-1)+RD*0.5*(yt(i,k-1)+yt(i,k))
76     s                /ypaprs(i,k)*(ypplay(i,k-1)-ypplay(i,k))/RG
77            enddo
78         enddo
79         do k=1,klev
80            do i=1,knon
81cATTENTION:on passe la temperature potentielle virt. pour le calcul de K
82             yteta(i,k)=yt(i,k)*(ypaprs(i,1)/ypplay(i,k))**rkappa
83     s          *(1.+0.61*yq(i,k))
84            enddo
85         enddo
86         do i=1,knon
87            yzlev(i,1)=0.
88            yzlev(i,klev+1)=2.*yzlay(i,klev)-yzlay(i,klev-1)
89         enddo
90         do k=2,klev
91            do i=1,knon
92               yzlev(i,k)=0.5*(yzlay(i,k)+yzlay(i,k-1))
93            enddo
94         enddo
95
96      yustar(1:knon) =SQRT(ycdragm(1:knon)*
97     $       (yu(1:knon,1)*yu(1:knon,1)+yv(1:knon,1)*yv(1:knon,1)))
98
99c  Fin de la partie qui doit etre unclue a terme dans clmain.
100
101Cette routine est ecrite pour avoir en entree ustar, teta et zlev
102c  Ici, on a inclut le calcul de ces trois variables dans la routine
103c  coefkzmin en attendant une nouvelle version de la couche limite
104c  ou ces variables seront disponibles.
105
106c Debut de la routine coefkzmin proprement dite.
107
108      ustar=yustar
109      teta=yteta
110      zlev=yzlev
111
112      do ig=1,knon
113         coriol(ig)=1.e-4
114         pblhmin(ig)=0.07*ustar(ig)/max(abs(coriol(ig)),2.546e-5)
115      enddo
116         
117      do k=2,klev
118         do ig=1,knon
119            if (teta(ig,2).gt.teta(ig,1)) then
120               qmin=ustar(ig)*(max(1.-zlev(ig,k)/pblhmin(ig),0.))**2
121               kmin=kap*zlev(ig,k)*qmin
122            else
123               kmin=0. ! kmin n'est utilise que pour les SL stables.
124            endif
125            kn(ig,k)=kmin
126            km(ig,k)=kmin
127         enddo
128      enddo
129
130
131      return
132      end
Note: See TracBrowser for help on using the repository browser.