4 SUBROUTINE conflx (dtime,pres_h,pres_f,
5 e t,
q, con_t, con_q, pqhfl, w,
6 s d_t, d_q, rain, snow,
7 s pmfu, pmfd, pen_u, pde_u, pen_d, pde_d,
8 s kcbot, kctop, kdtop, pmflxr, pmflxs)
26 REAL pres_h(klon,
klev+1)
27 REAL pres_f(klon,
klev)
45 REAL pmflxr(klon,
klev+1)
46 REAL pmflxs(klon,
klev+1)
54 REAL pvervel(klon,
klev)
57 REAL d_t_bis(klon,
klev)
58 REAL d_q_bis(klon,
klev)
59 REAL paprs(klon,
klev+1)
60 REAL paprsf(klon,
klev)
71 REAL zmflxr(klon,
klev+1)
72 REAL zmflxs(klon,
klev+1)
131 zdelta=max(0.,sign(1.,rtt-pt(
i,
k)))
132 zqsat=r2es*foeew( pt(
i,
k), zdelta ) / paprsf(
i,
k)
139 paprs(
i,
klev+1) = pres_h(
i,1)
146 zgeom(
i,
k) = zgeom(
i,
k+1)
147 . + rd * 0.5*(pt(
i,
k+1)+pt(
i,
k)) / paprs(
i,
k+1)
148 . * (paprsf(
i,
k+1)-paprsf(
i,
k))
155 . paprsf, paprs, zgeom, land, zcvgt, zcvgq, pvervel,
156 . rain, snow, kcbot, kctop, kdtop,
157 . zmfu, zmfd, zen_u, zde_u, zen_d, zde_d,
158 . d_t_bis, d_q_bis, zmflxr, zmflxs)
211 SUBROUTINE flxmain(pdtime, pten, pqen, pqsen, pqhfl, pap, paph,
212 . pgeo, ldland, ptte, pqte, pvervel,
213 . prsfc, pssfc, kcbot, kctop, kdtop,
215 . pmfu, pmfd, pen_u, pde_u, pen_d, pde_d,
216 . dt_con, dq_con, pmflxr, pmflxs)
229 REAL pvervel(klon,
klev)
234 REAL plude(klon,
klev)
236 REAL prsfc(klon), pssfc(klon)
237 INTEGER kcbot(klon), kctop(klon), ktype(klon)
238 LOGICAL ldland(klon), ldcum(klon)
240 REAL ztenh(klon,
klev), zqenh(klon,
klev), zqsenh(klon,
klev)
241 REAL zgeoh(klon,
klev)
242 REAL zmfub(klon), zmfub1(klon)
243 REAL zmfus(klon,
klev), zmfuq(klon,
klev), zmful(klon,
klev)
244 REAL zdmfup(klon,
klev), zdpmel(klon,
klev)
245 REAL zentr(klon), zhcbase(klon)
246 REAL zdqpbl(klon), zdqcv(klon), zdhpbl(klon)
248 REAL pmflxr(klon,
klev+1)
249 REAL pmflxs(klon,
klev+1)
250 INTEGER ilab(klon,
klev), ictop0(klon)
252 REAL dt_con(klon,
klev), dq_con(klon,
klev)
254 REAL pdtime, zqumqe, zdqmin, zalvdcp, zhsat, zzz
255 REAL zhhat, zpbmpt, zgam, zeps, zfac
256 INTEGER i,
k, ikb, itopm2, kcum
258 REAL pen_u(klon,
klev), pde_u(klon,
klev)
259 REAL pen_d(klon,
klev), pde_d(klon,
klev)
262 REAL zmfds(klon,
klev), zmfdq(klon,
klev), zdmfdp(klon,
klev)
268 DATA firstcal / .true. /
288 CALL
flxini(pten, pqen, pqsen, pgeo,
289 . paph, zgeoh, ztenh, zqenh, zqsenh,
290 . ptu, pqu, ptd, pqd, pmfd, zmfds, zmfdq, zdmfdp,
291 . pmfu, zmfus, zmfuq, zdmfup,
292 . zdpmel, plu, plude, ilab, pen_u, pde_u, pen_d, pde_d)
296 CALL
flxbase(ztenh, zqenh, zgeoh, paph,
297 * ptu, pqu, plu, ldcum, kcbot, ilab)
307 zdqcv(
i) = pqte(
i,
k)*(paph(
i,
k+1)-paph(
i,
k))
314 zdqcv(
i)=zdqcv(
i)+pqte(
i,
k)*(paph(
i,
k+1)-paph(
i,
k))
315 IF (
k.GE.kcbot(
i))
THEN
316 zdqpbl(
i)=zdqpbl(
i)+pqte(
i,
k)*(paph(
i,
k+1)-paph(
i,
k))
317 zdhpbl(
i)=zdhpbl(
i)+(rcpd*ptte(
i,
k)+rlvtt*pqte(
i,
k))
318 . *(paph(
i,
k+1)-paph(
i,
k))
325 if (zdqcv(
i).GT.max(0.,-1.5*pqhfl(
i)*rg)) ktype(
i) = 1
335 zqumqe=pqu(
i,ikb)+plu(
i,ikb)-zqenh(
i,ikb)
336 zdqmin=max(0.01*zqenh(
i,ikb),1.e-10)
337 IF (zdqpbl(
i).GT.0..AND.zqumqe.GT.zdqmin.AND.ldcum(
i))
THEN
338 zmfub(
i) = zdqpbl(
i)/(rg*max(zqumqe,zdqmin))
343 IF (ktype(
i).EQ.2)
THEN
344 zdh = rcpd*(ptu(
i,ikb)-ztenh(
i,ikb)) + rlvtt*zqumqe
345 zdh = rg * max(zdh,1.0e5*zdqmin)
346 IF (zdhpbl(
i).GT.0..AND.ldcum(
i))zmfub(
i)=zdhpbl(
i)/zdh
348 zmfmax = (paph(
i,ikb)-paph(
i,ikb-1)) / (rg*pdtime)
349 zmfub(
i) = min(zmfub(
i),zmfmax)
351 IF (ktype(
i).EQ.1) zentr(
i) = entrpen
362 zhcbase(
i)=rcpd*ptu(
i,ikb)+zgeoh(
i,ikb)+rlvtt*pqu(
i,ikb)
369 zhsat=rcpd*ztenh(
i,
k)+zgeoh(
i,
k)+rlvtt*zqsenh(
i,
k)
370 zgam=r5les*zalvdcp*zqsenh(
i,
k)/
371 . ((1.-retv *zqsenh(
i,
k))*(ztenh(
i,
k)-r4les)**2)
372 zzz=rcpd*ztenh(
i,
k)*0.608
373 zhhat=zhsat-(zzz+zgam*zzz)/(1.+zgam*zzz/rlvtt)*
374 . max(zqsenh(
i,
k)-zqenh(
i,
k),0.)
375 IF(
k.LT.ictop0(
i).AND.zhcbase(
i).GT.zhhat) ictop0(
i)=
k
381 CALL
flxasc(pdtime,ztenh, zqenh, pten, pqen, pqsen,
382 . pgeo, zgeoh, pap, paph, pqte, pvervel,
383 . ldland, ldcum, ktype, ilab,
384 . ptu, pqu, plu, pmfu, zmfub, zentr,
385 . zmfus, zmfuq, zmful, plude, zdmfup,
386 . kcbot, kctop, ictop0, kcum, pen_u, pde_u)
387 IF (kcum.EQ.0) go to 1000
393 zpbmpt=paph(
i,kcbot(
i))-paph(
i,kctop(
i))
394 IF(ldcum(
i).AND.ktype(
i).EQ.1.AND.zpbmpt.LT.2.e4)ktype(
i)=2
395 IF(ldcum(
i)) ictop0(
i)=kctop(
i)
396 IF(ktype(
i).EQ.2) zentr(
i)=entrscv
408 zrfl(
i)=zrfl(
i)+zdmfup(
i,
k)
413 CALL
flxdlfs(ztenh, zqenh, zgeoh, paph, ptu, pqu,
414 * ldcum, kcbot, kctop, zmfub, zrfl,
416 * pmfd, zmfds, zmfdq, zdmfdp,
423 * pmfd, zmfds, zmfdq, zdmfdp,
424 * lddraf, pen_d, pde_d)
432 llo1 = pmfd(
i,ikb).LT.0.
434 IF ( llo1 ) zeps = cmfdeps
435 zqumqe = pqu(
i,ikb)+plu(
i,ikb)-
436 . zeps*pqd(
i,ikb)-(1.-zeps)*zqenh(
i,ikb)
437 zdqmin = max(0.01*zqenh(
i,ikb),1.e-10)
438 zmfmax = (paph(
i,ikb)-paph(
i,ikb-1)) / (rg*pdtime)
439 IF (zdqpbl(
i).GT.0..AND.zqumqe.GT.zdqmin.AND.ldcum(
i)
440 . .AND.zmfub(
i).LT.zmfmax)
THEN
441 zmfub1(
i) = zdqpbl(
i) / (rg*max(zqumqe,zdqmin))
445 IF (ktype(
i).EQ.2)
THEN
446 zdh = rcpd*(ptu(
i,ikb)-zeps*ptd(
i,ikb)-
447 . (1.-zeps)*ztenh(
i,ikb))+rlvtt*zqumqe
448 zdh = rg * max(zdh,1.0e5*zdqmin)
449 IF (zdhpbl(
i).GT.0..AND.ldcum(
i))zmfub1(
i)=zdhpbl(
i)/zdh
451 IF ( .NOT.((ktype(
i).EQ.1.OR.ktype(
i).EQ.2).AND.
452 . abs(zmfub1(
i)-zmfub(
i)).LT.0.2*zmfub(
i)) )
453 . zmfub1(
i) = zmfub(
i)
459 zfac = zmfub1(
i)/max(zmfub(
i),1.e-10)
460 pmfd(
i,
k) = pmfd(
i,
k)*zfac
461 zmfds(
i,
k) = zmfds(
i,
k)*zfac
462 zmfdq(
i,
k) = zmfdq(
i,
k)*zfac
463 zdmfdp(
i,
k) = zdmfdp(
i,
k)*zfac
464 pen_d(
i,
k) = pen_d(
i,
k)*zfac
465 pde_d(
i,
k) = pde_d(
i,
k)*zfac
470 IF (lddraf(
i)) zmfub(
i)=zmfub1(
i)
478 CALL
flxasc(pdtime,ztenh, zqenh, pten, pqen, pqsen,
479 . pgeo, zgeoh, pap, paph, pqte, pvervel,
480 . ldland, ldcum, ktype, ilab,
481 . ptu, pqu, plu, pmfu, zmfub, zentr,
482 . zmfus, zmfuq, zmful, plude, zdmfup,
483 . kcbot, kctop, ictop0, kcum, pen_u, pde_u)
489 CALL
flxflux(pdtime, pqen, pqsen, ztenh, zqenh, pap, paph,
490 . ldland, zgeoh, kcbot, kctop, lddraf, kdtop, ktype, ldcum,
491 . pmfu, pmfd, zmfus, zmfds, zmfuq, zmfdq, zmful, plude,
492 . zdmfup, zdmfdp, pten, prsfc, pssfc, zdpmel, itopm2,
498 CALL
flxdtdq(pdtime, itopm2, paph, ldcum, pten,
499 e zmfus, zmfds, zmfuq, zmfdq, zmful, zdmfup, zdmfdp, zdpmel,
505 SUBROUTINE flxini(pten, pqen, pqsen, pgeo, paph, pgeoh, ptenh,
506 . pqenh, pqsenh, ptu, pqu, ptd, pqd, pmfd, pmfds, pmfdq,
507 . pdmfdp, pmfu, pmfus, pmfuq, pdmfup, pdpmel, plu, plude,
508 . klab,pen_u, pde_u, pen_d, pde_d)
523 REAL pqsen(klon,
klev)
525 REAL pgeoh(klon,
klev)
526 REAL paph(klon,
klev+1)
527 REAL ptenh(klon,
klev)
528 REAL pqenh(klon,
klev)
529 REAL pqsenh(klon,
klev)
535 REAL pmfus(klon,
klev)
536 REAL pmfuq(klon,
klev)
537 REAL pdmfup(klon,
klev)
538 REAL plude(klon,
klev)
540 REAL pdpmel(klon,
klev)
545 REAL pmfds(klon,
klev)
546 REAL pmfdq(klon,
klev)
547 REAL pdmfdp(klon,
klev)
549 REAL pen_u(klon,
klev)
550 REAL pde_u(klon,
klev)
551 REAL pen_d(klon,
klev)
552 REAL pde_d(klon,
klev)
554 INTEGER klab(klon,
klev)
565 pgeoh(
i,
k)=pgeo(
i,
k)+(pgeo(
i,
k-1)-pgeo(
i,
k))*0.5
566 ptenh(
i,
k)=(max(rcpd*pten(
i,
k-1)+pgeo(
i,
k-1),
567 . rcpd*pten(
i,
k)+pgeo(
i,
k))-pgeoh(
i,
k))/rcpd
568 pqsenh(
i,
k)=pqsen(
i,
k-1)
573 CALL
flxadjtq(paph(1,
k),ptenh(1,
k),pqsenh(1,
k),llflag,icall)
576 pqenh(
i,
k)=min(pqen(
i,
k-1),pqsen(
i,
k-1))
577 . +(pqsenh(
i,
k)-pqsen(
i,
k-1))
578 pqenh(
i,
k)=max(pqenh(
i,
k),0.)
585 1 pgeoh(
i,
klev))/rcpd
592 DO 160
k =
klev-1, 2, -1
594 zzs = max(rcpd*ptenh(
i,
k)+pgeoh(
i,
k),
595 . rcpd*ptenh(
i,
k+1)+pgeoh(
i,
k+1))
596 ptenh(
i,
k) = (zzs-pgeoh(
i,
k))/rcpd
605 ptu(
i,
k) = ptenh(
i,
k)
606 pqu(
i,
k) = pqenh(
i,
k)
617 ptd(
i,
k) = ptenh(
i,
k)
618 pqd(
i,
k) = pqenh(
i,
k)
634 * ptu, pqu, plu, ldcum, kcbot, klab)
653 REAL ptenh(klon,
klev), pqenh(klon,
klev)
654 REAL pgeoh(klon,
klev), paph(klon,
klev+1)
657 INTEGER klab(klon,
klev), kcbot(klon)
659 LOGICAL llflag(klon), ldcum(klon)
660 INTEGER i,
k, icall, is
661 REAL zbuo, zqold(klon)
676 DO 290
k =
klev-1, 2, -1
680 IF (klab(
i,
k+1).EQ.1) is = is + 1
682 IF (klab(
i,
k+1).EQ.1) llflag(
i) = .true.
684 IF (is.EQ.0) goto 290
688 pqu(
i,
k) = pqu(
i,
k+1)
689 ptu(
i,
k) = ptu(
i,
k+1)+(pgeoh(
i,
k+1)-pgeoh(
i,
k))/rcpd
690 zbuo = ptu(
i,
k)*(1.+retv*pqu(
i,
k))-
691 . ptenh(
i,
k)*(1.+retv*pqenh(
i,
k))+0.5
692 IF (zbuo.GT.0.) klab(
i,
k) = 1
698 CALL
flxadjtq(paph(1,
k), ptu(1,
k), pqu(1,
k), llflag, icall)
701 IF (llflag(
i).AND.pqu(
i,
k).NE.zqold(
i))
THEN
703 plu(
i,
k) = plu(
i,
k) + zqold(
i)-pqu(
i,
k)
704 zbuo = ptu(
i,
k)*(1.+retv*pqu(
i,
k))-
705 . ptenh(
i,
k)*(1.+retv*pqenh(
i,
k))+0.5
706 IF (zbuo.GT.0.) kcbot(
i) =
k
707 IF (zbuo.GT.0.) ldcum(
i) = .true.
715 SUBROUTINE flxasc(pdtime, ptenh, pqenh, pten, pqen, pqsen,
716 . pgeo, pgeoh, pap, paph, pqte, pvervel,
717 . ldland, ldcum, ktype, klab, ptu, pqu, plu,
718 . pmfu, pmfub, pentr, pmfus, pmfuq,
719 . pmful, plude, pdmfup, kcbot, kctop, kctop0, kcum,
734 REAL pten(klon,
klev), ptenh(klon,
klev)
735 REAL pqen(klon,
klev), pqenh(klon,
klev), pqsen(klon,
klev)
736 REAL pgeo(klon,
klev), pgeoh(klon,
klev)
737 REAL pap(klon,
klev), paph(klon,
klev+1)
739 REAL pvervel(klon,
klev)
741 REAL pmfub(klon), pentr(klon)
743 REAL plude(klon,
klev)
744 REAL pmfu(klon,
klev), pmfus(klon,
klev)
745 REAL pmfuq(klon,
klev), pmful(klon,
klev)
746 REAL pdmfup(klon,
klev)
747 INTEGER ktype(klon), klab(klon,
klev), kcbot(klon), kctop(klon)
749 LOGICAL ldland(klon), ldcum(klon)
751 REAL pen_u(klon,
klev), pde_u(klon,
klev)
755 INTEGER k,
i, is, icall, kcum
756 REAL ztglace, zdphi, zqeen, zseen, zscde, zqude
757 REAL zmfusk, zmfuqk, zmfulk, zbuo, zdnoprc, zprcon, zlnew
759 REAL zpbot(klon), zptop(klon), zrho(klon)
760 REAL zdprho, zentr, zpmid, zmftest, zmfmax
763 REAL zwmax(klon), zzzmb
775 IF (pvervel(
i,
k).LT.zwmax(
i))
THEN
776 zwmax(
i) = pvervel(
i,
k)
785 IF (.NOT.ldcum(
i)) ktype(
i)=0
797 IF(.NOT.ldcum(
i).OR.ktype(
i).EQ.3) klab(
i,
k)=0
798 IF(.NOT.ldcum(
i).AND.paph(
i,
k).LT.4.e4) kctop0(
i)=
k
805 zdphi=pgeoh(
i,kctop0(
i))-pgeoh(
i,kcbot(
i))
806 IF (ptu(
i,kctop0(
i)).GE.ztglace) zdland(
i)=zdphi
807 zdland(
i)=max(3.0e4,zdland(
i))
808 zdland(
i)=min(5.0e4,zdland(
i))
816 IF (.NOT.ldcum(
i))
THEN
835 DO 480
k =
klev-1,3,-1
837 IF (lmfmid .AND.
k.LT.
klev-1 .AND.
k.GT.
klev/2)
THEN
839 IF (.NOT.ldcum(
i) .AND. klab(
i,
k+1).EQ.0 .AND.
840 . pqen(
i,
k).GT.0.9*pqsen(
i,
k))
THEN
841 ptu(
i,
k+1) = pten(
i,
k) +(pgeo(
i,
k)-pgeoh(
i,
k+1))/rcpd
842 pqu(
i,
k+1) = pqen(
i,
k)
844 zzzmb = max(cmfcmin, -pvervel(
i,
k)/rg)
845 zmfmax = (paph(
i,
k)-paph(
i,
k-1))/(rg*pdtime)
846 pmfub(
i) = min(zzzmb,zmfmax)
847 pmfu(
i,
k+1) = pmfub(
i)
848 pmfus(
i,
k+1) = pmfub(
i)*(rcpd*ptu(
i,
k+1)+pgeoh(
i,
k+1))
849 pmfuq(
i,
k+1) = pmfub(
i)*pqu(
i,
k+1)
862 is = is + klab(
i,
k+1)
863 IF (klab(
i,
k+1) .EQ. 0) klab(
i,
k) = 0
865 IF (klab(
i,
k+1) .GT. 0) llflag(
i) = .true.
867 IF (is .EQ. 0) goto 480
874 zrho(
i)=paph(
i,
k+1)/(rd*ptenh(
i,
k+1))
875 zpbot(
i)=paph(
i,kcbot(
i))
876 zptop(
i)=paph(
i,kctop0(
i))
881 zdprho=(paph(
i,
k+1)-paph(
i,
k))/(rg*zrho(
i))
882 zentr=pentr(
i)*pmfu(
i,
k+1)*zdprho
884 IF(llo1) pde_u(
i,
k)=zentr
885 zpmid=0.5*(zpbot(
i)+zptop(
i))
886 llo2=llo1.AND.ktype(
i).EQ.2.AND.
887 . (zpbot(
i)-paph(
i,
k).LT.0.2e5.OR.
888 . paph(
i,
k).GT.zpmid)
889 IF(llo2) pen_u(
i,
k)=zentr
890 llo2=llo1.AND.(ktype(
i).EQ.1.OR.ktype(
i).EQ.3).AND.
891 . (
k.GE.max(klwmin(
i),kctop0(
i)+2).OR.pap(
i,
k).GT.zpmid)
892 IF(llo2) pen_u(
i,
k)=zentr
893 llo1=pen_u(
i,
k).GT.0..AND.(ktype(
i).EQ.1.OR.ktype(
i).EQ.2)
895 zentr=zentr*(1.+3.*(1.-min(1.,(zpbot(
i)-pap(
i,
k))/1.5e4)))
896 pen_u(
i,
k)=pen_u(
i,
k)*(1.+3.*(1.-min(1.,
897 . (zpbot(
i)-pap(
i,
k))/1.5e4)))
898 pde_u(
i,
k)=pde_u(
i,
k)*(1.+3.*(1.-min(1.,
899 . (zpbot(
i)-pap(
i,
k))/1.5e4)))
901 IF(llo2.AND.pqenh(
i,
k+1).GT.1.e-5)
902 . pen_u(
i,
k)=zentr+max(pqte(
i,
k),0.)/pqenh(
i,
k+1)*
913 IF (
k.LT.kcbot(
i))
THEN
914 zmftest = pmfu(
i,
k+1)+pen_u(
i,
k)-pde_u(
i,
k)
915 zmfmax = min(zmftest,(paph(
i,
k)-paph(
i,
k-1))/(rg*pdtime))
916 pen_u(
i,
k)=max(pen_u(
i,
k)-max(0.0,zmftest-zmfmax),0.0)
918 pde_u(
i,
k)=min(pde_u(
i,
k),0.75*pmfu(
i,
k+1))
920 pmfu(
i,
k)=pmfu(
i,
k+1)+pen_u(
i,
k)-pde_u(
i,
k)
922 zqeen=pqenh(
i,
k+1)*pen_u(
i,
k)
923 zseen=(rcpd*ptenh(
i,
k+1)+pgeoh(
i,
k+1))*pen_u(
i,
k)
924 zscde=(rcpd*ptu(
i,
k+1)+pgeoh(
i,
k+1))*pde_u(
i,
k)
925 zqude=pqu(
i,
k+1)*pde_u(
i,
k)
926 plude(
i,
k)=plu(
i,
k+1)*pde_u(
i,
k)
927 zmfusk=pmfus(
i,
k+1)+zseen-zscde
928 zmfuqk=pmfuq(
i,
k+1)+zqeen-zqude
929 zmfulk=pmful(
i,
k+1) -plude(
i,
k)
930 plu(
i,
k)=zmfulk*(1./max(cmfcmin,pmfu(
i,
k)))
931 pqu(
i,
k)=zmfuqk*(1./max(cmfcmin,pmfu(
i,
k)))
932 ptu(
i,
k)=(zmfusk*(1./max(cmfcmin,pmfu(
i,
k)))-
934 ptu(
i,
k)=max(100.,ptu(
i,
k))
935 ptu(
i,
k)=min(400.,ptu(
i,
k))
947 CALL
flxadjtq(paph(1,
k), ptu(1,
k), pqu(1,
k), llflag, icall)
950 IF(llflag(
i).AND.pqu(
i,
k).NE.zqold(
i))
THEN
952 plu(
i,
k) = plu(
i,
k)+zqold(
i)-pqu(
i,
k)
953 zbuo = ptu(
i,
k)*(1.+retv*pqu(
i,
k))-
954 . ptenh(
i,
k)*(1.+retv*pqenh(
i,
k))
955 IF (klab(
i,
k+1).EQ.1) zbuo=zbuo+0.5
956 IF (zbuo.GT.0..AND.pmfu(
i,
k).GE.0.1*pmfub(
i))
THEN
960 IF (ldland(
i)) zdnoprc = zdland(
i)
962 IF ((zpbot(
i)-paph(
i,
k)).LT.zdnoprc) zprcon = 0.0
963 zlnew=plu(
i,
k)/(1.+zprcon*(pgeoh(
i,
k)-pgeoh(
i,
k+1)))
964 pdmfup(
i,
k)=max(0.,(plu(
i,
k)-zlnew)*pmfu(
i,
k))
974 pmful(
i,
k)=plu(
i,
k)*pmfu(
i,
k)
975 pmfus(
i,
k)=(rcpd*ptu(
i,
k)+pgeoh(
i,
k))*pmfu(
i,
k)
976 pmfuq(
i,
k)=pqu(
i,
k)*pmfu(
i,
k)
989 kcbot(
i) = max(kcbot(
i),kctop(
i))
996 if (ldcum(
i)) is = is + 1
999 IF (is.EQ.0) goto 800
1004 pde_u(
i,
k)=(1.-cmfctop)*pmfu(
i,
k+1)
1005 plude(
i,
k)=pde_u(
i,
k)*plu(
i,
k+1)
1006 pmfu(
i,
k)=pmfu(
i,
k+1)-pde_u(
i,
k)
1008 pdmfup(
i,
k)=max(0.,(plu(
i,
k)-zlnew)*pmfu(
i,
k))
1010 pmfus(
i,
k)=(rcpd*ptu(
i,
k)+pgeoh(
i,
k))*pmfu(
i,
k)
1011 pmfuq(
i,
k)=pqu(
i,
k)*pmfu(
i,
k)
1012 pmful(
i,
k)=plu(
i,
k)*pmfu(
i,
k)
1013 plude(
i,
k-1)=pmful(
i,
k)
1020 SUBROUTINE flxflux(pdtime, pqen, pqsen, ptenh, pqenh, pap
1021 . , paph, ldland, pgeoh, kcbot, kctop, lddraf, kdtop
1022 . , ktype, ldcum, pmfu, pmfd, pmfus, pmfds
1023 . , pmfuq, pmfdq, pmful, plude, pdmfup, pdmfdp
1024 . , pten, prfl, psfl, pdpmel, ktopm2
1036 #include "YOECUMF.h"
1038 REAL cevapcu(klon,
klev)
1040 REAL pqen(klon,
klev), pqenh(klon,
klev), pqsen(klon,
klev)
1041 REAL pten(klon,
klev), ptenh(klon,
klev)
1042 REAL paph(klon,
klev+1), pgeoh(klon,
klev)
1045 REAL ztmsmlt, zdelta,
zqsat
1047 REAL pmfu(klon,
klev), pmfus(klon,
klev)
1048 REAL pmfd(klon,
klev), pmfds(klon,
klev)
1049 REAL pmfuq(klon,
klev), pmful(klon,
klev)
1050 REAL pmfdq(klon,
klev)
1051 REAL plude(klon,
klev)
1052 REAL pdmfup(klon,
klev), pdpmel(klon,
klev)
1055 REAL pdmfdp(klon,
klev), maxpdmfdp(klon,
klev)
1056 REAL prfl(klon), psfl(klon)
1057 REAL pmflxr(klon,
klev+1), pmflxs(klon,
klev+1)
1058 INTEGER kcbot(klon), kctop(klon), ktype(klon)
1059 LOGICAL ldland(klon), ldcum(klon)
1061 REAL zcons1, zcons2, zcucov, ztmelp2
1062 REAL pdtime, zdp, zzp, zfac, zsnmlt, zrfl, zrnew
1063 REAL zrmin, zrfln, zdrfl
1064 REAL zpds, zpdr, zdenom
1065 INTEGER ktopm2, itop, ikb
1067 LOGICAL lddraf(klon)
1074 cevapcu(
i,
k)=1.93e-6*261.*sqrt(1.e3/(38.3*0.293)
1075 1 *sqrt(0.5*(paph(
i,
k)+paph(
i,
k+1))/paph(
i,
klev+1)) ) * 0.5/rg
1081 zcons1 = rcpd/(rlmlt*rg*pdtime)
1082 zcons2 = 1./(rg*pdtime)
1090 itop=min(itop,kctop(
i))
1091 IF (.NOT.ldcum(
i) .OR. kdtop(
i).LT.kctop(
i)) lddraf(
i)=.
false.
1092 IF(.NOT.ldcum(
i)) ktype(
i)=0
1096 DO 120
k=ktopm2,
klev
1098 IF(ldcum(
i).AND.
k.GE.kctop(
i)-1)
THEN
1099 pmfus(
i,
k)=pmfus(
i,
k)-pmfu(
i,
k)*
1100 . (rcpd*ptenh(
i,
k)+pgeoh(
i,
k))
1101 pmfuq(
i,
k)=pmfuq(
i,
k)-pmfu(
i,
k)*pqenh(
i,
k)
1103 IF ( ldland(
i) ) zdp = 3.e4
1109 IF(paph(
i,kcbot(
i))-paph(
i,kctop(
i)).GE.zdp.AND.
1110 . pqen(
i,
k-1).GT.0.8*pqsen(
i,
k-1))
1111 . pdmfup(
i,
k-1)=pdmfup(
i,
k-1)+plude(
i,
k-1)
1113 IF(lddraf(
i).AND.
k.GE.kdtop(
i))
THEN
1114 pmfds(
i,
k)=pmfds(
i,
k)-pmfd(
i,
k)*
1115 . (rcpd*ptenh(
i,
k)+pgeoh(
i,
k))
1116 pmfdq(
i,
k)=pmfdq(
i,
k)-pmfd(
i,
k)*pqenh(
i,
k)
1138 DO 130
k=ktopm2,
klev
1140 IF(ldcum(
i).AND.
k.GT.kcbot(
i))
THEN
1142 zzp=((paph(
i,
klev+1)-paph(
i,
k))/
1143 . (paph(
i,
klev+1)-paph(
i,ikb)))
1144 IF (ktype(
i).EQ.3) zzp = zzp**2
1145 pmfu(
i,
k)=pmfu(
i,ikb)*zzp
1146 pmfus(
i,
k)=pmfus(
i,ikb)*zzp
1147 pmfuq(
i,
k)=pmfuq(
i,ikb)*zzp
1148 pmful(
i,
k)=pmful(
i,ikb)*zzp
1166 IF (pmflxs(
i,
k).GT.0.0 .AND. pten(
i,
k).GT.ztmelp2)
THEN
1167 zfac=zcons1*(paph(
i,
k+1)-paph(
i,
k))
1168 zsnmlt=min(pmflxs(
i,
k),zfac*(pten(
i,
k)-ztmelp2))
1170 ztmsmlt=pten(
i,
k)-zsnmlt/zfac
1171 zdelta=max(0.,sign(1.,rtt-ztmsmlt))
1172 zqsat=r2es*foeew(ztmsmlt, zdelta) / pap(
i,
k)
1177 IF (pten(
i,
k).GT.rtt)
THEN
1178 pmflxr(
i,
k+1)=pmflxr(
i,
k)+pdmfup(
i,
k)+pdmfdp(
i,
k)+pdpmel(
i,
k)
1179 pmflxs(
i,
k+1)=pmflxs(
i,
k)-pdpmel(
i,
k)
1181 pmflxs(
i,
k+1)=pmflxs(
i,
k)+pdmfup(
i,
k)+pdmfdp(
i,
k)
1182 pmflxr(
i,
k+1)=pmflxr(
i,
k)
1186 IF ((pmflxr(
i,
k+1)+pmflxs(
i,
k+1)).LT.0.0)
THEN
1187 pdmfdp(
i,
k) = -pmflxr(
i,
k)-pmflxs(
i,
k)-pdmfup(
i,
k)
1212 maxpdmfdp(
i,
k)=maxpdmfdp(
i,
k)+pdmfdp(
i,kp)
1220 IF (ldcum(
i) .AND.
k.GE.kcbot(
i))
THEN
1221 zrfl = pmflxr(
i,
k) + pmflxs(
i,
k)
1222 IF (zrfl.GT.1.0e-20)
THEN
1223 zrnew=(max(0.,sqrt(zrfl/zcucov)-
1224 . cevapcu(
i,
k)*(paph(
i,
k+1)-paph(
i,
k))*
1225 . max(0.,pqsen(
i,
k)-pqen(
i,
k))))**2*zcucov
1226 zrmin=zrfl-zcucov*max(0.,0.8*pqsen(
i,
k)-pqen(
i,
k))
1227 . *zcons2*(paph(
i,
k+1)-paph(
i,
k))
1228 zrnew=max(zrnew,zrmin)
1230 zdrfl=min(0.,zrfln-zrfl)
1235 . min(-pmflxr(
i,
k)-pmflxs(
i,
k)-maxpdmfdp(
i,
k),0.0))
1238 zdenom=1.0/max(1.0e-20,pmflxr(
i,
k)+pmflxs(
i,
k))
1239 IF (pten(
i,
k).GT.rtt)
THEN
1246 pmflxr(
i,
k+1) = pmflxr(
i,
k) + zpdr + pdpmel(
i,
k)
1247 . + zdrfl*pmflxr(
i,
k)*zdenom
1248 pmflxs(
i,
k+1) = pmflxs(
i,
k) + zpds - pdpmel(
i,
k)
1249 . + zdrfl*pmflxs(
i,
k)*zdenom
1250 pdmfup(
i,
k) = pdmfup(
i,
k) + zdrfl
1257 if (pmflxr(
i,
k) + pmflxs(
i,
k).lt.-1.e-26)
1258 .
write(*,*)
'precip. < 1e-16 ',pmflxr(
i,
k) + pmflxs(
i,
k)
1264 prfl(
i) = pmflxr(
i,
klev+1)
1265 psfl(
i) = pmflxs(
i,
klev+1)
1270 SUBROUTINE flxdtdq(pdtime, ktopm2, paph, ldcum, pten
1271 . , pmfus, pmfds, pmfuq, pmfdq, pmful, pdmfup, pdmfdp
1272 . , pdpmel, dt_con, dq_con)
1282 #include "YOECUMF.h"
1286 REAL pten(klon,
klev), paph(klon,
klev+1)
1287 REAL pmfus(klon,
klev), pmfuq(klon,
klev), pmful(klon,
klev)
1288 REAL pmfds(klon,
klev), pmfdq(klon,
klev)
1289 REAL pdmfup(klon,
klev)
1290 REAL pdmfdp(klon,
klev)
1291 REAL pdpmel(klon,
klev)
1293 REAL dt_con(klon,
klev), dq_con(klon,
klev)
1299 REAL zalv, zdtdt, zdqdt
1301 DO 210
k=ktopm2,
klev-1
1304 llo1 = (pten(
i,
k)-rtt).GT.0.
1306 IF (llo1) zalv = rlvtt
1307 zdtdt=rg/(paph(
i,
k+1)-paph(
i,
k))/rcpd
1308 . *(pmfus(
i,
k+1)-pmfus(
i,
k)
1309 . +pmfds(
i,
k+1)-pmfds(
i,
k)
1310 . -rlmlt*pdpmel(
i,
k)
1311 . -zalv*(pmful(
i,
k+1)-pmful(
i,
k)-pdmfup(
i,
k)-pdmfdp(
i,
k))
1314 zdqdt=rg/(paph(
i,
k+1)-paph(
i,
k))
1315 . *(pmfuq(
i,
k+1)-pmfuq(
i,
k)
1316 . +pmfdq(
i,
k+1)-pmfdq(
i,
k)
1317 . +pmful(
i,
k+1)-pmful(
i,
k)-pdmfup(
i,
k)-pdmfdp(
i,
k))
1326 llo1 = (pten(
i,
k)-rtt).GT.0.
1328 IF (llo1) zalv = rlvtt
1329 zdtdt=-rg/(paph(
i,
k+1)-paph(
i,
k))/rcpd
1330 . *(pmfus(
i,
k)+pmfds(
i,
k)+rlmlt*pdpmel(
i,
k)
1331 . -zalv*(pmful(
i,
k)+pdmfup(
i,
k)+pdmfdp(
i,
k)))
1333 zdqdt=-rg/(paph(
i,
k+1)-paph(
i,
k))
1334 . *(pmfuq(
i,
k)+pmfdq(
i,
k)+pmful(
i,
k)
1335 . +pdmfup(
i,
k)+pdmfdp(
i,
k))
1342 SUBROUTINE flxdlfs(ptenh, pqenh, pgeoh, paph, ptu, pqu,
1343 . ldcum, kcbot, kctop, pmfub, prfl, ptd, pqd,
1344 . pmfd, pmfds, pmfdq, pdmfdp, kdtop, lddraf)
1367 #include "YOECUMF.h"
1369 REAL ptenh(klon,
klev)
1370 REAL pqenh(klon,
klev)
1371 REAL pgeoh(klon,
klev), paph(klon,
klev+1)
1372 REAL ptu(klon,
klev), pqu(klon,
klev)
1376 REAL ptd(klon,
klev), pqd(klon,
klev)
1377 REAL pmfd(klon,
klev), pmfds(klon,
klev), pmfdq(klon,
klev)
1378 REAL pdmfdp(klon,
klev)
1379 INTEGER kcbot(klon), kctop(klon), kdtop(klon)
1380 LOGICAL ldcum(klon), lddraf(klon)
1382 REAL ztenwb(klon,
klev), zqenwb(klon,
klev), zcond(klon)
1383 REAL zttest, zqtest, zbuo, zmftop
1385 INTEGER i,
k, is, icall
1407 DO 290
k = 3,
klev-3
1411 ztenwb(
i,
k)=ptenh(
i,
k)
1412 zqenwb(
i,
k)=pqenh(
i,
k)
1413 llo2(
i) = ldcum(
i).AND.prfl(
i).GT.0.
1414 . .AND..NOT.lddraf(
i)
1415 . .AND.(
k.LT.kcbot(
i).AND.
k.GT.kctop(
i))
1416 IF ( llo2(
i) ) is = is + 1
1418 IF(is.EQ.0) go to 290
1421 CALL
flxadjtq(paph(1,
k), ztenwb(1,
k), zqenwb(1,
k), llo2, icall)
1430 zttest=0.5*(ptu(
i,
k)+ztenwb(
i,
k))
1431 zqtest=0.5*(pqu(
i,
k)+zqenwb(
i,
k))
1432 zbuo=zttest*(1.+retv*zqtest)-
1433 . ptenh(
i,
k)*(1.+retv *pqenh(
i,
k))
1434 zcond(
i)=pqenh(
i,
k)-zqenwb(
i,
k)
1435 zmftop=-cmfdeps*pmfub(
i)
1436 IF (zbuo.LT.0..AND.prfl(
i).GT.10.*zmftop*zcond(
i))
THEN
1442 pmfds(
i,
k)=pmfd(
i,
k)*(rcpd*ptd(
i,
k)+pgeoh(
i,
k))
1443 pmfdq(
i,
k)=pmfd(
i,
k)*pqd(
i,
k)
1444 pdmfdp(
i,
k-1)=-0.5*pmfd(
i,
k)*zcond(
i)
1445 prfl(
i)=prfl(
i)+pdmfdp(
i,
k-1)
1455 . ptd, pqd, pmfd, pmfds, pmfdq, pdmfdp,
1456 . lddraf, pen_d, pde_d)
1479 #include "YOECUMF.h"
1481 REAL ptenh(klon,
klev), pqenh(klon,
klev)
1482 REAL pgeoh(klon,
klev), paph(klon,
klev+1)
1484 REAL ptd(klon,
klev), pqd(klon,
klev)
1485 REAL pmfd(klon,
klev), pmfds(klon,
klev), pmfdq(klon,
klev)
1486 REAL pdmfdp(klon,
klev)
1488 LOGICAL lddraf(klon)
1490 REAL pen_d(klon,
klev), pde_d(klon,
klev), zcond(klon)
1491 LOGICAL llo2(klon), llo1
1492 INTEGER i,
k, is, icall, itopde
1493 REAL zentr, zseen, zqeen, zsdde, zqdde, zmfdsk, zmfdqk, zdmfdp
1508 llo2(
i)=lddraf(
i).AND.pmfd(
i,
k-1).LT.0.
1509 IF (llo2(
i)) is = is + 1
1511 IF (is.EQ.0) goto 180
1515 zentr = entrdd*pmfd(
i,
k-1)*rd*ptenh(
i,
k-1)/
1516 . (rg*paph(
i,
k-1))*(paph(
i,
k)-paph(
i,
k-1))
1523 IF (
k.GT.itopde)
THEN
1527 pde_d(
i,
k)=pmfd(
i,itopde)*
1528 . (paph(
i,
k)-paph(
i,
k-1))/(paph(
i,
klev+1)-paph(
i,itopde))
1535 pmfd(
i,
k) = pmfd(
i,
k-1)+pen_d(
i,
k)-pde_d(
i,
k)
1536 zseen = (rcpd*ptenh(
i,
k-1)+pgeoh(
i,
k-1))*pen_d(
i,
k)
1537 zqeen = pqenh(
i,
k-1)*pen_d(
i,
k)
1538 zsdde = (rcpd*ptd(
i,
k-1)+pgeoh(
i,
k-1))*pde_d(
i,
k)
1539 zqdde = pqd(
i,
k-1)*pde_d(
i,
k)
1540 zmfdsk = pmfds(
i,
k-1)+zseen-zsdde
1541 zmfdqk = pmfdq(
i,
k-1)+zqeen-zqdde
1542 pqd(
i,
k) = zmfdqk*(1./min(-cmfcmin,pmfd(
i,
k)))
1543 ptd(
i,
k) = (zmfdsk*(1./min(-cmfcmin,pmfd(
i,
k)))-
1545 ptd(
i,
k) = min(400.,ptd(
i,
k))
1546 ptd(
i,
k) = max(100.,ptd(
i,
k))
1552 CALL
flxadjtq(paph(1,
k), ptd(1,
k), pqd(1,
k), llo2, icall)
1556 zcond(
i) = zcond(
i)-pqd(
i,
k)
1557 zbuo = ptd(
i,
k)*(1.+retv *pqd(
i,
k))-
1558 . ptenh(
i,
k)*(1.+retv *pqenh(
i,
k))
1559 llo1 = zbuo.LT.0..AND.(prfl(
i)-pmfd(
i,
k)*zcond(
i).GT.0.)
1560 IF (.not.llo1) pmfd(
i,
k) = 0.0
1561 pmfds(
i,
k) = (rcpd*ptd(
i,
k)+pgeoh(
i,
k))*pmfd(
i,
k)
1562 pmfdq(
i,
k) = pqd(
i,
k)*pmfd(
i,
k)
1563 zdmfdp = -pmfd(
i,
k)*zcond(
i)
1564 pdmfdp(
i,
k-1) = zdmfdp
1565 prfl(
i) = prfl(
i)+zdmfdp
1587 REAL pt(klon), pq(klon), pp(klon)
1588 LOGICAL ldflag(klon)
1591 REAL zcond(klon), zcond1
1592 REAL z5alvcp, z5alscp, zalvdcp, zalsdcp
1593 REAL zdelta, zcvm5, zldcp,
zqsat, zcor
1598 z5alvcp = r5les*rlvtt/rcpd
1599 z5alscp = r5ies*rlstt/rcpd
1600 zalvdcp = rlvtt/rcpd
1601 zalsdcp = rlstt/rcpd
1610 zdelta = max(0.,sign(1.,rtt-pt(
i)))
1611 zcvm5 = z5alvcp*(1.-zdelta) + zdelta*z5alscp
1612 zldcp = zalvdcp*(1.-zdelta) + zdelta*zalsdcp
1613 zqsat = r2es*foeew(pt(
i),zdelta) / pp(
i)
1615 zcor = 1./(1.-retv*
zqsat)
1618 . / (1. + foede(pt(
i), zdelta, zcvm5,
zqsat, zcor))
1619 IF (kcall.EQ.1) zcond(
i) = max(zcond(
i),0.)
1620 IF (kcall.EQ.2) zcond(
i) = min(zcond(
i),0.)
1621 pt(
i) = pt(
i) + zldcp*zcond(
i)
1622 pq(
i) = pq(
i) - zcond(
i)
1628 IF (zcond(
i).NE.0.) is = is + 1
1630 IF (is.EQ.0) goto 230
1633 IF(ldflag(
i).AND.zcond(
i).NE.0.)
THEN
1634 zdelta = max(0.,sign(1.,rtt-pt(
i)))
1635 zcvm5 = z5alvcp*(1.-zdelta) + zdelta*z5alscp
1636 zldcp = zalvdcp*(1.-zdelta) + zdelta*zalsdcp
1637 zqsat = r2es* foeew(pt(
i),zdelta) / pp(
i)
1639 zcor = 1./(1.-retv*
zqsat)
1642 . / (1. + foede(pt(
i),zdelta,zcvm5,
zqsat,zcor))
1643 pt(
i) = pt(
i) + zldcp*zcond1
1644 pq(
i) = pq(
i) - zcond1
1656 #include "YOECUMF.h"