source: LMDZ6/trunk/libf/phylmd/coefkzmin.f90

Last change on this file was 5274, checked in by abarral, 54 minutes ago

Replace yomcst.h by existing module

  • 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: 4.2 KB
Line 
1
2SUBROUTINE coefkzmin(knon, ypaprs, ypplay, yu, yv, yt, yq, ycdragm, km, kn)
3
4  USE dimphy
5  USE yomcst_mod_h, ONLY: RPI, RCLUM, RHPLA, RKBOL, RNAVO                   &
6          , RDAY, REA, REPSM, RSIYEA, RSIDAY, ROMEGA                  &
7          , R_ecc, R_peri, R_incl                                      &
8          , RA, RG, R1SA                                         &
9          , RSIGMA                                                     &
10          , R, RMD, RMV, RD, RV, RCPD                    &
11          , RMO3, RMCO2, RMC, RMCH4, RMN2O, RMCFC11, RMCFC12        &
12          , RCPV, RCVD, RCVV, RKAPPA, RETV, eps_w                    &
13          , RCW, RCS                                                 &
14          , RLVTT, RLSTT, RLMLT, RTT, RATM                           &
15          , RESTT, RALPW, RBETW, RGAMW, RALPS, RBETS, RGAMS            &
16          , RALPD, RBETD, RGAMD
17IMPLICIT NONE
18
19
20
21  ! .......................................................................
22  ! Entrees modifies en attendant une version ou les zlev, et zlay soient
23  ! disponibles.
24
25  REAL ycdragm(klon)
26
27  REAL yu(klon, klev), yv(klon, klev)
28  REAL yt(klon, klev), yq(klon, klev)
29  REAL ypaprs(klon, klev+1), ypplay(klon, klev)
30  REAL yustar(klon)
31  REAL yzlay(klon, klev), yzlev(klon, klev+1), yteta(klon, klev)
32
33  INTEGER i
34
35  ! .......................................................................
36
37  ! En entree :
38  ! -----------
39
40  ! zlev : altitude a chaque niveau (interface inferieure de la couche
41  ! de meme indice)
42  ! ustar : u*
43
44  ! teta : temperature potentielle au centre de chaque couche
45  ! (en entree : la valeur au debut du pas de temps)
46
47  ! en sortier :
48  ! ------------
49
50  ! km : diffusivite turbulente de quantite de mouvement (au bas de chaque
51  ! couche)
52  ! (en sortie : la valeur a la fin du pas de temps)
53  ! kn : diffusivite turbulente des scalaires (au bas de chaque couche)
54  ! (en sortie : la valeur a la fin du pas de temps)
55
56  ! .......................................................................
57
58  REAL ustar(klon)
59  REAL kmin, qmin, pblhmin(klon), coriol(klon)
60  REAL zlev(klon, klev+1)
61  REAL teta(klon, klev)
62
63  REAL km(klon, klev)
64  REAL kn(klon, klev)
65  INTEGER knon
66
67
68  INTEGER nlay, nlev
69  INTEGER ig, k
70
71  REAL, PARAMETER :: kap = 0.4
72
73  nlay = klev
74  nlev = klev + 1
75  ! .......................................................................
76  ! en attendant une version ou les zlev, et zlay soient
77  ! disponibles.
78  ! Debut de la partie qui doit etre unclue a terme dans clmain.
79
80  DO i = 1, knon
81    yzlay(i, 1) = rd*yt(i, 1)/(0.5*(ypaprs(i,1)+ypplay(i, &
82      1)))*(ypaprs(i,1)-ypplay(i,1))/rg
83  END DO
84  DO k = 2, klev
85    DO i = 1, knon
86      yzlay(i, k) = yzlay(i, k-1) + rd*0.5*(yt(i,k-1)+yt(i,k))/ypaprs(i, k)*( &
87        ypplay(i,k-1)-ypplay(i,k))/rg
88    END DO
89  END DO
90  DO k = 1, klev
91    DO i = 1, knon
92      ! ATTENTION:on passe la temperature potentielle virt. pour le calcul de
93      ! K
94      yteta(i, k) = yt(i, k)*(ypaprs(i,1)/ypplay(i,k))**rkappa* &
95        (1.+0.61*yq(i,k))
96    END DO
97  END DO
98  DO i = 1, knon
99    yzlev(i, 1) = 0.
100    yzlev(i, klev+1) = 2.*yzlay(i, klev) - yzlay(i, klev-1)
101  END DO
102  DO k = 2, klev
103    DO i = 1, knon
104      yzlev(i, k) = 0.5*(yzlay(i,k)+yzlay(i,k-1))
105    END DO
106  END DO
107
108  yustar(1:knon) = sqrt(ycdragm(1:knon)*(yu(1:knon,1)*yu(1:knon,1)+yv(1:knon, &
109    1)*yv(1:knon,1)))
110
111  ! Fin de la partie qui doit etre unclue a terme dans clmain.
112
113  ! ette routine est ecrite pour avoir en entree ustar, teta et zlev
114  ! Ici, on a inclut le calcul de ces trois variables dans la routine
115  ! coefkzmin en attendant une nouvelle version de la couche limite
116  ! ou ces variables seront disponibles.
117
118  ! Debut de la routine coefkzmin proprement dite.
119
120  ustar = yustar
121  teta = yteta
122  zlev = yzlev
123
124  DO ig = 1, knon
125    coriol(ig) = 1.E-4
126    pblhmin(ig) = 0.07*ustar(ig)/max(abs(coriol(ig)), 2.546E-5)
127  END DO
128
129  DO k = 2, klev
130    DO ig = 1, knon
131      IF (teta(ig,2)>teta(ig,1)) THEN
132        qmin = ustar(ig)*(max(1.-zlev(ig,k)/pblhmin(ig),0.))**2
133        kmin = kap*zlev(ig, k)*qmin
134      ELSE
135        kmin = 0. ! kmin n'est utilise que pour les SL stables.
136      END IF
137      kn(ig, k) = kmin
138      km(ig, k) = kmin
139    END DO
140  END DO
141
142
143  RETURN
144END SUBROUTINE coefkzmin
Note: See TracBrowser for help on using the repository browser.