source: LMDZ6/branches/IPSLCM6.0.15/libf/phylmd/yamada4.F90 @ 5416

Last change on this file since 5416 was 3041, checked in by fhourdin, 7 years ago

Correction pour compilation debug

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