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

Last change on this file since 4825 was 4825, checked in by fhourdin, 3 months ago

Correction plantage debug wake

  • 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
Line 
1!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2
3SUBROUTINE yamada4(ni, nsrf, ngrid, dt, g, rconst, plev, temp, zlev, zlay, u, v, teta, &
4    cd, tke, km, kn, kq, ustar, iflag_pbl, drgpro)
5
6  USE dimphy, only : klev,klon
7  USE phys_local_var_mod, only: tke_dissip,wprime
8  USE yamada_ini_mod, only : new_yamada4,yamada4_num,hboville
9  USE yamada_ini_mod, only : prt_level, lunout,pbl_lmixmin_alpha,b1,kap,viscom,viscoh
10  USE yamada_ini_mod, only : ric, yun,ydeux,lmixmin,iflag_vdif_q2
11 
12  IMPLICIT NONE
13  ! ************************************************************************************************
14  !
15  ! yamada4: subroutine qui calcule le transfert turbulent avec une fermeture d'ordre 2 ou 2.5
16  !
17  ! Reference: Simulation of nocturnal drainage flows by a q2l Turbulence Closure Model
18  !            Yamada T.
19  !            J. Atmos. Sci, 40, 91-106, 1983
20  !
21  !************************************************************************************************
22  ! Input :
23  !'======
24  ! ni: indice horizontal sur la grille de base, non restreinte
25  ! nsrf: type de surface
26  ! ngrid: nombre de mailles concern??es sur l'horizontal
27  ! dt : pas de temps
28  ! g  : g
29  ! rconst: constante de l'air sec
30  ! zlev : altitude a chaque niveau (interface inferieure de la couche
31  ! de meme indice)
32  ! zlay : altitude au centre de chaque couche
33  ! u,v : vitesse au centre de chaque couche
34  ! (en entree : la valeur au debut du pas de temps)
35  ! teta : temperature potentielle virtuelle au centre de chaque couche
36  ! (en entree : la valeur au debut du pas de temps)
37  ! cd : cdrag pour la quantit?? de mouvement
38  ! (en entree : la valeur au debut du pas de temps)
39  ! ustar: vitesse de friction calcul??e par une formule diagnostique
40  ! iflag_pbl: flag pour choisir des options du sch??ma de turbulence
41  !
42  !             iflag_pbl doit valoir entre 6 et 9
43  !             l=6, on prend  systematiquement une longueur d'equilibre
44  !             iflag_pbl=6 : MY 2.0
45  !             iflag_pbl=7 : MY 2.0.Fournier
46  !             iflag_pbl=8/9 : MY 2.5
47  !             iflag_pbl=8 with special obsolete treatments for convergence
48  !             with Cmpi5 NPv3.1 simulations
49  !             iflag_pbl=10/11 :  New scheme M2 and N2 explicit and dissiptation exact
50  !             iflag_pbl=12 = 11 with vertical diffusion off q2
51  !
52  !             2013/04/01 (FH hourdin@lmd.jussieu.fr)
53  !             Correction for very stable PBLs (iflag_pbl=10 and 11)
54  !             iflag_pbl=8 converges numerically with NPv3.1
55  !             iflag_pbl=11 -> the model starts with NP from start files created by ce0l
56  !                          -> the model can run with longer time-steps.
57  !             2016/11/30 (EV etienne.vignon@lmd.ipsl.fr)
58  !               On met tke (=q2/2) en entr??e plut??t que q2
59  !               On corrige l'update de la tke
60  !             2020/10/01 (EV)
61  !               On ajoute la dissipation de la TKE en diagnostique de sortie
62  !                 
63  ! Inpout/Output :
64  !==============
65  ! tke : tke au bas de chaque couche
66  ! (en entree : la valeur au debut du pas de temps)
67  ! (en sortie : la valeur a la fin du pas de temps)
68 
69  ! Outputs:
70  !==========
71  ! km : diffusivite turbulente de quantite de mouvement (au bas de chaque
72  ! couche)
73  ! (en sortie : la valeur a la fin du pas de temps)
74  ! kn : diffusivite turbulente des scalaires (au bas de chaque couche)
75  ! (en sortie : la valeur a la fin du pas de temps)
76  !
77  !.......................................................................
78
79  !=======================================================================
80  ! Declarations:
81  !=======================================================================
82
83
84  ! Inputs/Outputs
85  !----------------
86  REAL dt, g, rconst
87  REAL plev(klon, klev+1), temp(klon, klev)
88  REAL ustar(klon)
89  REAL kmin, qmin, pblhmin(klon), coriol(klon)
90  REAL zlev(klon, klev+1)
91  REAL zlay(klon, klev)
92  REAL u(klon, klev)
93  REAL v(klon, klev)
94  REAL teta(klon, klev)
95  REAL cd(klon)
96  REAL tke(klon, klev+1)
97  REAL unsdz(klon, klev)
98  REAL unsdzdec(klon, klev+1)
99  REAL kn(klon, klev+1)
100  REAL km(klon, klev+1)
101  INTEGER iflag_pbl, ngrid, nsrf
102  INTEGER ni(klon)
103
104!FC
105  REAL drgpro(klon,klev)
106  REAL winds(klon,klev)
107
108  ! Local
109  !-------
110
111  REAL q2(klon, klev+1)
112  REAL kmpre(klon, klev+1), tmp2, qpre
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
118
119  INTEGER ig, jg, k
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)
126  REAL zz(klon, klev+1)
127  INTEGER iter
128  REAL dissip(klon,klev), tkeprov,tkeexp, shear(klon,klev), buoy(klon,klev)
129  REAL :: disseff
130
131  REAL,SAVE :: rifc
132  !$OMP THREADPRIVATE(rifc)
133  REAL,SAVE :: seuilsm, seuilalpha
134  !$OMP THREADPRIVATE(seuilsm, seuilalpha)
135
136  REAL frif, falpha, fsm
137  REAL rino(klon, klev+1), smyam(klon, klev), styam(klon, klev), &
138    lyam(klon, klev), knyam(klon, klev), w2yam(klon, klev), t2yam(klon, klev)
139
140  CHARACTER (len = 20) :: modname = 'yamada4'
141  CHARACTER (len = 80) :: abort_message
142
143
144
145  ! Fonctions utilis??es
146  !--------------------
147
148  frif(ri) = 0.6588*(ri+0.1776-sqrt(ri*ri-0.3221*ri+0.03156))
149  falpha(ri) = 1.318*(0.2231-ri)/(0.2341-ri)
150  fsm(ri) = 1.96*(0.1912-ri)*(0.2341-ri)/((1.-ri)*(0.2231-ri))
151 
152
153
154    IF (new_yamada4) THEN
155! Corrections et reglages issus du travail de these d'Etienne Vignon.
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
164
165!===============================================================================
166! Flags, tests et ??valuations de constantes
167!===============================================================================
168
169! On utilise ou non la routine de Holstalg Boville pour les cas tres stables
170
171
172  IF (.NOT. (iflag_pbl>=6 .AND. iflag_pbl<=12)) THEN
173    abort_message='probleme de coherence dans appel a MY'
174    CALL abort_physic(modname,abort_message,1)
175  END IF
176
177
178  nlay = klev
179  nlev = klev + 1
180
181
182!========================================================================
183! Calcul des increments verticaux
184!=========================================================================
185
186 
187! Attention: zlev n'est pas declare a nlev
188  DO ig = 1, ngrid
189    zlev(ig, nlev) = zlay(ig, nlay) + (zlay(ig,nlay)-zlev(ig,nlev-1))
190  END DO
191
192
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
209
210!=========================================================================
211! Richardson number and stability functions
212!=========================================================================
213 
214! initialize arrays:
215
216  m2(1:ngrid, :) = 0.0
217  sm(1:ngrid, :) = 0.0
218  rif(1:ngrid, :) = 0.0
219
220!------------------------------------------------------------
221  DO k = 2, klev
222
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
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
239      IF (rif(ig,k)<0.16) THEN
240        alpha(ig, k) = falpha(rif(ig,k))
241        sm(ig, k) = fsm(rif(ig,k))
242      ELSE
243        alpha(ig, k) = seuilalpha
244        sm(ig, k) = seuilsm
245      END IF
246
247end if
248      zz(ig, k) = b1*m2(ig, k)*(1.-rif(ig,k))*sm(ig, k)
249    END DO
250  END DO
251
252
253
254
255
256  !=======================================================================
257  !     DIFFERENT TYPES  DE SCHEMA de  YAMADA
258  !=======================================================================
259
260  ! On commence par calculer q2 a partir de la tke
261
262  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
272! ====================================================================
273! Computing the mixing length
274! ====================================================================
275
276 
277  CALL mixinglength(ni,nsrf,ngrid,iflag_pbl,pbl_lmixmin_alpha,lmixmin,zlay,zlev,u,v,q2,n2, l)
278
279
280  !--------------
281  ! Yamada 2.0
282  !--------------
283  IF (iflag_pbl==6) THEN
284 
285    DO k = 2, klev
286      q2(1:ngrid, k) = l(1:ngrid, k)**2*zz(1:ngrid, k)
287    END DO
288
289
290  !------------------
291  ! Yamada 2.Fournier
292  !------------------
293
294  ELSE IF (iflag_pbl==7) THEN
295
296
297    ! Calcul de l,  km, au pas precedent
298    !....................................
299    DO k = 2, klev
300      DO ig = 1, ngrid
301        delta(ig, k) = q2(ig, k)/(l(ig,k)**2*sm(ig,k))
302        kmpre(ig, k) = l(ig, k)*sqrt(q2(ig,k))*sm(ig, k)
303        mpre(ig, k) = sqrt(m2(ig,k))
304      END DO
305    END DO
306
307    DO k = 2, klev - 1
308      DO ig = 1, ngrid
309        m2cstat = max(alpha(ig,k)*n2(ig,k)+delta(ig,k)/b1, 1.E-12)
310        mcstat = sqrt(m2cstat)
311
312     ! Puis on ecrit la valeur de q qui annule l'equation de m supposee en q3
313     !.........................................................................
314
315        IF (k==2) THEN
316          kmcstat = 1.E+0/mcstat*(unsdz(ig,k)*kmpre(ig,k+1)*mpre(ig,k+1)+ &
317            unsdz(ig,k-1)*cd(ig)*(sqrt(u(ig,3)**2+v(ig,3)**2)-mcstat/unsdzdec &
318            (ig,k)-mpre(ig,k+1)/unsdzdec(ig,k+1))**2)/(unsdz(ig,k)+unsdz(ig,k &
319            -1))
320        ELSE
321          kmcstat = 1.E+0/mcstat*(unsdz(ig,k)*kmpre(ig,k+1)*mpre(ig,k+1)+ &
322            unsdz(ig,k-1)*kmpre(ig,k-1)*mpre(ig,k-1))/ &
323            (unsdz(ig,k)+unsdz(ig,k-1))
324        END IF
325
326        tmp2 = kmcstat/(sm(ig,k)/q2(ig,k))/l(ig, k)
327        q2(ig, k) = max(tmp2, 1.E-12)**(2./3.)
328
329      END DO
330    END DO
331
332
333    ! ------------------------
334    ! Yamada 2.5 a la Didi
335    !-------------------------
336
337  ELSE IF (iflag_pbl==8 .OR. iflag_pbl==9) THEN
338
339    ! Calcul de l, km, au pas precedent
340    !....................................
341    DO k = 2, klev
342      DO ig = 1, ngrid
343        delta(ig, k) = q2(ig, k)/(l(ig,k)**2*sm(ig,k))
344        IF (delta(ig,k)<1.E-20) THEN
345          delta(ig, k) = 1.E-20
346        END IF
347        km(ig, k) = l(ig, k)*sqrt(q2(ig,k))*sm(ig, k)
348        aa0 = (m2(ig,k)-alpha(ig,k)*n2(ig,k)-delta(ig,k)/b1)
349        aa1 = (m2(ig,k)*(1.-rif(ig,k))-delta(ig,k)/b1)
350        aa(ig, k) = aa1*dt/(delta(ig,k)*l(ig,k))
351        qpre = sqrt(q2(ig,k))
352        IF (aa(ig,k)>0.) THEN
353          q2(ig, k) = (qpre+aa(ig,k)*qpre*qpre)**2
354        ELSE
355          q2(ig, k) = (qpre/(1.-aa(ig,k)*qpre))**2
356        END IF
357        ! else ! iflag_pbl=9
358        ! if (aa(ig,k)*qpre.gt.0.9) then
359        ! q2(ig,k)=(qpre*10.)**2
360        ! else
361        ! q2(ig,k)=(qpre/(1.-aa(ig,k)*qpre))**2
362        ! endif
363        ! endif
364        q2(ig, k) = min(max(q2(ig,k),1.E-10), 1.E4)
365      END DO
366    END DO
367
368  ELSE IF (iflag_pbl>=10) THEN
369
370    shear(:,:)=0.
371    buoy(:,:)=0.
372    dissip(:,:)=0.
373    km(:,:)=0.
374       
375    IF (yamada4_num>=1) THEN
376 
377    DO k = 2, klev - 1
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))
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))
385     ENDDO
386    ENDDO
387   
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
392         tkeprov= tkeprov*                           &
393           &  (tkeprov+dt*(shear(ig,k)+max(0.,buoy(ig,k))))/ &
394           &  (tkeprov+dt*((-1.)*min(0.,buoy(ig,k))+dissip(ig,k)+drgpro(ig,k)*tkeprov))
395         q2(ig,k)=tkeprov*ydeux
396        ENDDO
397       ENDDO
398    ELSE IF (yamada4_num==2) THEN ! version modifiee avec integration exacte pour la dissipation
399       DO k = 2, klev - 1
400         DO ig=1,ngrid
401         tkeprov=q2(ig,k)/ydeux
402         disseff=dissip(ig,k)-min(0.,buoy(ig,k))
403         tkeprov = tkeprov/(1.+dt*disseff/(2.*tkeprov))**2
404         tkeprov= tkeprov+dt*(shear(ig,k)+max(0.,buoy(ig,k)))
405         q2(ig,k)=tkeprov*ydeux
406         ! En cas stable, on traite la flotabilite comme la
407         ! dissipation, en supposant que buoy/q2^3 est constant.
408         ! Puis on prend la solution exacte
409        ENDDO
410       ENDDO
411    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
438       
439      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
440      !! Attention, yamada4_num=5 est inexacte car néglige les termes de flottabilité
441      !! en conditions instables
442      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
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
447!FC on ajoute la dissipation due aux arbres
448         disseff=dissip(ig,k)-min(0.,buoy(ig,k)) + drgpro(ig,k)*tkeprov
449         tkeexp=exp(-dt*disseff/tkeprov)
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
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
463         ! En cas stable, on traite la flotabilite comme la
464         ! dissipation, en supposant que dissipeff/TKE est constant.
465         ! Puis on prend la solution exacte
466         ! With drag and dissipation from high vegetation (EV & FC, 05/10/2020)
467         winds(ig,k)=sqrt(u(ig,k)**2+v(ig,k)**2)
468         tkeprov=q2(ig,k)/ydeux
469         tkeprov=tkeprov+max(buoy(ig,k)+shear(ig,k)+drgpro(ig,k)*(winds(ig,k))**3,0.)*dt
470         disseff=dissip(ig,k)-min(0.,buoy(ig,k)+shear(ig,k)+drgpro(ig,k)*(winds(ig,k))**3) + drgpro(ig,k)*tkeprov
471         tkeexp=exp(-dt*disseff/tkeprov)
472         tkeprov= tkeprov*tkeexp
473         q2(ig,k)=tkeprov*ydeux
474         
475        ENDDO
476       ENDDO
477    ENDIF
478
479    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
488      km(1:ngrid, k) = l(1:ngrid, k)*sqrt(q2(1:ngrid,k))*sm(1:ngrid, k)
489      q2(1:ngrid, k) = q2(1:ngrid, k) + ydeux*dt*km(1:ngrid, k)*m2(1:ngrid, k)*(1.-rif(1:ngrid,k))
490!     q2(1:ngrid, k) = q2(1:ngrid, k) + dt*km(1:ngrid, k)*m2(1:ngrid, k)*(1.-rif(1:ngrid,k))
491      q2(1:ngrid, k) = min(max(q2(1:ngrid,k),1.E-10), 1.E4)
492       q2(1:ngrid, k) = 1./(1./sqrt(q2(1:ngrid,k))+dt/(yun*l(1:ngrid,k)*b1))
493!     q2(1:ngrid, k) = 1./(1./sqrt(q2(1:ngrid,k))+dt/(2*l(1:ngrid,k)*b1))
494      q2(1:ngrid, k) = q2(1:ngrid, k)*q2(1:ngrid, k)
495    END DO
496
497  ENDIF
498
499  ELSE
500     abort_message='Cas nom prevu dans yamada4'
501     CALL abort_physic(modname,abort_message,1)
502
503  END IF ! Fin du cas 8
504
505
506  ! ====================================================================
507  ! Calcul des coefficients de melange
508  ! ====================================================================
509
510  DO k = 2, klev
511    DO ig = 1, ngrid
512      zq = sqrt(q2(ig,k))
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
516    END DO
517  END DO
518
519
520  !====================================================================
521  ! Transport diffusif vertical de la TKE par la TKE
522  !====================================================================
523
524
525    ! initialize near-surface and top-layer mixing coefficients
526    !...........................................................
527
528  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
534  IF (iflag_vdif_q2==1) THEN
535    q2(1:ngrid, 1) = q2(1:ngrid, 2)
536    CALL vdif_q2(dt, g, rconst, ngrid, plev, temp, kq, q2)
537  END IF
538
539
540  !====================================================================
541  ! Traitement particulier pour les cas tres stables, introduction d'une
542  ! longueur de m??lange minimale
543  !====================================================================
544  !
545  ! Reference: Local versus Nonlocal boundary-layer diffusion in a global climate model
546  !            Holtslag A.A.M. and Boville B.A.
547  !            J. Clim., 6, 1825-1842, 1993
548
549
550 IF (hboville) THEN
551
552
553  IF (prt_level>1) THEN
554    WRITE(lunout,*) 'YAMADA4 0'
555  END IF
556
557  DO ig = 1, ngrid
558    coriol(ig) = 1.E-4
559    pblhmin(ig) = 0.07*ustar(ig)/max(abs(coriol(ig)), 2.546E-5)
560  END DO
561
562  IF (1==1) THEN
563    IF (iflag_pbl==8 .OR. iflag_pbl==10) THEN
564
565      DO k = 2, klev
566        DO ig = 1, ngrid
567          IF (teta(ig,2)>teta(ig,1)) THEN
568            qmin = ustar(ig)*(max(1.-zlev(ig,k)/pblhmin(ig),0.))**2
569            kmin = kap*zlev(ig, k)*qmin
570          ELSE
571            kmin = -1. ! kmin n'est utilise que pour les SL stables.
572          END IF
573          IF (kn(ig,k)<kmin .OR. km(ig,k)<kmin) THEN
574
575            kn(ig, k) = kmin
576            km(ig, k) = kmin
577            kq(ig, k) = kmin
578
579 ! la longueur de melange est suposee etre l= kap z
580 ! K=l q Sm d'ou q2=(K/l Sm)**2
581
582            q2(ig, k) = (qmin/sm(ig,k))**2
583          END IF
584        END DO
585      END DO
586
587    ELSE
588      DO k = 2, klev
589        DO ig = 1, ngrid
590          IF (teta(ig,2)>teta(ig,1)) THEN
591            qmin = ustar(ig)*(max(1.-zlev(ig,k)/pblhmin(ig),0.))**2
592            kmin = kap*zlev(ig, k)*qmin
593          ELSE
594            kmin = -1. ! kmin n'est utilise que pour les SL stables.
595          END IF
596          IF (kn(ig,k)<kmin .OR. km(ig,k)<kmin) THEN
597            kn(ig, k) = kmin
598            km(ig, k) = kmin
599            kq(ig, k) = kmin
600 ! la longueur de melange est suposee etre l= kap z
601 ! K=l q Sm d'ou q2=(K/l Sm)**2
602            sm(ig, k) = 1.
603            alpha(ig, k) = 1.
604            q2(ig, k) = min((qmin/sm(ig,k))**2, 10.)
605            zq = sqrt(q2(ig,k))
606            km(ig, k) = l(ig, k)*zq*sm(ig, k)
607            kn(ig, k) = km(ig, k)*alpha(ig, k)
608            kq(ig, k) = l(ig, k)*zq*0.2
609          END IF
610        END DO
611      END DO
612    END IF
613
614  END IF
615
616 END IF ! hboville
617
618! Ajout d'une viscosite moleculaire
619   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
622
623  IF (prt_level>1) THEN
624    WRITE(lunout,*)'YAMADA4 1'
625  END IF !(prt_level>1) THEN
626
627
628 !======================================================
629 ! Estimations de w'2 et T'2 d'apres Abdela et McFarlane
630 !======================================================
631 !
632 ! Reference: A New Second-Order Turbulence Closure Scheme for the Planetary Boundary Layer
633 !            Abdella K and McFarlane N
634 !            J. Atmos. Sci., 54, 1850-1867, 1997
635
636  ! Diagnostique pour stokage
637  !..........................
638
639  IF (1==0) THEN
640    rino = rif
641    smyam(1:ngrid, 1) = 0.
642    styam(1:ngrid, 1) = 0.
643    lyam(1:ngrid, 1) = 0.
644    knyam(1:ngrid, 1) = 0.
645    w2yam(1:ngrid, 1) = 0.
646    t2yam(1:ngrid, 1) = 0.
647
648    smyam(1:ngrid, 2:klev) = sm(1:ngrid, 2:klev)
649    styam(1:ngrid, 2:klev) = sm(1:ngrid, 2:klev)*alpha(1:ngrid, 2:klev)
650    lyam(1:ngrid, 2:klev) = l(1:ngrid, 2:klev)
651    knyam(1:ngrid, 2:klev) = kn(1:ngrid, 2:klev)
652
653
654  ! Calcul de w'2 et T'2
655  !.......................
656
657    w2yam(1:ngrid, 2:klev) = q2(1:ngrid, 2:klev)*0.24 + &
658      lyam(1:ngrid, 2:klev)*5.17*kn(1:ngrid, 2:klev)*n2(1:ngrid, 2:klev)/ &
659      sqrt(q2(1:ngrid,2:klev))
660 
661    t2yam(1:ngrid, 2:klev) = 9.1*kn(1:ngrid, 2:klev)* &
662      dtetadz(1:ngrid, 2:klev)**2/sqrt(q2(1:ngrid,2:klev))* &
663      lyam(1:ngrid, 2:klev)
664  END IF
665
666
667
668!============================================================================
669! Mise a jour de la tke
670!============================================================================
671
672  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!============================================================================
684! Diagnostique de la dissipation et vitesse verticale
685!============================================================================
686
687! Diagnostics
688 tke_dissip(1:ngrid,:,nsrf)=0.
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
697 
698!=============================================================================
699
700  RETURN
701
702
703END SUBROUTINE yamada4
704
705!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
706
707!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
708SUBROUTINE vdif_q2(timestep, gravity, rconst, ngrid, plev, temp, kmy, q2)
709
710  USE dimphy, only : klev,klon
711  IMPLICIT NONE
712 
713!    vdif_q2: subroutine qui calcule la diffusion de la TKE par la TKE
714!             avec un schema implicite en temps avec
715!             inversion d'un syst??me tridiagonal
716!
717!     Reference: Description of the interface with the surface and
718!                the computation of the turbulet diffusion in LMDZ
719!                Technical note on LMDZ
720!                Dufresne, J-L, Ghattas, J. and Grandpeix, J-Y
721!
722!============================================================================
723! Declarations
724!============================================================================
725
726  REAL plev(klon, klev+1)
727  REAL temp(klon, klev)
728  REAL timestep
729  REAL gravity, rconst
730  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
736
737  INTEGER i, k
738
739
740!=========================================================================
741! Calcul
742!=========================================================================
743
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
751
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
764
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
773
774  ! Si on recalcule q2(1)
775  !.......................
776  IF (1==0) THEN
777    DO i = 1, ngrid
778      denom(i, 1) = deltap(i, 1) + (1-beta(i,2))*kstar(i, 1)
779      q2(i, 1) = (q2(i,1)*deltap(i,1)+kstar(i,1)*alpha(i,2))/denom(i, 1)
780    END DO
781  END IF
782
783
784  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
789
790  RETURN
791END SUBROUTINE vdif_q2
792!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
793
794
795
796!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
797 SUBROUTINE vdif_q2e(timestep, gravity, rconst, ngrid, plev, temp, kmy, q2)
798 
799   USE dimphy, only : klev,klon
800  IMPLICIT NONE
801
802! vdif_q2e: subroutine qui calcule la diffusion de TKE par la TKE
803!           avec un schema explicite en temps
804
805
806!====================================================
807! Declarations
808!====================================================
809
810  REAL plev(klon, klev+1)
811  REAL temp(klon, klev)
812  REAL timestep
813  REAL gravity, rconst
814  REAL kstar(klon, klev+1), zz
815  REAL kmy(klon, klev+1)
816  REAL q2(klon, klev+1)
817  REAL deltap(klon, klev+1)
818  REAL denom(klon, klev+1), alpha(klon, klev+1), beta(klon, klev+1)
819  INTEGER ngrid
820  INTEGER i, k
821
822
823!==================================================
824! Calcul
825!==================================================
826
827  DO k = 1, klev
828    DO i = 1, ngrid
829      zz = (plev(i,k)+plev(i,k+1))*gravity/(rconst*temp(i,k))
830      kstar(i, k) = 0.125*(kmy(i,k+1)+kmy(i,k))*zz*zz/ &
831        (plev(i,k)-plev(i,k+1))*timestep
832    END DO
833  END DO
834
835  DO k = 2, klev
836    DO i = 1, ngrid
837      deltap(i, k) = 0.5*(plev(i,k-1)-plev(i,k+1))
838    END DO
839  END DO
840  DO i = 1, ngrid
841    deltap(i, 1) = 0.5*(plev(i,1)-plev(i,2))
842    deltap(i, klev+1) = 0.5*(plev(i,klev)-plev(i,klev+1))
843  END DO
844
845  DO k = klev, 2, -1
846    DO i = 1, ngrid
847      q2(i, k) = q2(i, k) + (kstar(i,k)*(q2(i,k+1)-q2(i, &
848        k))-kstar(i,k-1)*(q2(i,k)-q2(i,k-1)))/deltap(i, k)
849    END DO
850  END DO
851
852  DO i = 1, ngrid
853    q2(i, 1) = q2(i, 1) + (kstar(i,1)*(q2(i,2)-q2(i,1)))/deltap(i, 1)
854    q2(i, klev+1) = q2(i, klev+1) + (-kstar(i,klev)*(q2(i,klev+1)-q2(i, &
855      klev)))/deltap(i, klev+1)
856  END DO
857
858  RETURN
859END SUBROUTINE vdif_q2e
860
861!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
862
863
864!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
865
866SUBROUTINE mixinglength(ni, nsrf, ngrid,iflag_pbl,pbl_lmixmin_alpha,lmixmin,zlay,zlev,u,v,q2,n2, lmix)
867
868
869
870  USE dimphy, only : klev,klon
871  USE yamada_ini_mod, only : l0
872  USE phys_state_var_mod, only: zstd, zsig, zmea
873  USE phys_local_var_mod, only: l_mixmin, l_mix
874  USE yamada_ini_mod, only : kap, kapb
875
876 ! zstd: ecart type de la'altitud e sous-maille
877 ! zmea: altitude moyenne sous maille
878 ! zsig: pente moyenne de le maille
879
880  USE geometry_mod, only: cell_area
881  ! aire_cell: aire de la maille
882
883  IMPLICIT NONE
884!*************************************************************************
885! Subrourine qui calcule la longueur de m??lange dans le sch??ma de turbulence
886! avec la formule de Blackadar
887! Calcul d'un  minimum en fonction de l'orographie sous-maille:
888! L'id??e est la suivante: plus il y a de relief, plus il y a du m??lange
889! induit par les circulations meso et submeso ??chelles.
890!
891! References: * The vertical distribution of wind and turbulent exchange in a neutral atmosphere
892!               Blackadar A.K.
893!               J. Geophys. Res., 64, No 8, 1962
894!
895!             * An evaluation of neutral and convective planetary boundary-layer parametrisations relative
896!               to large eddy simulations
897!               Ayotte K et al
898!               Boundary Layer Meteorology, 79, 131-175, 1996
899!
900!
901!             * Local Similarity in the Stable Boundary Layer and Mixing length Approaches: consistency of concepts
902!               Van de Wiel B.J.H et al
903!               Boundary-Lay Meteorol, 128, 103-166, 2008
904!
905!
906! Histoire:
907!----------
908! * premi??re r??daction, Etienne et Frederic, 09/06/2016
909!
910! ***********************************************************************
911
912!==================================================================
913! Declarations
914!==================================================================
915
916! Inputs
917!-------
918 INTEGER            ni(klon)           ! indice sur la grille original (non restreinte)
919 INTEGER            nsrf               ! Type de surface
920 INTEGER            ngrid              ! Nombre de points concern??s sur l'horizontal
921 INTEGER            iflag_pbl          ! Choix du sch??ma de turbulence
922 REAL               pbl_lmixmin_alpha  ! on active ou non le calcul de la longueur de melange minimum en fonction du relief
923 REAL               lmixmin            ! Minimum absolu de la longueur de m??lange
924 REAL               zlay(klon, klev)   ! altitude du centre de la couche
925 REAL               zlev(klon, klev+1) ! atitude de l'interface inf??rieure de la couche
926 REAL               u(klon, klev)      ! vitesse du vent zonal
927 REAL               v(klon, klev)      ! vitesse du vent meridional
928 REAL               q2(klon, klev+1)   ! energie cin??tique turbulente
929 REAL               n2(klon, klev+1)   ! frequence de Brunt-Vaisala
930
931!In/out
932!-------
933
934! Outputs
935!---------
936
937 REAL               lmix(klon, klev+1)    ! Longueur de melange 
938
939
940! Local
941!-------
942 
943 INTEGER  ig,jg, k
944 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
974  IF (ngrid==0) RETURN
975
976
977!=====================================================================
978!         CALCUL de la LONGUEUR de m??lange suivant BLACKADAR: l1
979!=====================================================================
980
981  l1(1:ngrid,:)=0.
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
1016    l0(1:ngrid) = 150.
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
1025!===========================================================================================
1026!  CALCUL d'une longueur de melange minimum en fonctions de la topographie sous maille: l2
1027! si pbl_lmixmin_alpha=TRUE et si on se trouve sur de la terre ( pas actif sur les
1028! glacier, la glace de mer et les oc??ans)
1029!===========================================================================================
1030
1031   l2(1:ngrid,:)=0.0
1032   l_mixmin(1:ngrid,:,nsrf)=0.
1033   l_mix(1:ngrid,:,nsrf)=0.
1034   hlim(1:ngrid)=0.
1035
1036   IF (nsrf .EQ. 1) THEN
1037
1038! coefficients
1039!--------------
1040
1041     extent=2.                                                         ! On ??tend l'impact du relief jusqu'?? extent*h, extent >1. 
1042     lmax=150.                                                         ! Longueur de m??lange max dans l'absolu
1043
1044! calculs
1045!---------
1046
1047     DO ig=1,ngrid
1048
1049      ! On calcule la hauteur du relief
1050      !.................................
1051      ! On ne peut pas prendre zstd seulement pour caracteriser le relief sous maille
1052      ! car sur un terrain pentu mais sans relief, zstd est non nul (comme en Antarctique, C. Genthon)
1053      ! On corrige donc zstd avec l'ecart type de l'altitude dans la maille sans relief
1054      ! (en gros, une maille de taille xcell avec une pente constante zstdslope)
1055      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)     
1067     ENDDO
1068
1069     l2limit(1:ngrid)=0.
1070
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)
1080                                     
1081           ELSE IF (zlev(ig,k) .LE. hlim(ig)) THEN ! Si on est au dessus des montagnes, mais affect?? encore par elles
1082
1083      ! Au dessus des montagnes, on prend la l2limit au sommet des montagnes
1084      ! (la derni??re calcul??e dans la boucle k, vu que k est un indice croissant avec z)
1085      ! et on multiplie l2limit par une fonction qui d??croit entre h et hlim
1086              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
1092   ENDIF                                                                           ! pbl_lmixmin_alpha
1093
1094!==================================================================================
1095! On prend le max entre la longueur de melange de blackadar et celle calcul??e
1096! en fonction de la topographie
1097!===================================================================================
1098
1099
1100 DO k=1,klev+1
1101    DO ig=1,ngrid
1102       lmix(ig,k)=MAX(MAX(l1(ig,k), l2(ig,k)),lmixmin)
1103   ENDDO
1104 ENDDO
1105
1106! Diagnostics
1107
1108 DO k=1,klev+1
1109    DO ig=1,ngrid
1110       jg=ni(ig)
1111       l_mix(jg,k,nsrf)=lmix(ig,k)
1112       l_mixmin(jg,k,nsrf)=MAX(l2(ig,k),lmixmin)
1113    ENDDO
1114 ENDDO
1115
1116
1117
1118END SUBROUTINE mixinglength
Note: See TracBrowser for help on using the repository browser.