/[lmdze]/trunk/phylmd/vdif_kcay.f
ViewVC logotype

Contents of /trunk/phylmd/vdif_kcay.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 118 - (show annotations)
Thu Dec 18 17:30:24 2014 UTC (9 years, 4 months ago) by guez
File size: 18963 byte(s)
In file grilles_gcm.nc, renamed variable phis to orog, deleted
variable presnivs.

Removed variable bug_ozone from module clesphys.

In procedure ozonecm, moved computation of sint and cost out of the
loops on horizontal position and vertical level. Inverted the order of
the two loops. We can then move all computations from slat to aprim
out of the loop on vertical levels. Created variable slat2, following
LMDZ. Moved the limitation of column-density of ozone in cell at 1e-12
from radlwsw to ozonecm, following LMDZ.

Removed unused arguments u, albsol, rh, cldfra, rneb, diafra, cldliq,
pmflxr, pmflxs, prfl, psfl of phytrac.

In procedure yamada4, for all the arrays, replaced the dimension klon
by ngrid. At the end of the procedure, for the computation of kmn,kn,
kq and q2, changed the upper limit of the loop index from klon to ngrid.

In radlwsw, for the calculation of pozon, removed the factor
paprs(iof+i, 1)/101325, as in LMDZ. In procedure sw, removed the
factor 101325.0/PPSOL(JL), as in LMDZ.

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

  ViewVC Help
Powered by ViewVC 1.1.21