GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: phylmd/yamada4.F90 Lines: 186 336 55.4 %
Date: 2023-06-30 12:56:34 Branches: 186 326 57.1 %

Line Branch Exec Source
1
!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2
3
1152
SUBROUTINE yamada4(ni, nsrf, ngrid, dt, g, rconst, plev, temp, zlev, zlay, u, v, teta, &
4
1152
    cd, tke, km, kn, kq, ustar, iflag_pbl, drgpro)
5
6
  USE dimphy, only : klev,klon
7
  USE phys_local_var_mod, only: tke_dissip,wprime
8
  USE yamada_ini_mod, only : new_yamada4,yamada4_num,hboville
9
  USE yamada_ini_mod, only : prt_level, lunout,pbl_lmixmin_alpha,b1,kap,viscom,viscoh
10
  USE yamada_ini_mod, only : ric, yun,ydeux,lmixmin
11
12
  IMPLICIT NONE
13
  ! ************************************************************************************************
14
  !
15
  ! yamada4: subroutine qui calcule le transfert turbulent avec une fermeture d'ordre 2 ou 2.5
16
  !
17
  ! Reference: Simulation of nocturnal drainage flows by a q2l Turbulence Closure Model
18
  !            Yamada T.
19
  !            J. Atmos. Sci, 40, 91-106, 1983
20
  !
21
  !************************************************************************************************
22
  ! Input :
23
  !'======
24
  ! ni: indice horizontal sur la grille de base, non restreinte
25
  ! nsrf: type de surface
26
  ! ngrid: nombre de mailles concern??es sur l'horizontal
27
  ! dt : pas de temps
28
  ! g  : g
29
  ! rconst: constante de l'air sec
30
  ! zlev : altitude a chaque niveau (interface inferieure de la couche
31
  ! de meme indice)
32
  ! zlay : altitude au centre de chaque couche
33
  ! u,v : vitesse au centre de chaque couche
34
  ! (en entree : la valeur au debut du pas de temps)
35
  ! teta : temperature potentielle virtuelle au centre de chaque couche
36
  ! (en entree : la valeur au debut du pas de temps)
37
  ! cd : cdrag pour la quantit?? de mouvement
38
  ! (en entree : la valeur au debut du pas de temps)
39
  ! ustar: vitesse de friction calcul??e par une formule diagnostique
40
  ! iflag_pbl: flag pour choisir des options du sch??ma de turbulence
41
  !
42
  !             iflag_pbl doit valoir entre 6 et 9
43
  !             l=6, on prend  systematiquement une longueur d'equilibre
44
  !             iflag_pbl=6 : MY 2.0
45
  !             iflag_pbl=7 : MY 2.0.Fournier
46
  !             iflag_pbl=8/9 : MY 2.5
47
  !             iflag_pbl=8 with special obsolete treatments for convergence
48
  !             with Cmpi5 NPv3.1 simulations
49
  !             iflag_pbl=10/11 :  New scheme M2 and N2 explicit and dissiptation exact
50
  !             iflag_pbl=12 = 11 with vertical diffusion off q2
51
  !
52
  !             2013/04/01 (FH hourdin@lmd.jussieu.fr)
53
  !             Correction for very stable PBLs (iflag_pbl=10 and 11)
54
  !             iflag_pbl=8 converges numerically with NPv3.1
55
  !             iflag_pbl=11 -> the model starts with NP from start files created by ce0l
56
  !                          -> the model can run with longer time-steps.
57
  !             2016/11/30 (EV etienne.vignon@lmd.ipsl.fr)
58
  !               On met tke (=q2/2) en entr??e plut??t que q2
59
  !               On corrige l'update de la tke
60
  !             2020/10/01 (EV)
61
  !               On ajoute la dissipation de la TKE en diagnostique de sortie
62
  !
63
  ! Inpout/Output :
64
  !==============
65
  ! tke : tke au bas de chaque couche
66
  ! (en entree : la valeur au debut du pas de temps)
67
  ! (en sortie : la valeur a la fin du pas de temps)
68
69
  ! Outputs:
70
  !==========
71
  ! km : diffusivite turbulente de quantite de mouvement (au bas de chaque
72
  ! couche)
73
  ! (en sortie : la valeur a la fin du pas de temps)
74
  ! kn : diffusivite turbulente des scalaires (au bas de chaque couche)
75
  ! (en sortie : la valeur a la fin du pas de temps)
76
  !
77
  !.......................................................................
78
79
  !=======================================================================
80
  ! Declarations:
81
  !=======================================================================
82
83
84
  ! Inputs/Outputs
85
  !----------------
86
  REAL dt, g, rconst
87
  REAL plev(klon, klev+1), temp(klon, klev)
88
  REAL ustar(klon)
89
2304
  REAL kmin, qmin, pblhmin(klon), coriol(klon)
90
  REAL zlev(klon, klev+1)
91
  REAL zlay(klon, klev)
92
  REAL u(klon, klev)
93
  REAL v(klon, klev)
94
  REAL teta(klon, klev)
95
  REAL cd(klon)
96
  REAL tke(klon, klev+1)
97
2304
  REAL unsdz(klon, klev)
98
2304
  REAL unsdzdec(klon, klev+1)
99
  REAL kn(klon, klev+1)
100
  REAL km(klon, klev+1)
101
  INTEGER iflag_pbl, ngrid, nsrf
102
  INTEGER ni(klon)
103
104
!FC
105
  REAL drgpro(klon,klev)
106
2304
  REAL winds(klon,klev)
107
108
  ! Local
109
  !-------
110
111
2304
  REAL q2(klon, klev+1)
112
2304
  REAL kmpre(klon, klev+1), tmp2, qpre
113
2304
  REAL mpre(klon, klev+1)
114
  REAL kq(klon, klev+1)
115
2304
  REAL ff(klon, klev+1), delta(klon, klev+1)
116
2304
  REAL aa(klon, klev+1), aa0, aa1
117
  INTEGER nlay, nlev
118
119
  INTEGER ig, jg, k
120
  REAL ri, zrif, zalpha, zsm, zsn
121
2304
  REAL rif(klon, klev+1), sm(klon, klev+1), alpha(klon, klev)
122
2304
  REAL m2(klon, klev+1), dz(klon, klev+1), zq, n2(klon, klev+1)
123
2304
  REAL dtetadz(klon, klev+1)
124
  REAL m2cstat, mcstat, kmcstat
125
2304
  REAL l(klon, klev+1)
126
2304
  REAL zz(klon, klev+1)
127
  INTEGER iter
128
2304
  REAL dissip(klon,klev), tkeprov,tkeexp, shear(klon,klev), buoy(klon,klev)
129
  REAL :: disseff
130
131
  REAL,SAVE :: rifc
132
  !$OMP THREADPRIVATE(rifc)
133
  REAL,SAVE :: seuilsm, seuilalpha
134
  !$OMP THREADPRIVATE(seuilsm, seuilalpha)
135
136
  REAL frif, falpha, fsm
137
  REAL rino(klon, klev+1), smyam(klon, klev), styam(klon, klev), &
138
    lyam(klon, klev), knyam(klon, klev), w2yam(klon, klev), t2yam(klon, klev)
139
140
  CHARACTER (len = 20) :: modname = 'yamada4'
141
  CHARACTER (len = 80) :: abort_message
142
143
144
145
  ! Fonctions utilis??es
146
  !--------------------
147
148
  frif(ri) = 0.6588*(ri+0.1776-sqrt(ri*ri-0.3221*ri+0.03156))
149
  falpha(ri) = 1.318*(0.2231-ri)/(0.2341-ri)
150
  fsm(ri) = 1.96*(0.1912-ri)*(0.2341-ri)/((1.-ri)*(0.2231-ri))
151
152
153
154
1152
    IF (new_yamada4) THEN
155
! Corrections et reglages issus du travail de these d'Etienne Vignon.
156
1152
       rifc=frif(ric)
157
1152
       seuilsm=fsm(frif(ric))
158
1152
       seuilalpha=falpha(frif(ric))
159
    ELSE
160
       rifc=0.191
161
       seuilalpha=1.12
162
       seuilsm=0.085
163
    ENDIF
164
165
!===============================================================================
166
! Flags, tests et ??valuations de constantes
167
!===============================================================================
168
169
! On utilise ou non la routine de Holstalg Boville pour les cas tres stables
170
171
172
1152
  IF (.NOT. (iflag_pbl>=6 .AND. iflag_pbl<=12)) THEN
173
    abort_message='probleme de coherence dans appel a MY'
174
    CALL abort_physic(modname,abort_message,1)
175
  END IF
176
177
178
1152
  nlay = klev
179
1152
  nlev = klev + 1
180
181
182
!========================================================================
183
! Calcul des increments verticaux
184
!=========================================================================
185
186
187
! Attention: zlev n'est pas declare a nlev
188
473954
  DO ig = 1, ngrid
189
473954
    zlev(ig, nlev) = zlay(ig, nlay) + (zlay(ig,nlay)-zlev(ig,nlev-1))
190
  END DO
191
192
193
46080
  DO k = 1, nlay
194
18485358
    DO ig = 1, ngrid
195
18484206
      unsdz(ig, k) = 1.E+0/(zlev(ig,k+1)-zlev(ig,k))
196
    END DO
197
  END DO
198
473954
  DO ig = 1, ngrid
199
473954
    unsdzdec(ig, 1) = 1.E+0/(zlay(ig,1)-zlev(ig,1))
200
  END DO
201
44928
  DO k = 2, nlay
202
18011404
    DO ig = 1, ngrid
203
18010252
      unsdzdec(ig, k) = 1.E+0/(zlay(ig,k)-zlay(ig,k-1))
204
    END DO
205
  END DO
206
473954
  DO ig = 1, ngrid
207
473954
    unsdzdec(ig, nlay+1) = 1.E+0/(zlev(ig,nlay+1)-zlay(ig,nlay))
208
  END DO
209
210
!=========================================================================
211
! Richardson number and stability functions
212
!=========================================================================
213
214
! initialize arrays:
215
216

18959312
  m2(1:ngrid, :) = 0.0
217

18959312
  sm(1:ngrid, :) = 0.0
218

18959312
  rif(1:ngrid, :) = 0.0
219
220
!------------------------------------------------------------
221
44928
  DO k = 2, klev
222
223
18011404
    DO ig = 1, ngrid
224
17966476
      dz(ig, k) = zlay(ig, k) - zlay(ig, k-1)
225
      m2(ig, k) = ((u(ig,k)-u(ig,k-1))**2+(v(ig,k)-v(ig, &
226
17966476
        k-1))**2)/(dz(ig,k)*dz(ig,k))
227
17966476
      dtetadz(ig, k) = (teta(ig,k)-teta(ig,k-1))/dz(ig, k)
228
17966476
      n2(ig, k) = g*2.*dtetadz(ig, k)/(teta(ig,k-1)+teta(ig,k))
229
17966476
      ri = n2(ig, k)/max(m2(ig,k), 1.E-10)
230
17966476
      IF (ri<ric) THEN
231
598145
        rif(ig, k) = frif(ri)
232
      ELSE
233
17368331
        rif(ig, k) = rifc
234
      END IF
235
17966476
if (new_yamada4) then
236
17966476
        alpha(ig, k) = max(falpha(rif(ig,k)),seuilalpha)
237
17966476
        sm(ig, k) = max(fsm(rif(ig,k)),seuilsm)
238
else
239
      IF (rif(ig,k)<0.16) THEN
240
        alpha(ig, k) = falpha(rif(ig,k))
241
        sm(ig, k) = fsm(rif(ig,k))
242
      ELSE
243
        alpha(ig, k) = seuilalpha
244
        sm(ig, k) = seuilsm
245
      END IF
246
247
end if
248
18010252
      zz(ig, k) = b1*m2(ig, k)*(1.-rif(ig,k))*sm(ig, k)
249
    END DO
250
  END DO
251
252
253
254
255
256
  !=======================================================================
257
  !     DIFFERENT TYPES  DE SCHEMA de  YAMADA
258
  !=======================================================================
259
260
  ! On commence par calculer q2 a partir de la tke
261
262
1152
  IF (new_yamada4) THEN
263
47232
      DO k=1,klev+1
264
18959312
         q2(1:ngrid,k)=tke(1:ngrid,k)*ydeux
265
      ENDDO
266
  ELSE
267
      DO k=1,klev+1
268
         q2(1:ngrid,k)=tke(1:ngrid,k)
269
      ENDDO
270
  ENDIF
271
272
! ====================================================================
273
! Computing the mixing length
274
! ====================================================================
275
276
277
1152
  CALL mixinglength(ni,nsrf,ngrid,iflag_pbl,pbl_lmixmin_alpha,lmixmin,zlay,zlev,u,v,q2,n2, l)
278
279
280
  !--------------
281
  ! Yamada 2.0
282
  !--------------
283
1152
  IF (iflag_pbl==6) THEN
284
285
    DO k = 2, klev
286
      q2(1:ngrid, k) = l(1:ngrid, k)**2*zz(1:ngrid, k)
287
    END DO
288
289
290
  !------------------
291
  ! Yamada 2.Fournier
292
  !------------------
293
294
1152
  ELSE IF (iflag_pbl==7) THEN
295
296
297
    ! Calcul de l,  km, au pas precedent
298
    !....................................
299
    DO k = 2, klev
300
      DO ig = 1, ngrid
301
        delta(ig, k) = q2(ig, k)/(l(ig,k)**2*sm(ig,k))
302
        kmpre(ig, k) = l(ig, k)*sqrt(q2(ig,k))*sm(ig, k)
303
        mpre(ig, k) = sqrt(m2(ig,k))
304
      END DO
305
    END DO
306
307
    DO k = 2, klev - 1
308
      DO ig = 1, ngrid
309
        m2cstat = max(alpha(ig,k)*n2(ig,k)+delta(ig,k)/b1, 1.E-12)
310
        mcstat = sqrt(m2cstat)
311
312
     ! Puis on ecrit la valeur de q qui annule l'equation de m supposee en q3
313
     !.........................................................................
314
315
        IF (k==2) THEN
316
          kmcstat = 1.E+0/mcstat*(unsdz(ig,k)*kmpre(ig,k+1)*mpre(ig,k+1)+ &
317
            unsdz(ig,k-1)*cd(ig)*(sqrt(u(ig,3)**2+v(ig,3)**2)-mcstat/unsdzdec &
318
            (ig,k)-mpre(ig,k+1)/unsdzdec(ig,k+1))**2)/(unsdz(ig,k)+unsdz(ig,k &
319
            -1))
320
        ELSE
321
          kmcstat = 1.E+0/mcstat*(unsdz(ig,k)*kmpre(ig,k+1)*mpre(ig,k+1)+ &
322
            unsdz(ig,k-1)*kmpre(ig,k-1)*mpre(ig,k-1))/ &
323
            (unsdz(ig,k)+unsdz(ig,k-1))
324
        END IF
325
326
        tmp2 = kmcstat/(sm(ig,k)/q2(ig,k))/l(ig, k)
327
        q2(ig, k) = max(tmp2, 1.E-12)**(2./3.)
328
329
      END DO
330
    END DO
331
332
333
    ! ------------------------
334
    ! Yamada 2.5 a la Didi
335
    !-------------------------
336
337
1152
  ELSE IF (iflag_pbl==8 .OR. iflag_pbl==9) THEN
338
339
    ! Calcul de l, km, au pas precedent
340
    !....................................
341
    DO k = 2, klev
342
      DO ig = 1, ngrid
343
        delta(ig, k) = q2(ig, k)/(l(ig,k)**2*sm(ig,k))
344
        IF (delta(ig,k)<1.E-20) THEN
345
          delta(ig, k) = 1.E-20
346
        END IF
347
        km(ig, k) = l(ig, k)*sqrt(q2(ig,k))*sm(ig, k)
348
        aa0 = (m2(ig,k)-alpha(ig,k)*n2(ig,k)-delta(ig,k)/b1)
349
        aa1 = (m2(ig,k)*(1.-rif(ig,k))-delta(ig,k)/b1)
350
        aa(ig, k) = aa1*dt/(delta(ig,k)*l(ig,k))
351
        qpre = sqrt(q2(ig,k))
352
        IF (aa(ig,k)>0.) THEN
353
          q2(ig, k) = (qpre+aa(ig,k)*qpre*qpre)**2
354
        ELSE
355
          q2(ig, k) = (qpre/(1.-aa(ig,k)*qpre))**2
356
        END IF
357
        ! else ! iflag_pbl=9
358
        ! if (aa(ig,k)*qpre.gt.0.9) then
359
        ! q2(ig,k)=(qpre*10.)**2
360
        ! else
361
        ! q2(ig,k)=(qpre/(1.-aa(ig,k)*qpre))**2
362
        ! endif
363
        ! endif
364
        q2(ig, k) = min(max(q2(ig,k),1.E-10), 1.E4)
365
      END DO
366
    END DO
367
368
1152
  ELSE IF (iflag_pbl>=10) THEN
369
370

44704512
    shear(:,:)=0.
371

44704512
    buoy(:,:)=0.
372

44704512
    dissip(:,:)=0.
373

45850752
    km(:,:)=0.
374
375
1152
    IF (yamada4_num>=1) THEN
376
377
43776
    DO k = 2, klev - 1
378
17537450
      DO ig=1,ngrid
379
17493674
      q2(ig, k) = min(max(q2(ig,k),1.E-10), 1.E4)
380
17493674
      km(ig, k) = l(ig, k)*sqrt(q2(ig,k))*sm(ig, k)
381
17493674
      shear(ig,k)=km(ig, k)*m2(ig, k)
382
17493674
      buoy(ig,k)=km(ig, k)*m2(ig, k)*(-1.*rif(ig,k))
383
!      dissip(ig,k)=min(max(((sqrt(q2(ig,k)))**3)/(b1*l(ig,k)),1.E-12),1.E4)
384
17536298
      dissip(ig,k)=((sqrt(q2(ig,k)))**3)/(b1*l(ig,k))
385
     ENDDO
386
    ENDDO
387
388
1152
    IF (yamada4_num==1) THEN ! Schema du MAR tel quel
389
       DO k = 2, klev - 1
390
         DO ig=1,ngrid
391
         tkeprov=q2(ig,k)/ydeux
392
         tkeprov= tkeprov*                           &
393
           &  (tkeprov+dt*(shear(ig,k)+max(0.,buoy(ig,k))))/ &
394
           &  (tkeprov+dt*((-1.)*min(0.,buoy(ig,k))+dissip(ig,k)+drgpro(ig,k)*tkeprov))
395
         q2(ig,k)=tkeprov*ydeux
396
        ENDDO
397
       ENDDO
398
1152
    ELSE IF (yamada4_num==2) THEN ! version modifiee avec integration exacte pour la dissipation
399
       DO k = 2, klev - 1
400
         DO ig=1,ngrid
401
         tkeprov=q2(ig,k)/ydeux
402
         disseff=dissip(ig,k)-min(0.,buoy(ig,k))
403
         tkeprov = tkeprov/(1.+dt*disseff/(2.*tkeprov))**2
404
         tkeprov= tkeprov+dt*(shear(ig,k)+max(0.,buoy(ig,k)))
405
         q2(ig,k)=tkeprov*ydeux
406
         ! En cas stable, on traite la flotabilite comme la
407
         ! dissipation, en supposant que buoy/q2^3 est constant.
408
         ! Puis on prend la solution exacte
409
        ENDDO
410
       ENDDO
411
1152
    ELSE IF (yamada4_num==3) THEN ! version modifiee avec integration exacte pour la dissipation
412
       DO k = 2, klev - 1
413
         DO ig=1,ngrid
414
         tkeprov=q2(ig,k)/ydeux
415
         disseff=dissip(ig,k)-min(0.,buoy(ig,k))
416
         tkeprov=tkeprov*exp(-dt*disseff/tkeprov)
417
         tkeprov= tkeprov+dt*(shear(ig,k)+max(0.,buoy(ig,k)))
418
         q2(ig,k)=tkeprov*ydeux
419
         ! En cas stable, on traite la flotabilite comme la
420
         ! dissipation, en supposant que buoy/q2^3 est constant.
421
         ! Puis on prend la solution exacte
422
        ENDDO
423
       ENDDO
424
1152
    ELSE IF (yamada4_num==4) THEN ! version modifiee avec integration exacte pour la dissipation
425
       DO k = 2, klev - 1
426
         DO ig=1,ngrid
427
         tkeprov=q2(ig,k)/ydeux
428
         tkeprov= tkeprov+dt*(shear(ig,k)+max(0.,buoy(ig,k)))
429
         tkeprov= tkeprov*                           &
430
           &  tkeprov/ &
431
           &  (tkeprov+dt*((-1.)*min(0.,buoy(ig,k))+dissip(ig,k)))
432
         q2(ig,k)=tkeprov*ydeux
433
         ! En cas stable, on traite la flotabilite comme la
434
         ! dissipation, en supposant que buoy/q2^3 est constant.
435
         ! Puis on prend la solution exacte
436
        ENDDO
437
       ENDDO
438
439
      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
440
      !! Attention, yamada4_num=5 est inexacte car néglige les termes de flottabilité
441
      !! en conditions instables
442
      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
443
1152
    ELSE IF (yamada4_num==5) THEN ! version modifiee avec integration exacte pour la dissipation
444
43776
       DO k = 2, klev - 1
445
17537450
         DO ig=1,ngrid
446
17493674
         tkeprov=q2(ig,k)/ydeux
447
!FC on ajoute la dissipation due aux arbres
448
17493674
         disseff=dissip(ig,k)-min(0.,buoy(ig,k)) + drgpro(ig,k)*tkeprov
449
17493674
         tkeexp=exp(-dt*disseff/tkeprov)
450
! on prend en compte la tke cree par les arbres
451
17493674
         winds(ig,k)=sqrt(u(ig,k)**2+v(ig,k)**2)
452
         tkeprov= (shear(ig,k)+ &
453
17493674
          & drgpro(ig,k)*(winds(ig,k))**3)*tkeprov/disseff*(1.-tkeexp)+tkeprov*tkeexp
454
17536298
         q2(ig,k)=tkeprov*ydeux
455
         ! En cas stable, on traite la flotabilite comme la
456
         ! dissipation, en supposant que buoy/q2^3 est constant.
457
         ! Puis on prend la solution exacte
458
        ENDDO
459
       ENDDO
460
    ELSE IF (yamada4_num==6) THEN ! version modifiee avec integration exacte pour la dissipation
461
       DO k = 2, klev - 1
462
         DO ig=1,ngrid
463
         ! En cas stable, on traite la flotabilite comme la
464
         ! dissipation, en supposant que dissipeff/TKE est constant.
465
         ! Puis on prend la solution exacte
466
         ! With drag and dissipation from high vegetation (EV & FC, 05/10/2020)
467
         winds(ig,k)=sqrt(u(ig,k)**2+v(ig,k)**2)
468
         tkeprov=q2(ig,k)/ydeux
469
         tkeprov=tkeprov+max(buoy(ig,k)+shear(ig,k)+drgpro(ig,k)*(winds(ig,k))**3,0.)*dt
470
         disseff=dissip(ig,k)-min(0.,buoy(ig,k)+shear(ig,k)+drgpro(ig,k)*(winds(ig,k))**3) + drgpro(ig,k)*tkeprov
471
         tkeexp=exp(-dt*disseff/tkeprov)
472
         tkeprov= tkeprov*tkeexp
473
         q2(ig,k)=tkeprov*ydeux
474
475
        ENDDO
476
       ENDDO
477
    ENDIF
478
479
43776
    DO k = 2, klev - 1
480
17537450
      DO ig=1,ngrid
481
17536298
      q2(ig, k) = min(max(q2(ig,k),1.E-10), 1.E4)
482
      ENDDO
483
    ENDDO
484
485
   ELSE
486
487
    DO k = 2, klev - 1
488
      km(1:ngrid, k) = l(1:ngrid, k)*sqrt(q2(1:ngrid,k))*sm(1:ngrid, k)
489
      q2(1:ngrid, k) = q2(1:ngrid, k) + ydeux*dt*km(1:ngrid, k)*m2(1:ngrid, k)*(1.-rif(1:ngrid,k))
490
!     q2(1:ngrid, k) = q2(1:ngrid, k) + dt*km(1:ngrid, k)*m2(1:ngrid, k)*(1.-rif(1:ngrid,k))
491
      q2(1:ngrid, k) = min(max(q2(1:ngrid,k),1.E-10), 1.E4)
492
       q2(1:ngrid, k) = 1./(1./sqrt(q2(1:ngrid,k))+dt/(yun*l(1:ngrid,k)*b1))
493
!     q2(1:ngrid, k) = 1./(1./sqrt(q2(1:ngrid,k))+dt/(2*l(1:ngrid,k)*b1))
494
      q2(1:ngrid, k) = q2(1:ngrid, k)*q2(1:ngrid, k)
495
    END DO
496
497
  ENDIF
498
499
  ELSE
500
     abort_message='Cas nom prevu dans yamada4'
501
     CALL abort_physic(modname,abort_message,1)
502
503
  END IF ! Fin du cas 8
504
505
506
  ! ====================================================================
507
  ! Calcul des coefficients de melange
508
  ! ====================================================================
509
510
44928
  DO k = 2, klev
511
18011404
    DO ig = 1, ngrid
512
17966476
      zq = sqrt(q2(ig,k))
513
17966476
      km(ig, k) = l(ig, k)*zq*sm(ig, k)     ! For momentum
514
17966476
      kn(ig, k) = km(ig, k)*alpha(ig, k)    ! For scalars
515
18010252
      kq(ig, k) = l(ig, k)*zq*0.2           ! For TKE
516
    END DO
517
  END DO
518
519
520
  !====================================================================
521
  ! Transport diffusif vertical de la TKE par la TKE
522
  !====================================================================
523
524
525
    ! initialize near-surface and top-layer mixing coefficients
526
    !...........................................................
527
528
473954
  kq(1:ngrid, 1) = kq(1:ngrid, 2)    ! constant (ie no gradient) near the surface
529
473954
  kq(1:ngrid, klev+1) = 0            ! zero at the top
530
531
    ! Transport diffusif vertical de la TKE.
532
    !.......................................
533
534
1152
  IF (iflag_pbl>=12) THEN
535
473954
    q2(1:ngrid, 1) = q2(1:ngrid, 2)
536
1152
    CALL vdif_q2(dt, g, rconst, ngrid, plev, temp, kq, q2)
537
  END IF
538
539
540
  !====================================================================
541
  ! Traitement particulier pour les cas tres stables, introduction d'une
542
  ! longueur de m??lange minimale
543
  !====================================================================
544
  !
545
  ! Reference: Local versus Nonlocal boundary-layer diffusion in a global climate model
546
  !            Holtslag A.A.M. and Boville B.A.
547
  !            J. Clim., 6, 1825-1842, 1993
548
549
550
1152
 IF (hboville) THEN
551
552
553
  IF (prt_level>1) THEN
554
    WRITE(lunout,*) 'YAMADA4 0'
555
  END IF
556
557
  DO ig = 1, ngrid
558
    coriol(ig) = 1.E-4
559
    pblhmin(ig) = 0.07*ustar(ig)/max(abs(coriol(ig)), 2.546E-5)
560
  END DO
561
562
  IF (1==1) THEN
563
    IF (iflag_pbl==8 .OR. iflag_pbl==10) THEN
564
565
      DO k = 2, klev
566
        DO ig = 1, ngrid
567
          IF (teta(ig,2)>teta(ig,1)) THEN
568
            qmin = ustar(ig)*(max(1.-zlev(ig,k)/pblhmin(ig),0.))**2
569
            kmin = kap*zlev(ig, k)*qmin
570
          ELSE
571
            kmin = -1. ! kmin n'est utilise que pour les SL stables.
572
          END IF
573
          IF (kn(ig,k)<kmin .OR. km(ig,k)<kmin) THEN
574
575
            kn(ig, k) = kmin
576
            km(ig, k) = kmin
577
            kq(ig, k) = kmin
578
579
 ! la longueur de melange est suposee etre l= kap z
580
 ! K=l q Sm d'ou q2=(K/l Sm)**2
581
582
            q2(ig, k) = (qmin/sm(ig,k))**2
583
          END IF
584
        END DO
585
      END DO
586
587
    ELSE
588
      DO k = 2, klev
589
        DO ig = 1, ngrid
590
          IF (teta(ig,2)>teta(ig,1)) THEN
591
            qmin = ustar(ig)*(max(1.-zlev(ig,k)/pblhmin(ig),0.))**2
592
            kmin = kap*zlev(ig, k)*qmin
593
          ELSE
594
            kmin = -1. ! kmin n'est utilise que pour les SL stables.
595
          END IF
596
          IF (kn(ig,k)<kmin .OR. km(ig,k)<kmin) THEN
597
            kn(ig, k) = kmin
598
            km(ig, k) = kmin
599
            kq(ig, k) = kmin
600
 ! la longueur de melange est suposee etre l= kap z
601
 ! K=l q Sm d'ou q2=(K/l Sm)**2
602
            sm(ig, k) = 1.
603
            alpha(ig, k) = 1.
604
            q2(ig, k) = min((qmin/sm(ig,k))**2, 10.)
605
            zq = sqrt(q2(ig,k))
606
            km(ig, k) = l(ig, k)*zq*sm(ig, k)
607
            kn(ig, k) = km(ig, k)*alpha(ig, k)
608
            kq(ig, k) = l(ig, k)*zq*0.2
609
          END IF
610
        END DO
611
      END DO
612
    END IF
613
614
  END IF
615
616
 END IF ! hboville
617
618
! Ajout d'une viscosite moleculaire
619

18011404
   km(1:ngrid,2:klev)=km(1:ngrid,2:klev)+viscom
620

18011404
   kn(1:ngrid,2:klev)=kn(1:ngrid,2:klev)+viscoh
621

18011404
   kq(1:ngrid,2:klev)=kq(1:ngrid,2:klev)+viscoh
622
623
1152
  IF (prt_level>1) THEN
624
    WRITE(lunout,*)'YAMADA4 1'
625
  END IF !(prt_level>1) THEN
626
627
628
 !======================================================
629
 ! Estimations de w'2 et T'2 d'apres Abdela et McFarlane
630
 !======================================================
631
 !
632
 ! Reference: A New Second-Order Turbulence Closure Scheme for the Planetary Boundary Layer
633
 !            Abdella K and McFarlane N
634
 !            J. Atmos. Sci., 54, 1850-1867, 1997
635
636
  ! Diagnostique pour stokage
637
  !..........................
638
639
  IF (1==0) THEN
640
    rino = rif
641
    smyam(1:ngrid, 1) = 0.
642
    styam(1:ngrid, 1) = 0.
643
    lyam(1:ngrid, 1) = 0.
644
    knyam(1:ngrid, 1) = 0.
645
    w2yam(1:ngrid, 1) = 0.
646
    t2yam(1:ngrid, 1) = 0.
647
648
    smyam(1:ngrid, 2:klev) = sm(1:ngrid, 2:klev)
649
    styam(1:ngrid, 2:klev) = sm(1:ngrid, 2:klev)*alpha(1:ngrid, 2:klev)
650
    lyam(1:ngrid, 2:klev) = l(1:ngrid, 2:klev)
651
    knyam(1:ngrid, 2:klev) = kn(1:ngrid, 2:klev)
652
653
654
  ! Calcul de w'2 et T'2
655
  !.......................
656
657
    w2yam(1:ngrid, 2:klev) = q2(1:ngrid, 2:klev)*0.24 + &
658
      lyam(1:ngrid, 2:klev)*5.17*kn(1:ngrid, 2:klev)*n2(1:ngrid, 2:klev)/ &
659
      sqrt(q2(1:ngrid,2:klev))
660
661
    t2yam(1:ngrid, 2:klev) = 9.1*kn(1:ngrid, 2:klev)* &
662
      dtetadz(1:ngrid, 2:klev)**2/sqrt(q2(1:ngrid,2:klev))* &
663
      lyam(1:ngrid, 2:klev)
664
  END IF
665
666
667
668
!============================================================================
669
! Mise a jour de la tke
670
!============================================================================
671
672
1152
  IF (new_yamada4) THEN
673
47232
     DO k=1,klev+1
674
18959312
        tke(1:ngrid,k)=q2(1:ngrid,k)/ydeux
675
     ENDDO
676
  ELSE
677
     DO k=1,klev+1
678
        tke(1:ngrid,k)=q2(1:ngrid,k)
679
     ENDDO
680
  ENDIF
681
682
683
!============================================================================
684
! Diagnostique de la dissipation et vitesse verticale
685
!============================================================================
686
687
! Diagnostics
688

18959312
 tke_dissip(1:ngrid,:,nsrf)=0.
689

18959312
 wprime(1:ngrid,:,nsrf)=0.
690
44928
 DO k=2,klev
691
18011404
    DO ig=1,ngrid
692
17966476
       jg=ni(ig)
693
17966476
       wprime(jg,k,nsrf)=sqrt(MAX(1./3*q2(ig,k),0.))
694
18010252
       tke_dissip(jg,k,nsrf)=dissip(ig,k)
695
    ENDDO
696
 ENDDO
697
698
!=============================================================================
699
700
1152
  RETURN
701
702
703
END SUBROUTINE yamada4
704
705
!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
706
707
!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
708
1152
SUBROUTINE vdif_q2(timestep, gravity, rconst, ngrid, plev, temp, kmy, q2)
709
710
  USE dimphy, only : klev,klon
711
  IMPLICIT NONE
712
713
!    vdif_q2: subroutine qui calcule la diffusion de la TKE par la TKE
714
!             avec un schema implicite en temps avec
715
!             inversion d'un syst??me tridiagonal
716
!
717
!     Reference: Description of the interface with the surface and
718
!                the computation of the turbulet diffusion in LMDZ
719
!                Technical note on LMDZ
720
!                Dufresne, J-L, Ghattas, J. and Grandpeix, J-Y
721
!
722
!============================================================================
723
! Declarations
724
!============================================================================
725
726
  REAL plev(klon, klev+1)
727
  REAL temp(klon, klev)
728
  REAL timestep
729
  REAL gravity, rconst
730
2304
  REAL kstar(klon, klev+1), zz
731
  REAL kmy(klon, klev+1)
732
  REAL q2(klon, klev+1)
733
2304
  REAL deltap(klon, klev+1)
734
1152
  REAL denom(klon, klev+1), alpha(klon, klev+1), beta(klon, klev+1)
735
  INTEGER ngrid
736
737
  INTEGER i, k
738
739
740
!=========================================================================
741
! Calcul
742
!=========================================================================
743
744
46080
  DO k = 1, klev
745
18485358
    DO i = 1, ngrid
746
18439278
      zz = (plev(i,k)+plev(i,k+1))*gravity/(rconst*temp(i,k))
747
      kstar(i, k) = 0.125*(kmy(i,k+1)+kmy(i,k))*zz*zz/ &
748
18484206
        (plev(i,k)-plev(i,k+1))*timestep
749
    END DO
750
  END DO
751
752
44928
  DO k = 2, klev
753
18011404
    DO i = 1, ngrid
754
18010252
      deltap(i, k) = 0.5*(plev(i,k-1)-plev(i,k+1))
755
    END DO
756
  END DO
757
473954
  DO i = 1, ngrid
758
472802
    deltap(i, 1) = 0.5*(plev(i,1)-plev(i,2))
759
472802
    deltap(i, klev+1) = 0.5*(plev(i,klev)-plev(i,klev+1))
760
472802
    denom(i, klev+1) = deltap(i, klev+1) + kstar(i, klev)
761
472802
    alpha(i, klev+1) = deltap(i, klev+1)*q2(i, klev+1)/denom(i, klev+1)
762
473954
    beta(i, klev+1) = kstar(i, klev)/denom(i, klev+1)
763
  END DO
764
765
44928
  DO k = klev, 2, -1
766
18011404
    DO i = 1, ngrid
767
      denom(i, k) = deltap(i, k) + (1.-beta(i,k+1))*kstar(i, k) + &
768
17966476
        kstar(i, k-1)
769
17966476
      alpha(i, k) = (q2(i,k)*deltap(i,k)+kstar(i,k)*alpha(i,k+1))/denom(i, k)
770
18010252
      beta(i, k) = kstar(i, k-1)/denom(i, k)
771
    END DO
772
  END DO
773
774
  ! Si on recalcule q2(1)
775
  !.......................
776
  IF (1==0) THEN
777
    DO i = 1, ngrid
778
      denom(i, 1) = deltap(i, 1) + (1-beta(i,2))*kstar(i, 1)
779
      q2(i, 1) = (q2(i,1)*deltap(i,1)+kstar(i,1)*alpha(i,2))/denom(i, 1)
780
    END DO
781
  END IF
782
783
784
46080
  DO k = 2, klev + 1
785
18485358
    DO i = 1, ngrid
786
18484206
      q2(i, k) = alpha(i, k) + beta(i, k)*q2(i, k-1)
787
    END DO
788
  END DO
789
790
1152
  RETURN
791
END SUBROUTINE vdif_q2
792
!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
793
794
795
796
!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
797
 SUBROUTINE vdif_q2e(timestep, gravity, rconst, ngrid, plev, temp, kmy, q2)
798
799
   USE dimphy, only : klev,klon
800
  IMPLICIT NONE
801
802
! vdif_q2e: subroutine qui calcule la diffusion de TKE par la TKE
803
!           avec un schema explicite en temps
804
805
806
!====================================================
807
! Declarations
808
!====================================================
809
810
  REAL plev(klon, klev+1)
811
  REAL temp(klon, klev)
812
  REAL timestep
813
  REAL gravity, rconst
814
  REAL kstar(klon, klev+1), zz
815
  REAL kmy(klon, klev+1)
816
  REAL q2(klon, klev+1)
817
  REAL deltap(klon, klev+1)
818
  REAL denom(klon, klev+1), alpha(klon, klev+1), beta(klon, klev+1)
819
  INTEGER ngrid
820
  INTEGER i, k
821
822
823
!==================================================
824
! Calcul
825
!==================================================
826
827
  DO k = 1, klev
828
    DO i = 1, ngrid
829
      zz = (plev(i,k)+plev(i,k+1))*gravity/(rconst*temp(i,k))
830
      kstar(i, k) = 0.125*(kmy(i,k+1)+kmy(i,k))*zz*zz/ &
831
        (plev(i,k)-plev(i,k+1))*timestep
832
    END DO
833
  END DO
834
835
  DO k = 2, klev
836
    DO i = 1, ngrid
837
      deltap(i, k) = 0.5*(plev(i,k-1)-plev(i,k+1))
838
    END DO
839
  END DO
840
  DO i = 1, ngrid
841
    deltap(i, 1) = 0.5*(plev(i,1)-plev(i,2))
842
    deltap(i, klev+1) = 0.5*(plev(i,klev)-plev(i,klev+1))
843
  END DO
844
845
  DO k = klev, 2, -1
846
    DO i = 1, ngrid
847
      q2(i, k) = q2(i, k) + (kstar(i,k)*(q2(i,k+1)-q2(i, &
848
        k))-kstar(i,k-1)*(q2(i,k)-q2(i,k-1)))/deltap(i, k)
849
    END DO
850
  END DO
851
852
  DO i = 1, ngrid
853
    q2(i, 1) = q2(i, 1) + (kstar(i,1)*(q2(i,2)-q2(i,1)))/deltap(i, 1)
854
    q2(i, klev+1) = q2(i, klev+1) + (-kstar(i,klev)*(q2(i,klev+1)-q2(i, &
855
      klev)))/deltap(i, klev+1)
856
  END DO
857
858
  RETURN
859
END SUBROUTINE vdif_q2e
860
861
!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
862
863
864
!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
865
866
1152
SUBROUTINE mixinglength(ni, nsrf, ngrid,iflag_pbl,pbl_lmixmin_alpha,lmixmin,zlay,zlev,u,v,q2,n2, lmix)
867
868
869
870
  USE dimphy, only : klev,klon
871
  USE yamada_ini_mod, only : l0
872
  USE phys_state_var_mod, only: zstd, zsig, zmea
873
  USE phys_local_var_mod, only: l_mixmin, l_mix
874
  USE yamada_ini_mod, only : kap, kapb
875
876
 ! zstd: ecart type de la'altitud e sous-maille
877
 ! zmea: altitude moyenne sous maille
878
 ! zsig: pente moyenne de le maille
879
880
  USE geometry_mod, only: cell_area
881
  ! aire_cell: aire de la maille
882
883
  IMPLICIT NONE
884
!*************************************************************************
885
! Subrourine qui calcule la longueur de m??lange dans le sch??ma de turbulence
886
! avec la formule de Blackadar
887
! Calcul d'un  minimum en fonction de l'orographie sous-maille:
888
! L'id??e est la suivante: plus il y a de relief, plus il y a du m??lange
889
! induit par les circulations meso et submeso ??chelles.
890
!
891
! References: * The vertical distribution of wind and turbulent exchange in a neutral atmosphere
892
!               Blackadar A.K.
893
!               J. Geophys. Res., 64, No 8, 1962
894
!
895
!             * An evaluation of neutral and convective planetary boundary-layer parametrisations relative
896
!               to large eddy simulations
897
!               Ayotte K et al
898
!               Boundary Layer Meteorology, 79, 131-175, 1996
899
!
900
!
901
!             * Local Similarity in the Stable Boundary Layer and Mixing length Approaches: consistency of concepts
902
!               Van de Wiel B.J.H et al
903
!               Boundary-Lay Meteorol, 128, 103-166, 2008
904
!
905
!
906
! Histoire:
907
!----------
908
! * premi??re r??daction, Etienne et Frederic, 09/06/2016
909
!
910
! ***********************************************************************
911
912
!==================================================================
913
! Declarations
914
!==================================================================
915
916
! Inputs
917
!-------
918
 INTEGER            ni(klon)           ! indice sur la grille original (non restreinte)
919
 INTEGER            nsrf               ! Type de surface
920
 INTEGER            ngrid              ! Nombre de points concern??s sur l'horizontal
921
 INTEGER            iflag_pbl          ! Choix du sch??ma de turbulence
922
 REAL               pbl_lmixmin_alpha  ! on active ou non le calcul de la longueur de melange minimum en fonction du relief
923
 REAL               lmixmin            ! Minimum absolu de la longueur de m??lange
924
 REAL               zlay(klon, klev)   ! altitude du centre de la couche
925
 REAL               zlev(klon, klev+1) ! atitude de l'interface inf??rieure de la couche
926
 REAL               u(klon, klev)      ! vitesse du vent zonal
927
 REAL               v(klon, klev)      ! vitesse du vent meridional
928
 REAL               q2(klon, klev+1)   ! energie cin??tique turbulente
929
 REAL               n2(klon, klev+1)   ! frequence de Brunt-Vaisala
930
931
!In/out
932
!-------
933
934
! Outputs
935
!---------
936
937
 REAL               lmix(klon, klev+1)    ! Longueur de melange
938
939
940
! Local
941
!-------
942
943
 INTEGER  ig,jg, k
944
2304
 REAL     h_oro(klon)
945
2304
 REAL     hlim(klon)
946
 REAL zq
947
2304
 REAL sq(klon), sqz(klon)
948
 REAL fl, zzz, zl0, zq2, zn2
949
 REAL famorti, zzzz, zh_oro, zhlim
950
2304
 REAL l1(klon, klev+1), l2(klon,klev+1)
951
2304
 REAL winds(klon, klev)
952
 REAL xcell
953
 REAL zstdslope(klon)
954
 REAL lmax
955
 REAL l2strat, l2neutre, extent
956
 REAL l2limit(klon)
957
!===============================================================
958
! Fonctions utiles
959
!===============================================================
960
961
! Calcul de l suivant la formule de Blackadar 1962 adapt??e par Ayotte 1996
962
!..........................................................................
963
964
 fl(zzz, zl0, zq2, zn2) = max(min(l0(ig)*kap*zlev(ig, &
965
    k)/(kap*zlev(ig,k)+l0(ig)),0.5*sqrt(q2(ig,k))/sqrt( &
966
    max(n2(ig,k),1.E-10))), 1.E-5)
967
968
! Fonction d'amortissement de la turbulence au dessus de la montagne
969
! On augmente l'amortissement en diminuant la valeur de hlim (extent) dans le code
970
!.....................................................................
971
972
 famorti(zzzz, zh_oro, zhlim)=(-1.)*ATAN((zzzz-zh_oro)/(zhlim-zh_oro))*2./3.1416+1.
973
974
1152
  IF (ngrid==0) RETURN
975
976
977
!=====================================================================
978
!         CALCUL de la LONGUEUR de m??lange suivant BLACKADAR: l1
979
!=====================================================================
980
981

18959312
  l1(1:ngrid,:)=0.
982
1152
  IF (iflag_pbl==8 .OR. iflag_pbl==10) THEN
983
984
985
    ! Iterative computation of l0
986
    ! This version is kept for iflag_pbl only for convergence
987
    ! with NPv3.1 Cmip5 simulations
988
    !...................................................................
989
990
    DO ig = 1, ngrid
991
      sq(ig) = 1.E-10
992
      sqz(ig) = 1.E-10
993
    END DO
994
    DO k = 2, klev - 1
995
      DO ig = 1, ngrid
996
        zq = sqrt(q2(ig,k))
997
        sqz(ig) = sqz(ig) + zq*zlev(ig, k)*(zlay(ig,k)-zlay(ig,k-1))
998
        sq(ig) = sq(ig) + zq*(zlay(ig,k)-zlay(ig,k-1))
999
      END DO
1000
    END DO
1001
    DO ig = 1, ngrid
1002
      l0(ig) = 0.2*sqz(ig)/sq(ig)
1003
    END DO
1004
    DO k = 2, klev
1005
      DO ig = 1, ngrid
1006
        l1(ig, k) = fl(zlev(ig,k), l0(ig), q2(ig,k), n2(ig,k))
1007
      END DO
1008
    END DO
1009
1010
  ELSE
1011
1012
1013
    ! In all other case, the assymptotic mixing length l0 is imposed (150m)
1014
    !......................................................................
1015
1016
473954
    l0(1:ngrid) = 150.
1017
44928
    DO k = 2, klev
1018
18011404
      DO ig = 1, ngrid
1019
18010252
        l1(ig, k) = fl(zlev(ig,k), l0(ig), q2(ig,k), n2(ig,k))
1020
      END DO
1021
    END DO
1022
1023
  END IF
1024
1025
!===========================================================================================
1026
!  CALCUL d'une longueur de melange minimum en fonctions de la topographie sous maille: l2
1027
! si pbl_lmixmin_alpha=TRUE et si on se trouve sur de la terre ( pas actif sur les
1028
! glacier, la glace de mer et les oc??ans)
1029
!===========================================================================================
1030
1031

18959312
   l2(1:ngrid,:)=0.0
1032

18959312
   l_mixmin(1:ngrid,:,nsrf)=0.
1033

18959312
   l_mix(1:ngrid,:,nsrf)=0.
1034
473954
   hlim(1:ngrid)=0.
1035
1036
1152
   IF (nsrf .EQ. 1) THEN
1037
1038
! coefficients
1039
!--------------
1040
1041
     extent=2.                                                         ! On ??tend l'impact du relief jusqu'?? extent*h, extent >1.
1042
     lmax=150.                                                         ! Longueur de m??lange max dans l'absolu
1043
1044
! calculs
1045
!---------
1046
1047
148896
     DO ig=1,ngrid
1048
1049
      ! On calcule la hauteur du relief
1050
      !.................................
1051
      ! On ne peut pas prendre zstd seulement pour caracteriser le relief sous maille
1052
      ! car sur un terrain pentu mais sans relief, zstd est non nul (comme en Antarctique, C. Genthon)
1053
      ! On corrige donc zstd avec l'ecart type de l'altitude dans la maille sans relief
1054
      ! (en gros, une maille de taille xcell avec une pente constante zstdslope)
1055
148608
      jg=ni(ig)
1056
!     IF (zsig(jg) .EQ. 0.) THEN
1057
!          zstdslope(ig)=0.
1058
!     ELSE
1059
!     xcell=sqrt(cell_area(jg))
1060
!     zstdslope(ig)=max((xcell*zsig(jg)-zmea(jg))**3 /(3.*zsig(jg)),0.)
1061
!     zstdslope(ig)=sqrt(zstdslope(ig))
1062
!     END IF
1063
1064
!     h_oro(ig)=max(zstd(jg)-zstdslope(ig),0.)   ! Hauteur du relief
1065
148608
      h_oro(ig)=zstd(jg)
1066
148896
      hlim(ig)=extent*h_oro(ig)
1067
     ENDDO
1068
1069
148896
     l2limit(1:ngrid)=0.
1070
1071
11232
     DO k=2,klev
1072
5658336
        DO ig=1,ngrid
1073
5647104
           winds(ig,k)=sqrt(u(ig,k)**2+v(ig,k)**2)
1074
5658048
           IF (zlev(ig,k) .LE. h_oro(ig)) THEN  ! sous l'orographie
1075
271872
              l2strat= kapb*pbl_lmixmin_alpha*winds(ig,k)/sqrt(max(n2(ig,k),1.E-10))  ! si stratifi??, amplitude d'oscillation * kappab (voir Van de Wiel et al 2008)
1076
271872
              l2neutre=kap*zlev(ig,k)*h_oro(ig)/(kap*zlev(ig,k)+h_oro(ig))            ! Dans le cas neutre, formule de blackadar. tend asymptotiquement vers h
1077
271872
              l2neutre=MIN(l2neutre,lmax)                                             ! On majore par lmax
1078
271872
              l2limit(ig)=MIN(l2neutre,l2strat)                                       ! Calcule de l2 (minimum de la longueur en cas neutre et celle en situation stratifi??e)
1079
271872
              l2(ig,k)=l2limit(ig)
1080
1081
5375232
           ELSE IF (zlev(ig,k) .LE. hlim(ig)) THEN ! Si on est au dessus des montagnes, mais affect?? encore par elles
1082
1083
      ! Au dessus des montagnes, on prend la l2limit au sommet des montagnes
1084
      ! (la derni??re calcul??e dans la boucle k, vu que k est un indice croissant avec z)
1085
      ! et on multiplie l2limit par une fonction qui d??croit entre h et hlim
1086
152451
              l2(ig,k)=l2limit(ig)*famorti(zlev(ig,k),h_oro(ig), hlim(ig))
1087
           ELSE                                                                    ! Au dessus de extent*h, on prend l2=l0
1088
5222781
              l2(ig,k)=0.
1089
           END IF
1090
        ENDDO
1091
     ENDDO
1092
   ENDIF                                                                           ! pbl_lmixmin_alpha
1093
1094
!==================================================================================
1095
! On prend le max entre la longueur de melange de blackadar et celle calcul??e
1096
! en fonction de la topographie
1097
!===================================================================================
1098
1099
1100
47232
 DO k=1,klev+1
1101
18959312
    DO ig=1,ngrid
1102
18958160
       lmix(ig,k)=MAX(MAX(l1(ig,k), l2(ig,k)),lmixmin)
1103
   ENDDO
1104
 ENDDO
1105
1106
! Diagnostics
1107
1108
47232
 DO k=1,klev+1
1109
18959312
    DO ig=1,ngrid
1110
18912080
       jg=ni(ig)
1111
18912080
       l_mix(jg,k,nsrf)=lmix(ig,k)
1112
18958160
       l_mixmin(jg,k,nsrf)=MAX(l2(ig,k),lmixmin)
1113
    ENDDO
1114
 ENDDO
1115
1116
1117
1118
1152
END SUBROUTINE mixinglength