15 ypaprs, ypplay, yu, yv, yq, yt, yts, yrugos, yqsurf, ycdragm, &
28 REAL,
INTENT(IN) ::
dtime
29 INTEGER,
INTENT(IN) ::
nsrf, knon
30 INTEGER,
DIMENSION(klon),
INTENT(IN) :: ni
31 REAL,
DIMENSION(klon,klev+1),
INTENT(IN) :: ypaprs
32 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: ypplay
33 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: yu, yv
34 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: yq, yt
35 REAL,
DIMENSION(klon),
INTENT(IN) :: yts, yrugos, yqsurf
36 REAL,
DIMENSION(klon),
INTENT(IN) :: ycdragm
40 REAL,
DIMENSION(klon,klev+1),
INTENT(INOUT):: yq2
44 REAL,
DIMENSION(klon,klev),
INTENT(OUT) :: ycoefh
45 REAL,
DIMENSION(klon,klev),
INTENT(OUT) :: ycoefm
50 REAL,
DIMENSION(klon,klev) :: ycoefm0, ycoefh0, yzlay, yteta
51 REAL,
DIMENSION(klon,klev+1) :: yzlev, q2diag, ykmm, ykmn, ykmq
52 REAL,
DIMENSION(klon) :: yustar
72 yts, yrugos, yu, yv, yt, yq, &
82 IF (iflag_pbl.EQ.1)
THEN
88 ycoefm(
i,
k) = max(ycoefm(
i,
k),ycoefm0(
i,
k))
89 ycoefh(
i,
k) = max(ycoefh(
i,
k),ycoefh0(
i,
k))
100 CALL
coefkzmin(knon,ypaprs,ypplay,yu,yv,yt,yq,ycdragm, &
105 ycoefm(
i,
k) = max(ycoefm(
i,
k),ycoefm0(
i,
k))
106 ycoefh(
i,
k) = max(ycoefh(
i,
k),ycoefh0(
i,
k))
118 IF (iflag_pbl.GE.3)
THEN
121 rd*yt(1:knon,1)/(0.5*(ypaprs(1:knon,1)+ypplay(1:knon,1))) &
122 *(ypaprs(1:knon,1)-ypplay(1:knon,1))/rg
126 yzlay(
i,
k-1)+rd*0.5*(yt(
i,
k-1)+yt(
i,
k)) &
127 /ypaprs(
i,
k)*(ypplay(
i,
k-1)-ypplay(
i,
k))/rg
134 yt(
i,
k)*(ypaprs(
i,1)/ypplay(
i,
k))**rkappa &
140 yzlev(1:knon,
klev+1)=2.*yzlay(1:knon,
klev)-yzlay(1:knon,
klev-1)
143 yzlev(
i,
k)=0.5*(yzlay(
i,
k)+yzlay(
i,
k-1))
153 CALL
ustarhb(knon,yu,yv,ycdragm, yustar)
156 WRITE(
lunout,*)
'USTAR = ',yustar
160 IF (iflag_pbl.GE.31)
THEN
162 yzlev,yzlay,yu,yv,yteta, &
163 ycdragm,yq2,q2diag,ykmm,ykmn,yustar, &
165 ELSE IF (iflag_pbl<20)
THEN
167 yzlev,yzlay,yu,yv,yteta, &
168 ycdragm,yq2,ykmm,ykmn,ykmq,yustar, &
172 ycoefm(1:knon,2:
klev)=ykmm(1:knon,2:
klev)
173 ycoefh(1:knon,2:
klev)=ykmn(1:knon,2:
klev)
181 SUBROUTINE coefkz(nsrf, knon, paprs, pplay, &
213 include
"indicesol.h"
219 INTEGER,
INTENT(IN) :: knon,
nsrf
220 REAL,
INTENT(IN) ::
ksta, ksta_ter
221 REAL,
DIMENSION(klon),
INTENT(IN) :: ts
222 REAL,
DIMENSION(klon,klev+1),
INTENT(IN) :: paprs
223 REAL,
DIMENSION(klon,klev),
INTENT(IN) ::
pplay
224 REAL,
DIMENSION(klon,klev),
INTENT(IN) ::
u,
v, t,
q
225 REAL,
DIMENSION(klon),
INTENT(IN) ::
rugos
226 REAL,
DIMENSION(klon),
INTENT(IN) ::
qsurf
228 REAL,
DIMENSION(klon,klev),
INTENT(OUT) :: pcfm, pcfh
233 INTEGER,
DIMENSION(klon) :: itop
237 REAL,
PARAMETER :: cepdu2=0.1**2
238 REAL,
PARAMETER :: ckap=0.4
239 REAL,
PARAMETER :: cb=5.0
240 REAL,
PARAMETER :: cc=5.0
241 REAL,
PARAMETER :: cd=5.0
242 REAL,
PARAMETER :: clam=160.0
243 REAL,
PARAMETER :: ratqs=0.05
244 LOGICAL,
PARAMETER :: richum=.true.
245 REAL,
PARAMETER :: ric=0.4
246 REAL,
PARAMETER :: prandtl=0.4
256 REAL,
PARAMETER :: mixlen=35.0
258 LOGICAL,
PARAMETER :: tvirtu=.true.
259 LOGICAL,
PARAMETER :: opt_ec=.
false.
264 REAL zgeop(klon,
klev)
268 REAL zdphi, zdu2, ztvd, ztvu, zcdn
270 REAL zt, zq, zdelta, zcvm5, zcor, zqs, zfr, zdqs
271 REAL z2geomf, zalh2, zalm2, zscfh, zscfm
272 REAL,
PARAMETER :: t_coup=273.15
273 LOGICAL,
PARAMETER :: check=.
false.
278 LOGICAL,
SAVE :: appel1er=.true.
284 fsta(
x) = 1.0 / (1.0+10.0*
x*(1+8.0*
x))
285 fins(
x) = sqrt(1.0-18.0*
x)
291 WRITE(
lunout,*)
'coefkz, opt_ec:', opt_ec
292 WRITE(
lunout,*)
'coefkz, richum:', richum
293 IF (richum)
WRITE(
lunout,*)
'coefkz, ratqs:', ratqs
294 WRITE(
lunout,*)
'coefkz, isommet:', isommet
295 WRITE(
lunout,*)
'coefkz, tvirtu:', tvirtu
315 IF (iflag_pbl.EQ.1)
THEN
326 IF (
nsrf .NE. is_oce )
THEN
339 zgeop(
i,1) = rd * t(
i,1) / (0.5*(paprs(
i,1)+
pplay(
i,1))) &
344 zgeop(
i,
k) = zgeop(
i,
k-1) &
345 + rd * 0.5*(t(
i,
k-1)+t(
i,
k)) / paprs(
i,
k) &
360 zdu2=max(cepdu2,(
u(
i,
k)-
u(
i,
k-1))**2 &
362 zmgeom(
i)=zgeop(
i,
k)-zgeop(
i,
k-1)
363 zdphi =zmgeom(
i) / 2.0
364 zt = (t(
i,
k)+t(
i,
k-1)) * 0.5
365 zq = (
q(
i,
k)+
q(
i,
k-1)) * 0.5
371 zdelta = max(0.,sign(1.,rtt-zt))
372 zcvm5 = r5les*rlvtt/rcpd/(1.0+rvtmp2*zq)*(1.-zdelta) &
373 + r5ies*rlstt/rcpd/(1.0+rvtmp2*zq)*zdelta
374 zqs = r2es * foeew(zt,zdelta) /
pplay(
i,
k)
376 zcor = 1./(1.-retv*zqs)
378 zdqs = foede(zt,zdelta,zcvm5,zqs,zcor)
380 IF (zt .LT. t_coup)
THEN
382 zdqs = dqsats(zt,zqs)
385 zdqs = dqsatl(zt,zqs)
392 zfr = (zq+ratqs*zq-zqs) / (2.0*ratqs*zq)
396 zfr = max(0.0,min(1.0,zfr))
397 IF (.NOT.richum) zfr = 0.0
403 + zdphi/rcpd/(1.+rvtmp2*zq) &
404 *( (1.-zfr) + zfr*(1.+rlvtt*zqs/rd/zt)/(1.+zdqs) ) &
407 - zdphi/rcpd/(1.+rvtmp2*zq) &
408 *( (1.-zfr) + zfr*(1.+rlvtt*zqs/rd/zt)/(1.+zdqs) ) &
410 zri(
i) =zmgeom(
i)*(ztvd-ztvu)/(zdu2*0.5*(ztvd+ztvu))
412 + zmgeom(
i)*zmgeom(
i)/rg*gamt(
k) &
413 *(paprs(
i,
k)/101325.0)**rkappa &
414 /(zdu2*0.5*(ztvd+ztvu))
418 zri(
i) =(rcpd*(t(
i,
k)-t(
i,
k-1)) &
419 -rd*0.5*(t(
i,
k)+t(
i,
k-1))/paprs(
i,
k) &
421 )*zmgeom(
i)/(zdu2*0.5*rcpd*(t(
i,
k-1)+t(
i,
k)))
423 zmgeom(
i)*zmgeom(
i)*gamt(
k)/rg &
424 *(paprs(
i,
k)/101325.0)**rkappa &
425 /(zdu2*0.5*(t(
i,
k-1)+t(
i,
k)))
430 zcdn=sqrt(zdu2) / zmgeom(
i) * rg
433 z2geomf=zgeop(
i,
k-1)+zgeop(
i,
k)
434 zalm2=(0.5*ckap/rg*z2geomf &
435 /(1.+0.5*ckap/rg/clam*z2geomf))**2
436 zalh2=(0.5*ckap/rg*z2geomf &
437 /(1.+0.5*ckap/rg/(clam*sqrt(1.5*cd))*z2geomf))**2
438 IF (zri(
i).LT.0.0)
THEN
439 zscf = ((zgeop(
i,
k)/zgeop(
i,
k-1))**(1./3.)-1.)**3 &
440 / (zmgeom(
i)/rg)**3 / (zgeop(
i,
k-1)/rg)
441 zscf = sqrt(-zri(
i)*zscf)
442 zscfm = 1.0 / (1.0+3.0*cb*cc*zalm2*zscf)
443 zscfh = 1.0 / (1.0+3.0*cb*cc*zalh2*zscf)
444 pcfm(
i,
k)=zcdn*zalm2*(1.-2.0*cb*zri(
i)*zscfm)
445 pcfh(
i,
k)=zcdn*zalh2*(1.-3.0*cb*zri(
i)*zscfh)
447 zscf=sqrt(1.+cd*zri(
i))
448 pcfm(
i,
k)=zcdn*zalm2/(1.+2.0*cb*zri(
i)/zscf)
449 pcfh(
i,
k)=zcdn*zalh2/(1.+3.0*cb*zri(
i)*zscf)
452 zl2(
i)=(mixlen*max(0.0,(paprs(
i,
k)-paprs(
i,itop(
i)+1)) &
453 /(paprs(
i,2)-paprs(
i,itop(
i)+1)) ))**2
454 pcfm(
i,
k)=sqrt(max(zcdn*zcdn*(ric-zri(
i))/ric, kstable))
455 pcfm(
i,
k)= zl2(
i)* pcfm(
i,
k)
456 pcfh(
i,
k) = pcfm(
i,
k) /prandtl
465 IF (itop(
i)+1 .LE.
klev)
THEN
477 SUBROUTINE coefkz2(nsrf, knon, paprs, pplay,t, &
500 INTEGER,
INTENT(IN) :: knon,
nsrf
501 REAL,
DIMENSION(klon, klev+1),
INTENT(IN) :: paprs
502 REAL,
DIMENSION(klon, klev),
INTENT(IN) ::
pplay
503 REAL,
DIMENSION(klon, klev),
INTENT(IN) :: t(klon,
klev)
505 REAL,
DIMENSION(klon, klev),
INTENT(OUT) :: pcfm, pcfh
509 REAL,
PARAMETER :: prandtl=0.4
510 REAL,
PARAMETER :: kstable=0.002
512 REAL,
PARAMETER :: mixlen=35.0
513 REAL,
PARAMETER :: seuil=-0.02
521 INTEGER i,
k, invb(knon)
523 REAL zdthmin(knon), zdthdp
525 include
"indicesol.h"
547 - rd * 0.5*(t(
i,
k)+t(
i,
k+1))/rcpd/paprs(
i,
k+1)
548 zdthdp = zdthdp * 100.0
549 IF (
pplay(
i,
k).GT.0.8*paprs(
i,1) .AND. &
550 zdthdp.LT.zdthmin(
i) )
THEN
560 IF (
nsrf.EQ.is_oce )
THEN
572 IF ( (invb(
i).EQ.
klev) .OR. (zdthmin(
i).GT.seuil) )
THEN
573 zl2(
i)=(mixlen*max(0.0,(paprs(
i,
k)-paprs(
i,
klev+1)) &
574 /(paprs(
i,2)-paprs(
i,
klev+1)) ))**2
575 pcfm(
i,
k)= zl2(
i)* kstable
576 pcfh(
i,
k) = pcfm(
i,
k) /prandtl