source: LMDZ6/trunk/libf/phylmd/coefkzmin_mod.f90 @ 6048

Last change on this file since 6048 was 6048, checked in by fhourdin, 3 months ago

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