261 integer,
intent(in):: its,ite,kts,kte
262 integer,
intent(in),
optional :: microphysics_debug
263 integer,
intent(in),
optional :: diag_i_dbg
264 integer,
intent(in),
optional :: diag_j_dbg
265 integer,
intent(in),
optional :: diag_k_raw_base
267 real(kind=kind_phys),
intent(in),
dimension(its:,:):: &
271 real(kind=kind_phys),
intent(in):: &
292 real(kind=kind_phys),
intent(inout),
dimension(its:,:):: &
294 real(kind=kind_phys),
intent(inout),
dimension(its:,:):: &
301 real(kind=kind_phys),
intent(inout),
dimension(its:):: &
306 real(kind=kind_phys),
intent(inout),
dimension(its:),
optional:: &
310 real(kind=kind_phys),
intent(inout),
dimension(its:),
optional:: &
314 real(kind=kind_phys),
intent(inout),
dimension(its:,:),
optional:: &
320 real(kind=kind_phys),
intent(inout),
dimension(its:),
optional:: &
325 character(len=*),
intent(out):: errmsg
326 integer,
intent(out):: errflg
329 real(kind=kind_phys),
dimension(its:ite,kts:kte,3):: &
340 real(kind=kind_phys),
dimension(its:ite,kts:kte):: &
347 real(kind=kind_phys),
dimension(its:ite,kts:kte):: &
350 real(kind=kind_phys),
dimension(its:ite,kts:kte):: &
382 real(kind=kind_phys),
dimension(its:ite,kts:kte):: &
394 real(kind=kind_phys),
dimension(its:ite):: &
399 real(kind=kind_phys),
dimension(its:ite):: &
402 integer,
dimension(its:ite):: &
405 logical,
dimension(its:ite):: flgcld
406 real(kind=kind_phys):: &
407 cpmcal, xlcal, diffus, &
408 viscos, xka, venfac, conden, diffac, &
409 x, y, z, a, b, c, d, e, &
410 qdt, holdrr, holdrs, holdrg, supcol, supcolt, pvt, &
411 coeres, supsat, dtcld, xmi, eacrs, satdt, &
412 qimax, diameter, xni0, roqi0, &
413 fallsum, fallsum_qsi, fallsum_qg, &
414 vt2i,vt2r,vt2s,vt2g,acrfac,egs,egi, &
415 xlwork2, factor, source,
value, &
416 xlf, pfrzdtc, pfrzdtr, supice, alpha2, delta2, delta3
417 real(kind=kind_phys):: vt2ave
418 real(kind=kind_phys):: holdc, holdci
419 integer:: i, j, k, mstepmax, &
420 iprt, latd, lond, loop, loops, ifsat, n, idim, kdim, idbg_col
421 integer :: mpdbg_level
422 integer :: i_dbg_local
423 integer :: j_dbg_local
424 integer :: k_raw_base_local
427 real(kind=kind_phys):: dldti, xb, xai, tr, xbi, xa, hvap, cvap, hsub, dldt, ttp
430 real(kind=kind_phys),
dimension(its:ite):: dvec1,tvec1
431 real(kind=kind_phys):: temp
437 cpmcal(x) = cpd*(1.-max(x,qmin))+max(x,qmin)*cpv
438 xlcal(x) = xlv0-xlv1*(x-t0c)
444 diffus(x,y) = 8.794e-5 * exp(log(x)*(1.81)) / y
445 viscos(x,y) = 1.496e-6 * (x*sqrt(x)) /(x+120.)/y
446 xka(x,y) = 1.414e3*viscos(x,y)*y
447 diffac(a,b,c,d,e) = d*a*a/(xka(c,d)*rv*c*c)+1./(e*diffus(c,b))
448 venfac(a,b,c) = exp(log((viscos(b,c)/diffus(b,a)))*((.3333333))) &
449 /sqrt(viscos(b,c))*sqrt(sqrt(den0/c))
450 conden(a,b,c,d,e) = (max(b,qmin)-c)/(1.+d*d/(rv*e)*c/(a*a))
456 if (
present(microphysics_debug)) mpdbg_level = microphysics_debug
458 if (
present(diag_i_dbg)) i_dbg_local = max(its, min(ite, diag_i_dbg))
460 if (
present(diag_j_dbg)) j_dbg_local = diag_j_dbg
462 if (
present(diag_k_raw_base)) k_raw_base_local = diag_k_raw_base
469 qc(i,k) = max(qc(i,k),0.0)
470 qr(i,k) = max(qr(i,k),0.0)
471 qi(i,k) = max(qi(i,k),0.0)
472 qs(i,k) = max(qs(i,k),0.0)
473 qg(i,k) = max(qg(i,k),0.0)
483 cpm(i,k) = cpmcal(q(i,k))
484 xl(i,k) = xlcal(t(i,k))
489 delz_tmp(i,k) = delz(i,k)
490 den_tmp(i,k) = den(i,k)
499 if(
present(snowncv) .and.
present(snow)) snowncv(i) = 0.
500 if(
present(graupelncv) .and.
present(graupel)) graupelncv(i) = 0.
510 loops = max(nint(delt/dtcldcr),1)
512 if(delt.le.dtcldcr) dtcld = delt
533 call vrec(tvec1,dvec1,ite-its+1)
535 tvec1(i) = tvec1(i)*den0
537 call vsqrt(dvec1,tvec1,ite-its+1)
539 denfac(i,k) = dvec1(i)
555 xbi=xai+hsub/(rv*ttp)
559 qsat(i,k,1)=psat*exp(log(tr)*(xa))*exp(xb*(1.-tr))
560 qsat(i,k,1) = min(qsat(i,k,1),0.99*p(i,k))
561 qsat(i,k,1) = ep2 * qsat(i,k,1) / (p(i,k) - qsat(i,k,1))
562 qsat(i,k,1) = max(qsat(i,k,1),qmin)
563 rh(i,k,1) = max(q(i,k) / qsat(i,k,1),qmin)
565 if(t(i,k).lt.ttp)
then
566 qsat(i,k,2)=psat*exp(log(tr)*(xai))*exp(xbi*(1.-tr))
568 qsat(i,k,2)=psat*exp(log(tr)*(xa))*exp(xb*(1.-tr))
570 qsat(i,k,2) = min(qsat(i,k,2),0.99*p(i,k))
571 qsat(i,k,2) = ep2 * qsat(i,k,2) / (p(i,k) - qsat(i,k,2))
572 qsat(i,k,2) = max(qsat(i,k,2),qmin)
573 rh(i,k,2) = max(q(i,k) / qsat(i,k,2),qmin)
634 temp = (den(i,k)*max(qi(i,k),qmin))
635 temp = sqrt(sqrt(temp*temp*temp))
636 xni(i,k) = min(max(5.38e7*temp,1.e3),1.e6)
650 qrs_tmp(i,k,1) = qr(i,k)
651 qrs_tmp(i,k,2) = qs(i,k)
652 qrs_tmp(i,k,3) = qg(i,k)
655 call slope_wsm6(qrs_tmp,den_tmp,denfac,t,rslope,rslopeb,rslope2,rslope3, &
656 work1,its,ite,kts,kte)
660 workr(i,k) = work1(i,k,1)
661 qsum(i,k) = max( (qs(i,k)+qg(i,k)), 1.e-15)
662 if( qsum(i,k) .gt. 1.e-15 )
then
663 worka(i,k) = (work1(i,k,2)*qs(i,k) + work1(i,k,3)*qg(i,k)) &
668 denqrs1(i,k) = den(i,k)*qr(i,k)
669 denqrs2(i,k) = den(i,k)*qs(i,k)
670 denqrs3(i,k) = den(i,k)*qg(i,k)
671 if(qr(i,k).le.0.0) workr(i,k) = 0.0
674 call nislfv_rain_plm(idim,kdim,den_tmp,denfac,t,delz_tmp,workr,denqrs1, &
676 call nislfv_rain_plm6(idim,kdim,den_tmp,denfac,t,delz_tmp,worka, &
677 denqrs2,denqrs3,delqrs2,delqrs3,dtcld,1,1)
680 qr(i,k) = max(denqrs1(i,k)/den(i,k),0.)
681 qs(i,k) = max(denqrs2(i,k)/den(i,k),0.)
682 qg(i,k) = max(denqrs3(i,k)/den(i,k),0.)
683 fall(i,k,1) = denqrs1(i,k)*workr(i,k)/delz(i,k)
684 fall(i,k,2) = denqrs2(i,k)*worka(i,k)/delz(i,k)
685 fall(i,k,3) = denqrs3(i,k)*worka(i,k)/delz(i,k)
689 fall(i,1,1) = delqrs1(i)/delz(i,1)/dtcld
690 fall(i,1,2) = delqrs2(i)/delz(i,1)/dtcld
691 fall(i,1,3) = delqrs3(i)/delz(i,1)/dtcld
699 qrs_tmp(i,k,1) = qr(i,k)
700 qrs_tmp(i,k,2) = qs(i,k)
701 qrs_tmp(i,k,3) = qg(i,k)
704 call slope_wsm6(qrs_tmp,den_tmp,denfac,t,rslope,rslopeb,rslope2,rslope3, &
705 work1,its,ite,kts,kte)
714 n0sfac(i,k) = max(min(exp(alpha*supcol),n0smax/n0s),1.)
715 if(t(i,k).gt.t0c)
then
721 work2(i,k) = venfac(p(i,k),t(i,k),den(i,k))
722 if(qs(i,k).gt.0.)
then
723 coeres = rslope2(i,k,2)*sqrt(rslope(i,k,2)*rslopeb(i,k,2))
724 psmlt(i,k) = xka(t(i,k),den(i,k))/xlf*(t0c-t(i,k))*pi/2. &
725 *n0sfac(i,k)*(precs1*rslope2(i,k,2) &
726 +precs2*work2(i,k)*coeres)/den(i,k)
727 psmlt(i,k) = min(max(psmlt(i,k)*dtcld/mstep(i), &
728 -qs(i,k)/mstep(i)),0.)
729 qs(i,k) = qs(i,k) + psmlt(i,k)
730 qr(i,k) = qr(i,k) - psmlt(i,k)
731 t(i,k) = t(i,k) + xlf/cpm(i,k)*psmlt(i,k)
737 if(qg(i,k).gt.0.)
then
738 coeres = rslope2(i,k,3)*sqrt(rslope(i,k,3)*rslopeb(i,k,3))
739 pgmlt(i,k) = xka(t(i,k),den(i,k))/xlf &
740 *(t0c-t(i,k))*(precg1*rslope2(i,k,3) &
741 +precg2*work2(i,k)*coeres)/den(i,k)
742 pgmlt(i,k) = min(max(pgmlt(i,k)*dtcld/mstep(i), &
743 -qg(i,k)/mstep(i)),0.)
744 qg(i,k) = qg(i,k) + pgmlt(i,k)
745 qr(i,k) = qr(i,k) - pgmlt(i,k)
746 t(i,k) = t(i,k) + xlf/cpm(i,k)*pgmlt(i,k)
760 if(qi(i,k).le.0.)
then
763 xmi = den(i,k)*qi(i,k)/xni(i,k)
764 diameter = max(min(dicon * sqrt(xmi),dimax), 1.e-25)
765 work1c(i,k) = 1.49e4*exp(log(diameter)*(1.31))
774 denqci(i,k) = den(i,k)*qi(i,k)
777 call nislfv_rain_plm(idim,kdim,den_tmp,denfac,t,delz_tmp,work1c,denqci, &
781 qi(i,k) = max(denqci(i,k)/den(i,k),0.)
785 fallc(i,1) = delqi(i)/delz(i,1)/dtcld
796 fallsum = fall(i,kts,1)+fall(i,kts,2)+fall(i,kts,3)+fallc(i,kts)
797 fallsum_qsi = fall(i,kts,2)+fallc(i,kts)
798 fallsum_qg = fall(i,kts,3)
799 if(fallsum.gt.0.)
then
800 rainncv(i) = fallsum*delz(i,kts)/denr*dtcld*1000. + rainncv(i)
801 rain(i) = fallsum*delz(i,kts)/denr*dtcld*1000. + rain(i)
803 if(fallsum_qsi.gt.0.)
then
804 tstepsnow(i) = fallsum_qsi*delz(i,kts)/denr*dtcld*1000. &
806 if(
present(snowncv) .and.
present(snow))
then
807 snowncv(i) = fallsum_qsi*delz(i,kts)/denr*dtcld*1000. &
809 snow(i) = fallsum_qsi*delz(i,kts)/denr*dtcld*1000. + snow(i)
812 if(fallsum_qg.gt.0.)
then
813 tstepgraup(i) = fallsum_qg*delz(i,kts)/denr*dtcld*1000. &
815 if(
present (graupelncv) .and.
present (graupel))
then
816 graupelncv(i) = fallsum_qg*delz(i,kts)/denr*dtcld*1000. &
818 graupel(i) = fallsum_qg*delz(i,kts)/denr*dtcld*1000. + graupel(i)
821 if(
present(rainonly))
then
822 rainonly(i) = fall(i,kts,1)*delz(i,kts)/denr*dtcld*1000. + rainonly(i)
824 if(
present(snowonly))
then
825 snowonly(i) = fall(i,kts,2)*delz(i,kts)/denr*dtcld*1000. + snowonly(i)
827 if(
present (snowncv))
then
828 if(fallsum.gt.0.)sr(i)=(snowncv(i) + graupelncv(i))/(rainncv(i)+1.e-12)
830 if(fallsum.gt.0.)sr(i)=(tstepsnow(i) + tstepgraup(i))/(rainncv(i)+1.e-12)
850 if(supcol.lt.0.) xlf = xlf0
851 if(supcol.lt.0.and.qi(i,k).gt.0.)
then
853 qc(i,k) = qc(i,k) + qi(i,k)
854 t(i,k) = t(i,k) - xlf/cpm(i,k)*qi(i,k)
861 if(supcol.gt.40..and.qc(i,k).gt.0.)
then
863 qi(i,k) = qi(i,k) + qc(i,k)
864 t(i,k) = t(i,k) + xlf/cpm(i,k)*qc(i,k)
871 if(supcol.gt.0..and.qc(i,k).gt.qmin)
then
874 supcolt=min(supcol,50.)
875 pfrzdtc = min(pfrz1*(exp(pfrz2*supcolt)-1.) &
876 * den(i,k)/denr/xncr*qc(i,k)*qc(i,k)*dtcld,qc(i,k))
878 qi(i,k) = qi(i,k) + pfrzdtc
879 t(i,k) = t(i,k) + xlf/cpm(i,k)*pfrzdtc
880 qc(i,k) = qc(i,k)-pfrzdtc
886 if(supcol.gt.0..and.qr(i,k).gt.0.)
then
890 temp = rslope3(i,k,1)
891 temp = temp*temp*rslope(i,k,1)
892 supcolt=min(supcol,50.)
893 pfrzdtr = min(20.*(pi*pi)*pfrz1*n0r*denr/den(i,k) &
894 *(exp(pfrz2*supcolt)-1.)*temp*dtcld, &
897 qg(i,k) = qg(i,k) + pfrzdtr
898 t(i,k) = t(i,k) + xlf/cpm(i,k)*pfrzdtr
899 qr(i,k) = qr(i,k)-pfrzdtr
914 qrs_tmp(i,k,1) = qr(i,k)
915 qrs_tmp(i,k,2) = qs(i,k)
916 qrs_tmp(i,k,3) = qg(i,k)
919 call slope_wsm6(qrs_tmp,den_tmp,denfac,t,rslope,rslopeb,rslope2,rslope3, &
920 work1,its,ite,kts,kte)
933 work1(i,k,1) = diffac(xl(i,k),p(i,k),t(i,k),den(i,k),qsat(i,k,1))
934 work1(i,k,2) = diffac(xls,p(i,k),t(i,k),den(i,k),qsat(i,k,2))
935 work2(i,k) = venfac(p(i,k),t(i,k),den(i,k))
949 supsat = max(q(i,k),qmin)-qsat(i,k,1)
955 if(qc(i,k).gt.qc0)
then
956 praut(i,k) = qck1*qc(i,k)**(7./3.)
957 praut(i,k) = min(praut(i,k),qc(i,k)/dtcld)
963 if(qr(i,k).gt.qcrmin.and.qc(i,k).gt.qmin)
then
964 pracw(i,k) = min(pacrr*rslope3(i,k,1)*rslopeb(i,k,1) &
965 * qc(i,k)*denfac(i,k),qc(i,k)/dtcld)
971 if(qr(i,k).gt.0.)
then
972 coeres = rslope2(i,k,1)*sqrt(rslope(i,k,1)*rslopeb(i,k,1))
973 prevp(i,k) = (rh(i,k,1)-1.)*(precr1*rslope2(i,k,1) &
974 + precr2*work2(i,k)*coeres)/work1(i,k,1)
975 if(prevp(i,k).lt.0.)
then
976 prevp(i,k) = max(prevp(i,k),-qr(i,k)/dtcld)
977 prevp(i,k) = max(prevp(i,k),satdt/2)
979 prevp(i,k) = min(prevp(i,k),satdt/2)
1001 n0sfac(i,k) = max(min(exp(alpha*supcol),n0smax/n0s),1.)
1002 supsat = max(q(i,k),qmin)-qsat(i,k,2)
1003 satdt = supsat/dtcld
1010 temp = (den(i,k)*max(qi(i,k),qmin))
1011 temp = sqrt(sqrt(temp*temp*temp))
1012 xni(i,k) = min(max(5.38e7*temp,1.e3),1.e6)
1013 eacrs = exp(0.07*(-supcol))
1015 xmi = den(i,k)*qi(i,k)/xni(i,k)
1016 diameter = min(dicon * sqrt(xmi),dimax)
1017 vt2i = 1.49e4*diameter**1.31
1018 vt2r=pvtr*rslopeb(i,k,1)*denfac(i,k)
1019 vt2s=pvts*rslopeb(i,k,2)*denfac(i,k)
1020 vt2g=pvtg*rslopeb(i,k,3)*denfac(i,k)
1021 qsum(i,k) = max( (qs(i,k)+qg(i,k)), 1.e-15)
1022 if(qsum(i,k) .gt. 1.e-15)
then
1023 vt2ave=(vt2s*qs(i,k)+vt2g*qg(i,k))/(qsum(i,k))
1027 if(supcol.gt.0.and.qi(i,k).gt.qmin)
then
1028 if(qr(i,k).gt.qcrmin)
then
1037 acrfac = 2.*rslope3(i,k,1)+2.*diameter*rslope2(i,k,1) &
1038 + diameter**2*rslope(i,k,1)
1039 praci(i,k) = pi*qi(i,k)*n0r*abs(vt2r-vt2i)*acrfac/4.
1041 praci(i,k) = praci(i,k)*min(max(0.0,qr(i,k)/qi(i,k)),1.)**2
1042 praci(i,k) = min(praci(i,k),qi(i,k)/dtcld)
1047 piacr(i,k) = pi**2*avtr*n0r*denr*xni(i,k)*denfac(i,k) &
1048 * g6pbr*rslope3(i,k,1)*rslope3(i,k,1) &
1049 * rslopeb(i,k,1)/24./den(i,k)
1051 piacr(i,k) = piacr(i,k)*min(max(0.0,qi(i,k)/qr(i,k)),1.)**2
1052 piacr(i,k) = min(piacr(i,k),qr(i,k)/dtcld)
1062 if(qs(i,k).gt.qcrmin)
then
1063 acrfac = 2.*rslope3(i,k,2)+2.*diameter*rslope2(i,k,2) &
1064 + diameter**2*rslope(i,k,2)
1065 psaci(i,k) = pi*qi(i,k)*eacrs*n0s*n0sfac(i,k) &
1066 * abs(vt2ave-vt2i)*acrfac/4.
1067 psaci(i,k) = min(psaci(i,k),qi(i,k)/dtcld)
1073 if(qg(i,k).gt.qcrmin)
then
1074 egi = exp(0.07*(-supcol))
1075 acrfac = 2.*rslope3(i,k,3)+2.*diameter*rslope2(i,k,3) &
1076 + diameter**2*rslope(i,k,3)
1077 pgaci(i,k) = pi*egi*qi(i,k)*n0g*abs(vt2ave-vt2i)*acrfac/4.
1078 pgaci(i,k) = min(pgaci(i,k),qi(i,k)/dtcld)
1085 if(qs(i,k).gt.qcrmin.and.qc(i,k).gt.qmin)
then
1086 psacw(i,k) = min(pacrc*n0sfac(i,k)*rslope3(i,k,2)*rslopeb(i,k,2) &
1088 * min(max(0.0,qs(i,k)/qc(i,k)),1.)**2 &
1089 * qc(i,k)*denfac(i,k),qc(i,k)/dtcld)
1095 if(qg(i,k).gt.qcrmin.and.qc(i,k).gt.qmin)
then
1096 pgacw(i,k) = min(pacrg*rslope3(i,k,3)*rslopeb(i,k,3) &
1098 * min(max(0.0,qg(i,k)/qc(i,k)),1.)**2 &
1099 * qc(i,k)*denfac(i,k),qc(i,k)/dtcld)
1105 if(qsum(i,k) .gt. 1.e-15)
then
1106 paacw(i,k) = (qs(i,k)*psacw(i,k)+qg(i,k)*pgacw(i,k)) &
1117 if(qs(i,k).gt.qcrmin.and.qr(i,k).gt.qcrmin)
then
1118 if(supcol.gt.0)
then
1119 acrfac = 5.*rslope3(i,k,2)*rslope3(i,k,2)*rslope(i,k,1) &
1120 + 2.*rslope3(i,k,2)*rslope2(i,k,2)*rslope2(i,k,1) &
1121 + .5*rslope2(i,k,2)*rslope2(i,k,2)*rslope3(i,k,1)
1122 pracs(i,k) = pi**2*n0r*n0s*n0sfac(i,k)*abs(vt2r-vt2ave) &
1123 * (dens/den(i,k))*acrfac
1125 pracs(i,k) = pracs(i,k)*min(max(0.0,qr(i,k)/qs(i,k)),1.)**2
1126 pracs(i,k) = min(pracs(i,k),qs(i,k)/dtcld)
1132 acrfac = 5.*rslope3(i,k,1)*rslope3(i,k,1)*rslope(i,k,2) &
1133 + 2.*rslope3(i,k,1)*rslope2(i,k,1)*rslope2(i,k,2) &
1134 +.5*rslope2(i,k,1)*rslope2(i,k,1)*rslope3(i,k,2)
1135 psacr(i,k) = pi**2*n0r*n0s*n0sfac(i,k)*abs(vt2ave-vt2r) &
1136 * (denr/den(i,k))*acrfac
1138 psacr(i,k) = psacr(i,k)*min(max(0.0,qs(i,k)/qr(i,k)),1.)**2
1139 psacr(i,k) = min(psacr(i,k),qr(i,k)/dtcld)
1145 if(qg(i,k).gt.qcrmin.and.qr(i,k).gt.qcrmin)
then
1146 acrfac = 5.*rslope3(i,k,1)*rslope3(i,k,1)*rslope(i,k,3) &
1147 + 2.*rslope3(i,k,1)*rslope2(i,k,1)*rslope2(i,k,3) &
1148 + .5*rslope2(i,k,1)*rslope2(i,k,1)*rslope3(i,k,3)
1149 pgacr(i,k) = pi**2*n0r*n0g*abs(vt2ave-vt2r)*(denr/den(i,k)) &
1152 pgacr(i,k) = pgacr(i,k)*min(max(0.0,qg(i,k)/qr(i,k)),1.)**2
1153 pgacr(i,k) = min(pgacr(i,k),qr(i,k)/dtcld)
1161 if(qg(i,k).gt.qcrmin.and.qs(i,k).gt.qcrmin)
then
1164 if(supcol.le.0)
then
1175 pseml(i,k) = min(max(cliq*supcol*(paacw(i,k)+psacr(i,k)) &
1176 / xlf,-qs(i,k)/dtcld),0.)
1182 pgeml(i,k) = min(max(cliq*supcol*(paacw(i,k)+pgacr(i,k)) &
1183 / xlf,-qg(i,k)/dtcld),0.)
1185 if(supcol.gt.0)
then
1194 if(qi(i,k).gt.0.and.ifsat.ne.1)
then
1195 pidep(i,k) = 4.*diameter*xni(i,k)*(rh(i,k,2)-1.)/work1(i,k,2)
1196 supice = satdt-prevp(i,k)
1197 if(pidep(i,k).lt.0.)
then
1198 pidep(i,k) = max(max(pidep(i,k),satdt/2),supice)
1199 pidep(i,k) = max(pidep(i,k),-qi(i,k)/dtcld)
1201 pidep(i,k) = min(min(pidep(i,k),satdt/2),supice)
1203 if(abs(prevp(i,k)+pidep(i,k)).ge.abs(satdt)) ifsat = 1
1209 if(qs(i,k).gt.0..and.ifsat.ne.1)
then
1210 coeres = rslope2(i,k,2)*sqrt(rslope(i,k,2)*rslopeb(i,k,2))
1211 psdep(i,k) = (rh(i,k,2)-1.)*n0sfac(i,k)*(precs1*rslope2(i,k,2) &
1212 + precs2*work2(i,k)*coeres)/work1(i,k,2)
1213 supice = satdt-prevp(i,k)-pidep(i,k)
1214 if(psdep(i,k).lt.0.)
then
1215 psdep(i,k) = max(psdep(i,k),-qs(i,k)/dtcld)
1216 psdep(i,k) = max(max(psdep(i,k),satdt/2),supice)
1218 psdep(i,k) = min(min(psdep(i,k),satdt/2),supice)
1220 if(abs(prevp(i,k)+pidep(i,k)+psdep(i,k)).ge.abs(satdt)) &
1227 if(qg(i,k).gt.0..and.ifsat.ne.1)
then
1228 coeres = rslope2(i,k,3)*sqrt(rslope(i,k,3)*rslopeb(i,k,3))
1229 pgdep(i,k) = (rh(i,k,2)-1.)*(precg1*rslope2(i,k,3) &
1230 + precg2*work2(i,k)*coeres)/work1(i,k,2)
1231 supice = satdt-prevp(i,k)-pidep(i,k)-psdep(i,k)
1232 if(pgdep(i,k).lt.0.)
then
1233 pgdep(i,k) = max(pgdep(i,k),-qg(i,k)/dtcld)
1234 pgdep(i,k) = max(max(pgdep(i,k),satdt/2),supice)
1236 pgdep(i,k) = min(min(pgdep(i,k),satdt/2),supice)
1238 if(abs(prevp(i,k)+pidep(i,k)+psdep(i,k)+pgdep(i,k)).ge. &
1239 abs(satdt)) ifsat = 1
1245 if(supsat.gt.0.and.ifsat.ne.1)
then
1246 supice = satdt-prevp(i,k)-pidep(i,k)-psdep(i,k)-pgdep(i,k)
1247 xni0 = 1.e3*exp(0.1*supcol)
1248 roqi0 = 4.92e-11*xni0**1.33
1249 pigen(i,k) = max(0.,(roqi0/den(i,k)-max(qi(i,k),0.))/dtcld)
1250 pigen(i,k) = min(min(pigen(i,k),satdt),supice)
1261 if(qi(i,k).gt.0.)
then
1262 qimax = roqimax/den(i,k)
1263 psaut(i,k) = max(0.,(qi(i,k)-qimax)/dtcld)
1270 if(qs(i,k).gt.0.)
then
1271 alpha2 = 1.e-3*exp(0.09*(-supcol))
1272 pgaut(i,k) = min(max(0.,alpha2*(qs(i,k)-qs0)),qs(i,k)/dtcld)
1284 if(supcol.lt.0.)
then
1285 if(qs(i,k).gt.0..and.rh(i,k,1).lt.1.)
then
1286 coeres = rslope2(i,k,2)*sqrt(rslope(i,k,2)*rslopeb(i,k,2))
1287 psevp(i,k) = (rh(i,k,1)-1.)*n0sfac(i,k)*(precs1 &
1288 * rslope2(i,k,2)+precs2*work2(i,k) &
1289 * coeres)/work1(i,k,1)
1290 psevp(i,k) = min(max(psevp(i,k),-qs(i,k)/dtcld),0.)
1296 if(qg(i,k).gt.0..and.rh(i,k,1).lt.1.)
then
1297 coeres = rslope2(i,k,3)*sqrt(rslope(i,k,3)*rslopeb(i,k,3))
1298 pgevp(i,k) = (rh(i,k,1)-1.)*(precg1*rslope2(i,k,3) &
1299 + precg2*work2(i,k)*coeres)/work1(i,k,1)
1300 pgevp(i,k) = min(max(pgevp(i,k),-qg(i,k)/dtcld),0.)
1320 if(qr(i,k).lt.1.e-4.and.qs(i,k).lt.1.e-4) delta2=1.
1321 if(qr(i,k).lt.1.e-4) delta3=1.
1322 if(t(i,k).le.t0c)
then
1326 value = max(qmin,qc(i,k))
1327 source = (praut(i,k)+pracw(i,k)+paacw(i,k)+paacw(i,k))*dtcld
1328 if (source.gt.
value)
then
1329 factor =
value/source
1330 praut(i,k) = praut(i,k)*factor
1331 pracw(i,k) = pracw(i,k)*factor
1332 paacw(i,k) = paacw(i,k)*factor
1337 value = max(qmin,qi(i,k))
1338 source = (psaut(i,k)-pigen(i,k)-pidep(i,k)+praci(i,k)+psaci(i,k) &
1340 if (source.gt.
value)
then
1341 factor =
value/source
1342 psaut(i,k) = psaut(i,k)*factor
1343 pigen(i,k) = pigen(i,k)*factor
1344 pidep(i,k) = pidep(i,k)*factor
1345 praci(i,k) = praci(i,k)*factor
1346 psaci(i,k) = psaci(i,k)*factor
1347 pgaci(i,k) = pgaci(i,k)*factor
1352 value = max(qmin,qr(i,k))
1353 source = (-praut(i,k)-prevp(i,k)-pracw(i,k)+piacr(i,k)+psacr(i,k) &
1355 if (source.gt.
value)
then
1356 factor =
value/source
1357 praut(i,k) = praut(i,k)*factor
1358 prevp(i,k) = prevp(i,k)*factor
1359 pracw(i,k) = pracw(i,k)*factor
1360 piacr(i,k) = piacr(i,k)*factor
1361 psacr(i,k) = psacr(i,k)*factor
1362 pgacr(i,k) = pgacr(i,k)*factor
1367 value = max(qmin,qs(i,k))
1368 source = -(psdep(i,k)+psaut(i,k)-pgaut(i,k)+paacw(i,k)+piacr(i,k) &
1369 * delta3+praci(i,k)*delta3-pracs(i,k)*(1.-delta2) &
1370 + psacr(i,k)*delta2+psaci(i,k)-pgacs(i,k) )*dtcld
1371 if (source.gt.
value)
then
1372 factor =
value/source
1373 psdep(i,k) = psdep(i,k)*factor
1374 psaut(i,k) = psaut(i,k)*factor
1375 pgaut(i,k) = pgaut(i,k)*factor
1376 paacw(i,k) = paacw(i,k)*factor
1377 piacr(i,k) = piacr(i,k)*factor
1378 praci(i,k) = praci(i,k)*factor
1379 psaci(i,k) = psaci(i,k)*factor
1380 pracs(i,k) = pracs(i,k)*factor
1381 psacr(i,k) = psacr(i,k)*factor
1382 pgacs(i,k) = pgacs(i,k)*factor
1387 value = max(qmin,qg(i,k))
1388 source = -(pgdep(i,k)+pgaut(i,k) &
1389 + piacr(i,k)*(1.-delta3)+praci(i,k)*(1.-delta3) &
1390 + psacr(i,k)*(1.-delta2)+pracs(i,k)*(1.-delta2) &
1391 + pgaci(i,k)+paacw(i,k)+pgacr(i,k)+pgacs(i,k))*dtcld
1392 if (source.gt.
value)
then
1393 factor =
value/source
1394 pgdep(i,k) = pgdep(i,k)*factor
1395 pgaut(i,k) = pgaut(i,k)*factor
1396 piacr(i,k) = piacr(i,k)*factor
1397 praci(i,k) = praci(i,k)*factor
1398 psacr(i,k) = psacr(i,k)*factor
1399 pracs(i,k) = pracs(i,k)*factor
1400 paacw(i,k) = paacw(i,k)*factor
1401 pgaci(i,k) = pgaci(i,k)*factor
1402 pgacr(i,k) = pgacr(i,k)*factor
1403 pgacs(i,k) = pgacs(i,k)*factor
1406 work2(i,k)=-(prevp(i,k)+psdep(i,k)+pgdep(i,k)+pigen(i,k)+pidep(i,k))
1408 q(i,k) = q(i,k)+work2(i,k)*dtcld
1409 qc(i,k) = max(qc(i,k)-(praut(i,k)+pracw(i,k) &
1410 + paacw(i,k)+paacw(i,k))*dtcld,0.)
1411 qr(i,k) = max(qr(i,k)+(praut(i,k)+pracw(i,k) &
1412 + prevp(i,k)-piacr(i,k)-pgacr(i,k) &
1413 - psacr(i,k))*dtcld,0.)
1414 qi(i,k) = max(qi(i,k)-(psaut(i,k)+praci(i,k) &
1415 + psaci(i,k)+pgaci(i,k)-pigen(i,k)-pidep(i,k)) &
1417 qs(i,k) = max(qs(i,k)+(psdep(i,k)+psaut(i,k)+paacw(i,k) &
1418 - pgaut(i,k)+piacr(i,k)*delta3 &
1419 + praci(i,k)*delta3+psaci(i,k)-pgacs(i,k) &
1420 - pracs(i,k)*(1.-delta2)+psacr(i,k)*delta2) &
1422 qg(i,k) = max(qg(i,k)+(pgdep(i,k)+pgaut(i,k) &
1423 + piacr(i,k)*(1.-delta3) &
1424 + praci(i,k)*(1.-delta3)+psacr(i,k)*(1.-delta2) &
1425 + pracs(i,k)*(1.-delta2)+pgaci(i,k)+paacw(i,k) &
1426 + pgacr(i,k)+pgacs(i,k))*dtcld,0.)
1428 xlwork2 = -xls*(psdep(i,k)+pgdep(i,k)+pidep(i,k)+pigen(i,k)) &
1429 -xl(i,k)*prevp(i,k)-xlf*(piacr(i,k)+paacw(i,k) &
1430 +paacw(i,k)+pgacr(i,k)+psacr(i,k))
1431 t(i,k) = t(i,k)-xlwork2/cpm(i,k)*dtcld
1436 value = max(qmin,qc(i,k))
1437 source=(praut(i,k)+pracw(i,k)+paacw(i,k)+paacw(i,k))*dtcld
1438 if (source.gt.
value)
then
1439 factor =
value/source
1440 praut(i,k) = praut(i,k)*factor
1441 pracw(i,k) = pracw(i,k)*factor
1442 paacw(i,k) = paacw(i,k)*factor
1447 value = max(qmin,qr(i,k))
1448 source = (-paacw(i,k)-praut(i,k)+pseml(i,k)+pgeml(i,k)-pracw(i,k) &
1449 -paacw(i,k)-prevp(i,k))*dtcld
1450 if (source.gt.
value)
then
1451 factor =
value/source
1452 praut(i,k) = praut(i,k)*factor
1453 prevp(i,k) = prevp(i,k)*factor
1454 pracw(i,k) = pracw(i,k)*factor
1455 paacw(i,k) = paacw(i,k)*factor
1456 pseml(i,k) = pseml(i,k)*factor
1457 pgeml(i,k) = pgeml(i,k)*factor
1462 value = max(qcrmin,qs(i,k))
1463 source=(pgacs(i,k)-pseml(i,k)-psevp(i,k))*dtcld
1464 if (source.gt.
value)
then
1465 factor =
value/source
1466 pgacs(i,k) = pgacs(i,k)*factor
1467 psevp(i,k) = psevp(i,k)*factor
1468 pseml(i,k) = pseml(i,k)*factor
1473 value = max(qcrmin,qg(i,k))
1474 source=-(pgacs(i,k)+pgevp(i,k)+pgeml(i,k))*dtcld
1475 if (source.gt.
value)
then
1476 factor =
value/source
1477 pgacs(i,k) = pgacs(i,k)*factor
1478 pgevp(i,k) = pgevp(i,k)*factor
1479 pgeml(i,k) = pgeml(i,k)*factor
1482 work2(i,k)=-(prevp(i,k)+psevp(i,k)+pgevp(i,k))
1484 q(i,k) = q(i,k)+work2(i,k)*dtcld
1485 qc(i,k) = max(qc(i,k)-(praut(i,k)+pracw(i,k) &
1486 + paacw(i,k)+paacw(i,k))*dtcld,0.)
1487 qr(i,k) = max(qr(i,k)+(praut(i,k)+pracw(i,k) &
1488 + prevp(i,k)+paacw(i,k)+paacw(i,k)-pseml(i,k) &
1489 - pgeml(i,k))*dtcld,0.)
1490 qs(i,k) = max(qs(i,k)+(psevp(i,k)-pgacs(i,k) &
1491 + pseml(i,k))*dtcld,0.)
1492 qg(i,k) = max(qg(i,k)+(pgacs(i,k)+pgevp(i,k) &
1493 + pgeml(i,k))*dtcld,0.)
1495 xlwork2 = -xl(i,k)*(prevp(i,k)+psevp(i,k)+pgevp(i,k)) &
1496 -xlf*(pseml(i,k)+pgeml(i,k))
1497 t(i,k) = t(i,k)-xlwork2/cpm(i,k)*dtcld
1518 xbi=xai+hsub/(rv*ttp)
1522 qsat(i,k,1)=psat*exp(log(tr)*(xa))*exp(xb*(1.-tr))
1523 qsat(i,k,1) = min(qsat(i,k,1),0.99*p(i,k))
1524 qsat(i,k,1) = ep2 * qsat(i,k,1) / (p(i,k) - qsat(i,k,1))
1525 qsat(i,k,1) = max(qsat(i,k,1),qmin)
1527 if(t(i,k).lt.ttp)
then
1528 qsat(i,k,2)=psat*exp(log(tr)*(xai))*exp(xbi*(1.-tr))
1530 qsat(i,k,2)=psat*exp(log(tr)*(xa))*exp(xb*(1.-tr))
1532 qsat(i,k,2) = min(qsat(i,k,2),0.99*p(i,k))
1533 qsat(i,k,2) = ep2 * qsat(i,k,2) / (p(i,k) - qsat(i,k,2))
1534 qsat(i,k,2) = max(qsat(i,k,2),qmin)
1549 work1(i,k,1) = conden(t(i,k),q(i,k),qsat(i,k,1),xl(i,k),cpm(i,k))
1550 work2(i,k) = qc(i,k)+work1(i,k,1)
1551 pcond(i,k) = min(max(work1(i,k,1)/dtcld,0.),max(q(i,k),0.)/dtcld)
1552 if(qc(i,k).gt.0..and.work1(i,k,1).lt.0.) &
1553 pcond(i,k) = max(work1(i,k,1),-qc(i,k))/dtcld
1554 q(i,k) = q(i,k)-pcond(i,k)*dtcld
1555 qc(i,k) = max(qc(i,k)+pcond(i,k)*dtcld,0.)
1556 t(i,k) = t(i,k)+pcond(i,k)*xl(i,k)/cpm(i,k)*dtcld
1570 if(qc(i,k).le.qmin) qc(i,k) = 0.0
1571 if(qi(i,k).le.qmin) qi(i,k) = 0.0
1576 if(
present(rainprod2d) .and.
present(evapprod2d))
then
1579 rainprod2d(i,k) = praut(i,k)+pracw(i,k)+praci(i,k)+psaci(i,k)+pgaci(i,k) &
1580 + psacw(i,k)+pgacw(i,k)+paacw(i,k)+psaut(i,k)
1581 evapprod2d(i,k) = -(prevp(i,k)+psevp(i,k)+pgevp(i,k)+psdep(i,k)+pgdep(i,k))
1590 errmsg =
'mp_wsm6_run OK'