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 &
49 REAL,
DIMENSION(klon,klev) :: d_u,d_v,d_t
50 REAL,
DIMENSION(klon,klev) :: pu,pv,pt
51 REAL,
DIMENSION(klon,klev) :: d_t_diss
58 real kmin,qmin,pblhmin(
klon),coriol(
klon)
77 integer iflag_pbl,ngrid
84 data first,ipas/.
false.,0/
90 real ri,zrif,zalpha,zsm,zsn
94 REAL,
DIMENSION(klon,klev+1) :: km2,kn2,sqrtq
96 real m2cstat,mcstat,kmcstat
99 real,
allocatable,
save :: l0(:)
106 data ric,rifc,b1,kap/0.195,0.191,16.6,0.4/
109 real fl,zzz,zl0,zq2,zn2
114 logical,
save :: firstcall=.
true.
116 CHARACTER(len=20),
PARAMETER :: modname=
"yamada_c"
117 REAL,
DIMENSION(klon,klev+1) :: fluxu,fluxv,fluxt
118 REAL,
DIMENSION(klon,klev+1) :: dddu,dddv,dddt
119 REAL,
DIMENSION(klon,klev) :: exner,masse
120 REAL,
DIMENSION(klon,klev+1) :: masseb,q2old,q2neg
122 frif(ri)=0.6588*(ri+0.1776-sqrt(ri*ri-0.3221*ri+0.03156))
123 falpha(ri)=1.318*(0.2231-ri)/(0.2341-ri)
124 fsm(ri)=1.96*(0.1912-ri)*(0.2341-ri)/((1.-ri)*(0.2231-ri))
125 fl(zzz,zl0,zq2,zn2)= &
126 & max(min(l0(ig)*kap*zlev(ig,k)/(kap*zlev(ig,k)+l0(ig)) &
127 & ,0.5*sqrt(q2(ig,k))/sqrt(max(n2(ig,k),1.e-10))) ,1.)
140 if (okiophys==1)
then
154 zu(:,:)=pu(:,:)+0.5*d_u(:,:)
155 zv(:,:)=pv(:,:)+0.5*d_v(:,:)
156 zt(:,:)=pt(:,:)+0.5*d_t(:,:)
158 exner(:,k)=(play(:,k)/plev(:,1))**rkappa
159 masse(:,k)=(plev(:,k)-plev(:,k+1))/
rg
161 teta(:,:)=zt(:,:)/exner(:,:)
166 masseb(:,k)=masseb(:,k)+masse(:,k)
167 masseb(:,k+1)=masseb(:,k+1)+masse(:,k)
169 masseb(:,:)=0.5*masseb(:,:)
174 zlay(:,1)=rcpd*teta(:,1)*(1.-exner(:,1))
176 zlay(:,k+1)=zlay(:,k)+0.5*rcpd*(teta(:,k)+teta(:,k+1))*(exner(:,k)-exner(:,k+1))/
rg
177 zlev(:,k)=0.5*(zlay(:,k)+zlay(:,k+1))
185 fluxu(:,k)=fluxu(:,k+1)+masse(:,k)*d_u(:,k)
186 fluxv(:,k)=fluxv(:,k+1)+masse(:,k)*d_v(:,k)
187 fluxt(:,k)=fluxt(:,k+1)+masse(:,k)*d_t(:,k)/exner(:,k)
190 dddu(:,1)=2*zu(:,1)*fluxu(:,1)
191 dddv(:,1)=2*zv(:,1)*fluxv(:,1)
192 dddt(:,1)=(exner(:,1)-1.)*fluxt(:,1)
195 dddu(:,k)=(zu(:,k)-zu(:,k-1))*fluxu(:,k)
196 dddv(:,k)=(zv(:,k)-zv(:,k-1))*fluxv(:,k)
197 dddt(:,k)=(exner(:,k)-exner(:,k-1))*fluxt(:,k)
204 if (okiophys==1)
then
234 zlev(ig,nlev)=zlay(ig,nlay) &
235 & +( zlay(ig,nlay) - zlev(ig,nlev-1) )
242 unsdz(ig,k)=1.e+0/(zlev(ig,k+1)-zlev(ig,k))
246 unsdzdec(ig,1)=1.e+0/(zlay(ig,1)-zlev(ig,1))
250 unsdzdec(ig,k)=1.e+0/(zlay(ig,k)-zlay(ig,k-1))
254 unsdzdec(ig,nlay+1)=1.e+0/(zlev(ig,nlay+1)-zlay(ig,nlay))
264 dz(ig,k)=zlay(ig,k)-zlay(ig,k-1)
265 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))
266 dtetadz(ig,k)=(teta(ig,k)-teta(ig,k-1))/dz(ig,k)
267 n2(ig,k)=
rg*2.*dtetadz(ig,k)/(teta(ig,k-1)+teta(ig,k))
269 ri=n2(ig,k)/max(m2(ig,k),1.e-10)
275 if(rif(ig,k).lt.0.16)
then
276 alpha(ig,k)=falpha(rif(ig,k))
277 sm(ig,k)=fsm(rif(ig,k))
282 zz(ig,k)=b1*m2(ig,k)*(1.-rif(ig,k))*sm(ig,k)
293 if (iflag_pbl==8.or.iflag_pbl==10)
then
308 sqz(ig)=sqz(ig)+zq*zlev(ig,k)*(zlay(ig,k)-zlay(ig,k-1))
309 sq(ig)=sq(ig)+zq*(zlay(ig,k)-zlay(ig,k-1))
313 l0(ig)=0.2*sqz(ig)/sq(ig)
317 l(ig,k)=fl(zlev(ig,k),l0(ig),q2(ig,k),n2(ig,k))
331 l(ig,k)=fl(zlev(ig,k),l0(ig),q2(ig,k),n2(ig,k))
340 if (okiophys==1)
then
349 IF (iflag_pbl<20)
then
358 leff(:,:)=max(l(:,:),1.)
359 IF (iflag_pbl==29)
THEN
360 km2(:,:)=km(:,:)*m2(:,:)
361 kn2(:,:)=kn2(:,:)*rif(:,:)
362 ELSEIF (iflag_pbl==25)
THEN
364 km2(:,k)=-0.5*(dddu(:,k)+dddv(:,k)+dddu(:,k+1)+dddv(:,k+1)) &
365 & /(masse(:,k)*timestep)
366 kn2(:,k)=rcpd*0.5*(dddt(:,k)+dddt(:,k+1))/(masse(:,k)*timestep)
367 leff(:,k)=0.5*(leff(:,k)+leff(:,k+1))
371 km2(:,:)=-(dddu(:,:)+dddv(:,:))/(masseb(:,:)*timestep)
372 kn2(:,:)=rcpd*dddt(:,:)/(masseb(:,:)*timestep)
374 q2neg(:,:)=q2(:,:)+timestep*(km2(:,:)-kn2(:,:))
375 q2(:,:)=min(max(q2neg(:,:),1.e-10),1.e4)
379 q2(:,:)=1./(1./sqrt(q2(:,:))+timestep/(2*leff(:,:)*b1))
380 q2(:,:)=q2(:,:)*q2(:,:)
381 IF (iflag_pbl<=24)
THEN
383 d_t_diss(:,k)=(masseb(:,k)*(q2neg(:,k)-q2(:,k))+masseb(:,k+1)*(q2neg(:,k+1)-q2(:,k+1)))/(2.*rcpd*masse(:,k))
385 ELSE IF (iflag_pbl<=27)
THEN
387 d_t_diss(:,k)=(q2neg(:,k)-q2(:,k))/rcpd
394 IF (iflag_pbl/=29)
THEN
397 IF (abs(km2(ig,k))<=1.e-20)
THEN
400 rif(ig,k)=min(kn2(ig,k)/km2(ig,k),rifc)
402 IF (rif(ig,k).lt.0.16)
THEN
403 alpha(ig,k)=falpha(rif(ig,k))
404 sm(ig,k)=fsm(rif(ig,k))
414 IF (25<=iflag_pbl.and.iflag_pbl<=28)
THEN
416 sqrtq(:,k)=sqrt(0.5*(q2(:,k)+q2(:,k-1)))
420 sqrtq(:,k)=sqrt(q2(:,k))
425 km(ig,k)=leff(ig,k)*sqrtq(ig,k)*sm(ig,k)
426 kn(ig,k)=km(ig,k)*alpha(ig,k)
427 kq(ig,k)=leff(ig,k)*zq*0.2
435 if (okiophys==1)
then
457 if (iflag_pbl.eq.6)
then
460 q2(:,k)=l(:,k)**2*zz(:,k)
464 else if (iflag_pbl.eq.7)
then
473 delta(ig,k)=q2(ig,k)/(l(ig,k)**2*sm(ig,k))
474 kmpre(ig,k)=l(ig,k)*sqrt(q2(ig,k))*sm(ig,k)
475 mpre(ig,k)=sqrt(m2(ig,k))
482 m2cstat=max(alpha(ig,k)*n2(ig,k)+delta(ig,k)/b1,1.e-12)
491 kmcstat=1.e+0 / mcstat &
492 & *( unsdz(ig,k)*kmpre(ig,k+1) &
496 & *( sqrt(zu(ig,3)**2+zv(ig,3)**2) &
497 & -mcstat/unsdzdec(ig,k) &
498 & -mpre(ig,k+1)/unsdzdec(ig,k+1) )**2) &
499 & /( unsdz(ig,k)+unsdz(ig,k-1) )
501 kmcstat=1.e+0 / mcstat &
502 & *( unsdz(ig,k)*kmpre(ig,k+1) &
504 & +unsdz(ig,k-1)*kmpre(ig,k-1) &
506 & /( unsdz(ig,k)+unsdz(ig,k-1) )
510 & /( sm(ig,k)/q2(ig,k) ) &
512 q2(ig,k)=max(tmp2,1.e-12)**(2./3.)
518 else if (iflag_pbl==8.or.iflag_pbl==9)
then
528 delta(ig,k)=q2(ig,k)/(l(ig,k)**2*sm(ig,k))
529 if (delta(ig,k).lt.1.e-20)
then
533 km(ig,k)=l(ig,k)*sqrt(q2(ig,k))*sm(ig,k)
534 aa0=(m2(ig,k)-alpha(ig,k)*n2(ig,k)-delta(ig,k)/b1)
535 aa1=(m2(ig,k)*(1.-rif(ig,k))-delta(ig,k)/b1)
537 aa(ig,k)=aa1*timestep/(delta(ig,k)*l(ig,k))
541 if (aa(ig,k).gt.0.)
then
542 q2(ig,k)=(qpre+aa(ig,k)*qpre*qpre)**2
544 q2(ig,k)=(qpre/(1.-aa(ig,k)*qpre))**2
553 q2(ig,k)=min(max(q2(ig,k),1.e-10),1.e4)
558 else if (iflag_pbl>=10)
then
563 l(:,k)=max(l(:,k),1.)
564 km(:,k)=l(:,k)*sqrt(q2(:,k))*sm(:,k)
565 q2(:,k)=q2(:,k)+timestep*km(:,k)*m2(:,k)*(1.-rif(:,k))
566 q2(:,k)=min(max(q2(:,k),1.e-10),1.e4)
567 q2(:,k)=1./(1./sqrt(q2(:,k))+timestep/(2*l(:,k)*b1))
568 q2(:,k)=q2(:,k)*q2(:,k)
573 CALL abort_physic(modname,
'Cas nom prevu dans yamada4',1)
587 km(ig,k)=l(ig,k)*zq*sm(ig,k)
588 kn(ig,k)=km(ig,k)*alpha(ig,k)
589 kq(ig,k)=l(ig,k)*zq*0.2
595 if (iflag_pbl.ge.12)
then
598 call vdif_q2(timestep,
rg,rd,ngrid,plev,zt,kq,q2)
613 pblhmin(ig)=0.07*ustar(ig)/max(abs(coriol(ig)),2.546e-5)
620 if(iflag_pbl==8.or.iflag_pbl==10)
then
624 if (teta(ig,2).gt.teta(ig,1))
then
625 qmin=ustar(ig)*(max(1.-zlev(ig,k)/pblhmin(ig),0.))**2
626 kmin=kap*zlev(ig,k)*qmin
630 if (kn(ig,k).lt.kmin.or.km(ig,k).lt.kmin)
then
638 q2(ig,k)=(qmin/sm(ig,k))**2
647 if (teta(ig,2).gt.teta(ig,1))
then
648 qmin=ustar(ig)*(max(1.-zlev(ig,k)/pblhmin(ig),0.))**2
649 kmin=kap*zlev(ig,k)*qmin
653 if (kn(ig,k).lt.kmin.or.km(ig,k).lt.kmin)
then
663 q2(ig,k)=min((qmin/sm(ig,k))**2,10.)
665 km(ig,k)=l(ig,k)*zq*sm(ig,k)
666 kn(ig,k)=km(ig,k)*alpha(ig,k)
667 kq(ig,k)=l(ig,k)*zq*0.2
689 smyam(1:ngrid,2:
klev)=sm(1:ngrid,2:
klev)
690 styam(1:ngrid,2:
klev)=sm(1:ngrid,2:
klev)*alpha(1:ngrid,2:
klev)
691 lyam(1:ngrid,2:
klev)=l(1:ngrid,2:
klev)
692 knyam(1:ngrid,2:
klev)=kn(1:ngrid,2:
klev)
696 w2yam(1:ngrid,2:
klev)=q2(1:ngrid,2:
klev)*0.24 &
697 & +lyam(1:ngrid,2:
klev)*5.17*kn(1:ngrid,2:
klev) &
698 & *n2(1:ngrid,2:
klev)/sqrt(q2(1:ngrid,2:
klev))
700 t2yam(1:ngrid,2:
klev)=9.1*kn(1:ngrid,2:
klev) &
701 & *dtetadz(1:ngrid,2:
klev)**2 &
702 & /sqrt(q2(1:ngrid,2:
klev))*lyam(1:ngrid,2:
klev)
!$Id iflag_pbl_split common compbl iflag_pbl
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL false
!FH On elimine toutes les clefs physiques dans la dynamique prt_level
subroutine vdif_q2(timestep, gravity, rconst, ngrid, plev, temp, kmy, q2)
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL true
subroutine yamada_c(ngrid, timestep, plev, play, pu, pv, pt, d_u, d_v, d_t, cd, q2, km, kn, kq, d_t_diss, ustar, iflag_pbl, okiophys)
subroutine abort_physic(modname, message, ierr)
INTERFACE SUBROUTINE RRTM_ECRT_140GP pt
subroutine iophys_ecrit(nom, lllm, titre, unite, px)