source: LMDZ6/branches/LMDZ_ECRad/libf/phylmd/yamada4.F90 @ 5452

Last change on this file since 5452 was 4482, checked in by lguez, 21 months ago

Sync latest trunk changes to branch LMDZ_ECRad

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 35.7 KB
RevLine 
[2561]1!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[1992]2
[2561]3SUBROUTINE yamada4(ni, nsrf, ngrid, dt, g, rconst, plev, temp, zlev, zlay, u, v, teta, &
[2952]4    cd, tke, km, kn, kq, ustar, iflag_pbl, drgpro)
[541]5
[4482]6  USE dimphy, only : klev,klon
[4009]7  USE phys_local_var_mod, only: tke_dissip,wprime
[4482]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
[3780]11 
[1992]12  IMPLICIT NONE
[2561]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
[1992]27  ! dt : pas de temps
28  ! g  : g
[2561]29  ! rconst: constante de l'air sec
[1992]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)
[2561]35  ! teta : temperature potentielle virtuelle au centre de chaque couche
[1992]36  ! (en entree : la valeur au debut du pas de temps)
[2561]37  ! cd : cdrag pour la quantit?? de mouvement
[1992]38  ! (en entree : la valeur au debut du pas de temps)
[2561]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.
[3780]57  !             2016/11/30 (EV etienne.vignon@lmd.ipsl.fr)
[2817]58  !               On met tke (=q2/2) en entr??e plut??t que q2
[2721]59  !               On corrige l'update de la tke
[3780]60  !             2020/10/01 (EV)
61  !               On ajoute la dissipation de la TKE en diagnostique de sortie
62  !                 
[2561]63  ! Inpout/Output :
64  !==============
[2721]65  ! tke : tke au bas de chaque couche
[1992]66  ! (en entree : la valeur au debut du pas de temps)
67  ! (en sortie : la valeur a la fin du pas de temps)
[2561]68 
69  ! Outputs:
70  !==========
[1992]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)
[2561]76  !
77  !.......................................................................
[541]78
[2561]79  !=======================================================================
80  ! Declarations:
81  !=======================================================================
[541]82
83
[2561]84  ! Inputs/Outputs
85  !----------------
[1992]86  REAL dt, g, rconst
87  REAL plev(klon, klev+1), temp(klon, klev)
88  REAL ustar(klon)
89  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)
[2721]96  REAL tke(klon, klev+1)
[1992]97  REAL unsdz(klon, klev)
98  REAL unsdzdec(klon, klev+1)
[2561]99  REAL kn(klon, klev+1)
100  REAL km(klon, klev+1)
101  INTEGER iflag_pbl, ngrid, nsrf
102  INTEGER ni(klon)
[541]103
[2952]104!FC
105  REAL drgpro(klon,klev)
106  REAL winds(klon,klev)
[2561]107
108  ! Local
109  !-------
110
[2721]111  REAL q2(klon, klev+1)
[2561]112  REAL kmpre(klon, klev+1), tmp2, qpre
[1992]113  REAL mpre(klon, klev+1)
114  REAL kq(klon, klev+1)
115  REAL ff(klon, klev+1), delta(klon, klev+1)
116  REAL aa(klon, klev+1), aa0, aa1
117  INTEGER nlay, nlev
[3035]118
[3780]119  INTEGER ig, jg, k
[1992]120  REAL ri, zrif, zalpha, zsm, zsn
121  REAL rif(klon, klev+1), sm(klon, klev+1), alpha(klon, klev)
122  REAL m2(klon, klev+1), dz(klon, klev+1), zq, n2(klon, klev+1)
123  REAL dtetadz(klon, klev+1)
124  REAL m2cstat, mcstat, kmcstat
125  REAL l(klon, klev+1)
[2561]126  REAL zz(klon, klev+1)
[1992]127  INTEGER iter
[2828]128  REAL dissip(klon,klev), tkeprov,tkeexp, shear(klon,klev), buoy(klon,klev)
[3035]129  REAL :: disseff
130
[4482]131  REAL,SAVE :: rifc
132  !$OMP THREADPRIVATE(rifc)
[2721]133  REAL,SAVE :: seuilsm, seuilalpha
134  !$OMP THREADPRIVATE(seuilsm, seuilalpha)
[3035]135
[1992]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)
[2561]139
[3531]140  CHARACTER (len = 20) :: modname = 'yamada4'
141  CHARACTER (len = 80) :: abort_message
[2561]142
[2721]143
[3531]144
[2561]145  ! Fonctions utilis??es
146  !--------------------
147
[1992]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))
[2561]151 
[541]152
[2828]153
[2721]154    IF (new_yamada4) THEN
[2828]155! Corrections et reglages issus du travail de these d'Etienne Vignon.
[2721]156       rifc=frif(ric)
157       seuilsm=fsm(frif(ric))
158       seuilalpha=falpha(frif(ric))
159    ELSE
160       rifc=0.191
161       seuilalpha=1.12
162       seuilsm=0.085
163    ENDIF
[2828]164
[2561]165!===============================================================================
166! Flags, tests et ??valuations de constantes
167!===============================================================================
[541]168
[2561]169! On utilise ou non la routine de Holstalg Boville pour les cas tres stables
[1738]170
[541]171
[1992]172  IF (.NOT. (iflag_pbl>=6 .AND. iflag_pbl<=12)) THEN
[3531]173    abort_message='probleme de coherence dans appel a MY'
174    CALL abort_physic(modname,abort_message,1)
[1992]175  END IF
[541]176
[2561]177
178  nlay = klev
179  nlev = klev + 1
[541]180
181
[2561]182!========================================================================
183! Calcul des increments verticaux
184!=========================================================================
[541]185
[2561]186 
187! Attention: zlev n'est pas declare a nlev
[1992]188  DO ig = 1, ngrid
189    zlev(ig, nlev) = zlay(ig, nlay) + (zlay(ig,nlay)-zlev(ig,nlev-1))
190  END DO
[541]191
[2561]192
[1992]193  DO k = 1, nlay
194    DO ig = 1, ngrid
195      unsdz(ig, k) = 1.E+0/(zlev(ig,k+1)-zlev(ig,k))
196    END DO
197  END DO
198  DO ig = 1, ngrid
199    unsdzdec(ig, 1) = 1.E+0/(zlay(ig,1)-zlev(ig,1))
200  END DO
201  DO k = 2, nlay
202    DO ig = 1, ngrid
203      unsdzdec(ig, k) = 1.E+0/(zlay(ig,k)-zlay(ig,k-1))
204    END DO
205  END DO
206  DO ig = 1, ngrid
207    unsdzdec(ig, nlay+1) = 1.E+0/(zlev(ig,nlay+1)-zlay(ig,nlay))
208  END DO
[1738]209
[2561]210!=========================================================================
211! Richardson number and stability functions
212!=========================================================================
213 
214! initialize arrays:
215
[2574]216  m2(1:ngrid, :) = 0.0
217  sm(1:ngrid, :) = 0.0
218  rif(1:ngrid, :) = 0.0
[1738]219
[2561]220!------------------------------------------------------------
[1992]221  DO k = 2, klev
[2561]222
[1992]223    DO ig = 1, ngrid
224      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        k-1))**2)/(dz(ig,k)*dz(ig,k))
227      dtetadz(ig, k) = (teta(ig,k)-teta(ig,k-1))/dz(ig, k)
228      n2(ig, k) = g*2.*dtetadz(ig, k)/(teta(ig,k-1)+teta(ig,k))
229      ri = n2(ig, k)/max(m2(ig,k), 1.E-10)
230      IF (ri<ric) THEN
231        rif(ig, k) = frif(ri)
232      ELSE
233        rif(ig, k) = rifc
234      END IF
[2721]235if (new_yamada4) then
236        alpha(ig, k) = max(falpha(rif(ig,k)),seuilalpha)
237        sm(ig, k) = max(fsm(rif(ig,k)),seuilsm)
238else
[1992]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
[2561]243        alpha(ig, k) = seuilalpha
244        sm(ig, k) = seuilsm
[1992]245      END IF
[2721]246
247end if
[1992]248      zz(ig, k) = b1*m2(ig, k)*(1.-rif(ig,k))*sm(ig, k)
249    END DO
250  END DO
[1738]251
252
253
[2721]254
255
256  !=======================================================================
257  !     DIFFERENT TYPES  DE SCHEMA de  YAMADA
258  !=======================================================================
259
[2817]260  ! On commence par calculer q2 a partir de la tke
[2721]261
262  IF (new_yamada4) THEN
263      DO k=1,klev+1
264         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
[2561]272! ====================================================================
273! Computing the mixing length
274! ====================================================================
[541]275
[2561]276 
[2573]277  CALL mixinglength(ni,nsrf,ngrid,iflag_pbl,pbl_lmixmin_alpha,lmixmin,zlay,zlev,u,v,q2,n2, l)
[541]278
279
[2561]280  !--------------
[1992]281  ! Yamada 2.0
[2561]282  !--------------
[1992]283  IF (iflag_pbl==6) THEN
[2561]284 
[1992]285    DO k = 2, klev
[2574]286      q2(1:ngrid, k) = l(1:ngrid, k)**2*zz(1:ngrid, k)
[1992]287    END DO
288
289
[2561]290  !------------------
291  ! Yamada 2.Fournier
292  !------------------
293
[1992]294  ELSE IF (iflag_pbl==7) THEN
295
[2561]296
[1992]297    ! Calcul de l,  km, au pas precedent
[2561]298    !....................................
[1992]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
[2561]312     ! Puis on ecrit la valeur de q qui annule l'equation de m supposee en q3
313     !.........................................................................
[1992]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))
[541]320        ELSE
[1992]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
[2561]325
[1992]326        tmp2 = kmcstat/(sm(ig,k)/q2(ig,k))/l(ig, k)
327        q2(ig, k) = max(tmp2, 1.E-12)**(2./3.)
[541]328
[1992]329      END DO
330    END DO
[541]331
[2561]332
333    ! ------------------------
[1992]334    ! Yamada 2.5 a la Didi
[2561]335    !-------------------------
[541]336
[2561]337  ELSE IF (iflag_pbl==8 .OR. iflag_pbl==9) THEN
[541]338
[2561]339    ! Calcul de l, km, au pas precedent
340    !....................................
[1992]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
[1738]367
[1992]368  ELSE IF (iflag_pbl>=10) THEN
[1738]369
[3780]370    shear(:,:)=0.
371    buoy(:,:)=0.
372    dissip(:,:)=0.
373    km(:,:)=0.
374       
[2817]375    IF (yamada4_num>=1) THEN
376 
[1992]377    DO k = 2, klev - 1
[2817]378      DO ig=1,ngrid
379      q2(ig, k) = min(max(q2(ig,k),1.E-10), 1.E4)
380      km(ig, k) = l(ig, k)*sqrt(q2(ig,k))*sm(ig, k)
381      shear(ig,k)=km(ig, k)*m2(ig, k)
382      buoy(ig,k)=km(ig, k)*m2(ig, k)*(-1.*rif(ig,k))
[3784]383!      dissip(ig,k)=min(max(((sqrt(q2(ig,k)))**3)/(b1*l(ig,k)),1.E-12),1.E4)
384      dissip(ig,k)=((sqrt(q2(ig,k)))**3)/(b1*l(ig,k))
[2817]385     ENDDO
386    ENDDO
[3780]387   
[2817]388    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
[2828]392         tkeprov= tkeprov*                           &
[2817]393           &  (tkeprov+dt*(shear(ig,k)+max(0.,buoy(ig,k))))/ &
[4482]394           &  (tkeprov+dt*((-1.)*min(0.,buoy(ig,k))+dissip(ig,k)+drgpro(ig,k)*tkeprov))
[2828]395         q2(ig,k)=tkeprov*ydeux
[2817]396        ENDDO
397       ENDDO
[2828]398    ELSE IF (yamada4_num==2) THEN ! version modifiee avec integration exacte pour la dissipation
[2817]399       DO k = 2, klev - 1
400         DO ig=1,ngrid
401         tkeprov=q2(ig,k)/ydeux
[2828]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
[2817]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
[2828]411    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    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
[3780]438       
439      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
440      !! Attention, yamada4_num=5 est inexacte car néglige les termes de flottabilité
441      !! en conditions instables
442      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
[2828]443    ELSE IF (yamada4_num==5) THEN ! version modifiee avec integration exacte pour la dissipation
444       DO k = 2, klev - 1
445         DO ig=1,ngrid
446         tkeprov=q2(ig,k)/ydeux
[2952]447!FC on ajoute la dissipation due aux arbres
448         disseff=dissip(ig,k)-min(0.,buoy(ig,k)) + drgpro(ig,k)*tkeprov
[2828]449         tkeexp=exp(-dt*disseff/tkeprov)
[2952]450! on prend en compte la tke cree par les arbres
451         winds(ig,k)=sqrt(u(ig,k)**2+v(ig,k)**2)
452         tkeprov= (shear(ig,k)+ &
453          & drgpro(ig,k)*(winds(ig,k))**3)*tkeprov/disseff*(1.-tkeexp)+tkeprov*tkeexp
[2828]454         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
[3780]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)
[2828]468         tkeprov=q2(ig,k)/ydeux
[3780]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
[2828]471         tkeexp=exp(-dt*disseff/tkeprov)
472         tkeprov= tkeprov*tkeexp
[3784]473         q2(ig,k)=tkeprov*ydeux
[3780]474         
[2828]475        ENDDO
476       ENDDO
[2817]477    ENDIF
478
479    DO k = 2, klev - 1
480      DO ig=1,ngrid
481      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
[2574]488      km(1:ngrid, k) = l(1:ngrid, k)*sqrt(q2(1:ngrid,k))*sm(1:ngrid, k)
[2721]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))
[2574]491      q2(1:ngrid, k) = min(max(q2(1:ngrid,k),1.E-10), 1.E4)
[3784]492       q2(1:ngrid, k) = 1./(1./sqrt(q2(1:ngrid,k))+dt/(yun*l(1:ngrid,k)*b1))
[2721]493!     q2(1:ngrid, k) = 1./(1./sqrt(q2(1:ngrid,k))+dt/(2*l(1:ngrid,k)*b1))
[2574]494      q2(1:ngrid, k) = q2(1:ngrid, k)*q2(1:ngrid, k)
[1992]495    END DO
[1738]496
[2817]497  ENDIF
[1738]498
[1992]499  ELSE
[3531]500     abort_message='Cas nom prevu dans yamada4'
501     CALL abort_physic(modname,abort_message,1)
[541]502
[1992]503  END IF ! Fin du cas 8
[541]504
505
[1992]506  ! ====================================================================
[2561]507  ! Calcul des coefficients de melange
[1992]508  ! ====================================================================
[2561]509
[1992]510  DO k = 2, klev
511    DO ig = 1, ngrid
512      zq = sqrt(q2(ig,k))
[2561]513      km(ig, k) = l(ig, k)*zq*sm(ig, k)     ! For momentum
514      kn(ig, k) = km(ig, k)*alpha(ig, k)    ! For scalars
515      kq(ig, k) = l(ig, k)*zq*0.2           ! For TKE
[1992]516    END DO
517  END DO
[2561]518
519
520  !====================================================================
521  ! Transport diffusif vertical de la TKE par la TKE
522  !====================================================================
523
524
[1992]525    ! initialize near-surface and top-layer mixing coefficients
[2561]526    !...........................................................
[541]527
[2561]528  kq(1:ngrid, 1) = kq(1:ngrid, 2)    ! constant (ie no gradient) near the surface
529  kq(1:ngrid, klev+1) = 0            ! zero at the top
530
531    ! Transport diffusif vertical de la TKE.
532    !.......................................
533
[1992]534  IF (iflag_pbl>=12) THEN
[2574]535    q2(1:ngrid, 1) = q2(1:ngrid, 2)
[1992]536    CALL vdif_q2(dt, g, rconst, ngrid, plev, temp, kq, q2)
537  END IF
[541]538
539
[2561]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
[541]548
[2561]549
550 IF (hboville) THEN
551
552
[1992]553  IF (prt_level>1) THEN
[3531]554    WRITE(lunout,*) 'YAMADA4 0'
[2561]555  END IF
556
[1992]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
[1738]561
[1992]562  IF (1==1) THEN
563    IF (iflag_pbl==8 .OR. iflag_pbl==10) THEN
[1738]564
[1992]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
[2561]574
[1992]575            kn(ig, k) = kmin
576            km(ig, k) = kmin
577            kq(ig, k) = kmin
[2561]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
[1992]582            q2(ig, k) = (qmin/sm(ig,k))**2
583          END IF
584        END DO
585      END DO
[1738]586
[1992]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
[2561]600 ! la longueur de melange est suposee etre l= kap z
601 ! K=l q Sm d'ou q2=(K/l Sm)**2
[1992]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
[1738]613
[1992]614  END IF
[541]615
[2561]616 END IF ! hboville
617
[2828]618! Ajout d'une viscosite moleculaire
[3041]619   km(1:ngrid,2:klev)=km(1:ngrid,2:klev)+viscom
620   kn(1:ngrid,2:klev)=kn(1:ngrid,2:klev)+viscoh
621   kq(1:ngrid,2:klev)=kq(1:ngrid,2:klev)+viscoh
[2828]622
[1992]623  IF (prt_level>1) THEN
[3531]624    WRITE(lunout,*)'YAMADA4 1'
[1992]625  END IF !(prt_level>1) THEN
[2561]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
[1992]636  ! Diagnostique pour stokage
[2561]637  !..........................
[541]638
[1992]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.
[878]647
[1992]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)
[541]652
653
[2561]654  ! Calcul de w'2 et T'2
655  !.......................
656
[1992]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))
[4009]660 
[1992]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
[1403]665
[2721]666
667
[2561]668!============================================================================
[2817]669! Mise a jour de la tke
[2721]670!============================================================================
[2561]671
[2721]672  IF (new_yamada4) THEN
673     DO k=1,klev+1
674        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!============================================================================
[4009]684! Diagnostique de la dissipation et vitesse verticale
[3780]685!============================================================================
[2721]686
[3780]687! Diagnostics
688 tke_dissip(1:ngrid,:,nsrf)=0.
[4009]689 wprime(1:ngrid,:,nsrf)=0.
690 DO k=2,klev
691    DO ig=1,ngrid
692       jg=ni(ig)
693       wprime(jg,k,nsrf)=sqrt(MAX(1./3*q2(ig,k),0.))
694       tke_dissip(jg,k,nsrf)=dissip(ig,k)
695    ENDDO
696 ENDDO
[3780]697 
698!=============================================================================
699
[1992]700  RETURN
[2561]701
702
[1992]703END SUBROUTINE yamada4
[2561]704
705!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
706
707!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[1992]708SUBROUTINE vdif_q2(timestep, gravity, rconst, ngrid, plev, temp, kmy, q2)
[2561]709
[4482]710  USE dimphy, only : klev,klon
[1992]711  IMPLICIT NONE
[2561]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!============================================================================
[1403]725
[1992]726  REAL plev(klon, klev+1)
727  REAL temp(klon, klev)
728  REAL timestep
729  REAL gravity, rconst
730  REAL kstar(klon, klev+1), zz
731  REAL kmy(klon, klev+1)
732  REAL q2(klon, klev+1)
733  REAL deltap(klon, klev+1)
734  REAL denom(klon, klev+1), alpha(klon, klev+1), beta(klon, klev+1)
735  INTEGER ngrid
[1403]736
[1992]737  INTEGER i, k
[1403]738
[2561]739
740!=========================================================================
741! Calcul
742!=========================================================================
743
[1992]744  DO k = 1, klev
745    DO i = 1, ngrid
746      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        (plev(i,k)-plev(i,k+1))*timestep
749    END DO
750  END DO
[1403]751
[1992]752  DO k = 2, klev
753    DO i = 1, ngrid
754      deltap(i, k) = 0.5*(plev(i,k-1)-plev(i,k+1))
755    END DO
756  END DO
757  DO i = 1, ngrid
758    deltap(i, 1) = 0.5*(plev(i,1)-plev(i,2))
759    deltap(i, klev+1) = 0.5*(plev(i,klev)-plev(i,klev+1))
760    denom(i, klev+1) = deltap(i, klev+1) + kstar(i, klev)
761    alpha(i, klev+1) = deltap(i, klev+1)*q2(i, klev+1)/denom(i, klev+1)
762    beta(i, klev+1) = kstar(i, klev)/denom(i, klev+1)
763  END DO
[1403]764
[1992]765  DO k = klev, 2, -1
766    DO i = 1, ngrid
767      denom(i, k) = deltap(i, k) + (1.-beta(i,k+1))*kstar(i, k) + &
768        kstar(i, k-1)
769      alpha(i, k) = (q2(i,k)*deltap(i,k)+kstar(i,k)*alpha(i,k+1))/denom(i, k)
770      beta(i, k) = kstar(i, k-1)/denom(i, k)
771    END DO
772  END DO
[1403]773
[1992]774  ! Si on recalcule q2(1)
[2561]775  !.......................
[1992]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
[1403]782
[2561]783
[1992]784  DO k = 2, klev + 1
785    DO i = 1, ngrid
786      q2(i, k) = alpha(i, k) + beta(i, k)*q2(i, k-1)
787    END DO
788  END DO
[1403]789
[1992]790  RETURN
791END SUBROUTINE vdif_q2
[2561]792!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
793
794
795
796!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
797 SUBROUTINE vdif_q2e(timestep, gravity, rconst, ngrid, plev, temp, kmy, q2)
798 
[4482]799   USE dimphy, only : klev,klon
[1992]800  IMPLICIT NONE
[1403]801
[2561]802! vdif_q2e: subroutine qui calcule la diffusion de TKE par la TKE
803!           avec un schema explicite en temps
[1403]804
[2561]805
806!====================================================
807! Declarations
808!====================================================
809
[1992]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
[1403]821
[2561]822
823!==================================================
824! Calcul
825!==================================================
826
[1992]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
[1403]834
[1992]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
859END SUBROUTINE vdif_q2e
[2561]860
861!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
862
863
864!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
865
[2573]866SUBROUTINE mixinglength(ni, nsrf, ngrid,iflag_pbl,pbl_lmixmin_alpha,lmixmin,zlay,zlev,u,v,q2,n2, lmix)
[2561]867
868
869
[4482]870  USE dimphy, only : klev,klon
871  USE yamada_ini_mod, only : l0
[2561]872  USE phys_state_var_mod, only: zstd, zsig, zmea
873  USE phys_local_var_mod, only: l_mixmin, l_mix
[4482]874  USE yamada_ini_mod, only : kap, kapb
[2561]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
[4019]922 REAL               pbl_lmixmin_alpha  ! on active ou non le calcul de la longueur de melange minimum en fonction du relief
[2561]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 REAL     h_oro(klon)
945 REAL     hlim(klon)
946 REAL zq
947 REAL sq(klon), sqz(klon)
948 REAL fl, zzz, zl0, zq2, zn2
949 REAL famorti, zzzz, zh_oro, zhlim
950 REAL l1(klon, klev+1), l2(klon,klev+1)
951 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
[2574]974  IF (ngrid==0) RETURN
[2561]975
976
977!=====================================================================
978!         CALCUL de la LONGUEUR de m??lange suivant BLACKADAR: l1
979!=====================================================================
980
[3780]981  l1(1:ngrid,:)=0.
[2561]982  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
[2574]1016    l0(1:ngrid) = 150.
[2561]1017    DO k = 2, klev
1018      DO ig = 1, ngrid
1019        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
[4019]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
[2561]1028! glacier, la glace de mer et les oc??ans)
[4019]1029!===========================================================================================
[2561]1030
[2574]1031   l2(1:ngrid,:)=0.0
1032   l_mixmin(1:ngrid,:,nsrf)=0.
[3784]1033   l_mix(1:ngrid,:,nsrf)=0.
[4019]1034   hlim(1:ngrid)=0.
[2561]1035
1036   IF (nsrf .EQ. 1) THEN
1037
1038! coefficients
1039!--------------
1040
[2574]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
[2561]1043
1044! calculs
1045!---------
1046
[2574]1047     DO ig=1,ngrid
[2561]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      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      h_oro(ig)=zstd(jg)
1066      hlim(ig)=extent*h_oro(ig)     
[2574]1067     ENDDO
[2561]1068
[2574]1069     l2limit(1:ngrid)=0.
[2561]1070
[2574]1071     DO k=2,klev
1072        DO ig=1,ngrid
1073           winds(ig,k)=sqrt(u(ig,k)**2+v(ig,k)**2)
1074           IF (zlev(ig,k) .LE. h_oro(ig)) THEN  ! sous l'orographie
1075              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              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              l2neutre=MIN(l2neutre,lmax)                                             ! On majore par lmax
1078              l2limit(ig)=MIN(l2neutre,l2strat)                                       ! Calcule de l2 (minimum de la longueur en cas neutre et celle en situation stratifi??e)
1079              l2(ig,k)=l2limit(ig)
[2561]1080                                     
[2574]1081           ELSE IF (zlev(ig,k) .LE. hlim(ig)) THEN ! Si on est au dessus des montagnes, mais affect?? encore par elles
[2561]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
[2574]1086              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              l2(ig,k)=0.
1089           END IF
1090        ENDDO
1091     ENDDO
[4019]1092   ENDIF                                                                           ! pbl_lmixmin_alpha
[2561]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
[3780]1100 DO k=1,klev+1
[2561]1101    DO ig=1,ngrid
[2574]1102       lmix(ig,k)=MAX(MAX(l1(ig,k), l2(ig,k)),lmixmin)
1103   ENDDO
1104 ENDDO
[2561]1105
[2574]1106! Diagnostics
[2561]1107
[4019]1108 DO k=1,klev+1
[2574]1109    DO ig=1,ngrid
1110       jg=ni(ig)
1111       l_mix(jg,k,nsrf)=lmix(ig,k)
[4019]1112       l_mixmin(jg,k,nsrf)=MAX(l2(ig,k),lmixmin)
[2574]1113    ENDDO
[2561]1114 ENDDO
1115
1116
1117
1118END SUBROUTINE mixinglength
Note: See TracBrowser for help on using the repository browser.