/[lmdze]/trunk/Sources/phylmd/yamada.f
ViewVC logotype

Contents of /trunk/Sources/phylmd/yamada.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 188 - (show annotations)
Tue Mar 22 16:31:39 2016 UTC (8 years, 1 month ago) by guez
File size: 5028 byte(s)
Removed argument ncum of cv30_unsat, arguments nloc, ncum, nd, na of cv30_yield.

1 module yamada_m
2
3 IMPLICIT NONE
4
5 contains
6
7 SUBROUTINE yamada(ngrid, g, zlev, zlay, u, v, teta, q2, km, kn)
8
9 ! From LMDZ4/libf/phylmd/yamada.F,v 1.1 2004/06/22 11:45:36
10
11 USE dimens_m
12 USE dimphy
13 ! .......................................................................
14 ! .......................................................................
15
16 ! g : g
17 ! zlev : altitude a chaque niveau (interface inferieure de la couche
18 ! de meme indice)
19 ! zlay : altitude au centre de chaque couche
20 ! u,v : vitesse au centre de chaque couche
21 ! (en entree : la valeur au debut du pas de temps)
22 ! teta : temperature potentielle au centre de chaque couche
23 ! (en entree : la valeur au debut du pas de temps)
24 ! q2 : $q^2$ au bas de chaque couche
25 ! (en entree : la valeur au debut du pas de temps)
26 ! (en sortie : la valeur a la fin du pas de temps)
27 ! km : diffusivite turbulente de quantite de mouvement (au bas de chaque
28 ! couche)
29 ! (en sortie : la valeur a la fin du pas de temps)
30 ! kn : diffusivite turbulente des scalaires (au bas de chaque couche)
31 ! (en sortie : la valeur a la fin du pas de temps)
32
33 ! .......................................................................
34 REAL, INTENT (IN) :: g
35 REAL zlev(klon, klev+1)
36 REAL zlay(klon, klev)
37 REAL u(klon, klev)
38 REAL v(klon, klev)
39 REAL teta(klon, klev)
40 REAL q2(klon, klev+1)
41 REAL km(klon, klev+1)
42 REAL kn(klon, klev+1)
43 INTEGER ngrid
44
45
46 INTEGER nlay
47 PARAMETER (nlay=klev)
48
49 LOGICAL first
50 SAVE first
51 DATA first/.TRUE./
52
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
69 IF (0==1 .AND. first) THEN
70 DO ig = 1, 1000
71 ri = (ig-800.)/500.
72 IF (ri<ric) THEN
73 zrif = frif(ri)
74 ELSE
75 zrif = rifc
76 END IF
77 IF (zrif<0.16) THEN
78 zalpha = falpha(zrif)
79 zsm = fsm(zrif)
80 ELSE
81 zalpha = 1.12
82 zsm = 0.085
83 END IF
84 PRINT *, ri, rif, zalpha, zsm
85 END DO
86 first = .FALSE.
87 END IF
88
89 ! Correction d'un bug sauvage a verifier.
90 ! do k=2,nlev
91 DO k = 2, nlay
92 DO ig = 1, ngrid
93 dz(ig, k) = zlay(ig, k) - zlay(ig, k-1)
94 m2(ig, k) = ((u(ig,k)-u(ig,k-1))**2+(v(ig,k)-v(ig, &
95 k-1))**2)/(dz(ig,k)*dz(ig,k))
96 n2(ig, k) = g*2.*(teta(ig,k)-teta(ig,k-1))/(teta(ig,k-1)+teta(ig,k))/ &
97 dz(ig, k)
98 ri = n2(ig, k)/max(m2(ig,k), 1.E-10)
99 IF (ri<ric) THEN
100 rif(ig, k) = frif(ri)
101 ELSE
102 rif(ig, k) = rifc
103 END IF
104 IF (rif(ig,k)<0.16) THEN
105 alpha(ig, k) = falpha(rif(ig,k))
106 sm(ig, k) = fsm(rif(ig,k))
107 ELSE
108 alpha(ig, k) = 1.12
109 sm(ig, k) = 0.085
110 END IF
111 zz(ig, k) = b1*m2(ig, k)*(1.-rif(ig,k))*sm(ig, k)
112 END DO
113 END DO
114
115 ! iterration pour determiner la longueur de melange
116
117 DO ig = 1, ngrid
118 l0(ig) = 100.
119 END DO
120 DO k = 2, klev - 1
121 DO ig = 1, ngrid
122 l(ig, k) = l0(ig)*kap*zlev(ig, k)/(kap*zlev(ig,k)+l0(ig))
123 END DO
124 END DO
125
126 DO iter = 1, 10
127 DO ig = 1, ngrid
128 sq(ig) = 1.E-10
129 sqz(ig) = 1.E-10
130 END DO
131 DO k = 2, klev - 1
132 DO ig = 1, ngrid
133 q2(ig, k) = l(ig, k)**2*zz(ig, k)
134 l(ig, k) = min(l0(ig)*kap*zlev(ig,k)/(kap*zlev(ig, &
135 k)+l0(ig)), 0.5*sqrt(q2(ig,k))/sqrt(max(n2(ig,k),1.E-10)))
136 zq = sqrt(q2(ig,k))
137 sqz(ig) = sqz(ig) + zq*zlev(ig, k)*(zlay(ig,k)-zlay(ig,k-1))
138 sq(ig) = sq(ig) + zq*(zlay(ig,k)-zlay(ig,k-1))
139 END DO
140 END DO
141 DO ig = 1, ngrid
142 l0(ig) = 0.2*sqz(ig)/sq(ig)
143 END DO
144 ! (abd 3 5 2) print*,'ITER=',iter,' L0=',l0
145
146 END DO
147
148 DO k = 2, klev
149 DO ig = 1, ngrid
150 l(ig, k) = min(l0(ig)*kap*zlev(ig,k)/(kap*zlev(ig, &
151 k)+l0(ig)), 0.5*sqrt(q2(ig,k))/sqrt(max(n2(ig,k),1.E-10)))
152 q2(ig, k) = l(ig, k)**2*zz(ig, k)
153 km(ig, k) = l(ig, k)*sqrt(q2(ig,k))*sm(ig, k)
154 kn(ig, k) = km(ig, k)*alpha(ig, k)
155 END DO
156 END DO
157
158 contains
159
160 REAL function frif(ri)
161 real ri
162 frif = 0.6588*(ri+0.1776-sqrt(ri*ri-0.3221*ri+0.03156))
163 end function frif
164
165 REAL function falpha(ri)
166 real ri
167 falpha = 1.318*(0.2231-ri)/(0.2341-ri)
168 end function falpha
169
170 REAL function fsm(ri)
171 real ri
172 fsm = 1.96*(0.1912-ri)*(0.2341-ri)/((1.-ri)*(0.2231-ri))
173 end function fsm
174
175 END SUBROUTINE yamada
176
177 end module yamada_m

  ViewVC Help
Powered by ViewVC 1.1.21