4 SUBROUTINE yamada4(ngrid, dt, g, rconst, plev, temp, zlev, zlay, u, v, teta, &
50 REAL kmin, qmin, pblhmin(
klon), coriol(
klon)
68 INTEGER iflag_pbl, ngrid
75 DATA first, ipas/.
false., 0/
81 REAL ri, zrif, zalpha, zsm, zsn
86 REAL m2cstat, mcstat, kmcstat
88 REAL,
ALLOCATABLE,
SAVE :: l0(:)
93 REAL ric, rifc, b1, kap
94 SAVE ric, rifc, b1, kap
95 DATA ric, rifc, b1, kap/0.195, 0.191, 16.6, 0.4/
97 REAL frif, falpha, fsm
98 REAL fl, zzz, zl0, zq2, zn2
102 LOGICAL,
SAVE :: firstcall = .
true.
104 frif(ri) = 0.6588*(ri+0.1776-sqrt(ri*ri-0.3221*ri+0.03156))
105 falpha(ri) = 1.318*(0.2231-ri)/(0.2341-ri)
106 fsm(ri) = 1.96*(0.1912-ri)*(0.2341-ri)/((1.-ri)*(0.2231-ri))
107 fl(zzz, zl0, zq2, zn2) = max(min(l0(ig)*kap*zlev(ig, &
108 k)/(kap*zlev(ig,k)+l0(ig)),0.5*sqrt(q2(ig,k))/sqrt( &
109 max(n2(ig,k),1.e-10))), 1.)
121 IF (.NOT. (iflag_pbl>=6 .AND. iflag_pbl<=12))
THEN
122 stop
'probleme de coherence dans appel a MY'
136 zlev(ig, nlev) = zlay(ig, nlay) + (zlay(ig,nlay)-zlev(ig,nlev-1))
143 unsdz(ig, k) = 1.e+0/(zlev(ig,k+1)-zlev(ig,k))
147 unsdzdec(ig, 1) = 1.e+0/(zlay(ig,1)-zlev(ig,1))
151 unsdzdec(ig, k) = 1.e+0/(zlay(ig,k)-zlay(ig,k-1))
155 unsdzdec(ig, nlay+1) = 1.e+0/(zlev(ig,nlay+1)-zlay(ig,nlay))
168 dz(ig, k) = zlay(ig, k) - zlay(ig, k-1)
169 m2(ig, k) = ((u(ig,k)-u(ig,k-1))**2+(v(ig,k)-v(ig, &
170 k-1))**2)/(dz(ig,k)*dz(ig,k))
171 dtetadz(ig, k) = (teta(ig,k)-teta(ig,k-1))/dz(ig, k)
172 n2(ig, k) = g*2.*dtetadz(ig, k)/(teta(ig,k-1)+teta(ig,k))
174 ri = n2(ig, k)/max(m2(ig,k), 1.e-10)
176 rif(ig, k) = frif(ri)
180 IF (rif(ig,k)<0.16)
THEN
181 alpha(ig, k) = falpha(rif(ig,k))
182 sm(ig, k) = fsm(rif(ig,k))
187 zz(ig, k) = b1*m2(ig, k)*(1.-rif(ig,k))*sm(ig, k)
197 IF (iflag_pbl==8 .OR. iflag_pbl==10)
THEN
212 sqz(ig) = sqz(ig) + zq*zlev(ig, k)*(zlay(ig,k)-zlay(ig,k-1))
213 sq(ig) = sq(ig) + zq*(zlay(ig,k)-zlay(ig,k-1))
217 l0(ig) = 0.2*sqz(ig)/sq(ig)
221 l(ig, k) = fl(zlev(ig,k), l0(ig), q2(ig,k), n2(ig,k))
235 l(ig, k) = fl(zlev(ig,k), l0(ig), q2(ig,k), n2(ig,k))
246 IF (iflag_pbl==6)
THEN
249 q2(:, k) = l(:, k)**2*zz(:, k)
253 ELSE IF (iflag_pbl==7)
THEN
262 delta(ig, k) = q2(ig, k)/(l(ig,k)**2*sm(ig,k))
263 kmpre(ig, k) = l(ig, k)*sqrt(q2(ig,k))*sm(ig, k)
264 mpre(ig, k) = sqrt(m2(ig,k))
271 m2cstat = max(alpha(ig,k)*n2(ig,k)+delta(ig,k)/b1, 1.e-12)
272 mcstat = sqrt(m2cstat)
280 kmcstat = 1.e+0/mcstat*(unsdz(ig,k)*kmpre(ig,k+1)*mpre(ig,k+1)+ &
281 unsdz(ig,k-1)*cd(ig)*(sqrt(u(ig,3)**2+v(ig,3)**2)-mcstat/unsdzdec &
282 (ig,k)-mpre(ig,k+1)/unsdzdec(ig,k+1))**2)/(unsdz(ig,k)+unsdz(ig,k &
285 kmcstat = 1.e+0/mcstat*(unsdz(ig,k)*kmpre(ig,k+1)*mpre(ig,k+1)+ &
286 unsdz(ig,k-1)*kmpre(ig,k-1)*mpre(ig,k-1))/ &
287 (unsdz(ig,k)+unsdz(ig,k-1))
290 tmp2 = kmcstat/(sm(ig,k)/q2(ig,k))/l(ig, k)
291 q2(ig, k) = max(tmp2, 1.e-12)**(2./3.)
297 ELSE IF (iflag_pbl==8 .OR. iflag_pbl==9)
THEN
307 delta(ig, k) = q2(ig, k)/(l(ig,k)**2*sm(ig,k))
308 IF (delta(ig,k)<1.e-20)
THEN
310 delta(ig, k) = 1.e-20
312 km(ig, k) = l(ig, k)*sqrt(q2(ig,k))*sm(ig, k)
313 aa0 = (m2(ig,k)-alpha(ig,k)*n2(ig,k)-delta(ig,k)/b1)
314 aa1 = (m2(ig,k)*(1.-rif(ig,k))-delta(ig,k)/b1)
316 aa(ig, k) = aa1*dt/(delta(ig,k)*l(ig,k))
318 qpre = sqrt(q2(ig,k))
320 IF (aa(ig,k)>0.)
THEN
321 q2(ig, k) = (qpre+aa(ig,k)*qpre*qpre)**2
323 q2(ig, k) = (qpre/(1.-aa(ig,k)*qpre))**2
332 q2(ig, k) = min(max(q2(ig,k),1.e-10), 1.e4)
337 ELSE IF (iflag_pbl>=10)
THEN
343 l(ig, k) = max(l(ig,k), 1.)
344 km(ig, k) = l(ig, k)*sqrt(q2(ig,k))*sm(ig, k)
345 q2(ig, k) = q2(ig, k) + dt*km(ig, k)*m2(ig, k)*(1.-rif(ig,k))
346 q2(ig, k) = min(max(q2(ig,k),1.e-10), 1.e4)
347 q2(ig, k) = 1./(1./sqrt(q2(ig,k))+dt/(2*l(ig,k)*b1))
348 q2(ig, k) = q2(ig, k)*q2(ig, k)
354 stop
'Cas nom prevu dans yamada4'
368 km(ig, k) = l(ig, k)*zq*sm(ig, k)
369 kn(ig, k) = km(ig, k)*alpha(ig, k)
370 kq(ig, k) = l(ig, k)*zq*0.2
375 kq(1:ngrid, 1) = kq(1:ngrid, 2)
376 kq(1:ngrid,
klev+1) = 0
379 IF (iflag_pbl>=12)
THEN
382 CALL vdif_q2(dt, g, rconst, ngrid, plev, temp, kq, q2)
397 pblhmin(ig) = 0.07*ustar(ig)/max(abs(coriol(ig)), 2.546e-5)
404 IF (iflag_pbl==8 .OR. iflag_pbl==10)
THEN
408 IF (teta(ig,2)>teta(ig,1))
THEN
409 qmin = ustar(ig)*(max(1.-zlev(ig,k)/pblhmin(ig),0.))**2
410 kmin = kap*zlev(ig, k)*qmin
414 IF (kn(ig,k)<kmin .OR. km(ig,k)<kmin)
THEN
422 q2(ig, k) = (qmin/sm(ig,k))**2
431 IF (teta(ig,2)>teta(ig,1))
THEN
432 qmin = ustar(ig)*(max(1.-zlev(ig,k)/pblhmin(ig),0.))**2
433 kmin = kap*zlev(ig, k)*qmin
437 IF (kn(ig,k)<kmin .OR. km(ig,k)<kmin)
THEN
447 q2(ig, k) = min((qmin/sm(ig,k))**2, 10.)
449 km(ig, k) = l(ig, k)*zq*sm(ig, k)
450 kn(ig, k) = km(ig, k)*alpha(ig, k)
451 kq(ig, k) = l(ig, k)*zq*0.2
466 smyam(1:ngrid, 1) = 0.
467 styam(1:ngrid, 1) = 0.
468 lyam(1:ngrid, 1) = 0.
469 knyam(1:ngrid, 1) = 0.
470 w2yam(1:ngrid, 1) = 0.
471 t2yam(1:ngrid, 1) = 0.
473 smyam(1:ngrid, 2:
klev) = sm(1:ngrid, 2:
klev)
474 styam(1:ngrid, 2:
klev) = sm(1:ngrid, 2:
klev)*alpha(1:ngrid, 2:
klev)
475 lyam(1:ngrid, 2:
klev) = l(1:ngrid, 2:
klev)
476 knyam(1:ngrid, 2:
klev) = kn(1:ngrid, 2:
klev)
480 w2yam(1:ngrid, 2:
klev) = q2(1:ngrid, 2:
klev)*0.24 + &
481 lyam(1:ngrid, 2:
klev)*5.17*kn(1:ngrid, 2:
klev)*n2(1:ngrid, 2:
klev)/ &
482 sqrt(q2(1:ngrid,2:
klev))
484 t2yam(1:ngrid, 2:
klev) = 9.1*kn(1:ngrid, 2:
klev)* &
485 dtetadz(1:ngrid, 2:
klev)**2/sqrt(q2(1:ngrid,2:
klev))* &
486 lyam(1:ngrid, 2:
klev)
493 SUBROUTINE vdif_q2(timestep, gravity, rconst, ngrid, plev, temp, kmy, q2)
519 zz = (plev(i,k)+plev(i,k+1))*gravity/(rconst*temp(i,k))
520 kstar(i, k) = 0.125*(kmy(i,k+1)+kmy(i,k))*zz*zz/ &
521 (plev(i,k)-plev(i,k+1))*timestep
527 deltap(i, k) = 0.5*(plev(i,k-1)-plev(i,k+1))
531 deltap(i, 1) = 0.5*(plev(i,1)-plev(i,2))
540 denom(i, k) = deltap(i, k) + (1.-beta(i,k+1))*kstar(i, k) + &
543 alpha(i, k) = (q2(i,k)*deltap(i,k)+kstar(i,k)*alpha(i,k+1))/denom(i, k)
544 beta(i, k) = kstar(i, k-1)/denom(i, k)
551 denom(i, 1) = deltap(i, 1) + (1-beta(i,2))*kstar(i, 1)
552 q2(i, 1) = (q2(i,1)*deltap(i,1)+kstar(i,1)*alpha(i,2))/denom(i, 1)
559 q2(i, k) = alpha(i, k) + beta(i, k)*q2(i, k-1)
565 SUBROUTINE vdif_q2e(timestep, gravity, rconst, ngrid, plev, temp, kmy, q2)
586 zz = (plev(i,k)+plev(i,k+1))*gravity/(rconst*temp(i,k))
587 kstar(i, k) = 0.125*(kmy(i,k+1)+kmy(i,k))*zz*zz/ &
588 (plev(i,k)-plev(i,k+1))*timestep
594 deltap(i, k) = 0.5*(plev(i,k-1)-plev(i,k+1))
598 deltap(i, 1) = 0.5*(plev(i,1)-plev(i,2))
604 q2(i, k) = q2(i, k) + (kstar(i,k)*(q2(i,k+1)-q2(i, &
605 k))-kstar(i,k-1)*(q2(i,k)-q2(i,k-1)))/deltap(i, k)
610 q2(i, 1) = q2(i, 1) + (kstar(i,1)*(q2(i,2)-q2(i,1)))/deltap(i, 1)
!$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 yamada4(ngrid, dt, g, rconst, plev, temp, zlev, zlay, u, v, teta, cd, q2, km, kn, kq, ustar, iflag_pbl)
subroutine vdif_q2e(timestep, gravity, rconst, ngrid, plev, temp, kmy, q2)