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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 145 - (show annotations)
Tue Jun 16 15:23:29 2015 UTC (8 years, 11 months ago) by guez
File size: 5062 byte(s)
Renamed bibio to misc.

In procedure fxhyp, use the fact that xf is an odd function of xtild.

In procedure invert_zoom_x, replace linear search in xf by
bisection. Also, use result from previous loop iteration as initial
guess. Variable "it" cannot be equal to 2 * nmax after search.

Unused arguments: hm of cv3_feed; ph, qnk, tv,tvp of cv3_mixing; ppsol
of lw; rconst, temp of vdif_kcay; rconst, plev, temp, ustar, l_mix of
yamada.

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, nlev
47 PARAMETER (nlay=klev)
48 PARAMETER (nlev=klev+1)
49
50 LOGICAL first
51 SAVE first
52 DATA first/.TRUE./
53
54
55 INTEGER ig, k
56
57 REAL ri, zrif, zalpha, zsm
58 REAL rif(klon, klev+1), sm(klon, klev+1), alpha(klon, klev)
59
60 REAL m2(klon, klev+1), dz(klon, klev+1), zq, n2(klon, klev+1)
61 REAL l(klon, klev+1), l0(klon)
62
63 REAL sq(klon), sqz(klon), zz(klon, klev+1)
64 INTEGER iter
65
66 REAL ric, rifc, b1, kap
67 SAVE ric, rifc, b1, kap
68 DATA ric, rifc, b1, kap/0.195, 0.191, 16.6, 0.3/
69
70 IF (0==1 .AND. first) THEN
71 DO ig = 1, 1000
72 ri = (ig-800.)/500.
73 IF (ri<ric) THEN
74 zrif = frif(ri)
75 ELSE
76 zrif = rifc
77 END IF
78 IF (zrif<0.16) THEN
79 zalpha = falpha(zrif)
80 zsm = fsm(zrif)
81 ELSE
82 zalpha = 1.12
83 zsm = 0.085
84 END IF
85 PRINT *, ri, rif, zalpha, zsm
86 END DO
87 first = .FALSE.
88 END IF
89
90 ! Correction d'un bug sauvage a verifier.
91 ! do k=2,nlev
92 DO k = 2, nlay
93 DO ig = 1, ngrid
94 dz(ig, k) = zlay(ig, k) - zlay(ig, k-1)
95 m2(ig, k) = ((u(ig,k)-u(ig,k-1))**2+(v(ig,k)-v(ig, &
96 k-1))**2)/(dz(ig,k)*dz(ig,k))
97 n2(ig, k) = g*2.*(teta(ig,k)-teta(ig,k-1))/(teta(ig,k-1)+teta(ig,k))/ &
98 dz(ig, k)
99 ri = n2(ig, k)/max(m2(ig,k), 1.E-10)
100 IF (ri<ric) THEN
101 rif(ig, k) = frif(ri)
102 ELSE
103 rif(ig, k) = rifc
104 END IF
105 IF (rif(ig,k)<0.16) THEN
106 alpha(ig, k) = falpha(rif(ig,k))
107 sm(ig, k) = fsm(rif(ig,k))
108 ELSE
109 alpha(ig, k) = 1.12
110 sm(ig, k) = 0.085
111 END IF
112 zz(ig, k) = b1*m2(ig, k)*(1.-rif(ig,k))*sm(ig, k)
113 END DO
114 END DO
115
116 ! iterration pour determiner la longueur de melange
117
118 DO ig = 1, ngrid
119 l0(ig) = 100.
120 END DO
121 DO k = 2, klev - 1
122 DO ig = 1, ngrid
123 l(ig, k) = l0(ig)*kap*zlev(ig, k)/(kap*zlev(ig,k)+l0(ig))
124 END DO
125 END DO
126
127 DO iter = 1, 10
128 DO ig = 1, ngrid
129 sq(ig) = 1.E-10
130 sqz(ig) = 1.E-10
131 END DO
132 DO k = 2, klev - 1
133 DO ig = 1, ngrid
134 q2(ig, k) = l(ig, k)**2*zz(ig, k)
135 l(ig, k) = min(l0(ig)*kap*zlev(ig,k)/(kap*zlev(ig, &
136 k)+l0(ig)), 0.5*sqrt(q2(ig,k))/sqrt(max(n2(ig,k),1.E-10)))
137 zq = sqrt(q2(ig,k))
138 sqz(ig) = sqz(ig) + zq*zlev(ig, k)*(zlay(ig,k)-zlay(ig,k-1))
139 sq(ig) = sq(ig) + zq*(zlay(ig,k)-zlay(ig,k-1))
140 END DO
141 END DO
142 DO ig = 1, ngrid
143 l0(ig) = 0.2*sqz(ig)/sq(ig)
144 END DO
145 ! (abd 3 5 2) print*,'ITER=',iter,' L0=',l0
146
147 END DO
148
149 DO k = 2, klev
150 DO ig = 1, ngrid
151 l(ig, k) = min(l0(ig)*kap*zlev(ig,k)/(kap*zlev(ig, &
152 k)+l0(ig)), 0.5*sqrt(q2(ig,k))/sqrt(max(n2(ig,k),1.E-10)))
153 q2(ig, k) = l(ig, k)**2*zz(ig, k)
154 km(ig, k) = l(ig, k)*sqrt(q2(ig,k))*sm(ig, k)
155 kn(ig, k) = km(ig, k)*alpha(ig, k)
156 END DO
157 END DO
158
159 contains
160
161 REAL function frif(ri)
162 real ri
163 frif = 0.6588*(ri+0.1776-sqrt(ri*ri-0.3221*ri+0.03156))
164 end function frif
165
166 REAL function falpha(ri)
167 real ri
168 falpha = 1.318*(0.2231-ri)/(0.2341-ri)
169 end function falpha
170
171 REAL function fsm(ri)
172 real ri
173 fsm = 1.96*(0.1912-ri)*(0.2341-ri)/((1.-ri)*(0.2231-ri))
174 end function fsm
175
176 END SUBROUTINE yamada
177
178 end module yamada_m

  ViewVC Help
Powered by ViewVC 1.1.21