source: LMDZ6/branches/Amaury_dev/libf/phylmd/coefkzmin.F90

Last change on this file was 5144, checked in by abarral, 3 months ago

Put YOMCST.h into modules

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