source: LMDZ6/branches/contrails/libf/phylmd/coefkzmin.f90 @ 5428

Last change on this file since 5428 was 5285, checked in by abarral, 2 months ago

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