source: LMDZ6/branches/PBLSURF_GPUPORT/libf/phylmd/yamada4.f90 @ 5876

Last change on this file since 5876 was 5876, checked in by yann meurdesoif, 6 days ago

GPU port of cdrag + call_atke + coef_diff_turb

YM

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