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)