15 ypaprs, ypplay, yu, yv, yq, yt, yts, yqsurf, ycdragm, &
30 REAL,
INTENT(IN) :: dtime
31 INTEGER,
INTENT(IN) :: nsrf, knon
32 INTEGER,
DIMENSION(klon),
INTENT(IN) :: ni
33 REAL,
DIMENSION(klon,klev+1),
INTENT(IN) :: ypaprs
34 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: ypplay
35 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: yu, yv
36 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: yq, yt
37 REAL,
DIMENSION(klon),
INTENT(IN) :: yts, yqsurf
38 REAL,
DIMENSION(klon),
INTENT(IN) :: ycdragm
42 REAL,
DIMENSION(klon,klev+1),
INTENT(INOUT):: yq2
46 REAL,
DIMENSION(klon,klev),
INTENT(OUT) :: ycoefh
47 REAL,
DIMENSION(klon,klev),
INTENT(OUT) :: ycoefm
52 REAL,
DIMENSION(klon,klev) :: ycoefm0, ycoefh0, yzlay, yteta
53 REAL,
DIMENSION(klon,klev+1) :: yzlev, q2diag, ykmm, ykmn, ykmq
54 REAL,
DIMENSION(klon) :: yustar
70 CALL coefkz(nsrf, knon, ypaprs, ypplay, &
72 yts, yu, yv, yt, yq, &
83 CALL coefkz2(nsrf, knon, ypaprs, ypplay, yt, &
88 ycoefm(i,k) = max(ycoefm(i,k),ycoefm0(i,k))
89 ycoefh(i,k) = max(ycoefh(i,k),ycoefh0(i,k))
100 CALL coefkzmin(knon,ypaprs,ypplay,yu,yv,yt,yq,ycdragm, &
105 ycoefm(i,k) = max(ycoefm(i,k),ycoefm0(i,k))
106 ycoefh(i,k) = max(ycoefh(i,k),ycoefh0(i,k))
121 rd*yt(1:knon,1)/(0.5*(ypaprs(1:knon,1)+ypplay(1:knon,1))) &
122 *(ypaprs(1:knon,1)-ypplay(1:knon,1))/
rg
126 yzlay(i,k-1)+rd*0.5*(yt(i,k-1)+yt(i,k)) &
127 /ypaprs(i,k)*(ypplay(i,k-1)-ypplay(i,k))/
rg
134 yt(i,k)*(ypaprs(i,1)/ypplay(i,k))**rkappa &
140 yzlev(1:knon,
klev+1)=2.*yzlay(1:knon,
klev)-yzlay(1:knon,
klev-1)
143 yzlev(i,k)=0.5*(yzlay(i,k)+yzlay(i,k-1))
153 CALL ustarhb(knon,yu,yv,ycdragm, yustar)
156 WRITE(
lunout,*)
'USTAR = ',yustar
162 yzlev,yzlay,yu,yv,yteta, &
163 ycdragm,yq2,q2diag,ykmm,ykmn,yustar, &
166 CALL yamada4(knon,dtime,
rg,rd,ypaprs,yt, &
167 yzlev,yzlay,yu,yv,yteta, &
168 ycdragm,yq2,ykmm,ykmn,ykmq,yustar, &
172 ycoefm(1:knon,2:
klev)=ykmm(1:knon,2:
klev)
173 ycoefh(1:knon,2:
klev)=ykmn(1:knon,2:
klev)
181 SUBROUTINE coefkz(nsrf, knon, paprs, pplay, &
218 INTEGER,
INTENT(IN) :: knon, nsrf
219 REAL,
INTENT(IN) :: ksta, ksta_ter
220 REAL,
DIMENSION(klon),
INTENT(IN) :: ts
221 REAL,
DIMENSION(klon,klev+1),
INTENT(IN) :: paprs
222 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: pplay
223 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: u, v, t, q
224 REAL,
DIMENSION(klon),
INTENT(IN) :: qsurf
226 REAL,
DIMENSION(klon,klev),
INTENT(OUT) :: pcfm, pcfh
231 INTEGER,
DIMENSION(klon) :: itop
235 REAL,
PARAMETER :: cepdu2=0.1**2
236 REAL,
PARAMETER :: CKAP=0.4
237 REAL,
PARAMETER :: cb=5.0
238 REAL,
PARAMETER :: cc=5.0
239 REAL,
PARAMETER :: cd=5.0
240 REAL,
PARAMETER :: clam=160.0
241 REAL,
PARAMETER :: ratqs=0.05
242 LOGICAL,
PARAMETER :: richum=.
true.
243 REAL,
PARAMETER :: ric=0.4
244 REAL,
PARAMETER :: prandtl=0.4
254 REAL,
PARAMETER :: mixlen=35.0
256 LOGICAL,
PARAMETER :: tvirtu=.
true.
257 LOGICAL,
PARAMETER :: opt_ec=.
false.
266 REAL zdphi, zdu2, ztvd, ztvu, zcdn
268 REAL zt, zq, zdelta, zcvm5, zcor, zqs, zfr, zdqs
269 REAL z2geomf, zalh2, zalm2, zscfh, zscfm
270 REAL,
PARAMETER :: t_coup=273.15
271 LOGICAL,
PARAMETER :: check=.
false.
276 LOGICAL,
SAVE :: appel1er=.
true.
282 fsta(x) = 1.0 / (1.0+10.0*x*(1+8.0*x))
283 fins(x) = sqrt(1.0-18.0*x)
289 WRITE(
lunout,*)
'coefkz, opt_ec:', opt_ec
290 WRITE(
lunout,*)
'coefkz, richum:', richum
291 IF (richum)
WRITE(
lunout,*)
'coefkz, ratqs:', ratqs
292 WRITE(
lunout,*)
'coefkz, isommet:', isommet
293 WRITE(
lunout,*)
'coefkz, tvirtu:', tvirtu
324 IF ( nsrf .NE.
is_oce )
THEN
337 zgeop(i,1) = rd * t(i,1) / (0.5*(paprs(i,1)+pplay(i,1))) &
338 * (paprs(i,1)-pplay(i,1))
342 zgeop(i,k) = zgeop(i,k-1) &
343 + rd * 0.5*(t(i,k-1)+t(i,k)) / paprs(i,k) &
344 * (pplay(i,k-1)-pplay(i,k))
358 zdu2=max(cepdu2,(u(i,k)-u(i,k-1))**2 &
359 +(v(i,k)-v(i,k-1))**2)
360 zmgeom(i)=zgeop(i,k)-zgeop(i,k-1)
361 zdphi =zmgeom(i) / 2.0
362 zt = (t(i,k)+t(i,k-1)) * 0.5
363 zq = (q(i,k)+q(i,k-1)) * 0.5
369 zdelta = max(0.,sign(1.,rtt-zt))
370 zcvm5 = r5les*rlvtt/rcpd/(1.0+rvtmp2*zq)*(1.-zdelta) &
371 + r5ies*rlstt/rcpd/(1.0+rvtmp2*zq)*zdelta
372 zqs = r2es * foeew(zt,zdelta) / pplay(i,k)
374 zcor = 1./(1.-retv*zqs)
376 zdqs = foede(zt,zdelta,zcvm5,zqs,zcor)
378 IF (zt .LT. t_coup)
THEN
379 zqs = qsats(zt) / pplay(i,k)
380 zdqs = dqsats(zt,zqs)
382 zqs = qsatl(zt) / pplay(i,k)
383 zdqs = dqsatl(zt,zqs)
390 zfr = (zq+ratqs*zq-zqs) / (2.0*ratqs*zq)
394 zfr = max(0.0,min(1.0,zfr))
395 IF (.NOT.richum) zfr = 0.0
401 + zdphi/rcpd/(1.+rvtmp2*zq) &
402 *( (1.-zfr) + zfr*(1.+rlvtt*zqs/rd/zt)/(1.+zdqs) ) &
405 - zdphi/rcpd/(1.+rvtmp2*zq) &
406 *( (1.-zfr) + zfr*(1.+rlvtt*zqs/rd/zt)/(1.+zdqs) ) &
408 zri(i) =zmgeom(i)*(ztvd-ztvu)/(zdu2*0.5*(ztvd+ztvu))
410 + zmgeom(i)*zmgeom(i)/
rg*gamt(k) &
411 *(paprs(i,k)/101325.0)**rkappa &
412 /(zdu2*0.5*(ztvd+ztvu))
416 zri(i) =(rcpd*(t(i,k)-t(i,k-1)) &
417 -rd*0.5*(t(i,k)+t(i,k-1))/paprs(i,k) &
418 *(pplay(i,k)-pplay(i,k-1)) &
419 )*zmgeom(i)/(zdu2*0.5*rcpd*(t(i,k-1)+t(i,k)))
421 zmgeom(i)*zmgeom(i)*gamt(k)/
rg &
422 *(paprs(i,k)/101325.0)**rkappa &
423 /(zdu2*0.5*(t(i,k-1)+t(i,k)))
428 zcdn=sqrt(zdu2) / zmgeom(i) *
rg
431 z2geomf=zgeop(i,k-1)+zgeop(i,k)
432 zalm2=(0.5*ckap/
rg*z2geomf &
433 /(1.+0.5*ckap/
rg/clam*z2geomf))**2
434 zalh2=(0.5*ckap/
rg*z2geomf &
435 /(1.+0.5*ckap/
rg/(clam*sqrt(1.5*cd))*z2geomf))**2
436 IF (zri(i).LT.0.0)
THEN
437 zscf = ((zgeop(i,k)/zgeop(i,k-1))**(1./3.)-1.)**3 &
438 / (zmgeom(i)/
rg)**3 / (zgeop(i,k-1)/
rg)
439 zscf = sqrt(-zri(i)*zscf)
440 zscfm = 1.0 / (1.0+3.0*cb*cc*zalm2*zscf)
441 zscfh = 1.0 / (1.0+3.0*cb*cc*zalh2*zscf)
442 pcfm(i,k)=zcdn*zalm2*(1.-2.0*cb*zri(i)*zscfm)
443 pcfh(i,k)=zcdn*zalh2*(1.-3.0*cb*zri(i)*zscfh)
445 zscf=sqrt(1.+cd*zri(i))
446 pcfm(i,k)=zcdn*zalm2/(1.+2.0*cb*zri(i)/zscf)
447 pcfh(i,k)=zcdn*zalh2/(1.+3.0*cb*zri(i)*zscf)
450 zl2(i)=(mixlen*max(0.0,(paprs(i,k)-paprs(i,itop(i)+1)) &
451 /(paprs(i,2)-paprs(i,itop(i)+1)) ))**2
452 pcfm(i,k)=sqrt(max(zcdn*zcdn*(ric-zri(i))/ric, kstable))
453 pcfm(i,k)= zl2(i)* pcfm(i,k)
454 pcfh(i,k) = pcfm(i,k) /prandtl
463 IF (itop(i)+1 .LE.
klev)
THEN
464 DO k = itop(i)+1,
klev
475 SUBROUTINE coefkz2(nsrf, knon, paprs, pplay,t, &
499 INTEGER,
INTENT(IN) :: knon, nsrf
500 REAL,
DIMENSION(klon, klev+1),
INTENT(IN) :: paprs
501 REAL,
DIMENSION(klon, klev),
INTENT(IN) :: pplay
502 REAL,
DIMENSION(klon, klev),
INTENT(IN) :: t(
klon,
klev)
504 REAL,
DIMENSION(klon, klev),
INTENT(OUT) :: pcfm, pcfh
508 REAL,
PARAMETER :: prandtl=0.4
509 REAL,
PARAMETER :: kstable=0.002
511 REAL,
PARAMETER :: mixlen=35.0
512 REAL,
PARAMETER :: seuil=-0.02
520 INTEGER i, k, invb(knon)
522 REAL zdthmin(knon), zdthdp
544 zdthdp = (t(i,k)-t(i,k+1))/(pplay(i,k)-pplay(i,k+1)) &
545 - rd * 0.5*(t(i,k)+t(i,k+1))/rcpd/paprs(i,k+1)
546 zdthdp = zdthdp * 100.0
547 IF (pplay(i,k).GT.0.8*paprs(i,1) .AND. &
548 zdthdp.LT.zdthmin(i) )
THEN
558 IF ( nsrf.EQ.
is_oce )
THEN
570 IF ( (invb(i).EQ.
klev) .OR. (zdthmin(i).GT.seuil) )
THEN
571 zl2(i)=(mixlen*max(0.0,(paprs(i,k)-paprs(i,
klev+1)) &
572 /(paprs(i,2)-paprs(i,
klev+1)) ))**2
573 pcfm(i,k)= zl2(i)* kstable
574 pcfh(i,k) = pcfm(i,k) /prandtl
subroutine coef_diff_turb(dtime, nsrf, knon, ni, ypaprs, ypplay, yu, yv, yq, yt, yts, yqsurf, ycdragm, ycoefm, ycoefh, yq2)
!$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
subroutine ustarhb(knon, u, v, cd_m, ustar)
subroutine vdif_kcay(ngrid, dt, g, rconst, plev, temp, zlev, zlay, u, v, teta, cd, q2, q2diag, km, kn, ustar, l_mix)
!$Id ok_orolf LOGICAL ok_limitvrai LOGICAL ok_all_xml INTEGER iflag_ener_conserv REAL solaire RCFC12 RCFC12_act CFC12_ppt!IM ajout CFMIP2 CMIP5 LOGICAL ok_4xCO2atm RCFC12_per CFC12_ppt_per!OM correction du bilan d eau global!OM Correction sur precip KE REAL cvl_corr!OM Fonte calotte dans bilan eau LOGICAL ok_lic_melt!IM simulateur ISCCP INTEGER overlap!IM seuils cdrh REAL cdhmax!IM param stabilite s terres et en dehors REAL ksta
!FH On elimine toutes les clefs physiques dans la dynamique prt_level
!$Id Turb_fcg_gcssold get_uvd hqturb_gcssold endif!large scale llm day day1 day day1 *dt_toga endif!time annee_ref dt_toga u_toga vq_toga w_prof vq_prof llm u(l)
!$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 coefkz2(nsrf, knon, paprs, pplay, t, pcfm, pcfh)
subroutine coefkzmin(knon, ypaprs, ypplay, yu, yv, yt, yq, ycdragm, km, kn)
!$Id ok_orolf LOGICAL ok_limitvrai LOGICAL ok_all_xml INTEGER iflag_ener_conserv REAL solaire RCFC12 RCFC12_act CFC12_ppt!IM ajout CFMIP2 CMIP5 LOGICAL ok_4xCO2atm RCFC12_per CFC12_ppt_per!OM correction du bilan d eau global!OM Correction sur precip KE REAL cvl_corr!OM Fonte calotte dans bilan eau LOGICAL ok_lic_melt!IM simulateur ISCCP INTEGER overlap!IM seuils cdrh REAL cdhmax!IM param stabilite s terres et en dehors REAL f_ri_cd_min!IM ok_kzmin
subroutine yamada4(ngrid, dt, g, rconst, plev, temp, zlev, zlay, u, v, teta, cd, q2, km, kn, kq, ustar, iflag_pbl)
!$Id ok_orolf LOGICAL ok_limitvrai LOGICAL ok_all_xml INTEGER iflag_ener_conserv REAL solaire RCFC12 RCFC12_act CFC12_ppt!IM ajout CFMIP2 CMIP5 LOGICAL ok_4xCO2atm RCFC12_per CFC12_ppt_per!OM correction du bilan d eau global!OM Correction sur precip KE REAL cvl_corr!OM Fonte calotte dans bilan eau LOGICAL ok_lic_melt!IM simulateur ISCCP INTEGER overlap!IM seuils cdrh REAL cdhmax!IM param stabilite s terres et en dehors REAL ksta_ter
subroutine coefkz(nsrf, knon, paprs, pplay, ksta, ksta_ter, ts, u, v, t, q, qsurf, pcfm, pcfh)
integer, parameter is_oce
!$Header!gestion des impressions de sorties et de débogage la sortie standard prt_level COMMON comprint lunout