GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: phylmd/vdif_kcay.F90 Lines: 0 183 0.0 %
Date: 2023-06-30 12:51:15 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