source: LMDZ5/branches/AI-cosp/libf/phylmd/coefkzmin.F90 @ 5425

Last change on this file since 5425 was 1992, checked in by lguez, 11 years ago

Converted to free source form files in libf/phylmd which were still in
fixed source form. The conversion was done using the polish mode of
the NAG Fortran Compiler.

In addition to converting to free source form, the processing of the
files also:

-- indented the code (including comments);

-- set Fortran keywords to uppercase, and set all other identifiers
to lower case;

-- added qualifiers to end statements (for example "end subroutine
conflx", instead of "end");

-- changed the terminating statements of all DO loops so that each
loop ends with an ENDDO statement (instead of a labeled continue).

-- replaced #include by include.

  • 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  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
132END SUBROUTINE coefkzmin
Note: See TracBrowser for help on using the repository browser.