source: LMDZ5/branches/testing/libf/phylmd/coefkzmin.F90 @ 2791

Last change on this file since 2791 was 1999, checked in by Laurent Fairhead, 11 years ago

Merged trunk changes r1920:1997 into testing branch

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 3.4 KB
Line 
1
2SUBROUTINE coefkzmin(knon, ypaprs, ypplay, yu, yv, yt, yq, ycdragm, km, kn)
3
4  USE dimphy
5  IMPLICIT NONE
6
7  include "YOMCST.h"
8
9  ! .......................................................................
10  ! Entrees modifies en attendant une version ou les zlev, et zlay soient
11  ! disponibles.
12
13  REAL ycdragm(klon)
14
15  REAL yu(klon, klev), yv(klon, klev)
16  REAL yt(klon, klev), yq(klon, klev)
17  REAL ypaprs(klon, klev+1), ypplay(klon, klev)
18  REAL yustar(klon)
19  REAL yzlay(klon, klev), yzlev(klon, klev+1), yteta(klon, klev)
20
21  INTEGER i
22
23  ! .......................................................................
24
25  ! En entree :
26  ! -----------
27
28  ! zlev : altitude a chaque niveau (interface inferieure de la couche
29  ! de meme indice)
30  ! ustar : u*
31
32  ! teta : temperature potentielle au centre de chaque couche
33  ! (en entree : la valeur au debut du pas de temps)
34
35  ! en sortier :
36  ! ------------
37
38  ! km : diffusivite turbulente de quantite de mouvement (au bas de chaque
39  ! couche)
40  ! (en sortie : la valeur a la fin du pas de temps)
41  ! kn : diffusivite turbulente des scalaires (au bas de chaque couche)
42  ! (en sortie : la valeur a la fin du pas de temps)
43
44  ! .......................................................................
45
46  REAL ustar(klon)
47  REAL kmin, qmin, pblhmin(klon), coriol(klon)
48  REAL zlev(klon, klev+1)
49  REAL teta(klon, klev)
50
51  REAL km(klon, klev)
52  REAL kn(klon, klev)
53  INTEGER knon
54
55
56  INTEGER nlay, nlev
57  INTEGER ig, k
58
59  REAL, PARAMETER :: kap = 0.4
60
61  nlay = klev
62  nlev = klev + 1
63  ! .......................................................................
64  ! en attendant une version ou les zlev, et zlay soient
65  ! disponibles.
66  ! Debut de la partie qui doit etre unclue a terme dans clmain.
67
68  DO i = 1, knon
69    yzlay(i, 1) = rd*yt(i, 1)/(0.5*(ypaprs(i,1)+ypplay(i, &
70      1)))*(ypaprs(i,1)-ypplay(i,1))/rg
71  END DO
72  DO k = 2, klev
73    DO i = 1, knon
74      yzlay(i, k) = yzlay(i, k-1) + rd*0.5*(yt(i,k-1)+yt(i,k))/ypaprs(i, k)*( &
75        ypplay(i,k-1)-ypplay(i,k))/rg
76    END DO
77  END DO
78  DO k = 1, klev
79    DO i = 1, knon
80      ! ATTENTION:on passe la temperature potentielle virt. pour le calcul de
81      ! K
82      yteta(i, k) = yt(i, k)*(ypaprs(i,1)/ypplay(i,k))**rkappa* &
83        (1.+0.61*yq(i,k))
84    END DO
85  END DO
86  DO i = 1, knon
87    yzlev(i, 1) = 0.
88    yzlev(i, klev+1) = 2.*yzlay(i, klev) - yzlay(i, klev-1)
89  END DO
90  DO k = 2, klev
91    DO i = 1, knon
92      yzlev(i, k) = 0.5*(yzlay(i,k)+yzlay(i,k-1))
93    END DO
94  END DO
95
96  yustar(1:knon) = sqrt(ycdragm(1:knon)*(yu(1:knon,1)*yu(1:knon,1)+yv(1:knon, &
97    1)*yv(1:knon,1)))
98
99  ! Fin de la partie qui doit etre unclue a terme dans clmain.
100
101  ! ette routine est ecrite pour avoir en entree ustar, teta et zlev
102  ! Ici, on a inclut le calcul de ces trois variables dans la routine
103  ! coefkzmin en attendant une nouvelle version de la couche limite
104  ! ou ces variables seront disponibles.
105
106  ! 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  END DO
116
117  DO k = 2, klev
118    DO ig = 1, knon
119      IF (teta(ig,2)>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      END IF
125      kn(ig, k) = kmin
126      km(ig, k) = kmin
127    END DO
128  END DO
129
130
131  RETURN
132END SUBROUTINE coefkzmin
Note: See TracBrowser for help on using the repository browser.