4 SUBROUTINE conccm(dtime, paprs, pplay, t, q, conv_q, d_t, d_q, rain, snow, &
42 REAL zlvdcp, zlsdcp, zdelta, zz, za, zb
51 INTEGER ibas_bis(
klon)
52 INTEGER itop_bis(
klon)
74 pt(i, k) = t(i,
klev-k+1)
75 pq(i, k) = q(i,
klev-k+1)
76 pres(i, k) = pplay(i,
klev-k+1)
77 dp(i, k) = paprs(i,
klev+1-k) - paprs(i,
klev+1-k+1)
81 zgeom(i,
klev) = rd*t(i, 1)/(0.5*(paprs(i,1)+pplay(i, &
82 1)))*(paprs(i,1)-pplay(i,1))
86 zgeom(i,
klev+1-k) = zgeom(i,
klev+1-k+1) + rd*0.5*(t(i,k-1)+t(i,k))/ &
87 paprs(i, k)*(pplay(i,k-1)-pplay(i,k))
91 CALL cmfmca(dtime, pres, dp, zgeom, pt, pq, cmfprt, cmfprs, ntop, nbas)
95 d_q(i,
klev+1-k) = pq(i, k) - q(i,
klev+1-k)
96 d_t(i,
klev+1-k) = pt(i, k) - t(i,
klev+1-k)
101 rain(i) = cmfprt(i)*rhoh2o
102 snow(i) = cmfprs(i)*rhoh2o
103 kbascm(i) =
klev + 1 - nbas(i)
104 ktopcm(i) =
klev + 1 - ntop(i)
108 CALL conkuo(dtime, paprs, pplay, t, q, conv_q, d_t_bis, d_q_bis, &
109 d_ql_bis, rneb_bis, rain_bis, snow_bis, ibas_bis, itop_bis)
112 d_t(i, k) = d_t(i, k) + d_t_bis(i, k)
113 d_q(i, k) = d_q(i, k) + d_q_bis(i, k)
117 rain(i) = rain(i) + rain_bis(i)
118 snow(i) = snow(i) + snow_bis(i)
119 kbascm(i) = min(kbascm(i), ibas_bis(i))
120 ktopcm(i) = max(ktopcm(i), itop_bis(i))
124 zlvdcp = rlvtt/rcpd/(1.0+rvtmp2*q(i,k))
125 zlsdcp = rlstt/rcpd/(1.0+rvtmp2*q(i,k))
126 zdelta = max(0., sign(1.,rtt-t(i,k)))
129 za = -max(0.0, zz)*(zlvdcp*(1.-zdelta)+zlsdcp*zdelta)
130 d_t(i, k) = d_t(i, k) + za
131 d_q(i, k) = d_q(i, k) + zb
138 SUBROUTINE cmfmca(deltat, p, dp, gz, tb, shb, cmfprt, cmfprs, cnt, cnb)
173 REAL cmrp(
klon, pcnst)
287 REAL tmp1, tmp2, tmp3, tmp4
288 REAL zx_t, zx_p, zx_q, zx_qs, zx_gam
289 REAL zcor, zdelta, zcvm5
291 REAL qhalf, sh1, sh2, shbs1, shbs2
295 qhalf(sh1, sh2, shbs1, shbs2) = min(max(sh1,sh2), &
296 (shbs2*sh1+shbs1*sh2)/(shbs1+shbs2))
325 cats = max(dt, cmftau)
335 zdelta = max(0., sign(1.,rtt-zx_t))
336 zcvm5 = r5les*rlvtt*(1.-zdelta) + r5ies*rlstt*zdelta
337 zcvm5 = zcvm5/rcpd/(1.0+rvtmp2*zx_q)
338 zx_qs = r2es*foeew(zx_t, zdelta)/zx_p
339 zx_qs = min(0.5, zx_qs)
340 zcor = 1./(1.-retv*zx_qs)
342 zx_gam = foede(zx_t, zdelta, zcvm5, zx_qs, zcor)
350 sb(i, k) = rcpd*tb(i, k) + gz(i, k)
351 hb(i, k) = sb(i, k) + rlvtt*shb(i, k)
352 hbs(i, k) = sb(i, k) + rlvtt*shbs(i, k)
358 DO k = limcnv + 1,
klev
361 sbh(i, k) = 0.5*(sb(i,km1)+sb(i,k))
362 shbh(i, k) = qhalf(shb(i,km1), shb(i,k), shbs(i,km1), shbs(i,k))
363 hbh(i, k) = sbh(i, k) + rlvtt*shbh(i, k)
370 sbh(i, limcnv) = sb(i, limcnv)
371 shbh(i, limcnv) = shb(i, limcnv)
372 hbh(i, limcnv) = hb(i, limcnv)
398 DO k =
klev - 1, limcnv + 1, -1
426 pblhgt = max(pblh(i), 1.0)
427 IF (gz(i,kp1)/
rg<=pblhgt .AND. dzcld(i)==0.0)
THEN
428 fac1 = max(0.0, 1.0-gz(i,kp1)/
rg/pblhgt)
429 tprime = min(thtap(i), tpmax)*fac1
430 qsattp = shbs(i, kp1) + rcpd/rlvtt*gam(i, kp1)*tprime
431 shprme = min(min(shp(i),shpmax)*fac1, max(qsattp-shb(i,kp1),0.0))
432 qprime = max(qprime, shprme)
440 sc(i) = sb(i, kp1) + rcpd*tprime
441 shc(i) = shb(i, kp1) + qprime
442 hc(i) = sc(i) + rlvtt*shc(i)
443 flotab(i) = hc(i) - hbs(i, k)
444 dz = dp(i, k)*rd*tb(i, k)/
rg/p(i, k)
445 IF (flotab(i)>0.0)
THEN
446 dzcld(i) = dzcld(i) + dz
456 IF (flotab(i)>0.0)
THEN
473 IF (k<=limcnv+1)
THEN
476 cldwtr(i) = sb(i, k) - sc(i) + flotab(i)/(1.0+gam(i,k))
477 cldwtr(i) = max(0.0, cldwtr(i))
491 cldwtr(i) = sb(i, k) - sc(i) + flotab(i)/(1.0+gam(i,k))
492 cldwtr(i) = max(0.0, cldwtr(i))
493 betamx = 1.0 - c0*max(0.0, (dzcld(i)-dzmin))
494 b1 = (hc(i)-hbs(i,km1))*dp(i, km1)
495 b2 = (hc(i)-hbs(i,k))*dp(i, k)
496 beta(i) = max(betamn, min(betamx,1.0+b1/b2))
497 IF (hbs(i,km1)<=hb(i,km1)) beta(i) = 0.0
509 tmp1 = (1.0+gam(i,k))*(sc(i)-sbh(i,kp1)+cldwtr(i)) - &
510 (hbh(i,kp1)-hc(i))*dp(i, k)/dp(i, kp1)
511 tmp2 = (1.0+gam(i,k))*(sc(i)-sbh(i,k))
512 IF ((beta(i)*tmp2-tmp1)>0.0)
THEN
513 betamx = 0.99*(tmp1/tmp2)
514 beta(i) = max(0.0, min(betamx,beta(i)))
523 IF (hb(i,km1)<hbs(i,km1))
THEN
524 tmp1 = (1.0+gam(i,k))*(sc(i)-sbh(i,kp1)+cldwtr(i)) - &
525 (hbh(i,kp1)-hc(i))*dp(i, k)/dp(i, kp1)
527 tmp2 = gam(i, km1)*(sbh(i,k)-sc(i)+cldwtr(i)) - hbh(i, k) + hc(i) - &
529 tmp3 = (1.0+gam(i,k))*(sc(i)-sbh(i,k))/dp(i, k)
530 tmp4 = (dt/cats)*(hc(i)-hbs(i,k))*tmp2/(dp(i,km1)*(hbs(i,km1)-hb(i, &
532 IF ((beta(i)*tmp4-tmp1)>0.0)
THEN
533 betamx = ssfac*(tmp1/tmp4)
534 beta(i) = max(0.0, min(betamx,beta(i)))
544 g = min(0.0, hb(i,k)-hb(i,km1))
545 tmp3 = (hb(i,k)-hb(i,km1)-g)*(cats/dt)/(hc(i)-hbs(i,k))
546 tmp1 = (1.0+gam(i,k))*(sc(i)-sbh(i,kp1)+cldwtr(i)) - &
547 (hbh(i,kp1)-hc(i))*dp(i, k)/dp(i, kp1)
549 tmp1 = tmp3*tmp1 + (hc(i)-hbh(i,kp1))/dp(i, k)
550 tmp2 = tmp3*(1.0+gam(i,k))*(sc(i)-sbh(i,k))/dp(i, k) + &
551 (hc(i)-hbh(i,k)-cldwtr(i))*(1.0/dp(i,k)+1.0/dp(i,kp1))
552 IF ((beta(i)*tmp2-tmp1)>0.0)
THEN
554 IF (tmp2/=0.0) betamx = tmp1/tmp2
555 beta(i) = max(0.0, min(betamx,beta(i)))
572 beta(i) = max(0.0, beta(i))
573 tmp1 = hc(i) - hbs(i, k)
574 tmp2 = ((1.0+gam(i,k))*(sc(i)-sbh(i,kp1)+cldwtr(i))-beta(i)*(1.0+gam( &
575 i,k))*(sc(i)-sbh(i,k)))/dp(i, k) - (hbh(i,kp1)-hc(i))/dp(i, kp1)
576 eta(i) = tmp1/(tmp2*
rg*cats)
577 tmass = min(dp(i,k), dp(i,kp1))/
rg
578 IF (eta(i)>tmass*rdt .OR. eta(i)<=0.0) eta(i) = 0.0
582 IF (shc(i)-shbh(i,k)<0.0 .AND. beta(i)*eta(i)/=0.0)
THEN
583 denom = eta(i)*
rg*dt*(shc(i)-shbh(i,k))/dp(i, km1)
584 beta(i) = max(0.0, min(-0.999*shb(i,km1)/denom,beta(i)))
589 qtest1 = shb(i, k) + eta(i)*
rg*dt*((shc(i)-shbh(i, &
590 kp1))-(1.0-beta(i))*cldwtr(i)/rlvtt-beta(i)*(shc(i)-shbh(i, &
592 IF (qtest1<=0.0) eta(i) = 0.0
596 fac1 = -(shbh(i,kp1)-shc(i))/dp(i, kp1)
597 qtest2 = shb(i, kp1) - eta(i)*
rg*dt*fac1
599 eta(i) = 0.99*shb(i, kp1)/(
rg*dt*fac1)
609 etagdt = eta(i)*
rg*dt
610 cldwtr(i) = etagdt*cldwtr(i)/rlvtt/
rg
611 rnwtr(i) = (1.0-beta(i))*cldwtr(i)
612 ds1(i) = etagdt*(sbh(i,kp1)-sc(i))/dp(i, kp1)
613 dq1(i) = etagdt*(shbh(i,kp1)-shc(i))/dp(i, kp1)
614 ds2(i) = (etagdt*(sc(i)-sbh(i,kp1))+rlvtt*
rg*cldwtr(i)-beta(i)*etagdt &
615 *(sc(i)-sbh(i,k)))/dp(i, k)
616 dq2(i) = (etagdt*(shc(i)-shbh(i,kp1))-
rg*rnwtr(i)-beta(i)*etagdt*(shc &
617 (i)-shbh(i,k)))/dp(i, k)
618 ds3(i) = beta(i)*(etagdt*(sc(i)-sbh(i,k))-rlvtt*
rg*cldwtr(i))/dp(i, &
620 dq3(i) = beta(i)*etagdt*(shc(i)-shbh(i,k))/dp(i, km1)
624 fslkp = eta(i)*(sc(i)-sbh(i,kp1))
625 fslkm = beta(i)*(eta(i)*(sc(i)-sbh(i,k))-rlvtt*cldwtr(i)*rdt)
626 fqlkp = eta(i)*(shc(i)-shbh(i,kp1))
627 fqlkm = beta(i)*eta(i)*(shc(i)-shbh(i,k))
632 tb(i, kp1) = tb(i, kp1) + ds1(i)/rcpd
633 tb(i, k) = tb(i, k) + ds2(i)/rcpd
634 tb(i, km1) = tb(i, km1) + ds3(i)/rcpd
635 shb(i, kp1) = shb(i, kp1) + dq1(i)
636 shb(i, k) = shb(i, k) + dq2(i)
637 shb(i, km1) = shb(i, km1) + dq3(i)
638 prec(i) = prec(i) + rnwtr(i)/rhoh2o
645 cmfdt(i, kp1) = cmfdt(i, kp1) + ds1(i)/rcpd*rdt
646 cmfdt(i, k) = cmfdt(i, k) + ds2(i)/rcpd*rdt
647 cmfdt(i, km1) = cmfdt(i, km1) + ds3(i)/rcpd*rdt
648 cmfdq(i, kp1) = cmfdq(i, kp1) + dq1(i)*rdt
649 cmfdq(i, k) = cmfdq(i, k) + dq2(i)*rdt
650 cmfdq(i, km1) = cmfdq(i, km1) + dq3(i)*rdt
651 cmfdqr(i, k) = cmfdqr(i, k) + (
rg*rnwtr(i)/dp(i,k))*rdt
652 cmfmc(i, kp1) = cmfmc(i, kp1) + eta(i)
653 cmfmc(i, k) = cmfmc(i, k) + beta(i)*eta(i)
654 cmfsl(i, kp1) = cmfsl(i, kp1) + fslkp
655 cmfsl(i, k) = cmfsl(i, k) + fslkm
656 cmflq(i, kp1) = cmflq(i, kp1) + rlvtt*fqlkp
657 cmflq(i, k) = cmflq(i, k) + rlvtt*fqlkm
658 qc(i, k) = (
rg*rnwtr(i)/dp(i,k))*rdt
671 IF ((cmrb(i,kp1,m)<0.0) .OR. (cmrb(i,k,m)<0.0) .OR. (cmrb(i,km1, &
676 cmrh(i, k) = 0.5*(cmrb(i,km1,m)+cmrb(i,k,m))
677 cmrh(i, kp1) = 0.5*(cmrb(i,k,m)+cmrb(i,kp1,m))
681 pblhgt = max(pblh(i), 1.0)
682 IF (gz(i,kp1)/
rg<=pblhgt .AND. dzcld(i)==0.)
THEN
683 fac1 = max(0.0, 1.0-gz(i,kp1)/
rg/pblhgt)
684 cmrc(i) = cmrb(i, kp1, m) + cmrp(i, m)*fac1
686 cmrc(i) = cmrb(i, kp1, m)
694 etagdt = eta(i)*
rg*dt
695 botflx = etagdt*(cmrc(i)-cmrh(i,kp1))
696 topflx = beta(i)*etagdt*(cmrc(i)-cmrh(i,k))
697 dcmr1(i) = -botflx/dp(i, kp1)
702 IF (cmrb(i,kp1,m)+dcmr1(i)<0.0)
THEN
703 efac1 = max(tiny, abs(cmrb(i,kp1,m)/dcmr1(i))-eps)
706 IF (efac1==tiny .OR. efac1>1.0) efac1 = 0.0
707 dcmr1(i) = -efac1*botflx/dp(i, kp1)
708 dcmr2(i) = (efac1*botflx-topflx)/dp(i, k)
710 IF (cmrb(i,k,m)+dcmr2(i)<0.0)
THEN
711 efac2 = max(tiny, abs(cmrb(i,k,m)/dcmr2(i))-eps)
714 IF (efac2==tiny .OR. efac2>1.0) efac2 = 0.0
715 dcmr2(i) = (efac1*botflx-efac2*topflx)/dp(i, k)
716 dcmr3(i) = efac2*topflx/dp(i, km1)
718 IF (cmrb(i,km1,m)+dcmr3(i)<0.0)
THEN
719 efac3 = max(tiny, abs(cmrb(i,km1,m)/dcmr3(i))-eps)
722 IF (efac3==tiny .OR. efac3>1.0) efac3 = 0.0
723 efac3 = min(efac2, efac3)
724 dcmr2(i) = (efac1*botflx-efac3*topflx)/dp(i, k)
725 dcmr3(i) = efac3*topflx/dp(i, km1)
727 cmrb(i, kp1, m) = cmrb(i, kp1, m) + dcmr1(i)
728 cmrb(i, k, m) = cmrb(i, k, m) + dcmr2(i)
729 cmrb(i, km1, m) = cmrb(i, km1, m) + dcmr3(i)
734 IF (k==limcnv+1)
GO TO 60
745 zdelta = max(0., sign(1.,rtt-zx_t))
746 zcvm5 = r5les*rlvtt*(1.-zdelta) + r5ies*rlstt*zdelta
747 zcvm5 = zcvm5/rcpd/(1.0+rvtmp2*zx_q)
748 zx_qs = r2es*foeew(zx_t, zdelta)/zx_p
749 zx_qs = min(0.5, zx_qs)
750 zcor = 1./(1.-retv*zx_qs)
752 zx_gam = foede(zx_t, zdelta, zcvm5, zx_qs, zcor)
759 zdelta = max(0., sign(1.,rtt-zx_t))
760 zcvm5 = r5les*rlvtt*(1.-zdelta) + r5ies*rlstt*zdelta
761 zcvm5 = zcvm5/rcpd/(1.0+rvtmp2*zx_q)
762 zx_qs = r2es*foeew(zx_t, zdelta)/zx_p
763 zx_qs = min(0.5, zx_qs)
764 zcor = 1./(1.-retv*zx_qs)
766 zx_gam = foede(zx_t, zdelta, zcvm5, zx_qs, zcor)
770 sb(i, k) = sb(i, k) + ds2(i)
771 sb(i, km1) = sb(i, km1) + ds3(i)
772 hb(i, k) = sb(i, k) + rlvtt*shb(i, k)
773 hb(i, km1) = sb(i, km1) + rlvtt*shb(i, km1)
774 hbs(i, k) = sb(i, k) + rlvtt*shbs(i, k)
775 hbs(i, km1) = sb(i, km1) + rlvtt*shbs(i, km1)
777 sbh(i, k) = 0.5*(sb(i,k)+sb(i,km1))
778 shbh(i, k) = qhalf(shb(i,km1), shb(i,k), shbs(i,km1), shbs(i,k))
779 hbh(i, k) = sbh(i, k) + rlvtt*shbh(i, k)
780 sbh(i, km1) = 0.5*(sb(i,km1)+sb(i,k-2))
781 shbh(i, km1) = qhalf(shb(i,k-2), shb(i,km1), shbs(i,k-2), &
783 hbh(i, km1) = sbh(i, km1) + rlvtt*shbh(i, km1)
793 etagt0 = eta(i) > 0.0
794 IF (.NOT. etagt0) dzcld(i) = 0.0
795 IF (etagt0 .AND. beta(i)>betamn)
THEN
801 cnt(i) = min(cnt(i), ktp)
802 cnb(i) = max(cnb(i), k)
810 IF (tb(i,
klev)<tmelt .AND. tb(i,
klev-1)<tmelt)
THEN
811 cmfprs(i) = prec(i)*rdt
813 cmfprt(i) = prec(i)*rdt
!$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
!$Header!integer nvarmx parameter(nfmx=10, imx=200, jmx=150, lmx=200, nvarmx=1000) real xd(imx
!$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 conccm(dtime, paprs, pplay, t, q, conv_q, d_t, d_q, rain, snow, kbascm, ktopcm)
subroutine cmfmca(deltat, p, dp, gz, tb, shb, cmfprt, cmfprs, cnt, cnb)
subroutine conkuo(dtime, paprs, pplay, t, q, conv_q, d_t, d_q, d_ql, rneb, rain, snow, ibas, itop)