4 SUBROUTINE yamada4(ngrid,dt,g,rconst,plev,temp
5 s ,zlev,
zlay,
u,
v,
teta,cd,q2,km,kn,kq,ustar
55 real kmin,qmin,pblhmin(klon),coriol(klon)
56 REAL zlev(klon,
klev+1)
62 REAL q2(klon,
klev+1),qpre
64 REAL unsdzdec(klon,
klev+1)
67 REAL kmpre(klon,
klev+1),tmp2
68 REAL mpre(klon,
klev+1)
72 real aa(klon,
klev+1),aa0,aa1
73 integer iflag_pbl,ngrid
80 data first,ipas/.false.,0/
86 real ri,zrif,zalpha,zsm,zsn
90 real dtetadz(klon,
klev+1)
91 real m2cstat,mcstat,kmcstat
93 real,
allocatable,
save :: l0(:)
95 real sq(klon),sqz(klon),zz(klon,
klev+1)
100 data ric,rifc,b1,kap/0.195,0.191,16.6,0.4/
103 real fl,zzz,zl0,zq2,zn2
105 real rino(klon,
klev+1),smyam(klon,
klev),styam(klon,
klev)
107 s ,w2yam(klon,
klev),t2yam(klon,
klev)
108 logical,
save :: firstcall=.true.
110 frif(
ri)=0.6588*(
ri+0.1776-sqrt(
ri*
ri-0.3221*
ri+0.03156))
111 falpha(
ri)=1.318*(0.2231-
ri)/(0.2341-
ri)
112 fsm(
ri)=1.96*(0.1912-
ri)*(0.2341-
ri)/((1.-
ri)*(0.2231-
ri))
114 s max(min(l0(ig)*kap*zlev(ig,
k)/(kap*zlev(ig,
k)+l0(ig))
115 s ,0.5*sqrt(q2(ig,
k))/sqrt(max(n2(ig,
k),1.e-10))) ,1.)
127 if (.not.(iflag_pbl.ge.6.and.iflag_pbl.le.12))
then
128 stop
'probleme de coherence dans appel a MY'
143 & +(
zlay(ig,
nlay) - zlev(ig,nlev-1) )
150 unsdz(ig,
k)=1.e+0/(zlev(ig,
k+1)-zlev(ig,
k))
154 unsdzdec(ig,1)=1.e+0/(
zlay(ig,1)-zlev(ig,1))
172 m2(ig,
k)=((
u(ig,
k)-
u(ig,
k-1))**2+(
v(ig,
k)-
v(ig,
k-1))**2)
173 s /(dz(ig,
k)*dz(ig,
k))
177 ri=n2(ig,
k)/max(m2(ig,
k),1.e-10)
183 if(rif(ig,
k).lt.0.16)
then
185 sm(ig,
k)=fsm(rif(ig,
k))
190 zz(ig,
k)=b1*m2(ig,
k)*(1.-rif(ig,
k))*sm(ig,
k)
200 if (iflag_pbl==8.or.iflag_pbl==10)
then
215 sqz(ig)=sqz(ig)+zq*zlev(ig,
k)*(
zlay(ig,
k)-
zlay(ig,
k-1))
220 l0(ig)=0.2*sqz(ig)/sq(ig)
224 l(ig,
k)=fl(zlev(ig,
k),l0(ig),q2(ig,
k),n2(ig,
k))
238 l(ig,
k)=fl(zlev(ig,
k),l0(ig),q2(ig,
k),n2(ig,
k))
249 if (iflag_pbl.eq.6)
then
252 q2(:,
k)=
l(:,
k)**2*zz(:,
k)
256 else if (iflag_pbl.eq.7)
then
266 kmpre(ig,
k)=
l(ig,
k)*sqrt(q2(ig,
k))*sm(ig,
k)
267 mpre(ig,
k)=sqrt(m2(ig,
k))
283 kmcstat=1.e+0 / mcstat
284 & *( unsdz(ig,
k)*kmpre(ig,
k+1)
288 & *( sqrt(
u(ig,3)**2+
v(ig,3)**2)
289 & -mcstat/unsdzdec(ig,
k)
290 & -mpre(ig,
k+1)/unsdzdec(ig,
k+1) )**2)
291 & /( unsdz(ig,
k)+unsdz(ig,
k-1) )
293 kmcstat=1.e+0 / mcstat
294 & *( unsdz(ig,
k)*kmpre(ig,
k+1)
296 & +unsdz(ig,
k-1)*kmpre(ig,
k-1)
298 & /( unsdz(ig,
k)+unsdz(ig,
k-1) )
302 & /( sm(ig,
k)/q2(ig,
k) )
304 q2(ig,
k)=max(tmp2,1.e-12)**(2./3.)
310 else if (iflag_pbl==8.or.iflag_pbl==9)
then
321 if (
delta(ig,
k).lt.1.e-20)
then
325 km(ig,
k)=
l(ig,
k)*sqrt(q2(ig,
k))*sm(ig,
k)
329 s(m2(ig,
k)*(1.-rif(ig,
k))-
delta(ig,
k)/b1)
335 if (aa(ig,
k).gt.0.)
then
336 q2(ig,
k)=(qpre+aa(ig,
k)*qpre*qpre)**2
338 q2(ig,
k)=(qpre/(1.-aa(ig,
k)*qpre))**2
347 q2(ig,
k)=min(max(q2(ig,
k),1.e-10),1.e4)
352 else if (iflag_pbl>=10)
then
357 l(:,
k)=max(
l(:,
k),1.)
358 km(:,
k)=
l(:,
k)*sqrt(q2(:,
k))*sm(:,
k)
359 q2(:,
k)=q2(:,
k)+
dt*km(:,
k)*m2(:,
k)*(1.-rif(:,
k))
360 q2(:,
k)=min(max(q2(:,
k),1.e-10),1.e4)
361 q2(:,
k)=1./(1./sqrt(q2(:,
k))+
dt/(2*
l(:,
k)*b1))
362 q2(:,
k)=q2(:,
k)*q2(:,
k)
367 stop
'Cas nom prevu dans yamada4'
381 km(ig,
k)=
l(ig,
k)*zq*sm(ig,
k)
383 kq(ig,
k)=
l(ig,
k)*zq*0.2
389 if (iflag_pbl.ge.12)
then
407 pblhmin(ig)=0.07*ustar(ig)/max(abs(coriol(ig)),2.546e-5)
414 if(iflag_pbl==8.or.iflag_pbl==10)
then
419 qmin=ustar(ig)*(max(1.-zlev(ig,
k)/pblhmin(ig),0.))**2
420 kmin=kap*zlev(ig,
k)*qmin
424 if (kn(ig,
k).lt.kmin.or.km(ig,
k).lt.kmin)
then
432 q2(ig,
k)=(qmin/sm(ig,
k))**2
442 qmin=ustar(ig)*(max(1.-zlev(ig,
k)/pblhmin(ig),0.))**2
443 kmin=kap*zlev(ig,
k)*qmin
447 if (kn(ig,
k).lt.kmin.or.km(ig,
k).lt.kmin)
then
457 q2(ig,
k)=min((qmin/sm(ig,
k))**2,10.)
459 km(ig,
k)=
l(ig,
k)*zq*sm(ig,
k)
461 kq(ig,
k)=
l(ig,
k)*zq*0.2
483 smyam(1:ngrid,2:
klev)=sm(1:ngrid,2:
klev)
486 knyam(1:ngrid,2:
klev)=kn(1:ngrid,2:
klev)
490 w2yam(1:ngrid,2:
klev)=q2(1:ngrid,2:
klev)*0.24
491 s +lyam(1:ngrid,2:
klev)*5.17*kn(1:ngrid,2:
klev)
492 s *n2(1:ngrid,2:
klev)/sqrt(q2(1:ngrid,2:
klev))
494 t2yam(1:ngrid,2:
klev)=9.1*kn(1:ngrid,2:
klev)
495 s *dtetadz(1:ngrid,2:
klev)**2
496 s /sqrt(q2(1:ngrid,2:
klev))*lyam(1:ngrid,2:
klev)
503 SUBROUTINE vdif_q2(timestep,gravity,rconst,ngrid,plev,temp,
508 #include "dimensions.h"
514 real plev(klon,
klev+1)
518 real kstar(klon,
klev+1),zz
519 real kmy(klon,
klev+1)
521 real deltap(klon,
klev+1)
534 zz=(plev(
i,
k)+plev(
i,
k+1))*gravity/(rconst*
temp(
i,
k))
535 kstar(
i,
k)=0.125*(kmy(
i,
k+1)+kmy(
i,
k))*zz*zz
542 deltap(
i,
k)=0.5*(plev(
i,
k-1)-plev(
i,
k+1))
546 deltap(
i,1)=0.5*(plev(
i,1)-plev(
i,2))
556 s kstar(
i,
k)+kstar(
i,
k-1)
567 denom(
i,1)=deltap(
i,1)+(1-
beta(
i,2))*kstar(
i,1)
568 q2(
i,1)=(q2(
i,1)*deltap(
i,1)
569 s +kstar(
i,1)*
alpha(
i,2))/denom(
i,1)
587 #include "dimensions.h"
593 real plev(klon,
klev+1)
597 real kstar(klon,
klev+1),zz
598 real kmy(klon,
klev+1)
600 real deltap(klon,
klev+1)
608 zz=(plev(
i,
k)+plev(
i,
k+1))*gravity/(rconst*
temp(
i,
k))
609 kstar(
i,
k)=0.125*(kmy(
i,
k+1)+kmy(
i,
k))*zz*zz
616 deltap(
i,
k)=0.5*(plev(
i,
k-1)-plev(
i,
k+1))
620 deltap(
i,1)=0.5*(plev(
i,1)-plev(
i,2))
627 s( kstar(
i,
k)*(q2(
i,
k+1)-q2(
i,
k))
628 s -kstar(
i,
k-1)*(q2(
i,
k)-q2(
i,
k-1)) )
635 s( kstar(
i,1)*(q2(
i,2)-q2(
i,1))