source: LMDZ6/trunk/libf/phylmd/yamada4.F90 @ 5004

Last change on this file since 5004 was 4884, checked in by evignon, 4 months ago

petite correction commit precedent

  • 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.8 KB
RevLine 
[2561]1!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[1992]2
[2561]3SUBROUTINE yamada4(ni, nsrf, ngrid, dt, g, rconst, plev, temp, zlev, zlay, u, v, teta, &
[4881]4    cd, tke, eps, km, kn, kq, ustar, iflag_pbl, drgpro)
[541]5
[4448]6  USE dimphy, only : klev,klon
[4881]7  USE phys_local_var_mod, only: wprime
[4448]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
[4822]10  USE yamada_ini_mod, only : ric, yun,ydeux,lmixmin,iflag_vdif_q2
[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  !==========
[4881]71  ! eps: tke dissipation rate
[1992]72  ! km : diffusivite turbulente de quantite de mouvement (au bas de chaque
73  ! couche)
74  ! (en sortie : la valeur a la fin du pas de temps)
75  ! kn : diffusivite turbulente des scalaires (au bas de chaque couche)
76  ! (en sortie : la valeur a la fin du pas de temps)
[2561]77  !
78  !.......................................................................
[541]79
[2561]80  !=======================================================================
81  ! Declarations:
82  !=======================================================================
[541]83
84
[2561]85  ! Inputs/Outputs
86  !----------------
[1992]87  REAL dt, g, rconst
88  REAL plev(klon, klev+1), temp(klon, klev)
89  REAL ustar(klon)
90  REAL kmin, qmin, pblhmin(klon), coriol(klon)
91  REAL zlev(klon, klev+1)
92  REAL zlay(klon, klev)
93  REAL u(klon, klev)
94  REAL v(klon, klev)
95  REAL teta(klon, klev)
96  REAL cd(klon)
[2721]97  REAL tke(klon, klev+1)
[4881]98  REAL eps(klon,klev+1)
[1992]99  REAL unsdz(klon, klev)
100  REAL unsdzdec(klon, klev+1)
[2561]101  REAL kn(klon, klev+1)
102  REAL km(klon, klev+1)
103  INTEGER iflag_pbl, ngrid, nsrf
104  INTEGER ni(klon)
[541]105
[2952]106!FC
107  REAL drgpro(klon,klev)
108  REAL winds(klon,klev)
[2561]109
110  ! Local
111  !-------
112
[2721]113  REAL q2(klon, klev+1)
[2561]114  REAL kmpre(klon, klev+1), tmp2, qpre
[1992]115  REAL mpre(klon, klev+1)
116  REAL kq(klon, klev+1)
117  REAL ff(klon, klev+1), delta(klon, klev+1)
118  REAL aa(klon, klev+1), aa0, aa1
119  INTEGER nlay, nlev
[3035]120
[3780]121  INTEGER ig, jg, k
[1992]122  REAL ri, zrif, zalpha, zsm, zsn
123  REAL rif(klon, klev+1), sm(klon, klev+1), alpha(klon, klev)
124  REAL m2(klon, klev+1), dz(klon, klev+1), zq, n2(klon, klev+1)
125  REAL dtetadz(klon, klev+1)
126  REAL m2cstat, mcstat, kmcstat
127  REAL l(klon, klev+1)
[2561]128  REAL zz(klon, klev+1)
[1992]129  INTEGER iter
[2828]130  REAL dissip(klon,klev), tkeprov,tkeexp, shear(klon,klev), buoy(klon,klev)
[3035]131  REAL :: disseff
132
[4448]133  REAL,SAVE :: rifc
134  !$OMP THREADPRIVATE(rifc)
[2721]135  REAL,SAVE :: seuilsm, seuilalpha
136  !$OMP THREADPRIVATE(seuilsm, seuilalpha)
[3035]137
[1992]138  REAL frif, falpha, fsm
139  REAL rino(klon, klev+1), smyam(klon, klev), styam(klon, klev), &
140    lyam(klon, klev), knyam(klon, klev), w2yam(klon, klev), t2yam(klon, klev)
[2561]141
[3531]142  CHARACTER (len = 20) :: modname = 'yamada4'
143  CHARACTER (len = 80) :: abort_message
[2561]144
[2721]145
[3531]146
[2561]147  ! Fonctions utilis??es
148  !--------------------
149
[1992]150  frif(ri) = 0.6588*(ri+0.1776-sqrt(ri*ri-0.3221*ri+0.03156))
151  falpha(ri) = 1.318*(0.2231-ri)/(0.2341-ri)
152  fsm(ri) = 1.96*(0.1912-ri)*(0.2341-ri)/((1.-ri)*(0.2231-ri))
[2561]153 
[541]154
[2828]155
[2721]156    IF (new_yamada4) THEN
[2828]157! Corrections et reglages issus du travail de these d'Etienne Vignon.
[2721]158       rifc=frif(ric)
159       seuilsm=fsm(frif(ric))
160       seuilalpha=falpha(frif(ric))
161    ELSE
162       rifc=0.191
163       seuilalpha=1.12
164       seuilsm=0.085
165    ENDIF
[2828]166
[2561]167!===============================================================================
168! Flags, tests et ??valuations de constantes
169!===============================================================================
[541]170
[2561]171! On utilise ou non la routine de Holstalg Boville pour les cas tres stables
[1738]172
[541]173
[1992]174  IF (.NOT. (iflag_pbl>=6 .AND. iflag_pbl<=12)) THEN
[3531]175    abort_message='probleme de coherence dans appel a MY'
176    CALL abort_physic(modname,abort_message,1)
[1992]177  END IF
[541]178
[2561]179
180  nlay = klev
181  nlev = klev + 1
[541]182
183
[2561]184!========================================================================
185! Calcul des increments verticaux
186!=========================================================================
[541]187
[2561]188 
189! Attention: zlev n'est pas declare a nlev
[1992]190  DO ig = 1, ngrid
191    zlev(ig, nlev) = zlay(ig, nlay) + (zlay(ig,nlay)-zlev(ig,nlev-1))
192  END DO
[541]193
[2561]194
[1992]195  DO k = 1, nlay
196    DO ig = 1, ngrid
197      unsdz(ig, k) = 1.E+0/(zlev(ig,k+1)-zlev(ig,k))
198    END DO
199  END DO
200  DO ig = 1, ngrid
201    unsdzdec(ig, 1) = 1.E+0/(zlay(ig,1)-zlev(ig,1))
202  END DO
203  DO k = 2, nlay
204    DO ig = 1, ngrid
205      unsdzdec(ig, k) = 1.E+0/(zlay(ig,k)-zlay(ig,k-1))
206    END DO
207  END DO
208  DO ig = 1, ngrid
209    unsdzdec(ig, nlay+1) = 1.E+0/(zlev(ig,nlay+1)-zlay(ig,nlay))
210  END DO
[1738]211
[2561]212!=========================================================================
213! Richardson number and stability functions
214!=========================================================================
215 
216! initialize arrays:
217
[2574]218  m2(1:ngrid, :) = 0.0
219  sm(1:ngrid, :) = 0.0
220  rif(1:ngrid, :) = 0.0
[1738]221
[2561]222!------------------------------------------------------------
[1992]223  DO k = 2, klev
[2561]224
[1992]225    DO ig = 1, ngrid
226      dz(ig, k) = zlay(ig, k) - zlay(ig, k-1)
227      m2(ig, k) = ((u(ig,k)-u(ig,k-1))**2+(v(ig,k)-v(ig, &
228        k-1))**2)/(dz(ig,k)*dz(ig,k))
229      dtetadz(ig, k) = (teta(ig,k)-teta(ig,k-1))/dz(ig, k)
230      n2(ig, k) = g*2.*dtetadz(ig, k)/(teta(ig,k-1)+teta(ig,k))
231      ri = n2(ig, k)/max(m2(ig,k), 1.E-10)
232      IF (ri<ric) THEN
233        rif(ig, k) = frif(ri)
234      ELSE
235        rif(ig, k) = rifc
236      END IF
[2721]237if (new_yamada4) then
238        alpha(ig, k) = max(falpha(rif(ig,k)),seuilalpha)
239        sm(ig, k) = max(fsm(rif(ig,k)),seuilsm)
240else
[1992]241      IF (rif(ig,k)<0.16) THEN
242        alpha(ig, k) = falpha(rif(ig,k))
243        sm(ig, k) = fsm(rif(ig,k))
244      ELSE
[2561]245        alpha(ig, k) = seuilalpha
246        sm(ig, k) = seuilsm
[1992]247      END IF
[2721]248
249end if
[1992]250      zz(ig, k) = b1*m2(ig, k)*(1.-rif(ig,k))*sm(ig, k)
251    END DO
252  END DO
[1738]253
254
255
[2721]256
257
258  !=======================================================================
259  !     DIFFERENT TYPES  DE SCHEMA de  YAMADA
260  !=======================================================================
261
[2817]262  ! On commence par calculer q2 a partir de la tke
[2721]263
264  IF (new_yamada4) THEN
265      DO k=1,klev+1
266         q2(1:ngrid,k)=tke(1:ngrid,k)*ydeux
267      ENDDO
268  ELSE
269      DO k=1,klev+1
270         q2(1:ngrid,k)=tke(1:ngrid,k)
271      ENDDO
272  ENDIF
273
[2561]274! ====================================================================
275! Computing the mixing length
276! ====================================================================
[541]277
[2561]278 
[2573]279  CALL mixinglength(ni,nsrf,ngrid,iflag_pbl,pbl_lmixmin_alpha,lmixmin,zlay,zlev,u,v,q2,n2, l)
[541]280
281
[2561]282  !--------------
[1992]283  ! Yamada 2.0
[2561]284  !--------------
[1992]285  IF (iflag_pbl==6) THEN
[2561]286 
[1992]287    DO k = 2, klev
[2574]288      q2(1:ngrid, k) = l(1:ngrid, k)**2*zz(1:ngrid, k)
[1992]289    END DO
290
291
[2561]292  !------------------
293  ! Yamada 2.Fournier
294  !------------------
295
[1992]296  ELSE IF (iflag_pbl==7) THEN
297
[2561]298
[1992]299    ! Calcul de l,  km, au pas precedent
[2561]300    !....................................
[1992]301    DO k = 2, klev
302      DO ig = 1, ngrid
303        delta(ig, k) = q2(ig, k)/(l(ig,k)**2*sm(ig,k))
304        kmpre(ig, k) = l(ig, k)*sqrt(q2(ig,k))*sm(ig, k)
305        mpre(ig, k) = sqrt(m2(ig,k))
306      END DO
307    END DO
308
309    DO k = 2, klev - 1
310      DO ig = 1, ngrid
311        m2cstat = max(alpha(ig,k)*n2(ig,k)+delta(ig,k)/b1, 1.E-12)
312        mcstat = sqrt(m2cstat)
313
[2561]314     ! Puis on ecrit la valeur de q qui annule l'equation de m supposee en q3
315     !.........................................................................
[1992]316
317        IF (k==2) THEN
318          kmcstat = 1.E+0/mcstat*(unsdz(ig,k)*kmpre(ig,k+1)*mpre(ig,k+1)+ &
319            unsdz(ig,k-1)*cd(ig)*(sqrt(u(ig,3)**2+v(ig,3)**2)-mcstat/unsdzdec &
320            (ig,k)-mpre(ig,k+1)/unsdzdec(ig,k+1))**2)/(unsdz(ig,k)+unsdz(ig,k &
321            -1))
[541]322        ELSE
[1992]323          kmcstat = 1.E+0/mcstat*(unsdz(ig,k)*kmpre(ig,k+1)*mpre(ig,k+1)+ &
324            unsdz(ig,k-1)*kmpre(ig,k-1)*mpre(ig,k-1))/ &
325            (unsdz(ig,k)+unsdz(ig,k-1))
326        END IF
[2561]327
[1992]328        tmp2 = kmcstat/(sm(ig,k)/q2(ig,k))/l(ig, k)
329        q2(ig, k) = max(tmp2, 1.E-12)**(2./3.)
[541]330
[1992]331      END DO
332    END DO
[541]333
[2561]334
335    ! ------------------------
[1992]336    ! Yamada 2.5 a la Didi
[2561]337    !-------------------------
[541]338
[2561]339  ELSE IF (iflag_pbl==8 .OR. iflag_pbl==9) THEN
[541]340
[2561]341    ! Calcul de l, km, au pas precedent
342    !....................................
[1992]343    DO k = 2, klev
344      DO ig = 1, ngrid
345        delta(ig, k) = q2(ig, k)/(l(ig,k)**2*sm(ig,k))
346        IF (delta(ig,k)<1.E-20) THEN
347          delta(ig, k) = 1.E-20
348        END IF
349        km(ig, k) = l(ig, k)*sqrt(q2(ig,k))*sm(ig, k)
350        aa0 = (m2(ig,k)-alpha(ig,k)*n2(ig,k)-delta(ig,k)/b1)
351        aa1 = (m2(ig,k)*(1.-rif(ig,k))-delta(ig,k)/b1)
352        aa(ig, k) = aa1*dt/(delta(ig,k)*l(ig,k))
353        qpre = sqrt(q2(ig,k))
354        IF (aa(ig,k)>0.) THEN
355          q2(ig, k) = (qpre+aa(ig,k)*qpre*qpre)**2
356        ELSE
357          q2(ig, k) = (qpre/(1.-aa(ig,k)*qpre))**2
358        END IF
359        ! else ! iflag_pbl=9
360        ! if (aa(ig,k)*qpre.gt.0.9) then
361        ! q2(ig,k)=(qpre*10.)**2
362        ! else
363        ! q2(ig,k)=(qpre/(1.-aa(ig,k)*qpre))**2
364        ! endif
365        ! endif
366        q2(ig, k) = min(max(q2(ig,k),1.E-10), 1.E4)
367      END DO
368    END DO
[1738]369
[1992]370  ELSE IF (iflag_pbl>=10) THEN
[1738]371
[3780]372    shear(:,:)=0.
373    buoy(:,:)=0.
374    dissip(:,:)=0.
375    km(:,:)=0.
376       
[2817]377    IF (yamada4_num>=1) THEN
378 
[1992]379    DO k = 2, klev - 1
[2817]380      DO ig=1,ngrid
381      q2(ig, k) = min(max(q2(ig,k),1.E-10), 1.E4)
382      km(ig, k) = l(ig, k)*sqrt(q2(ig,k))*sm(ig, k)
383      shear(ig,k)=km(ig, k)*m2(ig, k)
384      buoy(ig,k)=km(ig, k)*m2(ig, k)*(-1.*rif(ig,k))
[3784]385!      dissip(ig,k)=min(max(((sqrt(q2(ig,k)))**3)/(b1*l(ig,k)),1.E-12),1.E4)
386      dissip(ig,k)=((sqrt(q2(ig,k)))**3)/(b1*l(ig,k))
[2817]387     ENDDO
388    ENDDO
[3780]389   
[2817]390    IF (yamada4_num==1) THEN ! Schema du MAR tel quel
391       DO k = 2, klev - 1
392         DO ig=1,ngrid
393         tkeprov=q2(ig,k)/ydeux
[2828]394         tkeprov= tkeprov*                           &
[2817]395           &  (tkeprov+dt*(shear(ig,k)+max(0.,buoy(ig,k))))/ &
[4289]396           &  (tkeprov+dt*((-1.)*min(0.,buoy(ig,k))+dissip(ig,k)+drgpro(ig,k)*tkeprov))
[2828]397         q2(ig,k)=tkeprov*ydeux
[2817]398        ENDDO
399       ENDDO
[2828]400    ELSE IF (yamada4_num==2) THEN ! version modifiee avec integration exacte pour la dissipation
[2817]401       DO k = 2, klev - 1
402         DO ig=1,ngrid
403         tkeprov=q2(ig,k)/ydeux
[2828]404         disseff=dissip(ig,k)-min(0.,buoy(ig,k))
405         tkeprov = tkeprov/(1.+dt*disseff/(2.*tkeprov))**2
406         tkeprov= tkeprov+dt*(shear(ig,k)+max(0.,buoy(ig,k)))
407         q2(ig,k)=tkeprov*ydeux
[2817]408         ! En cas stable, on traite la flotabilite comme la
409         ! dissipation, en supposant que buoy/q2^3 est constant.
410         ! Puis on prend la solution exacte
411        ENDDO
412       ENDDO
[2828]413    ELSE IF (yamada4_num==3) THEN ! version modifiee avec integration exacte pour la dissipation
414       DO k = 2, klev - 1
415         DO ig=1,ngrid
416         tkeprov=q2(ig,k)/ydeux
417         disseff=dissip(ig,k)-min(0.,buoy(ig,k))
418         tkeprov=tkeprov*exp(-dt*disseff/tkeprov)
419         tkeprov= tkeprov+dt*(shear(ig,k)+max(0.,buoy(ig,k)))
420         q2(ig,k)=tkeprov*ydeux
421         ! En cas stable, on traite la flotabilite comme la
422         ! dissipation, en supposant que buoy/q2^3 est constant.
423         ! Puis on prend la solution exacte
424        ENDDO
425       ENDDO
426    ELSE IF (yamada4_num==4) THEN ! version modifiee avec integration exacte pour la dissipation
427       DO k = 2, klev - 1
428         DO ig=1,ngrid
429         tkeprov=q2(ig,k)/ydeux
430         tkeprov= tkeprov+dt*(shear(ig,k)+max(0.,buoy(ig,k)))
431         tkeprov= tkeprov*                           &
432           &  tkeprov/ &
433           &  (tkeprov+dt*((-1.)*min(0.,buoy(ig,k))+dissip(ig,k)))
434         q2(ig,k)=tkeprov*ydeux
435         ! En cas stable, on traite la flotabilite comme la
436         ! dissipation, en supposant que buoy/q2^3 est constant.
437         ! Puis on prend la solution exacte
438        ENDDO
439       ENDDO
[3780]440       
441      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
442      !! Attention, yamada4_num=5 est inexacte car néglige les termes de flottabilité
443      !! en conditions instables
444      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
[2828]445    ELSE IF (yamada4_num==5) THEN ! version modifiee avec integration exacte pour la dissipation
446       DO k = 2, klev - 1
447         DO ig=1,ngrid
448         tkeprov=q2(ig,k)/ydeux
[2952]449!FC on ajoute la dissipation due aux arbres
450         disseff=dissip(ig,k)-min(0.,buoy(ig,k)) + drgpro(ig,k)*tkeprov
[2828]451         tkeexp=exp(-dt*disseff/tkeprov)
[2952]452! on prend en compte la tke cree par les arbres
453         winds(ig,k)=sqrt(u(ig,k)**2+v(ig,k)**2)
454         tkeprov= (shear(ig,k)+ &
455          & drgpro(ig,k)*(winds(ig,k))**3)*tkeprov/disseff*(1.-tkeexp)+tkeprov*tkeexp
[2828]456         q2(ig,k)=tkeprov*ydeux
457         ! En cas stable, on traite la flotabilite comme la
458         ! dissipation, en supposant que buoy/q2^3 est constant.
459         ! Puis on prend la solution exacte
460        ENDDO
461       ENDDO
462    ELSE IF (yamada4_num==6) THEN ! version modifiee avec integration exacte pour la dissipation
463       DO k = 2, klev - 1
464         DO ig=1,ngrid
[3780]465         ! En cas stable, on traite la flotabilite comme la
466         ! dissipation, en supposant que dissipeff/TKE est constant.
467         ! Puis on prend la solution exacte
468         ! With drag and dissipation from high vegetation (EV & FC, 05/10/2020)
469         winds(ig,k)=sqrt(u(ig,k)**2+v(ig,k)**2)
[2828]470         tkeprov=q2(ig,k)/ydeux
[3780]471         tkeprov=tkeprov+max(buoy(ig,k)+shear(ig,k)+drgpro(ig,k)*(winds(ig,k))**3,0.)*dt
472         disseff=dissip(ig,k)-min(0.,buoy(ig,k)+shear(ig,k)+drgpro(ig,k)*(winds(ig,k))**3) + drgpro(ig,k)*tkeprov
[2828]473         tkeexp=exp(-dt*disseff/tkeprov)
474         tkeprov= tkeprov*tkeexp
[3784]475         q2(ig,k)=tkeprov*ydeux
[3780]476         
[2828]477        ENDDO
478       ENDDO
[2817]479    ENDIF
480
481    DO k = 2, klev - 1
482      DO ig=1,ngrid
483      q2(ig, k) = min(max(q2(ig,k),1.E-10), 1.E4)
484      ENDDO
485    ENDDO
486
487   ELSE
488
489    DO k = 2, klev - 1
[2574]490      km(1:ngrid, k) = l(1:ngrid, k)*sqrt(q2(1:ngrid,k))*sm(1:ngrid, k)
[2721]491      q2(1:ngrid, k) = q2(1:ngrid, k) + ydeux*dt*km(1:ngrid, k)*m2(1:ngrid, k)*(1.-rif(1:ngrid,k))
492!     q2(1:ngrid, k) = q2(1:ngrid, k) + dt*km(1:ngrid, k)*m2(1:ngrid, k)*(1.-rif(1:ngrid,k))
[2574]493      q2(1:ngrid, k) = min(max(q2(1:ngrid,k),1.E-10), 1.E4)
[3784]494       q2(1:ngrid, k) = 1./(1./sqrt(q2(1:ngrid,k))+dt/(yun*l(1:ngrid,k)*b1))
[2721]495!     q2(1:ngrid, k) = 1./(1./sqrt(q2(1:ngrid,k))+dt/(2*l(1:ngrid,k)*b1))
[2574]496      q2(1:ngrid, k) = q2(1:ngrid, k)*q2(1:ngrid, k)
[1992]497    END DO
[1738]498
[2817]499  ENDIF
[1738]500
[1992]501  ELSE
[3531]502     abort_message='Cas nom prevu dans yamada4'
503     CALL abort_physic(modname,abort_message,1)
[541]504
[1992]505  END IF ! Fin du cas 8
[541]506
507
[1992]508  ! ====================================================================
[2561]509  ! Calcul des coefficients de melange
[1992]510  ! ====================================================================
[2561]511
[1992]512  DO k = 2, klev
513    DO ig = 1, ngrid
514      zq = sqrt(q2(ig,k))
[2561]515      km(ig, k) = l(ig, k)*zq*sm(ig, k)     ! For momentum
516      kn(ig, k) = km(ig, k)*alpha(ig, k)    ! For scalars
517      kq(ig, k) = l(ig, k)*zq*0.2           ! For TKE
[1992]518    END DO
519  END DO
[2561]520
521
522  !====================================================================
523  ! Transport diffusif vertical de la TKE par la TKE
524  !====================================================================
525
526
[1992]527    ! initialize near-surface and top-layer mixing coefficients
[2561]528    !...........................................................
[541]529
[2561]530  kq(1:ngrid, 1) = kq(1:ngrid, 2)    ! constant (ie no gradient) near the surface
531  kq(1:ngrid, klev+1) = 0            ! zero at the top
532
533    ! Transport diffusif vertical de la TKE.
534    !.......................................
535
[4822]536  IF (iflag_vdif_q2==1) THEN
[2574]537    q2(1:ngrid, 1) = q2(1:ngrid, 2)
[1992]538    CALL vdif_q2(dt, g, rconst, ngrid, plev, temp, kq, q2)
539  END IF
[541]540
541
[2561]542  !====================================================================
543  ! Traitement particulier pour les cas tres stables, introduction d'une
544  ! longueur de m??lange minimale
545  !====================================================================
546  !
547  ! Reference: Local versus Nonlocal boundary-layer diffusion in a global climate model
548  !            Holtslag A.A.M. and Boville B.A.
549  !            J. Clim., 6, 1825-1842, 1993
[541]550
[2561]551
552 IF (hboville) THEN
553
554
[1992]555  IF (prt_level>1) THEN
[3531]556    WRITE(lunout,*) 'YAMADA4 0'
[2561]557  END IF
558
[1992]559  DO ig = 1, ngrid
560    coriol(ig) = 1.E-4
561    pblhmin(ig) = 0.07*ustar(ig)/max(abs(coriol(ig)), 2.546E-5)
562  END DO
[1738]563
[1992]564  IF (1==1) THEN
565    IF (iflag_pbl==8 .OR. iflag_pbl==10) THEN
[1738]566
[1992]567      DO k = 2, klev
568        DO ig = 1, ngrid
569          IF (teta(ig,2)>teta(ig,1)) THEN
570            qmin = ustar(ig)*(max(1.-zlev(ig,k)/pblhmin(ig),0.))**2
571            kmin = kap*zlev(ig, k)*qmin
572          ELSE
573            kmin = -1. ! kmin n'est utilise que pour les SL stables.
574          END IF
575          IF (kn(ig,k)<kmin .OR. km(ig,k)<kmin) THEN
[2561]576
[1992]577            kn(ig, k) = kmin
578            km(ig, k) = kmin
579            kq(ig, k) = kmin
[2561]580
581 ! la longueur de melange est suposee etre l= kap z
582 ! K=l q Sm d'ou q2=(K/l Sm)**2
583
[1992]584            q2(ig, k) = (qmin/sm(ig,k))**2
585          END IF
586        END DO
587      END DO
[1738]588
[1992]589    ELSE
590      DO k = 2, klev
591        DO ig = 1, ngrid
592          IF (teta(ig,2)>teta(ig,1)) THEN
593            qmin = ustar(ig)*(max(1.-zlev(ig,k)/pblhmin(ig),0.))**2
594            kmin = kap*zlev(ig, k)*qmin
595          ELSE
596            kmin = -1. ! kmin n'est utilise que pour les SL stables.
597          END IF
598          IF (kn(ig,k)<kmin .OR. km(ig,k)<kmin) THEN
599            kn(ig, k) = kmin
600            km(ig, k) = kmin
601            kq(ig, k) = kmin
[2561]602 ! la longueur de melange est suposee etre l= kap z
603 ! K=l q Sm d'ou q2=(K/l Sm)**2
[1992]604            sm(ig, k) = 1.
605            alpha(ig, k) = 1.
606            q2(ig, k) = min((qmin/sm(ig,k))**2, 10.)
607            zq = sqrt(q2(ig,k))
608            km(ig, k) = l(ig, k)*zq*sm(ig, k)
609            kn(ig, k) = km(ig, k)*alpha(ig, k)
610            kq(ig, k) = l(ig, k)*zq*0.2
611          END IF
612        END DO
613      END DO
614    END IF
[1738]615
[1992]616  END IF
[541]617
[2561]618 END IF ! hboville
619
[2828]620! Ajout d'une viscosite moleculaire
[3041]621   km(1:ngrid,2:klev)=km(1:ngrid,2:klev)+viscom
622   kn(1:ngrid,2:klev)=kn(1:ngrid,2:klev)+viscoh
623   kq(1:ngrid,2:klev)=kq(1:ngrid,2:klev)+viscoh
[2828]624
[1992]625  IF (prt_level>1) THEN
[3531]626    WRITE(lunout,*)'YAMADA4 1'
[1992]627  END IF !(prt_level>1) THEN
[2561]628
629
630 !======================================================
631 ! Estimations de w'2 et T'2 d'apres Abdela et McFarlane
632 !======================================================
633 !
634 ! Reference: A New Second-Order Turbulence Closure Scheme for the Planetary Boundary Layer
635 !            Abdella K and McFarlane N
636 !            J. Atmos. Sci., 54, 1850-1867, 1997
637
[1992]638  ! Diagnostique pour stokage
[2561]639  !..........................
[541]640
[1992]641  IF (1==0) THEN
642    rino = rif
643    smyam(1:ngrid, 1) = 0.
644    styam(1:ngrid, 1) = 0.
645    lyam(1:ngrid, 1) = 0.
646    knyam(1:ngrid, 1) = 0.
647    w2yam(1:ngrid, 1) = 0.
648    t2yam(1:ngrid, 1) = 0.
[878]649
[1992]650    smyam(1:ngrid, 2:klev) = sm(1:ngrid, 2:klev)
651    styam(1:ngrid, 2:klev) = sm(1:ngrid, 2:klev)*alpha(1:ngrid, 2:klev)
652    lyam(1:ngrid, 2:klev) = l(1:ngrid, 2:klev)
653    knyam(1:ngrid, 2:klev) = kn(1:ngrid, 2:klev)
[541]654
655
[2561]656  ! Calcul de w'2 et T'2
657  !.......................
658
[1992]659    w2yam(1:ngrid, 2:klev) = q2(1:ngrid, 2:klev)*0.24 + &
660      lyam(1:ngrid, 2:klev)*5.17*kn(1:ngrid, 2:klev)*n2(1:ngrid, 2:klev)/ &
661      sqrt(q2(1:ngrid,2:klev))
[4009]662 
[1992]663    t2yam(1:ngrid, 2:klev) = 9.1*kn(1:ngrid, 2:klev)* &
664      dtetadz(1:ngrid, 2:klev)**2/sqrt(q2(1:ngrid,2:klev))* &
665      lyam(1:ngrid, 2:klev)
666  END IF
[1403]667
[2721]668
669
[2561]670!============================================================================
[2817]671! Mise a jour de la tke
[2721]672!============================================================================
[2561]673
[2721]674  IF (new_yamada4) THEN
675     DO k=1,klev+1
676        tke(1:ngrid,k)=q2(1:ngrid,k)/ydeux
677     ENDDO
678  ELSE
679     DO k=1,klev+1
680        tke(1:ngrid,k)=q2(1:ngrid,k)
681     ENDDO
682  ENDIF
683
684
685!============================================================================
[4009]686! Diagnostique de la dissipation et vitesse verticale
[3780]687!============================================================================
[2721]688
[3780]689! Diagnostics
[4884]690
691 eps(:,:)=0.
[4009]692 wprime(1:ngrid,:,nsrf)=0.
693 DO k=2,klev
694    DO ig=1,ngrid
[4884]695       eps(ig,k)=dissip(ig,k)
[4009]696       jg=ni(ig)
697       wprime(jg,k,nsrf)=sqrt(MAX(1./3*q2(ig,k),0.))
698    ENDDO
699 ENDDO
[4881]700
[3780]701 
702!=============================================================================
703
[1992]704  RETURN
[2561]705
706
[1992]707END SUBROUTINE yamada4
[2561]708
709!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
710
711!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[1992]712SUBROUTINE vdif_q2(timestep, gravity, rconst, ngrid, plev, temp, kmy, q2)
[2561]713
[4448]714  USE dimphy, only : klev,klon
[1992]715  IMPLICIT NONE
[2561]716 
717!    vdif_q2: subroutine qui calcule la diffusion de la TKE par la TKE
718!             avec un schema implicite en temps avec
719!             inversion d'un syst??me tridiagonal
720!
721!     Reference: Description of the interface with the surface and
722!                the computation of the turbulet diffusion in LMDZ
723!                Technical note on LMDZ
724!                Dufresne, J-L, Ghattas, J. and Grandpeix, J-Y
725!
726!============================================================================
727! Declarations
728!============================================================================
[1403]729
[1992]730  REAL plev(klon, klev+1)
731  REAL temp(klon, klev)
732  REAL timestep
733  REAL gravity, rconst
734  REAL kstar(klon, klev+1), zz
735  REAL kmy(klon, klev+1)
736  REAL q2(klon, klev+1)
737  REAL deltap(klon, klev+1)
738  REAL denom(klon, klev+1), alpha(klon, klev+1), beta(klon, klev+1)
739  INTEGER ngrid
[1403]740
[1992]741  INTEGER i, k
[1403]742
[2561]743
744!=========================================================================
745! Calcul
746!=========================================================================
747
[1992]748  DO k = 1, klev
749    DO i = 1, ngrid
750      zz = (plev(i,k)+plev(i,k+1))*gravity/(rconst*temp(i,k))
751      kstar(i, k) = 0.125*(kmy(i,k+1)+kmy(i,k))*zz*zz/ &
752        (plev(i,k)-plev(i,k+1))*timestep
753    END DO
754  END DO
[1403]755
[1992]756  DO k = 2, klev
757    DO i = 1, ngrid
758      deltap(i, k) = 0.5*(plev(i,k-1)-plev(i,k+1))
759    END DO
760  END DO
761  DO i = 1, ngrid
762    deltap(i, 1) = 0.5*(plev(i,1)-plev(i,2))
763    deltap(i, klev+1) = 0.5*(plev(i,klev)-plev(i,klev+1))
764    denom(i, klev+1) = deltap(i, klev+1) + kstar(i, klev)
765    alpha(i, klev+1) = deltap(i, klev+1)*q2(i, klev+1)/denom(i, klev+1)
766    beta(i, klev+1) = kstar(i, klev)/denom(i, klev+1)
767  END DO
[1403]768
[1992]769  DO k = klev, 2, -1
770    DO i = 1, ngrid
771      denom(i, k) = deltap(i, k) + (1.-beta(i,k+1))*kstar(i, k) + &
772        kstar(i, k-1)
773      alpha(i, k) = (q2(i,k)*deltap(i,k)+kstar(i,k)*alpha(i,k+1))/denom(i, k)
774      beta(i, k) = kstar(i, k-1)/denom(i, k)
775    END DO
776  END DO
[1403]777
[1992]778  ! Si on recalcule q2(1)
[2561]779  !.......................
[1992]780  IF (1==0) THEN
781    DO i = 1, ngrid
782      denom(i, 1) = deltap(i, 1) + (1-beta(i,2))*kstar(i, 1)
783      q2(i, 1) = (q2(i,1)*deltap(i,1)+kstar(i,1)*alpha(i,2))/denom(i, 1)
784    END DO
785  END IF
[1403]786
[2561]787
[1992]788  DO k = 2, klev + 1
789    DO i = 1, ngrid
790      q2(i, k) = alpha(i, k) + beta(i, k)*q2(i, k-1)
791    END DO
792  END DO
[1403]793
[1992]794  RETURN
795END SUBROUTINE vdif_q2
[2561]796!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
797
798
799
800!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
801 SUBROUTINE vdif_q2e(timestep, gravity, rconst, ngrid, plev, temp, kmy, q2)
802 
[4448]803   USE dimphy, only : klev,klon
[1992]804  IMPLICIT NONE
[1403]805
[2561]806! vdif_q2e: subroutine qui calcule la diffusion de TKE par la TKE
807!           avec un schema explicite en temps
[1403]808
[2561]809
810!====================================================
811! Declarations
812!====================================================
813
[1992]814  REAL plev(klon, klev+1)
815  REAL temp(klon, klev)
816  REAL timestep
817  REAL gravity, rconst
818  REAL kstar(klon, klev+1), zz
819  REAL kmy(klon, klev+1)
820  REAL q2(klon, klev+1)
821  REAL deltap(klon, klev+1)
822  REAL denom(klon, klev+1), alpha(klon, klev+1), beta(klon, klev+1)
823  INTEGER ngrid
824  INTEGER i, k
[1403]825
[2561]826
827!==================================================
828! Calcul
829!==================================================
830
[1992]831  DO k = 1, klev
832    DO i = 1, ngrid
833      zz = (plev(i,k)+plev(i,k+1))*gravity/(rconst*temp(i,k))
834      kstar(i, k) = 0.125*(kmy(i,k+1)+kmy(i,k))*zz*zz/ &
835        (plev(i,k)-plev(i,k+1))*timestep
836    END DO
837  END DO
[1403]838
[1992]839  DO k = 2, klev
840    DO i = 1, ngrid
841      deltap(i, k) = 0.5*(plev(i,k-1)-plev(i,k+1))
842    END DO
843  END DO
844  DO i = 1, ngrid
845    deltap(i, 1) = 0.5*(plev(i,1)-plev(i,2))
846    deltap(i, klev+1) = 0.5*(plev(i,klev)-plev(i,klev+1))
847  END DO
848
849  DO k = klev, 2, -1
850    DO i = 1, ngrid
851      q2(i, k) = q2(i, k) + (kstar(i,k)*(q2(i,k+1)-q2(i, &
852        k))-kstar(i,k-1)*(q2(i,k)-q2(i,k-1)))/deltap(i, k)
853    END DO
854  END DO
855
856  DO i = 1, ngrid
857    q2(i, 1) = q2(i, 1) + (kstar(i,1)*(q2(i,2)-q2(i,1)))/deltap(i, 1)
858    q2(i, klev+1) = q2(i, klev+1) + (-kstar(i,klev)*(q2(i,klev+1)-q2(i, &
859      klev)))/deltap(i, klev+1)
860  END DO
861
862  RETURN
863END SUBROUTINE vdif_q2e
[2561]864
865!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
866
867
868!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
869
[2573]870SUBROUTINE mixinglength(ni, nsrf, ngrid,iflag_pbl,pbl_lmixmin_alpha,lmixmin,zlay,zlev,u,v,q2,n2, lmix)
[2561]871
872
873
[4448]874  USE dimphy, only : klev,klon
875  USE yamada_ini_mod, only : l0
[2561]876  USE phys_state_var_mod, only: zstd, zsig, zmea
877  USE phys_local_var_mod, only: l_mixmin, l_mix
[4448]878  USE yamada_ini_mod, only : kap, kapb
[2561]879
880 ! zstd: ecart type de la'altitud e sous-maille
881 ! zmea: altitude moyenne sous maille
882 ! zsig: pente moyenne de le maille
883
884  USE geometry_mod, only: cell_area
885  ! aire_cell: aire de la maille
886
887  IMPLICIT NONE
888!*************************************************************************
889! Subrourine qui calcule la longueur de m??lange dans le sch??ma de turbulence
890! avec la formule de Blackadar
891! Calcul d'un  minimum en fonction de l'orographie sous-maille:
892! L'id??e est la suivante: plus il y a de relief, plus il y a du m??lange
893! induit par les circulations meso et submeso ??chelles.
894!
895! References: * The vertical distribution of wind and turbulent exchange in a neutral atmosphere
896!               Blackadar A.K.
897!               J. Geophys. Res., 64, No 8, 1962
898!
899!             * An evaluation of neutral and convective planetary boundary-layer parametrisations relative
900!               to large eddy simulations
901!               Ayotte K et al
902!               Boundary Layer Meteorology, 79, 131-175, 1996
903!
904!
905!             * Local Similarity in the Stable Boundary Layer and Mixing length Approaches: consistency of concepts
906!               Van de Wiel B.J.H et al
907!               Boundary-Lay Meteorol, 128, 103-166, 2008
908!
909!
910! Histoire:
911!----------
912! * premi??re r??daction, Etienne et Frederic, 09/06/2016
913!
914! ***********************************************************************
915
916!==================================================================
917! Declarations
918!==================================================================
919
920! Inputs
921!-------
922 INTEGER            ni(klon)           ! indice sur la grille original (non restreinte)
923 INTEGER            nsrf               ! Type de surface
924 INTEGER            ngrid              ! Nombre de points concern??s sur l'horizontal
925 INTEGER            iflag_pbl          ! Choix du sch??ma de turbulence
[4019]926 REAL               pbl_lmixmin_alpha  ! on active ou non le calcul de la longueur de melange minimum en fonction du relief
[2561]927 REAL               lmixmin            ! Minimum absolu de la longueur de m??lange
928 REAL               zlay(klon, klev)   ! altitude du centre de la couche
929 REAL               zlev(klon, klev+1) ! atitude de l'interface inf??rieure de la couche
930 REAL               u(klon, klev)      ! vitesse du vent zonal
931 REAL               v(klon, klev)      ! vitesse du vent meridional
932 REAL               q2(klon, klev+1)   ! energie cin??tique turbulente
933 REAL               n2(klon, klev+1)   ! frequence de Brunt-Vaisala
934
935!In/out
936!-------
937
938! Outputs
939!---------
940
941 REAL               lmix(klon, klev+1)    ! Longueur de melange 
942
943
944! Local
945!-------
946 
947 INTEGER  ig,jg, k
948 REAL     h_oro(klon)
949 REAL     hlim(klon)
950 REAL zq
951 REAL sq(klon), sqz(klon)
952 REAL fl, zzz, zl0, zq2, zn2
953 REAL famorti, zzzz, zh_oro, zhlim
954 REAL l1(klon, klev+1), l2(klon,klev+1)
955 REAL winds(klon, klev)
956 REAL xcell
957 REAL zstdslope(klon) 
958 REAL lmax
959 REAL l2strat, l2neutre, extent 
960 REAL l2limit(klon)
961!===============================================================
962! Fonctions utiles
963!===============================================================
964
965! Calcul de l suivant la formule de Blackadar 1962 adapt??e par Ayotte 1996
966!..........................................................................
967
968 fl(zzz, zl0, zq2, zn2) = max(min(l0(ig)*kap*zlev(ig, &
969    k)/(kap*zlev(ig,k)+l0(ig)),0.5*sqrt(q2(ig,k))/sqrt( &
970    max(n2(ig,k),1.E-10))), 1.E-5)
971 
972! Fonction d'amortissement de la turbulence au dessus de la montagne
973! On augmente l'amortissement en diminuant la valeur de hlim (extent) dans le code
974!.....................................................................
975
976 famorti(zzzz, zh_oro, zhlim)=(-1.)*ATAN((zzzz-zh_oro)/(zhlim-zh_oro))*2./3.1416+1.   
977
[2574]978  IF (ngrid==0) RETURN
[2561]979
980
981!=====================================================================
982!         CALCUL de la LONGUEUR de m??lange suivant BLACKADAR: l1
983!=====================================================================
984
[3780]985  l1(1:ngrid,:)=0.
[2561]986  IF (iflag_pbl==8 .OR. iflag_pbl==10) THEN
987
988   
989    ! Iterative computation of l0
990    ! This version is kept for iflag_pbl only for convergence
991    ! with NPv3.1 Cmip5 simulations
992    !...................................................................
993
994    DO ig = 1, ngrid
995      sq(ig) = 1.E-10
996      sqz(ig) = 1.E-10
997    END DO
998    DO k = 2, klev - 1
999      DO ig = 1, ngrid
1000        zq = sqrt(q2(ig,k))
1001        sqz(ig) = sqz(ig) + zq*zlev(ig, k)*(zlay(ig,k)-zlay(ig,k-1))
1002        sq(ig) = sq(ig) + zq*(zlay(ig,k)-zlay(ig,k-1))
1003      END DO
1004    END DO
1005    DO ig = 1, ngrid
1006      l0(ig) = 0.2*sqz(ig)/sq(ig)
1007    END DO
1008    DO k = 2, klev
1009      DO ig = 1, ngrid
1010        l1(ig, k) = fl(zlev(ig,k), l0(ig), q2(ig,k), n2(ig,k))
1011      END DO
1012    END DO
1013
1014  ELSE
1015
1016   
1017    ! In all other case, the assymptotic mixing length l0 is imposed (150m)
1018    !......................................................................
1019
[2574]1020    l0(1:ngrid) = 150.
[2561]1021    DO k = 2, klev
1022      DO ig = 1, ngrid
1023        l1(ig, k) = fl(zlev(ig,k), l0(ig), q2(ig,k), n2(ig,k))
1024      END DO
1025    END DO
1026
1027  END IF
1028
[4019]1029!===========================================================================================
1030!  CALCUL d'une longueur de melange minimum en fonctions de la topographie sous maille: l2
1031! si pbl_lmixmin_alpha=TRUE et si on se trouve sur de la terre ( pas actif sur les
[2561]1032! glacier, la glace de mer et les oc??ans)
[4019]1033!===========================================================================================
[2561]1034
[2574]1035   l2(1:ngrid,:)=0.0
1036   l_mixmin(1:ngrid,:,nsrf)=0.
[3784]1037   l_mix(1:ngrid,:,nsrf)=0.
[4019]1038   hlim(1:ngrid)=0.
[2561]1039
1040   IF (nsrf .EQ. 1) THEN
1041
1042! coefficients
1043!--------------
1044
[2574]1045     extent=2.                                                         ! On ??tend l'impact du relief jusqu'?? extent*h, extent >1. 
1046     lmax=150.                                                         ! Longueur de m??lange max dans l'absolu
[2561]1047
1048! calculs
1049!---------
1050
[2574]1051     DO ig=1,ngrid
[2561]1052
1053      ! On calcule la hauteur du relief
1054      !.................................
1055      ! On ne peut pas prendre zstd seulement pour caracteriser le relief sous maille
1056      ! car sur un terrain pentu mais sans relief, zstd est non nul (comme en Antarctique, C. Genthon)
1057      ! On corrige donc zstd avec l'ecart type de l'altitude dans la maille sans relief
1058      ! (en gros, une maille de taille xcell avec une pente constante zstdslope)
1059      jg=ni(ig)
1060!     IF (zsig(jg) .EQ. 0.) THEN
1061!          zstdslope(ig)=0.         
1062!     ELSE
1063!     xcell=sqrt(cell_area(jg))
1064!     zstdslope(ig)=max((xcell*zsig(jg)-zmea(jg))**3 /(3.*zsig(jg)),0.)
1065!     zstdslope(ig)=sqrt(zstdslope(ig))
1066!     END IF
1067     
1068!     h_oro(ig)=max(zstd(jg)-zstdslope(ig),0.)   ! Hauteur du relief
1069      h_oro(ig)=zstd(jg)
1070      hlim(ig)=extent*h_oro(ig)     
[2574]1071     ENDDO
[2561]1072
[2574]1073     l2limit(1:ngrid)=0.
[2561]1074
[2574]1075     DO k=2,klev
1076        DO ig=1,ngrid
1077           winds(ig,k)=sqrt(u(ig,k)**2+v(ig,k)**2)
1078           IF (zlev(ig,k) .LE. h_oro(ig)) THEN  ! sous l'orographie
1079              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)
1080              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
1081              l2neutre=MIN(l2neutre,lmax)                                             ! On majore par lmax
1082              l2limit(ig)=MIN(l2neutre,l2strat)                                       ! Calcule de l2 (minimum de la longueur en cas neutre et celle en situation stratifi??e)
1083              l2(ig,k)=l2limit(ig)
[2561]1084                                     
[2574]1085           ELSE IF (zlev(ig,k) .LE. hlim(ig)) THEN ! Si on est au dessus des montagnes, mais affect?? encore par elles
[2561]1086
1087      ! Au dessus des montagnes, on prend la l2limit au sommet des montagnes
1088      ! (la derni??re calcul??e dans la boucle k, vu que k est un indice croissant avec z)
1089      ! et on multiplie l2limit par une fonction qui d??croit entre h et hlim
[2574]1090              l2(ig,k)=l2limit(ig)*famorti(zlev(ig,k),h_oro(ig), hlim(ig))
1091           ELSE                                                                    ! Au dessus de extent*h, on prend l2=l0
1092              l2(ig,k)=0.
1093           END IF
1094        ENDDO
1095     ENDDO
[4019]1096   ENDIF                                                                           ! pbl_lmixmin_alpha
[2561]1097
1098!==================================================================================
1099! On prend le max entre la longueur de melange de blackadar et celle calcul??e
1100! en fonction de la topographie
1101!===================================================================================
1102
1103
[3780]1104 DO k=1,klev+1
[2561]1105    DO ig=1,ngrid
[2574]1106       lmix(ig,k)=MAX(MAX(l1(ig,k), l2(ig,k)),lmixmin)
1107   ENDDO
1108 ENDDO
[2561]1109
[2574]1110! Diagnostics
[2561]1111
[4019]1112 DO k=1,klev+1
[2574]1113    DO ig=1,ngrid
1114       jg=ni(ig)
1115       l_mix(jg,k,nsrf)=lmix(ig,k)
[4019]1116       l_mixmin(jg,k,nsrf)=MAX(l2(ig,k),lmixmin)
[2574]1117    ENDDO
[2561]1118 ENDDO
1119
1120
1121
1122END SUBROUTINE mixinglength
Note: See TracBrowser for help on using the repository browser.