LMDZ
yamada.F90
Go to the documentation of this file.
1 
2 ! $Id: yamada.F90 2346 2015-08-21 15:13:46Z emillour $
3 
4 SUBROUTINE yamada(ngrid, dt, g, rconst, plev, temp, zlev, zlay, u, v, teta, &
5  cd, q2, km, kn, ustar, l_mix)
6  USE dimphy
7  IMPLICIT NONE
8 
9  ! dt : pas de temps
10  ! g : g
11  ! zlev : altitude a chaque niveau (interface inferieure de la couche
12  ! de meme indice)
13  ! zlay : altitude au centre de chaque couche
14  ! u,v : vitesse au centre de chaque couche
15  ! (en entree : la valeur au debut du pas de temps)
16  ! teta : temperature potentielle au centre de chaque couche
17  ! (en entree : la valeur au debut du pas de temps)
18  ! cd : cdrag
19  ! (en entree : la valeur au debut du pas de temps)
20  ! q2 : $q^2$ au bas de chaque couche
21  ! (en entree : la valeur au debut du pas de temps)
22  ! (en sortie : la valeur a la fin du pas de temps)
23  ! km : diffusivite turbulente de quantite de mouvement (au bas de chaque
24  ! couche)
25  ! (en sortie : la valeur a la fin du pas de temps)
26  ! kn : diffusivite turbulente des scalaires (au bas de chaque couche)
27  ! (en sortie : la valeur a la fin du pas de temps)
28 
29  ! .......................................................................
30  REAL dt, g, rconst
31  REAL plev(klon, klev+1), temp(klon, klev)
32  REAL ustar(klon), snstable
33  REAL zlev(klon, klev+1)
34  REAL zlay(klon, klev)
35  REAL u(klon, klev)
36  REAL v(klon, klev)
37  REAL teta(klon, klev)
38  REAL cd(klon)
39  REAL q2(klon, klev+1)
40  REAL km(klon, klev+1)
41  REAL kn(klon, klev+1)
42  INTEGER l_mix, ngrid
43 
44 
45  INTEGER nlay, nlev
46  ! ym PARAMETER (nlay=klev)
47  ! ym PARAMETER (nlev=klev+1)
48 
49  LOGICAL first
50  SAVE first
51  DATA first/.true./
52  !$OMP THREADPRIVATE(first)
53 
54  INTEGER ig, k
55 
56  REAL ri, zrif, zalpha, zsm
57  REAL rif(klon, klev+1), sm(klon, klev+1), alpha(klon, klev)
58 
59  REAL m2(klon, klev+1), dz(klon, klev+1), zq, n2(klon, klev+1)
60  REAL l(klon, klev+1), l0(klon)
61 
62  REAL sq(klon), sqz(klon), zz(klon, klev+1)
63  INTEGER iter
64 
65  REAL ric, rifc, b1, kap
66  SAVE ric, rifc, b1, kap
67  DATA ric, rifc, b1, kap/0.195, 0.191, 16.6, 0.3/
68  !$OMP THREADPRIVATE(ric,rifc,b1,kap)
69 
70  REAL frif, falpha, fsm
71 
72  frif(ri) = 0.6588*(ri+0.1776-sqrt(ri*ri-0.3221*ri+0.03156))
73  falpha(ri) = 1.318*(0.2231-ri)/(0.2341-ri)
74  fsm(ri) = 1.96*(0.1912-ri)*(0.2341-ri)/((1.-ri)*(0.2231-ri))
75 
76  nlay = klev
77  nlev = klev + 1
78 
79  IF (0==1 .AND. first) THEN
80  DO ig = 1, 1000
81  ri = (ig-800.)/500.
82  IF (ri<ric) THEN
83  zrif = frif(ri)
84  ELSE
85  zrif = rifc
86  END IF
87  IF (zrif<0.16) THEN
88  zalpha = falpha(zrif)
89  zsm = fsm(zrif)
90  ELSE
91  zalpha = 1.12
92  zsm = 0.085
93  END IF
94  print *, ri, rif, zalpha, zsm
95  END DO
96  first = .false.
97  END IF
98 
99  ! Correction d'un bug sauvage a verifier.
100  ! do k=2,nlev
101  DO k = 2, nlay
102  DO ig = 1, ngrid
103  dz(ig, k) = zlay(ig, k) - zlay(ig, k-1)
104  m2(ig, k) = ((u(ig,k)-u(ig,k-1))**2+(v(ig,k)-v(ig, &
105  k-1))**2)/(dz(ig,k)*dz(ig,k))
106  n2(ig, k) = g*2.*(teta(ig,k)-teta(ig,k-1))/(teta(ig,k-1)+teta(ig,k))/ &
107  dz(ig, k)
108  ri = n2(ig, k)/max(m2(ig,k), 1.e-10)
109  IF (ri<ric) THEN
110  rif(ig, k) = frif(ri)
111  ELSE
112  rif(ig, k) = rifc
113  END IF
114  IF (rif(ig,k)<0.16) THEN
115  alpha(ig, k) = falpha(rif(ig,k))
116  sm(ig, k) = fsm(rif(ig,k))
117  ELSE
118  alpha(ig, k) = 1.12
119  sm(ig, k) = 0.085
120  END IF
121  zz(ig, k) = b1*m2(ig, k)*(1.-rif(ig,k))*sm(ig, k)
122  END DO
123  END DO
124 
125  ! iterration pour determiner la longueur de melange
126 
127  DO ig = 1, ngrid
128  l0(ig) = 100.
129  END DO
130  DO k = 2, klev - 1
131  DO ig = 1, ngrid
132  l(ig, k) = l0(ig)*kap*zlev(ig, k)/(kap*zlev(ig,k)+l0(ig))
133  END DO
134  END DO
135 
136  DO iter = 1, 10
137  DO ig = 1, ngrid
138  sq(ig) = 1.e-10
139  sqz(ig) = 1.e-10
140  END DO
141  DO k = 2, klev - 1
142  DO ig = 1, ngrid
143  q2(ig, k) = l(ig, k)**2*zz(ig, k)
144  l(ig, k) = min(l0(ig)*kap*zlev(ig,k)/(kap*zlev(ig, &
145  k)+l0(ig)), 0.5*sqrt(q2(ig,k))/sqrt(max(n2(ig,k),1.e-10)))
146  zq = sqrt(q2(ig,k))
147  sqz(ig) = sqz(ig) + zq*zlev(ig, k)*(zlay(ig,k)-zlay(ig,k-1))
148  sq(ig) = sq(ig) + zq*(zlay(ig,k)-zlay(ig,k-1))
149  END DO
150  END DO
151  DO ig = 1, ngrid
152  l0(ig) = 0.2*sqz(ig)/sq(ig)
153  END DO
154  ! (abd 3 5 2) print*,'ITER=',iter,' L0=',l0
155 
156  END DO
157 
158  DO k = 2, klev
159  DO ig = 1, ngrid
160  l(ig, k) = min(l0(ig)*kap*zlev(ig,k)/(kap*zlev(ig, &
161  k)+l0(ig)), 0.5*sqrt(q2(ig,k))/sqrt(max(n2(ig,k),1.e-10)))
162  q2(ig, k) = l(ig, k)**2*zz(ig, k)
163  km(ig, k) = l(ig, k)*sqrt(q2(ig,k))*sm(ig, k)
164  kn(ig, k) = km(ig, k)*alpha(ig, k)
165  END DO
166  END DO
167 
168  RETURN
169 END SUBROUTINE yamada
integer, save klon
Definition: dimphy.F90:3
integer, save klev
Definition: dimphy.F90:7
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL false
Definition: calcul_STDlev.h:26
subroutine yamada(ngrid, dt, g, rconst, plev, temp, zlev, zlay, u, v, teta, cd, q2, km, kn, ustar, l_mix)
Definition: yamada.F90:6
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL true
Definition: dimphy.F90:1