/[lmdze]/trunk/libf/phylmd/vdif_kcay.f90
ViewVC logotype

Contents of /trunk/libf/phylmd/vdif_kcay.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 62 - (show annotations)
Thu Jul 26 14:37:37 2012 UTC (11 years, 9 months ago) by guez
File size: 18963 byte(s)
Changed handling of compiler in compilation system.

Removed the prefix letters "y", "p", "t" or "z" in some names of variables.

Replaced calls to NetCDF by calls to NetCDF95.

Extracted "ioget_calendar" procedures from "calendar.f90" into a
separate file.

Extracted to a separate file, "mathop2.f90", procedures that were not
part of the generic interface "mathop" in "mathop.f90".

Removed computation of "dq" in "bilan_dyn", which was not used.

In "iniadvtrac", removed schemes 20 Slopes and 30 Prather. Was not
compatible with declarations of array sizes.

In "clcdrag", "ustarhb", "vdif_kcay", "yamada4" and "coefkz", changed
the size of some arrays from "klon" to "knon".

Removed possible call to "conema3" in "physiq".

Removed unused argument "cd" in "yamada".

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

  ViewVC Help
Powered by ViewVC 1.1.21