1 |
module vdif_kcay_m |
2 |
|
3 |
IMPLICIT NONE |
4 |
|
5 |
contains |
6 |
|
7 |
SUBROUTINE vdif_kcay(ngrid, dt, g, rconst, plev, temp, zlev, zlay, u, v, & |
8 |
teta, cd, q2, q2diag, km, kn, ustar, l_mix) |
9 |
|
10 |
! From LMDZ4/libf/phylmd/vdif_kcay.F, version 1.1 2004/06/22 11:45:36 |
11 |
|
12 |
USE dimphy, ONLY: klev, klon |
13 |
use yamada_m, only: yamada |
14 |
|
15 |
INTEGER ngrid |
16 |
! dt : pas de temps |
17 |
! g : g |
18 |
! zlev : altitude a chaque niveau (interface inferieure de la couche |
19 |
! de meme indice) |
20 |
! zlay : altitude au centre de chaque couche |
21 |
! u, v : vitesse au centre de chaque couche |
22 |
! (en entree : la valeur au debut du pas de temps) |
23 |
! teta : temperature potentielle au centre de chaque couche |
24 |
! (en entree : la valeur au debut du pas de temps) |
25 |
! q2 : $q^2$ au bas de chaque couche |
26 |
! (en entree : la valeur au debut du pas de temps) |
27 |
! (en sortie : la valeur a la fin du pas de temps) |
28 |
! km : diffusivite turbulente de quantite de mouvement (au bas de chaque |
29 |
! couche) |
30 |
! (en sortie : la valeur a la fin du pas de temps) |
31 |
! kn : diffusivite turbulente des scalaires (au bas de chaque couche) |
32 |
! (en sortie : la valeur a la fin du pas de temps) |
33 |
|
34 |
REAL, intent(in):: dt |
35 |
real, intent(in):: g |
36 |
real rconst |
37 |
real plev(klon, klev+1), temp(klon, klev) |
38 |
real ustar(klon), snstable |
39 |
REAL zlev(klon, klev+1) |
40 |
REAL zlay(klon, klev) |
41 |
REAL u(klon, klev) |
42 |
REAL v(klon, klev) |
43 |
REAL teta(klon, klev) |
44 |
REAL, intent(in):: cd (:) ! (ngrid) cdrag, valeur au debut du pas de temps |
45 |
REAL q2(klon, klev+1) |
46 |
REAL q2diag(klon, klev+1) |
47 |
REAL km(klon, klev+1) |
48 |
REAL kn(klon, klev+1) |
49 |
real sq(klon), sqz(klon), zq, long0(klon) |
50 |
|
51 |
integer l_mix |
52 |
|
53 |
! nlay : nombre de couches |
54 |
! nlev : nombre de niveaux |
55 |
! ngrid : nombre de points de grille |
56 |
! unsdz : 1 sur l'epaisseur de couche |
57 |
! unsdzdec : 1 sur la distance entre le centre de la couche et le |
58 |
! centre de la couche inferieure |
59 |
! q : echelle de vitesse au bas de chaque couche |
60 |
! (valeur a la fin du pas de temps) |
61 |
|
62 |
INTEGER nlay, nlev |
63 |
REAL unsdz(klon, klev) |
64 |
REAL unsdzdec(klon, klev+1) |
65 |
REAL q(klon, klev+1) |
66 |
|
67 |
! kmpre : km au debut du pas de temps |
68 |
! qcstat : q : solution stationnaire du probleme couple |
69 |
! (valeur a la fin du pas de temps) |
70 |
! q2cstat : q2 : solution stationnaire du probleme couple |
71 |
! (valeur a la fin du pas de temps) |
72 |
|
73 |
REAL kmpre(klon, klev+1) |
74 |
REAL qcstat |
75 |
REAL q2cstat |
76 |
real sss, sssq |
77 |
|
78 |
! long : longueur de melange calculee selon Blackadar |
79 |
|
80 |
REAL long(klon, klev+1) |
81 |
|
82 |
! kmq3 : terme en q^3 dans le developpement de km |
83 |
! (valeur au debut du pas de temps) |
84 |
! kmcstat : valeur de km solution stationnaire du systeme {q2 ; du/dz} |
85 |
! (valeur a la fin du pas de temps) |
86 |
! knq3 : terme en q^3 dans le developpement de kn |
87 |
! mcstat : valeur de m solution stationnaire du systeme {q2 ; du/dz} |
88 |
! (valeur a la fin du pas de temps) |
89 |
! m2cstat : valeur de m2 solution stationnaire du systeme {q2 ; du/dz} |
90 |
! (valeur a la fin du pas de temps) |
91 |
! m : valeur a la fin du pas de temps |
92 |
! mpre : valeur au debut du pas de temps |
93 |
! m2 : valeur a la fin du pas de temps |
94 |
! n2 : valeur a la fin du pas de temps |
95 |
|
96 |
REAL kmq3 |
97 |
REAL kmcstat |
98 |
REAL knq3 |
99 |
REAL mcstat |
100 |
REAL m2cstat |
101 |
REAL m(klon, klev+1) |
102 |
REAL mpre(klon, klev+1) |
103 |
REAL m2(klon, klev+1) |
104 |
REAL n2(klon, klev+1) |
105 |
|
106 |
! gn : intermediaire pour les coefficients de stabilite |
107 |
! gnmin : borne inferieure de gn (-0.23 ou -0.28) |
108 |
! gnmax : borne superieure de gn (0.0233) |
109 |
! gninf : vrai si gn est en dessous de sa borne inferieure |
110 |
! gnsup : vrai si gn est en dessus de sa borne superieure |
111 |
! gm : drole d'objet bien utile |
112 |
! ri : nombre de Richardson |
113 |
! sn : coefficient de stabilite pour n |
114 |
! snq2 : premier terme du developement limite de sn en q2 |
115 |
! sm : coefficient de stabilite pour m |
116 |
! smq2 : premier terme du developement limite de sm en q2 |
117 |
|
118 |
REAL gn |
119 |
REAL gnmin |
120 |
REAL gnmax |
121 |
LOGICAL gninf |
122 |
LOGICAL gnsup |
123 |
REAL gm |
124 |
! REAL ri(klon, klev+1) |
125 |
REAL sn(klon, klev+1) |
126 |
REAL snq2(klon, klev+1) |
127 |
REAL sm(klon, klev+1) |
128 |
REAL smq2(klon, klev+1) |
129 |
|
130 |
! kappa : consatnte de Von Karman (0.4) |
131 |
! long00 : longueur de reference pour le calcul de long (160) |
132 |
! a1, a2, b1, b2, c1 : constantes d'origine pour les coefficients |
133 |
! de stabilite (0.92/0.74/16.6/10.1/0.08) |
134 |
! cn1, cn2 : constantes pour sn |
135 |
! cm1, cm2, cm3, cm4 : constantes pour sm |
136 |
|
137 |
REAL kappa |
138 |
REAL long00 |
139 |
REAL a1, a2, b1, b2, c1 |
140 |
REAL cn1, cn2 |
141 |
REAL cm1, cm2, cm3, cm4 |
142 |
|
143 |
! termq : termes en $q$ dans l'equation de q2 |
144 |
! termq3 : termes en $q^3$ dans l'equation de q2 |
145 |
! termqm2 : termes en $q*m^2$ dans l'equation de q2 |
146 |
! termq3m2 : termes en $q^3*m^2$ dans l'equation de q2 |
147 |
|
148 |
REAL termq |
149 |
REAL termq3 |
150 |
REAL termqm2 |
151 |
REAL termq3m2 |
152 |
|
153 |
! q2min : borne inferieure de q2 |
154 |
! q2max : borne superieure de q2 |
155 |
|
156 |
REAL q2min |
157 |
REAL q2max |
158 |
|
159 |
! knmin : borne inferieure de kn |
160 |
! kmmin : borne inferieure de km |
161 |
|
162 |
REAL knmin |
163 |
REAL kmmin |
164 |
|
165 |
INTEGER ilay, ilev, igrid |
166 |
REAL tmp1, tmp2 |
167 |
|
168 |
PARAMETER (kappa=0.4E+0) |
169 |
PARAMETER (long00=160.E+0) |
170 |
! PARAMETER (gnmin=-10.E+0) |
171 |
PARAMETER (gnmin=-0.28) |
172 |
PARAMETER (gnmax=0.0233E+0) |
173 |
PARAMETER (a1=0.92E+0) |
174 |
PARAMETER (a2=0.74E+0) |
175 |
PARAMETER (b1=16.6E+0) |
176 |
PARAMETER (b2=10.1E+0) |
177 |
PARAMETER (c1=0.08E+0) |
178 |
PARAMETER (knmin=1.E-5) |
179 |
PARAMETER (kmmin=1.E-5) |
180 |
PARAMETER (q2min=1.e-5) |
181 |
PARAMETER (q2max=1.E+2) |
182 |
PARAMETER (nlay=klev) |
183 |
PARAMETER (nlev=klev+1) |
184 |
|
185 |
PARAMETER (cn1=a2*(1.E+0 -6.E+0 *a1/b1)) |
186 |
PARAMETER (cn2=-3.E+0 *a2*(6.E+0 *a1+b2)) |
187 |
PARAMETER (cm1=a1*(1.E+0 -3.E+0 *c1-6.E+0 *a1/b1)) |
188 |
PARAMETER (cm2=a1*(-3.E+0 *a2*((b2-3.E+0 *a2)*(1.E+0 -6.E+0 *a1/b1) & |
189 |
-3.E+0 *c1*(b2+6.E+0 *a1)))) |
190 |
PARAMETER (cm3=-3.E+0 *a2*(6.E+0 *a1+b2)) |
191 |
PARAMETER (cm4=-9.E+0 *a1*a2) |
192 |
|
193 |
logical:: first = .true. |
194 |
|
195 |
!------------------------------------------------------------ |
196 |
|
197 |
! traitment des valeur de q2 en entree |
198 |
|
199 |
! Initialisation de q2 |
200 |
|
201 |
call yamada(ngrid, g, rconst, plev, temp, zlev, zlay, u, v, teta, & |
202 |
q2diag, km, kn, ustar, l_mix) |
203 |
if (first.and.1.eq.1) then |
204 |
first=.false. |
205 |
q2=q2diag |
206 |
endif |
207 |
|
208 |
DO ilev=1, nlev |
209 |
DO igrid=1, ngrid |
210 |
q2(igrid, ilev)=amax1(q2(igrid, ilev), q2min) |
211 |
q(igrid, ilev)=sqrt(q2(igrid, ilev)) |
212 |
ENDDO |
213 |
ENDDO |
214 |
|
215 |
DO igrid=1, ngrid |
216 |
tmp1=cd(igrid)*(u(igrid, 1)**2+v(igrid, 1)**2) |
217 |
q2(igrid, 1)=b1**(2.E+0/3.E+0)*tmp1 |
218 |
q2(igrid, 1)=amax1(q2(igrid, 1), q2min) |
219 |
q(igrid, 1)=sqrt(q2(igrid, 1)) |
220 |
ENDDO |
221 |
|
222 |
! les increments verticaux |
223 |
|
224 |
! allerte !c |
225 |
! zlev n'est pas declare a nlev !c |
226 |
DO igrid=1, ngrid |
227 |
zlev(igrid, nlev)=zlay(igrid, nlay) & |
228 |
+( zlay(igrid, nlay) - zlev(igrid, nlev-1) ) |
229 |
ENDDO |
230 |
! allerte !c |
231 |
|
232 |
DO ilay=1, nlay |
233 |
DO igrid=1, ngrid |
234 |
unsdz(igrid, ilay)=1.E+0/(zlev(igrid, ilay+1)-zlev(igrid, ilay)) |
235 |
ENDDO |
236 |
ENDDO |
237 |
DO igrid=1, ngrid |
238 |
unsdzdec(igrid, 1)=1.E+0/(zlay(igrid, 1)-zlev(igrid, 1)) |
239 |
ENDDO |
240 |
DO ilay=2, nlay |
241 |
DO igrid=1, ngrid |
242 |
unsdzdec(igrid, ilay)=1.E+0/(zlay(igrid, ilay)-zlay(igrid, ilay-1)) |
243 |
ENDDO |
244 |
ENDDO |
245 |
DO igrid=1, ngrid |
246 |
unsdzdec(igrid, nlay+1)=1.E+0/(zlev(igrid, nlay+1)-zlay(igrid, nlay)) |
247 |
ENDDO |
248 |
|
249 |
! le cisaillement et le gradient de temperature |
250 |
|
251 |
DO igrid=1, ngrid |
252 |
m2(igrid, 1)=(unsdzdec(igrid, 1) & |
253 |
*u(igrid, 1))**2 & |
254 |
+(unsdzdec(igrid, 1) & |
255 |
*v(igrid, 1))**2 |
256 |
m(igrid, 1)=sqrt(m2(igrid, 1)) |
257 |
mpre(igrid, 1)=m(igrid, 1) |
258 |
ENDDO |
259 |
|
260 |
DO ilev=2, nlev-1 |
261 |
DO igrid=1, ngrid |
262 |
|
263 |
n2(igrid, ilev)=g*unsdzdec(igrid, ilev) & |
264 |
*(teta(igrid, ilev)-teta(igrid, ilev-1)) & |
265 |
/(teta(igrid, ilev)+teta(igrid, ilev-1)) *2.E+0 |
266 |
|
267 |
! on ne sais traiter que les cas stratifies. et l'ajustement |
268 |
! convectif est cense faire en sorte que seul des |
269 |
! configurations stratifiees soient rencontrees en entree de |
270 |
! cette routine. mais, bon ... on sait jamais (meme on sait |
271 |
! que n2 prends quelques valeurs negatives ... parfois) |
272 |
! alors : |
273 |
|
274 |
IF (n2(igrid, ilev).lt.0.E+0) THEN |
275 |
n2(igrid, ilev)=0.E+0 |
276 |
ENDIF |
277 |
|
278 |
m2(igrid, ilev)=(unsdzdec(igrid, ilev) & |
279 |
*(u(igrid, ilev)-u(igrid, ilev-1)))**2 & |
280 |
+(unsdzdec(igrid, ilev) & |
281 |
*(v(igrid, ilev)-v(igrid, ilev-1)))**2 |
282 |
m(igrid, ilev)=sqrt(m2(igrid, ilev)) |
283 |
mpre(igrid, ilev)=m(igrid, ilev) |
284 |
|
285 |
ENDDO |
286 |
ENDDO |
287 |
|
288 |
DO igrid=1, ngrid |
289 |
m2(igrid, nlev)=m2(igrid, nlev-1) |
290 |
m(igrid, nlev)=m(igrid, nlev-1) |
291 |
mpre(igrid, nlev)=m(igrid, nlev) |
292 |
ENDDO |
293 |
|
294 |
! calcul des fonctions de stabilite |
295 |
|
296 |
if (l_mix.eq.4) then |
297 |
DO igrid=1, ngrid |
298 |
sqz(igrid)=1.e-10 |
299 |
sq(igrid)=1.e-10 |
300 |
ENDDO |
301 |
do ilev=2, nlev-1 |
302 |
DO igrid=1, ngrid |
303 |
zq=sqrt(q2(igrid, ilev)) |
304 |
sqz(igrid) & |
305 |
=sqz(igrid)+zq*zlev(igrid, ilev) & |
306 |
*(zlay(igrid, ilev)-zlay(igrid, ilev-1)) |
307 |
sq(igrid)=sq(igrid)+zq*(zlay(igrid, ilev)-zlay(igrid, ilev-1)) |
308 |
ENDDO |
309 |
enddo |
310 |
DO igrid=1, ngrid |
311 |
long0(igrid)=0.2*sqz(igrid)/sq(igrid) |
312 |
ENDDO |
313 |
else if (l_mix.eq.3) then |
314 |
long0(igrid)=long00 |
315 |
endif |
316 |
|
317 |
DO ilev=2, nlev-1 |
318 |
DO igrid=1, ngrid |
319 |
tmp1=kappa*(zlev(igrid, ilev)-zlev(igrid, 1)) |
320 |
if (l_mix.ge.10) then |
321 |
long(igrid, ilev)=l_mix |
322 |
else |
323 |
long(igrid, ilev)=tmp1/(1.E+0 + tmp1/long0(igrid)) |
324 |
endif |
325 |
long(igrid, ilev)=max(min(long(igrid, ilev) & |
326 |
, 0.5*sqrt(q2(igrid, ilev))/sqrt(max(n2(igrid, ilev), 1.e-10))) & |
327 |
, 5.) |
328 |
|
329 |
gn=-long(igrid, ilev)**2 / q2(igrid, ilev) & |
330 |
* n2(igrid, ilev) |
331 |
gm=long(igrid, ilev)**2 / q2(igrid, ilev) & |
332 |
* m2(igrid, ilev) |
333 |
|
334 |
gninf=.false. |
335 |
gnsup=.false. |
336 |
long(igrid, ilev)=long(igrid, ilev) |
337 |
long(igrid, ilev)=long(igrid, ilev) |
338 |
|
339 |
IF (gn.lt.gnmin) THEN |
340 |
gninf=.true. |
341 |
gn=gnmin |
342 |
ENDIF |
343 |
|
344 |
IF (gn.gt.gnmax) THEN |
345 |
gnsup=.true. |
346 |
gn=gnmax |
347 |
ENDIF |
348 |
|
349 |
sn(igrid, ilev)=cn1/(1.E+0 +cn2*gn) |
350 |
sm(igrid, ilev)= & |
351 |
(cm1+cm2*gn) & |
352 |
/( (1.E+0 +cm3*gn) & |
353 |
*(1.E+0 +cm4*gn) ) |
354 |
|
355 |
IF ((gninf).or.(gnsup)) THEN |
356 |
snq2(igrid, ilev)=0.E+0 |
357 |
smq2(igrid, ilev)=0.E+0 |
358 |
ELSE |
359 |
snq2(igrid, ilev)= & |
360 |
-gn & |
361 |
*(-cn1*cn2/(1.E+0 +cn2*gn)**2 ) |
362 |
smq2(igrid, ilev)= & |
363 |
-gn & |
364 |
*( cm2*(1.E+0 +cm3*gn) & |
365 |
*(1.E+0 +cm4*gn) & |
366 |
-( cm3*(1.E+0 +cm4*gn) & |
367 |
+cm4*(1.E+0 +cm3*gn) ) & |
368 |
*(cm1+cm2*gn) ) & |
369 |
/( (1.E+0 +cm3*gn) & |
370 |
*(1.E+0 +cm4*gn) )**2 |
371 |
ENDIF |
372 |
! la decomposition de Taylor en q2 n'a de sens que dans les |
373 |
! cas stratifies ou sn et sm sont quasi proportionnels a |
374 |
! q2. ailleurs on laisse le meme algorithme car l'ajustement |
375 |
! convectif fait le travail. mais c'est delirant quand sn |
376 |
! et snq2 n'ont pas le meme signe : dans ces cas, on ne fait |
377 |
! pas la decomposition. |
378 |
|
379 |
IF (snq2(igrid, ilev)*sn(igrid, ilev).le.0.E+0) & |
380 |
snq2(igrid, ilev)=0.E+0 |
381 |
IF (smq2(igrid, ilev)*sm(igrid, ilev).le.0.E+0) & |
382 |
smq2(igrid, ilev)=0.E+0 |
383 |
|
384 |
! Correction pour les couches stables. |
385 |
! Schema repris de JHoltzlag Boville, lui meme venant de... |
386 |
|
387 |
if (1.eq.1) then |
388 |
snstable=1.-zlev(igrid, ilev) & |
389 |
/(700.*max(ustar(igrid), 0.0001)) |
390 |
snstable=1.-zlev(igrid, ilev)/400. |
391 |
snstable=max(snstable, 0.) |
392 |
snstable=snstable*snstable |
393 |
|
394 |
if (sn(igrid, ilev).lt.snstable) then |
395 |
sn(igrid, ilev)=snstable |
396 |
snq2(igrid, ilev)=0. |
397 |
endif |
398 |
|
399 |
if (sm(igrid, ilev).lt.snstable) then |
400 |
sm(igrid, ilev)=snstable |
401 |
smq2(igrid, ilev)=0. |
402 |
endif |
403 |
endif |
404 |
|
405 |
! sn : coefficient de stabilite pour n |
406 |
! snq2 : premier terme du developement limite de sn en q2 |
407 |
ENDDO |
408 |
ENDDO |
409 |
|
410 |
! calcul de km et kn au debut du pas de temps |
411 |
|
412 |
DO igrid=1, ngrid |
413 |
kn(igrid, 1)=knmin |
414 |
km(igrid, 1)=kmmin |
415 |
kmpre(igrid, 1)=km(igrid, 1) |
416 |
ENDDO |
417 |
|
418 |
DO ilev=2, nlev-1 |
419 |
DO igrid=1, ngrid |
420 |
kn(igrid, ilev)=long(igrid, ilev)*q(igrid, ilev) & |
421 |
*sn(igrid, ilev) |
422 |
km(igrid, ilev)=long(igrid, ilev)*q(igrid, ilev) & |
423 |
*sm(igrid, ilev) |
424 |
kmpre(igrid, ilev)=km(igrid, ilev) |
425 |
ENDDO |
426 |
ENDDO |
427 |
|
428 |
DO igrid=1, ngrid |
429 |
kn(igrid, nlev)=kn(igrid, nlev-1) |
430 |
km(igrid, nlev)=km(igrid, nlev-1) |
431 |
kmpre(igrid, nlev)=km(igrid, nlev) |
432 |
ENDDO |
433 |
|
434 |
! boucle sur les niveaux 2 a nlev-1 |
435 |
|
436 |
DO ilev=2, nlev-1 |
437 |
DO igrid=1, ngrid |
438 |
! calcul des termes sources et puits de l'equation de q2 |
439 |
|
440 |
knq3=kn(igrid, ilev)*snq2(igrid, ilev) & |
441 |
/sn(igrid, ilev) |
442 |
kmq3=km(igrid, ilev)*smq2(igrid, ilev) & |
443 |
/sm(igrid, ilev) |
444 |
|
445 |
termq=0.E+0 |
446 |
termq3=0.E+0 |
447 |
termqm2=0.E+0 |
448 |
termq3m2=0.E+0 |
449 |
|
450 |
tmp1=dt*2.E+0 *km(igrid, ilev)*m2(igrid, ilev) |
451 |
tmp2=dt*2.E+0 *kmq3*m2(igrid, ilev) |
452 |
termqm2=termqm2 & |
453 |
+dt*2.E+0 *km(igrid, ilev)*m2(igrid, ilev) & |
454 |
-dt*2.E+0 *kmq3*m2(igrid, ilev) |
455 |
termq3m2=termq3m2 & |
456 |
+dt*2.E+0 *kmq3*m2(igrid, ilev) |
457 |
|
458 |
termq=termq & |
459 |
-dt*2.E+0 *kn(igrid, ilev)*n2(igrid, ilev) & |
460 |
+dt*2.E+0 *knq3*n2(igrid, ilev) |
461 |
termq3=termq3 & |
462 |
-dt*2.E+0 *knq3*n2(igrid, ilev) |
463 |
|
464 |
termq3=termq3 & |
465 |
-dt*2.E+0 *q(igrid, ilev)**3 / (b1*long(igrid, ilev)) |
466 |
|
467 |
! resolution stationnaire couplee avec le gradient de vitesse local |
468 |
|
469 |
! on cherche le cisaillement qui annule l'equation de q^2 |
470 |
! supposee en q3 |
471 |
|
472 |
tmp1=termq+termq3 |
473 |
tmp2=termqm2+termq3m2 |
474 |
m2cstat=m2(igrid, ilev) & |
475 |
-(tmp1+tmp2)/(dt*2.E+0*km(igrid, ilev)) |
476 |
mcstat=sqrt(m2cstat) |
477 |
|
478 |
! puis on ecrit la valeur de q qui annule l'equation de m |
479 |
! supposee en q3 |
480 |
|
481 |
IF (ilev.eq.2) THEN |
482 |
kmcstat=1.E+0 / mcstat & |
483 |
*( unsdz(igrid, ilev)*kmpre(igrid, ilev+1) & |
484 |
*mpre(igrid, ilev+1) & |
485 |
+unsdz(igrid, ilev-1) & |
486 |
*cd(igrid) & |
487 |
*( sqrt(u(igrid, 3)**2+v(igrid, 3)**2) & |
488 |
-mcstat/unsdzdec(igrid, ilev) & |
489 |
-mpre(igrid, ilev+1)/unsdzdec(igrid, ilev+1) )**2) & |
490 |
/( unsdz(igrid, ilev)+unsdz(igrid, ilev-1) ) |
491 |
ELSE |
492 |
kmcstat=1.E+0 / mcstat & |
493 |
*( unsdz(igrid, ilev)*kmpre(igrid, ilev+1) & |
494 |
*mpre(igrid, ilev+1) & |
495 |
+unsdz(igrid, ilev-1)*kmpre(igrid, ilev-1) & |
496 |
*mpre(igrid, ilev-1) ) & |
497 |
/( unsdz(igrid, ilev)+unsdz(igrid, ilev-1) ) |
498 |
ENDIF |
499 |
tmp2=kmcstat & |
500 |
/( sm(igrid, ilev)/q2(igrid, ilev) ) & |
501 |
/long(igrid, ilev) |
502 |
qcstat=tmp2**(1.E+0/3.E+0) |
503 |
q2cstat=qcstat**2 |
504 |
|
505 |
! choix de la solution finale |
506 |
|
507 |
q(igrid, ilev)=qcstat |
508 |
q2(igrid, ilev)=q2cstat |
509 |
m(igrid, ilev)=mcstat |
510 |
m2(igrid, ilev)=m2cstat |
511 |
|
512 |
! pour des raisons simples q2 est minore |
513 |
|
514 |
IF (q2(igrid, ilev).lt.q2min) THEN |
515 |
q2(igrid, ilev)=q2min |
516 |
q(igrid, ilev)=sqrt(q2min) |
517 |
ENDIF |
518 |
|
519 |
! calcul final de kn et km |
520 |
|
521 |
gn=-long(igrid, ilev)**2 / q2(igrid, ilev) & |
522 |
* n2(igrid, ilev) |
523 |
IF (gn.lt.gnmin) gn=gnmin |
524 |
IF (gn.gt.gnmax) gn=gnmax |
525 |
sn(igrid, ilev)=cn1/(1.E+0 +cn2*gn) |
526 |
sm(igrid, ilev)= & |
527 |
(cm1+cm2*gn) & |
528 |
/( (1.E+0 +cm3*gn)*(1.E+0 +cm4*gn) ) |
529 |
kn(igrid, ilev)=long(igrid, ilev)*q(igrid, ilev) & |
530 |
*sn(igrid, ilev) |
531 |
km(igrid, ilev)=long(igrid, ilev)*q(igrid, ilev) & |
532 |
*sm(igrid, ilev) |
533 |
end DO |
534 |
end DO |
535 |
|
536 |
DO igrid=1, ngrid |
537 |
kn(igrid, 1)=knmin |
538 |
km(igrid, 1)=kmmin |
539 |
q2(igrid, nlev)=q2(igrid, nlev-1) |
540 |
q(igrid, nlev)=q(igrid, nlev-1) |
541 |
kn(igrid, nlev)=kn(igrid, nlev-1) |
542 |
km(igrid, nlev)=km(igrid, nlev-1) |
543 |
ENDDO |
544 |
|
545 |
! CALCUL DE LA DIFFUSION VERTICALE DE Q2 |
546 |
if (1.eq.1) then |
547 |
do ilev=2, klev-1 |
548 |
sss=sss+plev(1, ilev-1)-plev(1, ilev+1) |
549 |
sssq=sssq+(plev(1, ilev-1)-plev(1, ilev+1))*q2(1, ilev) |
550 |
enddo |
551 |
do ilev=2, klev-1 |
552 |
sss=sss+plev(1, ilev-1)-plev(1, ilev+1) |
553 |
sssq=sssq+(plev(1, ilev-1)-plev(1, ilev+1))*q2(1, ilev) |
554 |
enddo |
555 |
print*, 'Q2moy apres', sssq/sss |
556 |
|
557 |
do ilev=1, nlev |
558 |
do igrid=1, ngrid |
559 |
q2(igrid, ilev)=max(q2(igrid, ilev), q2min) |
560 |
q(igrid, ilev)=sqrt(q2(igrid, ilev)) |
561 |
|
562 |
! calcul final de kn et km |
563 |
|
564 |
gn=-long(igrid, ilev)**2 / q2(igrid, ilev) & |
565 |
* n2(igrid, ilev) |
566 |
IF (gn.lt.gnmin) gn=gnmin |
567 |
IF (gn.gt.gnmax) gn=gnmax |
568 |
sn(igrid, ilev)=cn1/(1.E+0 +cn2*gn) |
569 |
sm(igrid, ilev)= & |
570 |
(cm1+cm2*gn) & |
571 |
/( (1.E+0 +cm3*gn)*(1.E+0 +cm4*gn) ) |
572 |
! Correction pour les couches stables. |
573 |
! Schema repris de JHoltzlag Boville, lui meme venant de... |
574 |
|
575 |
if (1.eq.1) then |
576 |
snstable=1.-zlev(igrid, ilev) & |
577 |
/(700.*max(ustar(igrid), 0.0001)) |
578 |
snstable=1.-zlev(igrid, ilev)/400. |
579 |
snstable=max(snstable, 0.) |
580 |
snstable=snstable*snstable |
581 |
|
582 |
if (sn(igrid, ilev).lt.snstable) then |
583 |
sn(igrid, ilev)=snstable |
584 |
snq2(igrid, ilev)=0. |
585 |
endif |
586 |
|
587 |
if (sm(igrid, ilev).lt.snstable) then |
588 |
sm(igrid, ilev)=snstable |
589 |
smq2(igrid, ilev)=0. |
590 |
endif |
591 |
endif |
592 |
|
593 |
! sn : coefficient de stabilite pour n |
594 |
kn(igrid, ilev)=long(igrid, ilev)*q(igrid, ilev) & |
595 |
*sn(igrid, ilev) |
596 |
km(igrid, ilev)=long(igrid, ilev)*q(igrid, ilev) |
597 |
enddo |
598 |
enddo |
599 |
endif |
600 |
|
601 |
END SUBROUTINE vdif_kcay |
602 |
|
603 |
end module vdif_kcay_m |