LMDZ
coefkzmin.F90
Go to the documentation of this file.
1 
2 SUBROUTINE 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
132 END SUBROUTINE coefkzmin
integer, save klon
Definition: dimphy.F90:3
integer, save klev
Definition: dimphy.F90:7
subroutine coefkzmin(knon, ypaprs, ypplay, yu, yv, yt, yq, ycdragm, km, kn)
Definition: coefkzmin.F90:3
Definition: dimphy.F90:1
real rg
Definition: comcstphy.h:1