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

Contents of /trunk/phylmd/vdif_kcay.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 108 - (show annotations)
Tue Sep 16 14:00:41 2014 UTC (9 years, 7 months ago) by guez
File size: 18952 byte(s)
Imported writefield from LMDZ. Close at the end of gcm the files which
were created by writefiled (not done in LMDZ).

Removed procedures for the output of Grads files. Removed calls to
dump2d. In guide, replaced calls to wrgrads by calls to writefield.

In vlspltqs, removed redundant programming of saturation
pressure. Call foeew from module FCTTRE instead.

Bug fix in interpre: size of w exceeding size of correponding actual
argument wg in advtrac.

In leapfrog, call guide until the end of the run, instead of six hours
before the end.

Bug fix in readsulfate_preind: type of arguments.

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

  ViewVC Help
Powered by ViewVC 1.1.21