source: LMDZ6/branches/Ocean_skin/libf/phylmd/yamada4.F90 @ 5453

Last change on this file since 5453 was 4368, checked in by lguez, 2 years ago

Sync latest trunk changes to Ocean_skin

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