4 SUBROUTINE yamada_c(ngrid,timestep,plev,play &
5 & ,pu,pv,pt,d_u,d_v,d_t,cd,q2,km,kn,kq,d_t_diss,ustar &
53 REAL,
DIMENSION(klon,klev) :: d_u,d_v,d_t
54 REAL,
DIMENSION(klon,klev) :: pu,pv,pt
55 REAL,
DIMENSION(klon,klev) :: d_t_diss
59 real plev(klon,
klev+1)
62 real kmin,qmin,pblhmin(klon),coriol(klon)
63 REAL zlev(klon,
klev+1)
70 REAL q2(klon,
klev+1),qpre
72 REAL unsdzdec(klon,
klev+1)
75 REAL kmpre(klon,
klev+1),tmp2
76 REAL mpre(klon,
klev+1)
80 real aa(klon,
klev+1),aa0,aa1
81 integer iflag_pbl,ngrid
88 data first,ipas/.false.,0/
94 real ri,zrif,zalpha,zsm,zsn
98 REAL,
DIMENSION(klon,klev+1) :: km2,kn2,sqrtq
99 real dtetadz(klon,
klev+1)
100 real m2cstat,mcstat,kmcstat
102 real leff(klon,
klev+1)
103 real,
allocatable,
save :: l0(:)
105 real sq(klon),sqz(klon),zz(klon,
klev+1)
110 data ric,rifc,b1,kap/0.195,0.191,16.6,0.4/
113 real fl,zzz,zl0,zq2,zn2
115 real rino(klon,
klev+1),smyam(klon,
klev),styam(klon,
klev)
116 real lyam(klon,
klev),knyam(klon,
klev)
117 real w2yam(klon,
klev),t2yam(klon,
klev)
118 logical,
save :: firstcall=.true.
120 REAL,
DIMENSION(klon,klev+1) :: fluxu,fluxv,fluxt
121 REAL,
DIMENSION(klon,klev+1) :: dddu,dddv,dddt
122 REAL,
DIMENSION(klon,klev) :: exner,masse
123 REAL,
DIMENSION(klon,klev+1) :: masseb,q2old,q2neg
126 frif(
ri)=0.6588*(
ri+0.1776-sqrt(
ri*
ri-0.3221*
ri+0.03156))
127 falpha(
ri)=1.318*(0.2231-
ri)/(0.2341-
ri)
128 fsm(
ri)=1.96*(0.1912-
ri)*(0.2341-
ri)/((1.-
ri)*(0.2231-
ri))
129 fl(zzz,zl0,zq2,zn2)= &
130 & max(min(l0(ig)*kap*zlev(ig,
k)/(kap*zlev(ig,
k)+l0(ig)) &
131 & ,0.5*sqrt(q2(ig,
k))/sqrt(max(n2(ig,
k),1.e-10))) ,1.)
144 if (okiophys==1)
then
158 zu(:,:)=pu(:,:)+0.5*d_u(:,:)
159 zv(:,:)=pv(:,:)+0.5*d_v(:,:)
160 zt(:,:)=pt(:,:)+0.5*d_t(:,:)
162 exner(:,
k)=(
play(:,
k)/plev(:,1))**rkappa
163 masse(:,
k)=(plev(:,
k)-plev(:,
k+1))/rg
165 teta(:,:)=zt(:,:)/exner(:,:)
170 masseb(:,
k)=masseb(:,
k)+masse(:,
k)
171 masseb(:,
k+1)=masseb(:,
k+1)+masse(:,
k)
173 masseb(:,:)=0.5*masseb(:,:)
178 zlay(:,1)=rcpd*
teta(:,1)*(1.-exner(:,1))
189 fluxu(:,
k)=fluxu(:,
k+1)+masse(:,
k)*d_u(:,
k)
190 fluxv(:,
k)=fluxv(:,
k+1)+masse(:,
k)*d_v(:,
k)
191 fluxt(:,
k)=fluxt(:,
k+1)+masse(:,
k)*d_t(:,
k)/exner(:,
k)
194 dddu(:,1)=2*zu(:,1)*fluxu(:,1)
195 dddv(:,1)=2*
zv(:,1)*fluxv(:,1)
196 dddt(:,1)=(exner(:,1)-1.)*fluxt(:,1)
199 dddu(:,
k)=(zu(:,
k)-zu(:,
k-1))*fluxu(:,
k)
200 dddv(:,
k)=(
zv(:,
k)-
zv(:,
k-1))*fluxv(:,
k)
201 dddt(:,
k)=(exner(:,
k)-exner(:,
k-1))*fluxt(:,
k)
208 if (okiophys==1)
then
209 call iophys_ecrit(
'zlay',
klev,
'Geop',
'm',
zlay)
210 call iophys_ecrit(
'teta',
klev,
'teta',
'K',
teta)
211 call iophys_ecrit(
'temp',
klev,
'temp',
'K',zt)
212 call iophys_ecrit(
'pt',
klev,
'temp',
'K',pt)
213 call iophys_ecrit(
'd_u',
klev,
'd_u',
'm/s2',d_u)
214 call iophys_ecrit(
'd_v',
klev,
'd_v',
'm/s2',d_v)
215 call iophys_ecrit(
'd_t',
klev,
'd_t',
'K/s',d_t)
216 call iophys_ecrit(
'exner',
klev,
'exner',
'',exner)
217 call iophys_ecrit(
'masse',
klev,
'masse',
'',masse)
218 call iophys_ecrit(
'masseb',
klev,
'masseb',
'',masseb)
220 call iophys_ecrit(
'Cn2',
klev,
'm2 conserv',
'm/s',(rcpd*dddt(:,1:
klev)/masseb(:,1:
klev))/
timestep)
221 call iophys_ecrit(
'rifc',
klev,
'rif conservative',
'',rcpd*dddt(:,1:
klev)/min(dddu(:,1:
klev)+dddv(:,1:
klev),-1.e-20))
239 & +(
zlay(ig,
nlay) - zlev(ig,nlev-1) )
246 unsdz(ig,
k)=1.e+0/(zlev(ig,
k+1)-zlev(ig,
k))
250 unsdzdec(ig,1)=1.e+0/(
zlay(ig,1)-zlev(ig,1))
269 m2(ig,
k)=((zu(ig,
k)-zu(ig,
k-1))**2+(
zv(ig,
k)-
zv(ig,
k-1))**2)/(dz(ig,
k)*dz(ig,
k))
273 ri=n2(ig,
k)/max(m2(ig,
k),1.e-10)
279 if(rif(ig,
k).lt.0.16)
then
281 sm(ig,
k)=fsm(rif(ig,
k))
286 zz(ig,
k)=b1*m2(ig,
k)*(1.-rif(ig,
k))*sm(ig,
k)
297 if (iflag_pbl==8.or.iflag_pbl==10)
then
312 sqz(ig)=sqz(ig)+zq*zlev(ig,
k)*(
zlay(ig,
k)-
zlay(ig,
k-1))
317 l0(ig)=0.2*sqz(ig)/sq(ig)
321 l(ig,
k)=fl(zlev(ig,
k),l0(ig),q2(ig,
k),n2(ig,
k))
335 l(ig,
k)=fl(zlev(ig,
k),l0(ig),q2(ig,
k),n2(ig,
k))
344 if (okiophys==1)
then
353 IF (iflag_pbl<20)
then
362 leff(:,:)=max(
l(:,:),1.)
363 IF (iflag_pbl==29)
THEN
364 km2(:,:)=km(:,:)*m2(:,:)
365 kn2(:,:)=kn2(:,:)*rif(:,:)
366 ELSEIF (iflag_pbl==25)
THEN
368 km2(:,
k)=-0.5*(dddu(:,
k)+dddv(:,
k)+dddu(:,
k+1)+dddv(:,
k+1)) &
370 kn2(:,
k)=rcpd*0.5*(dddt(:,
k)+dddt(:,
k+1))/(masse(:,
k)*
timestep)
371 leff(:,
k)=0.5*(leff(:,
k)+leff(:,
k+1))
375 km2(:,:)=-(dddu(:,:)+dddv(:,:))/(masseb(:,:)*
timestep)
376 kn2(:,:)=rcpd*dddt(:,:)/(masseb(:,:)*
timestep)
378 q2neg(:,:)=q2(:,:)+
timestep*(km2(:,:)-kn2(:,:))
379 q2(:,:)=min(max(q2neg(:,:),1.e-10),1.e4)
383 q2(:,:)=1./(1./sqrt(q2(:,:))+
timestep/(2*leff(:,:)*b1))
384 q2(:,:)=q2(:,:)*q2(:,:)
385 IF (iflag_pbl<=24)
THEN
387 d_t_diss(:,
k)=(masseb(:,
k)*(q2neg(:,
k)-q2(:,
k))+masseb(:,
k+1)*(q2neg(:,
k+1)-q2(:,
k+1)))/(2.*rcpd*masse(:,
k))
389 ELSE IF (iflag_pbl<=27)
THEN
391 d_t_diss(:,
k)=(q2neg(:,
k)-q2(:,
k))/rcpd
398 IF (iflag_pbl/=29)
THEN
401 IF (abs(km2(ig,
k))<=1.e-20)
THEN
404 rif(ig,
k)=min(kn2(ig,
k)/km2(ig,
k),rifc)
406 IF (rif(ig,
k).lt.0.16)
THEN
408 sm(ig,
k)=fsm(rif(ig,
k))
418 IF (25<=iflag_pbl.and.iflag_pbl<=28)
THEN
420 sqrtq(:,
k)=sqrt(0.5*(q2(:,
k)+q2(:,
k-1)))
424 sqrtq(:,
k)=sqrt(q2(:,
k))
429 km(ig,
k)=leff(ig,
k)*sqrtq(ig,
k)*sm(ig,
k)
431 kq(ig,
k)=leff(ig,
k)*zq*0.2
439 if (okiophys==1)
then
461 if (iflag_pbl.eq.6)
then
464 q2(:,
k)=
l(:,
k)**2*zz(:,
k)
468 else if (iflag_pbl.eq.7)
then
478 kmpre(ig,
k)=
l(ig,
k)*sqrt(q2(ig,
k))*sm(ig,
k)
479 mpre(ig,
k)=sqrt(m2(ig,
k))
495 kmcstat=1.e+0 / mcstat &
496 & *( unsdz(ig,
k)*kmpre(ig,
k+1) &
500 & *( sqrt(zu(ig,3)**2+
zv(ig,3)**2) &
501 & -mcstat/unsdzdec(ig,
k) &
502 & -mpre(ig,
k+1)/unsdzdec(ig,
k+1) )**2) &
503 & /( unsdz(ig,
k)+unsdz(ig,
k-1) )
505 kmcstat=1.e+0 / mcstat &
506 & *( unsdz(ig,
k)*kmpre(ig,
k+1) &
508 & +unsdz(ig,
k-1)*kmpre(ig,
k-1) &
510 & /( unsdz(ig,
k)+unsdz(ig,
k-1) )
514 & /( sm(ig,
k)/q2(ig,
k) ) &
516 q2(ig,
k)=max(tmp2,1.e-12)**(2./3.)
522 else if (iflag_pbl==8.or.iflag_pbl==9)
then
533 if (
delta(ig,
k).lt.1.e-20)
then
537 km(ig,
k)=
l(ig,
k)*sqrt(q2(ig,
k))*sm(ig,
k)
539 aa1=(m2(ig,
k)*(1.-rif(ig,
k))-
delta(ig,
k)/b1)
545 if (aa(ig,
k).gt.0.)
then
546 q2(ig,
k)=(qpre+aa(ig,
k)*qpre*qpre)**2
548 q2(ig,
k)=(qpre/(1.-aa(ig,
k)*qpre))**2
557 q2(ig,
k)=min(max(q2(ig,
k),1.e-10),1.e4)
562 else if (iflag_pbl>=10)
then
567 l(:,
k)=max(
l(:,
k),1.)
568 km(:,
k)=
l(:,
k)*sqrt(q2(:,
k))*sm(:,
k)
570 q2(:,
k)=min(max(q2(:,
k),1.e-10),1.e4)
572 q2(:,
k)=q2(:,
k)*q2(:,
k)
577 stop
'Cas nom prevu dans yamada4'
591 km(ig,
k)=
l(ig,
k)*zq*sm(ig,
k)
593 kq(ig,
k)=
l(ig,
k)*zq*0.2
599 if (iflag_pbl.ge.12)
then
617 pblhmin(ig)=0.07*ustar(ig)/max(abs(coriol(ig)),2.546e-5)
624 if(iflag_pbl==8.or.iflag_pbl==10)
then
629 qmin=ustar(ig)*(max(1.-zlev(ig,
k)/pblhmin(ig),0.))**2
630 kmin=kap*zlev(ig,
k)*qmin
634 if (kn(ig,
k).lt.kmin.or.km(ig,
k).lt.kmin)
then
642 q2(ig,
k)=(qmin/sm(ig,
k))**2
652 qmin=ustar(ig)*(max(1.-zlev(ig,
k)/pblhmin(ig),0.))**2
653 kmin=kap*zlev(ig,
k)*qmin
657 if (kn(ig,
k).lt.kmin.or.km(ig,
k).lt.kmin)
then
667 q2(ig,
k)=min((qmin/sm(ig,
k))**2,10.)
669 km(ig,
k)=
l(ig,
k)*zq*sm(ig,
k)
671 kq(ig,
k)=
l(ig,
k)*zq*0.2
693 smyam(1:ngrid,2:
klev)=sm(1:ngrid,2:
klev)
696 knyam(1:ngrid,2:
klev)=kn(1:ngrid,2:
klev)
700 w2yam(1:ngrid,2:
klev)=q2(1:ngrid,2:
klev)*0.24 &
701 & +lyam(1:ngrid,2:
klev)*5.17*kn(1:ngrid,2:
klev) &
702 & *n2(1:ngrid,2:
klev)/sqrt(q2(1:ngrid,2:
klev))
704 t2yam(1:ngrid,2:
klev)=9.1*kn(1:ngrid,2:
klev) &
705 & *dtetadz(1:ngrid,2:
klev)**2 &
706 & /sqrt(q2(1:ngrid,2:
klev))*lyam(1:ngrid,2:
klev)