GCC Code Coverage Report


Directory: ./
File: phys/vdif_kcay.f90
Date: 2022-01-11 19:19:34
Exec Total Coverage
Lines: 0 183 0.0%
Branches: 0 106 0.0%

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