12 REAL, PARAMETER, PRIVATE :: dtcldcr = 120. ! maximum time step for minor loops
13 REAL, PARAMETER, PRIVATE :: n0r = 8.e6 ! intercept parameter rain
14 REAL, PARAMETER, PRIVATE :: n0g = 4.e6 ! intercept parameter graupel
15 REAL, PARAMETER, PRIVATE :: avtr = 841.9 ! a constant for terminal velocity of rain
16 REAL, PARAMETER, PRIVATE :: bvtr = 0.8 ! a constant for terminal velocity of rain
17 REAL, PARAMETER, PRIVATE :: r0 = .8e-5 ! 8 microm in contrast to 10 micro m
18 REAL, PARAMETER, PRIVATE :: peaut = .55 ! collection efficiency
19 REAL, PARAMETER, PRIVATE :: xncr = 3.e8 ! maritime cloud in contrast to 3.e8 in tc80
20 REAL, PARAMETER, PRIVATE :: xmyu = 1.718e-5 ! the dynamic viscosity kgm-1s-1
21 REAL, PARAMETER, PRIVATE :: avts = 11.72 ! a constant for terminal velocity of snow
22 REAL, PARAMETER, PRIVATE :: bvts = .41 ! a constant for terminal velocity of snow
23 REAL, PARAMETER, PRIVATE :: avtg = 330. ! a constant for terminal velocity of graupel
24 REAL, PARAMETER, PRIVATE :: bvtg = 0.8 ! a constant for terminal velocity of graupel
25 REAL, PARAMETER, PRIVATE :: deng = 500. ! density of graupel
26 REAL, PARAMETER, PRIVATE :: n0smax = 1.e11 ! maximum n0s (t=-90C unlimited)
27 REAL, PARAMETER, PRIVATE :: lamdarmax = 8.e4 ! limited maximum value for slope parameter of rain
28 REAL, PARAMETER, PRIVATE :: lamdasmax = 1.e5 ! limited maximum value for slope parameter of snow
29 REAL, PARAMETER, PRIVATE :: lamdagmax = 6.e4 ! limited maximum value for slope parameter of graupel
30 REAL, PARAMETER, PRIVATE :: dicon = 11.9 ! constant for the cloud-ice diamter
31 REAL, PARAMETER, PRIVATE :: dimax = 500.e-6 ! limited maximum value for the cloud-ice diamter
32 REAL, PARAMETER, PRIVATE :: n0s = 2.e6 ! temperature dependent intercept parameter snow
33 REAL, PARAMETER, PRIVATE :: alpha = .12 ! .122 exponen factor for n0s
34 REAL, PARAMETER, PRIVATE :: pfrz1 = 100. ! constant in Biggs freezing
35 REAL, PARAMETER, PRIVATE :: pfrz2 = 0.66 ! constant in Biggs freezing
36 REAL, PARAMETER, PRIVATE :: qcrmin = 1.e-9 ! minimun values for qr, qs, and qg
37 REAL, PARAMETER, PRIVATE :: eacrc = 1.0 ! Snow/cloud-water collection efficiency
38 REAL, PARAMETER, PRIVATE :: dens = 100.0 ! Density of snow
39 REAL, PARAMETER, PRIVATE :: qs0 = 6.e-4 ! threshold amount for aggretion to occur
41 qc0, qck1,bvtr1,bvtr2,bvtr3,bvtr4,g1pbr, &
42 g3pbr,g4pbr,g5pbro2,pvtr,eacrr,pacrr, &
44 precr1,precr2,roqimax,bvts1, &
45 bvts2,bvts3,bvts4,g1pbs,g3pbs,g4pbs, &
46 g5pbso2,pvts,pacrs,precs1,precs2,pidn0r, &
47 pidn0s,xlv1,pacrc,pi, &
48 bvtg1,bvtg2,bvtg3,bvtg4,g1pbg, &
49 g3pbg,g4pbg,g5pbgo2,pvtg,pacrg, &
50 precg1,precg2,pidn0g, &
51 rslopermax,rslopesmax,rslopegmax, &
52 rsloperbmax,rslopesbmax,rslopegbmax, &
53 rsloper2max,rslopes2max,rslopeg2max, &
54 rsloper3max,rslopes3max,rslopeg3max
56 !===================================================================
58 SUBROUTINE wsm6(th, q, qc, qr, qi, qs, qg &
60 ,delt,g, cpd, cpv, rd, rv, t0c &
62 ,XLS, XLV0, XLF0, den0, denr &
67 ,graupel, graupelncv &
68 ,ids,ide, jds,jde, kds,kde &
69 ,ims,ime, jms,jme, kms,kme &
70 ,its,ite, jts,jte, kts,kte &
72 !-------------------------------------------------------------------
74 !-------------------------------------------------------------------
75 INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde , &
76 ims,ime, jms,jme, kms,kme , &
77 its,ite, jts,jte, kts,kte
78 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), &
87 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), &
93 REAL, INTENT(IN ) :: delt, &
111 REAL, DIMENSION( ims:ime , jms:jme ), &
112 INTENT(INOUT) :: rain, &
115 REAL, DIMENSION( ims:ime , jms:jme ), OPTIONAL, &
116 INTENT(INOUT) :: snow, &
118 REAL, DIMENSION( ims:ime , jms:jme ), OPTIONAL, &
119 INTENT(INOUT) :: graupel, &
122 REAL, DIMENSION( its:ite , kts:kte ) :: t
123 REAL, DIMENSION( its:ite , kts:kte, 2 ) :: qci
124 REAL, DIMENSION( its:ite , kts:kte, 3 ) :: qrs
126 !-------------------------------------------------------------------
130 t(i,k)=th(i,k,j)*pii(i,k,j)
131 qci(i,k,1) = qc(i,k,j)
132 qci(i,k,2) = qi(i,k,j)
133 qrs(i,k,1) = qr(i,k,j)
134 qrs(i,k,2) = qs(i,k,j)
135 qrs(i,k,3) = qg(i,k,j)
138 ! Sending array starting locations of optional variables may cause
139 ! troubles, so we explicitly change the call.
140 CALL wsm62D(t, q(ims,kms,j), qci, qrs &
142 ,p(ims,kms,j), delz(ims,kms,j) &
143 ,delt,g, cpd, cpv, rd, rv, t0c &
145 ,XLS, XLV0, XLF0, den0, denr &
148 ,rain(ims,j),rainncv(ims,j) &
150 ,ids,ide, jds,jde, kds,kde &
151 ,ims,ime, jms,jme, kms,kme &
152 ,its,ite, jts,jte, kts,kte &
154 ,graupel,graupelncv &
158 th(i,k,j)=t(i,k)/pii(i,k,j)
159 qc(i,k,j) = qci(i,k,1)
160 qi(i,k,j) = qci(i,k,2)
161 qr(i,k,j) = qrs(i,k,1)
162 qs(i,k,j) = qrs(i,k,2)
163 qg(i,k,j) = qrs(i,k,3)
168 !===================================================================
170 SUBROUTINE wsm62D(t, q &
171 ,qci, qrs, den, p, delz &
172 ,delt,g, cpd, cpv, rd, rv, t0c &
174 ,XLS, XLV0, XLF0, den0, denr &
179 ,ids,ide, jds,jde, kds,kde &
180 ,ims,ime, jms,jme, kms,kme &
181 ,its,ite, jts,jte, kts,kte &
183 ,graupel,graupelncv &
185 !-------------------------------------------------------------------
187 !-------------------------------------------------------------------
189 ! This code is a 6-class GRAUPEL phase microphyiscs scheme (WSM6) of the
190 ! Single-Moment MicroPhyiscs (WSMMP). The WSMMP assumes that ice nuclei
191 ! number concentration is a function of temperature, and seperate assumption
192 ! is developed, in which ice crystal number concentration is a function
193 ! of ice amount. A theoretical background of the ice-microphysics and related
194 ! processes in the WSMMPs are described in Hong et al. (2004).
195 ! All production terms in the WSM6 scheme are described in Hong and Lim (2006).
196 ! All units are in m.k.s. and source/sink terms in kgkg-1s-1.
200 ! Coded by Song-You Hong and Jeong-Ock Jade Lim (Yonsei Univ.)
203 ! Implemented by Song-You Hong (Yonsei Univ.) and Jimy Dudhia (NCAR)
206 ! History : semi-lagrangian scheme sedimentation(JH), and clean up
209 ! Reference) Hong, Dudhia, Chen (HDC, 2004) Mon. Wea. Rev.
210 ! Hong and Lim (HL, 2006) J. Korean Meteor. Soc.
211 ! Dudhia, Hong and Lim (DHL, 2008) J. Meteor. Soc. Japan
212 ! Lin, Farley, Orville (LFO, 1983) J. Appl. Meteor.
213 ! Rutledge, Hobbs (RH83, 1983) J. Atmos. Sci.
214 ! Rutledge, Hobbs (RH84, 1984) J. Atmos. Sci.
215 ! Juang and Hong (JH, 2010) Mon. Wea. Rev.
217 INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde , &
218 ims,ime, jms,jme, kms,kme , &
219 its,ite, jts,jte, kts,kte, &
221 REAL, DIMENSION( its:ite , kts:kte ), &
224 REAL, DIMENSION( its:ite , kts:kte, 2 ), &
227 REAL, DIMENSION( its:ite , kts:kte, 3 ), &
230 REAL, DIMENSION( ims:ime , kms:kme ), &
233 REAL, DIMENSION( ims:ime , kms:kme ), &
238 REAL, INTENT(IN ) :: delt, &
256 REAL, DIMENSION( ims:ime ), &
257 INTENT(INOUT) :: rain, &
260 REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, &
261 INTENT(INOUT) :: snow, &
263 REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, &
264 INTENT(INOUT) :: graupel, &
267 REAL, DIMENSION( its:ite , kts:kte , 3) :: &
278 REAL, DIMENSION( its:ite , kts:kte ) :: &
285 REAL, DIMENSION( its:ite , kts:kte ) :: &
288 REAL, DIMENSION( its:ite , kts:kte ) :: &
316 REAL, DIMENSION( its:ite , kts:kte ) :: &
328 REAL, DIMENSION( its:ite ) :: delqrs1, &
332 REAL, DIMENSION( its:ite ) :: tstepsnow, &
334 INTEGER, DIMENSION( its:ite ) :: mstep, &
336 LOGICAL, DIMENSION( its:ite ) :: flgcld
338 cpmcal, xlcal, diffus, &
339 viscos, xka, venfac, conden, diffac, &
340 x, y, z, a, b, c, d, e, &
341 qdt, holdrr, holdrs, holdrg, supcol, supcolt, pvt, &
342 coeres, supsat, dtcld, xmi, eacrs, satdt, &
343 qimax, diameter, xni0, roqi0, &
344 fallsum, fallsum_qsi, fallsum_qg, &
345 vt2i,vt2r,vt2s,vt2g,acrfac,egs,egi, &
346 xlwork2, factor, source, value, &
347 xlf, pfrzdtc, pfrzdtr, supice, alpha2, delta2, delta3
349 REAL :: holdc, holdci
350 INTEGER :: i, j, k, mstepmax, &
351 iprt, latd, lond, loop, loops, ifsat, n, idim, kdim
352 ! Temporaries used for inlining fpvs function
353 REAL :: dldti, xb, xai, tr, xbi, xa, hvap, cvap, hsub, dldt, ttp
354 ! variables for optimization
355 REAL, DIMENSION( its:ite ) :: tvec1
358 !=================================================================
359 ! compute internal functions
361 cpmcal(x) = cpd*(1.-max(x,qmin))+max(x,qmin)*cpv
362 xlcal(x) = xlv0-xlv1*(x-t0c)
363 !----------------------------------------------------------------
364 ! diffus: diffusion coefficient of the water vapor
365 ! viscos: kinematic viscosity(m2s-1)
366 ! Optimizatin : A**B => exp(log(A)*(B))
368 diffus(x,y) = 8.794e-5 * exp(log(x)*(1.81)) / y ! 8.794e-5*x**1.81/y
369 viscos(x,y) = 1.496e-6 * (x*sqrt(x)) /(x+120.)/y ! 1.496e-6*x**1.5/(x+120.)/y
370 xka(x,y) = 1.414e3*viscos(x,y)*y
371 diffac(a,b,c,d,e) = d*a*a/(xka(c,d)*rv*c*c)+1./(e*diffus(c,b))
372 venfac(a,b,c) = exp(log((viscos(b,c)/diffus(b,a)))*((.3333333))) &
373 /sqrt(viscos(b,c))*sqrt(sqrt(den0/c))
374 conden(a,b,c,d,e) = (max(b,qmin)-c)/(1.+d*d/(rv*e)*c/(a*a))
380 !----------------------------------------------------------------
381 ! paddint 0 for negative values generated by dynamics
385 qci(i,k,1) = max(qci(i,k,1),0.0)
386 qrs(i,k,1) = max(qrs(i,k,1),0.0)
387 qci(i,k,2) = max(qci(i,k,2),0.0)
388 qrs(i,k,2) = max(qrs(i,k,2),0.0)
389 qrs(i,k,3) = max(qrs(i,k,3),0.0)
393 !----------------------------------------------------------------
394 ! latent heat for phase changes and heat capacity. neglect the
395 ! changes during microphysical process calculation
400 cpm(i,k) = cpmcal(q(i,k))
401 xl(i,k) = xlcal(t(i,k))
406 delz_tmp(i,k) = delz(i,k)
407 den_tmp(i,k) = den(i,k)
411 !----------------------------------------------------------------
412 ! initialize the surface rain, snow, graupel
416 if(PRESENT (snowncv) .AND. PRESENT (snow)) snowncv(i,lat) = 0.
417 if(PRESENT (graupelncv) .AND. PRESENT (graupel)) graupelncv(i,lat) = 0.
419 ! new local array to catch step snow and graupel
424 !----------------------------------------------------------------
425 ! compute the minor time steps.
427 loops = max(nint(delt/dtcldcr),1)
429 if(delt.le.dtcldcr) dtcld = delt
433 !----------------------------------------------------------------
434 ! initialize the large scale variables
443 ! denfac(i,k) = sqrt(den0/den(i,k))
447 CALL VREC( tvec1(its), den(its,k), ite-its+1)
449 tvec1(i) = tvec1(i)*den0
451 CALL VSQRT( denfac(its,k), tvec1(its), ite-its+1)
454 ! Inline expansion for fpvs
455 ! qs(i,k,1) = fpvs(t(i,k),0,rd,rv,cpv,cliq,cice,xlv0,xls,psat,t0c)
456 ! qs(i,k,2) = fpvs(t(i,k),1,rd,rv,cpv,cliq,cice,xlv0,xls,psat,t0c)
466 xbi=xai+hsub/(rv*ttp)
470 qs(i,k,1)=psat*exp(log(tr)*(xa))*exp(xb*(1.-tr))
471 qs(i,k,1) = min(qs(i,k,1),0.99*p(i,k))
472 qs(i,k,1) = ep2 * qs(i,k,1) / (p(i,k) - qs(i,k,1))
473 qs(i,k,1) = max(qs(i,k,1),qmin)
474 rh(i,k,1) = max(q(i,k) / qs(i,k,1),qmin)
476 if(t(i,k).lt.ttp) then
477 qs(i,k,2)=psat*exp(log(tr)*(xai))*exp(xbi*(1.-tr))
479 qs(i,k,2)=psat*exp(log(tr)*(xa))*exp(xb*(1.-tr))
481 qs(i,k,2) = min(qs(i,k,2),0.99*p(i,k))
482 qs(i,k,2) = ep2 * qs(i,k,2) / (p(i,k) - qs(i,k,2))
483 qs(i,k,2) = max(qs(i,k,2),qmin)
484 rh(i,k,2) = max(q(i,k) / qs(i,k,2),qmin)
488 !----------------------------------------------------------------
489 ! initialize the variables for microphysical physics
532 !-------------------------------------------------------------
533 ! Ni: ice crystal number concentraiton [HDC 5c]
534 !-------------------------------------------------------------
537 temp = (den(i,k)*max(qci(i,k,2),qmin))
538 temp = sqrt(sqrt(temp*temp*temp))
539 xni(i,k) = min(max(5.38e7*temp,1.e3),1.e6)
543 !----------------------------------------------------------------
544 ! compute the fallout term:
545 ! first, vertical terminal velosity for minor loops
546 !----------------------------------------------------------------
549 qrs_tmp(i,k,1) = qrs(i,k,1)
550 qrs_tmp(i,k,2) = qrs(i,k,2)
551 qrs_tmp(i,k,3) = qrs(i,k,3)
554 call slope_wsm6(qrs_tmp,den_tmp,denfac,t,rslope,rslopeb,rslope2,rslope3, &
555 work1,its,ite,kts,kte)
559 workr(i,k) = work1(i,k,1)
560 qsum(i,k) = max( (qrs(i,k,2)+qrs(i,k,3)), 1.E-15)
561 IF ( qsum(i,k) .gt. 1.e-15 ) THEN
562 worka(i,k) = (work1(i,k,2)*qrs(i,k,2) + work1(i,k,3)*qrs(i,k,3)) &
567 denqrs1(i,k) = den(i,k)*qrs(i,k,1)
568 denqrs2(i,k) = den(i,k)*qrs(i,k,2)
569 denqrs3(i,k) = den(i,k)*qrs(i,k,3)
570 if(qrs(i,k,1).le.0.0) workr(i,k) = 0.0
573 call nislfv_rain_plm(idim,kdim,den_tmp,denfac,t,delz_tmp,workr,denqrs1, &
575 call nislfv_rain_plm6(idim,kdim,den_tmp,denfac,t,delz_tmp,worka, &
576 denqrs2,denqrs3,delqrs2,delqrs3,dtcld,1,1)
579 qrs(i,k,1) = max(denqrs1(i,k)/den(i,k),0.)
580 qrs(i,k,2) = max(denqrs2(i,k)/den(i,k),0.)
581 qrs(i,k,3) = max(denqrs3(i,k)/den(i,k),0.)
582 fall(i,k,1) = denqrs1(i,k)*workr(i,k)/delz(i,k)
583 fall(i,k,2) = denqrs2(i,k)*worka(i,k)/delz(i,k)
584 fall(i,k,3) = denqrs3(i,k)*worka(i,k)/delz(i,k)
588 fall(i,1,1) = delqrs1(i)/delz(i,1)/dtcld
589 fall(i,1,2) = delqrs2(i)/delz(i,1)/dtcld
590 fall(i,1,3) = delqrs3(i)/delz(i,1)/dtcld
594 qrs_tmp(i,k,1) = qrs(i,k,1)
595 qrs_tmp(i,k,2) = qrs(i,k,2)
596 qrs_tmp(i,k,3) = qrs(i,k,3)
599 call slope_wsm6(qrs_tmp,den_tmp,denfac,t,rslope,rslopeb,rslope2,rslope3, &
600 work1,its,ite,kts,kte)
605 n0sfac(i,k) = max(min(exp(alpha*supcol),n0smax/n0s),1.)
606 if(t(i,k).gt.t0c) then
607 !---------------------------------------------------------------
608 ! psmlt: melting of snow [HL A33] [RH83 A25]
610 !---------------------------------------------------------------
612 work2(i,k) = venfac(p(i,k),t(i,k),den(i,k))
613 if(qrs(i,k,2).gt.0.) then
614 coeres = rslope2(i,k,2)*sqrt(rslope(i,k,2)*rslopeb(i,k,2))
615 psmlt(i,k) = xka(t(i,k),den(i,k))/xlf*(t0c-t(i,k))*pi/2. &
616 *n0sfac(i,k)*(precs1*rslope2(i,k,2) &
617 +precs2*work2(i,k)*coeres)
618 psmlt(i,k) = min(max(psmlt(i,k)*dtcld/mstep(i), &
619 -qrs(i,k,2)/mstep(i)),0.)
620 qrs(i,k,2) = qrs(i,k,2) + psmlt(i,k)
621 qrs(i,k,1) = qrs(i,k,1) - psmlt(i,k)
622 t(i,k) = t(i,k) + xlf/cpm(i,k)*psmlt(i,k)
624 !---------------------------------------------------------------
625 ! pgmlt: melting of graupel [HL A23] [LFO 47]
627 !---------------------------------------------------------------
628 if(qrs(i,k,3).gt.0.) then
629 coeres = rslope2(i,k,3)*sqrt(rslope(i,k,3)*rslopeb(i,k,3))
630 pgmlt(i,k) = xka(t(i,k),den(i,k))/xlf &
631 *(t0c-t(i,k))*(precg1*rslope2(i,k,3) &
632 +precg2*work2(i,k)*coeres)
633 pgmlt(i,k) = min(max(pgmlt(i,k)*dtcld/mstep(i), &
634 -qrs(i,k,3)/mstep(i)),0.)
635 qrs(i,k,3) = qrs(i,k,3) + pgmlt(i,k)
636 qrs(i,k,1) = qrs(i,k,1) - pgmlt(i,k)
637 t(i,k) = t(i,k) + xlf/cpm(i,k)*pgmlt(i,k)
642 !---------------------------------------------------------------
643 ! Vice [ms-1] : fallout of ice crystal [HDC 5a]
644 !---------------------------------------------------------------
647 if(qci(i,k,2).le.0.) then
650 xmi = den(i,k)*qci(i,k,2)/xni(i,k)
651 diameter = max(min(dicon * sqrt(xmi),dimax), 1.e-25)
652 work1c(i,k) = 1.49e4*exp(log(diameter)*(1.31))
657 ! forward semi-laglangian scheme (JH), PCM (piecewise constant), (linear)
661 denqci(i,k) = den(i,k)*qci(i,k,2)
664 call nislfv_rain_plm(idim,kdim,den_tmp,denfac,t,delz_tmp,work1c,denqci, &
668 qci(i,k,2) = max(denqci(i,k)/den(i,k),0.)
672 fallc(i,1) = delqi(i)/delz(i,1)/dtcld
675 !----------------------------------------------------------------
676 ! rain (unit is mm/sec;kgm-2s-1: /1000*delt ===> m)==> mm for wrf
679 fallsum = fall(i,kts,1)+fall(i,kts,2)+fall(i,kts,3)+fallc(i,kts)
680 fallsum_qsi = fall(i,kts,2)+fallc(i,kts)
681 fallsum_qg = fall(i,kts,3)
682 if(fallsum.gt.0.) then
683 rainncv(i) = fallsum*delz(i,kts)/denr*dtcld*1000. + rainncv(i)
684 rain(i) = fallsum*delz(i,kts)/denr*dtcld*1000. + rain(i)
686 if(fallsum_qsi.gt.0.) then
687 tstepsnow(i) = fallsum_qsi*delz(i,kts)/denr*dtcld*1000. &
689 IF ( PRESENT (snowncv) .AND. PRESENT (snow)) THEN
690 snowncv(i,lat) = fallsum_qsi*delz(i,kts)/denr*dtcld*1000. &
692 snow(i,lat) = fallsum_qsi*delz(i,kts)/denr*dtcld*1000. + snow(i,lat)
695 if(fallsum_qg.gt.0.) then
696 tstepgraup(i) = fallsum_qsi*delz(i,kts)/denr*dtcld*1000. &
698 IF ( PRESENT (graupelncv) .AND. PRESENT (graupel)) THEN
699 graupelncv(i,lat) = fallsum_qg*delz(i,kts)/denr*dtcld*1000. &
701 graupel(i,lat) = fallsum_qg*delz(i,kts)/denr*dtcld*1000. + graupel(i,lat)
704 ! if(fallsum.gt.0.)sr(i)=(snowncv(i,lat) + graupelncv(i,lat))/(rainncv(i)+1.e-12)
705 if(fallsum.gt.0.)sr(i)=(tstepsnow(i) + tstepgraup(i))/(rainncv(i)+1.e-12)
708 !---------------------------------------------------------------
709 ! pimlt: instantaneous melting of cloud ice [HL A47] [RH83 A28]
711 !---------------------------------------------------------------
716 if(supcol.lt.0.) xlf = xlf0
717 if(supcol.lt.0.and.qci(i,k,2).gt.0.) then
718 qci(i,k,1) = qci(i,k,1) + qci(i,k,2)
719 t(i,k) = t(i,k) - xlf/cpm(i,k)*qci(i,k,2)
722 !---------------------------------------------------------------
723 ! pihmf: homogeneous freezing of cloud water below -40c [HL A45]
725 !---------------------------------------------------------------
726 if(supcol.gt.40..and.qci(i,k,1).gt.0.) then
727 qci(i,k,2) = qci(i,k,2) + qci(i,k,1)
728 t(i,k) = t(i,k) + xlf/cpm(i,k)*qci(i,k,1)
731 !---------------------------------------------------------------
732 ! pihtf: heterogeneous freezing of cloud water [HL A44]
734 !---------------------------------------------------------------
735 if(supcol.gt.0..and.qci(i,k,1).gt.qmin) then
736 ! pfrzdtc = min(pfrz1*(exp(pfrz2*supcol)-1.) &
737 ! *den(i,k)/denr/xncr*qci(i,k,1)**2*dtcld,qci(i,k,1))
738 supcolt=min(supcol,50.)
739 pfrzdtc = min(pfrz1*(exp(pfrz2*supcolt)-1.) &
740 *den(i,k)/denr/xncr*qci(i,k,1)*qci(i,k,1)*dtcld,qci(i,k,1))
741 qci(i,k,2) = qci(i,k,2) + pfrzdtc
742 t(i,k) = t(i,k) + xlf/cpm(i,k)*pfrzdtc
743 qci(i,k,1) = qci(i,k,1)-pfrzdtc
745 !---------------------------------------------------------------
746 ! pgfrz: freezing of rain water [HL A20] [LFO 45]
748 !---------------------------------------------------------------
749 if(supcol.gt.0..and.qrs(i,k,1).gt.0.) then
750 ! pfrzdtr = min(20.*pi**2*pfrz1*n0r*denr/den(i,k) &
751 ! *(exp(pfrz2*supcol)-1.)*rslope3(i,k,1)**2 &
752 ! *rslope(i,k,1)*dtcld,qrs(i,k,1))
753 temp = rslope3(i,k,1)
754 temp = temp*temp*rslope(i,k,1)
755 supcolt=min(supcol,50.)
756 pfrzdtr = min(20.*(pi*pi)*pfrz1*n0r*denr/den(i,k) &
757 *(exp(pfrz2*supcolt)-1.)*temp*dtcld, &
759 qrs(i,k,3) = qrs(i,k,3) + pfrzdtr
760 t(i,k) = t(i,k) + xlf/cpm(i,k)*pfrzdtr
761 qrs(i,k,1) = qrs(i,k,1)-pfrzdtr
767 !----------------------------------------------------------------
768 ! update the slope parameters for microphysics computation
772 qrs_tmp(i,k,1) = qrs(i,k,1)
773 qrs_tmp(i,k,2) = qrs(i,k,2)
774 qrs_tmp(i,k,3) = qrs(i,k,3)
777 call slope_wsm6(qrs_tmp,den_tmp,denfac,t,rslope,rslopeb,rslope2,rslope3, &
778 work1,its,ite,kts,kte)
779 !------------------------------------------------------------------
780 ! work1: the thermodynamic term in the denominator associated with
781 ! heat conduction and vapor diffusion
783 ! work2: parameter associated with the ventilation effects(y93)
787 work1(i,k,1) = diffac(xl(i,k),p(i,k),t(i,k),den(i,k),qs(i,k,1))
788 work1(i,k,2) = diffac(xls,p(i,k),t(i,k),den(i,k),qs(i,k,2))
789 work2(i,k) = venfac(p(i,k),t(i,k),den(i,k))
793 !===============================================================
795 ! warm rain processes
797 ! - follows the processes in RH83 and LFO except for autoconcersion
799 !===============================================================
803 supsat = max(q(i,k),qmin)-qs(i,k,1)
805 !---------------------------------------------------------------
806 ! praut: auto conversion rate from cloud to rain [HDC 16]
808 !---------------------------------------------------------------
809 if(qci(i,k,1).gt.qc0) then
810 praut(i,k) = qck1*qci(i,k,1)**(7./3.)
811 praut(i,k) = min(praut(i,k),qci(i,k,1)/dtcld)
813 !---------------------------------------------------------------
814 ! pracw: accretion of cloud water by rain [HL A40] [LFO 51]
816 !---------------------------------------------------------------
817 if(qrs(i,k,1).gt.qcrmin.and.qci(i,k,1).gt.qmin) then
818 pracw(i,k) = min(pacrr*rslope3(i,k,1)*rslopeb(i,k,1) &
819 *qci(i,k,1)*denfac(i,k),qci(i,k,1)/dtcld)
821 !---------------------------------------------------------------
822 ! prevp: evaporation/condensation rate of rain [HDC 14]
824 !---------------------------------------------------------------
825 if(qrs(i,k,1).gt.0.) then
826 coeres = rslope2(i,k,1)*sqrt(rslope(i,k,1)*rslopeb(i,k,1))
827 prevp(i,k) = (rh(i,k,1)-1.)*(precr1*rslope2(i,k,1) &
828 +precr2*work2(i,k)*coeres)/work1(i,k,1)
829 if(prevp(i,k).lt.0.) then
830 prevp(i,k) = max(prevp(i,k),-qrs(i,k,1)/dtcld)
831 prevp(i,k) = max(prevp(i,k),satdt/2)
833 prevp(i,k) = min(prevp(i,k),satdt/2)
839 !===============================================================
841 ! cold rain processes
843 ! - follows the revised ice microphysics processes in HDC
844 ! - the processes same as in RH83 and RH84 and LFO behave
845 ! following ice crystal hapits defined in HDC, inclduing
846 ! intercept parameter for snow (n0s), ice crystal number
847 ! concentration (ni), ice nuclei number concentration
848 ! (n0i), ice diameter (d)
850 !===============================================================
855 n0sfac(i,k) = max(min(exp(alpha*supcol),n0smax/n0s),1.)
856 supsat = max(q(i,k),qmin)-qs(i,k,2)
859 !-------------------------------------------------------------
860 ! Ni: ice crystal number concentraiton [HDC 5c]
861 !-------------------------------------------------------------
862 ! xni(i,k) = min(max(5.38e7*(den(i,k) &
863 ! *max(qci(i,k,2),qmin))**0.75,1.e3),1.e6)
864 temp = (den(i,k)*max(qci(i,k,2),qmin))
865 temp = sqrt(sqrt(temp*temp*temp))
866 xni(i,k) = min(max(5.38e7*temp,1.e3),1.e6)
867 eacrs = exp(0.07*(-supcol))
869 xmi = den(i,k)*qci(i,k,2)/xni(i,k)
870 diameter = min(dicon * sqrt(xmi),dimax)
871 vt2i = 1.49e4*diameter**1.31
872 vt2r=pvtr*rslopeb(i,k,1)*denfac(i,k)
873 vt2s=pvts*rslopeb(i,k,2)*denfac(i,k)
874 vt2g=pvtg*rslopeb(i,k,3)*denfac(i,k)
875 qsum(i,k) = max( (qrs(i,k,2)+qrs(i,k,3)), 1.E-15)
876 if(qsum(i,k) .gt. 1.e-15) then
877 vt2ave=(vt2s*qrs(i,k,2)+vt2g*qrs(i,k,3))/(qsum(i,k))
881 if(supcol.gt.0.and.qci(i,k,2).gt.qmin) then
882 if(qrs(i,k,1).gt.qcrmin) then
883 !-------------------------------------------------------------
884 ! praci: Accretion of cloud ice by rain [HL A15] [LFO 25]
886 !-------------------------------------------------------------
887 acrfac = 2.*rslope3(i,k,1)+2.*diameter*rslope2(i,k,1) &
888 +diameter**2*rslope(i,k,1)
889 praci(i,k) = pi*qci(i,k,2)*n0r*abs(vt2r-vt2i)*acrfac/4.
890 praci(i,k) = min(praci(i,k),qci(i,k,2)/dtcld)
891 !-------------------------------------------------------------
892 ! piacr: Accretion of rain by cloud ice [HL A19] [LFO 26]
893 ! (T<T0: R->S or R->G)
894 !-------------------------------------------------------------
895 piacr(i,k) = pi**2*avtr*n0r*denr*xni(i,k)*denfac(i,k) &
896 *g6pbr*rslope3(i,k,1)*rslope3(i,k,1) &
897 *rslopeb(i,k,1)/24./den(i,k)
898 piacr(i,k) = min(piacr(i,k),qrs(i,k,1)/dtcld)
900 !-------------------------------------------------------------
901 ! psaci: Accretion of cloud ice by snow [HDC 10]
903 !-------------------------------------------------------------
904 if(qrs(i,k,2).gt.qcrmin) then
905 acrfac = 2.*rslope3(i,k,2)+2.*diameter*rslope2(i,k,2) &
906 +diameter**2*rslope(i,k,2)
907 psaci(i,k) = pi*qci(i,k,2)*eacrs*n0s*n0sfac(i,k) &
908 *abs(vt2ave-vt2i)*acrfac/4.
909 psaci(i,k) = min(psaci(i,k),qci(i,k,2)/dtcld)
911 !-------------------------------------------------------------
912 ! pgaci: Accretion of cloud ice by graupel [HL A17] [LFO 41]
914 !-------------------------------------------------------------
915 if(qrs(i,k,3).gt.qcrmin) then
916 egi = exp(0.07*(-supcol))
917 acrfac = 2.*rslope3(i,k,3)+2.*diameter*rslope2(i,k,3) &
918 +diameter**2*rslope(i,k,3)
919 pgaci(i,k) = pi*egi*qci(i,k,2)*n0g*abs(vt2ave-vt2i)*acrfac/4.
920 pgaci(i,k) = min(pgaci(i,k),qci(i,k,2)/dtcld)
923 !-------------------------------------------------------------
924 ! psacw: Accretion of cloud water by snow [HL A7] [LFO 24]
925 ! (T<T0: C->S, and T>=T0: C->R)
926 !-------------------------------------------------------------
927 if(qrs(i,k,2).gt.qcrmin.and.qci(i,k,1).gt.qmin) then
928 psacw(i,k) = min(pacrc*n0sfac(i,k)*rslope3(i,k,2)*rslopeb(i,k,2) &
929 *qci(i,k,1)*denfac(i,k),qci(i,k,1)/dtcld)
931 !-------------------------------------------------------------
932 ! pgacw: Accretion of cloud water by graupel [HL A6] [LFO 40]
933 ! (T<T0: C->G, and T>=T0: C->R)
934 !-------------------------------------------------------------
935 if(qrs(i,k,3).gt.qcrmin.and.qci(i,k,1).gt.qmin) then
936 pgacw(i,k) = min(pacrg*rslope3(i,k,3)*rslopeb(i,k,3) &
937 *qci(i,k,1)*denfac(i,k),qci(i,k,1)/dtcld)
939 !-------------------------------------------------------------
940 ! paacw: Accretion of cloud water by averaged snow/graupel
941 ! (T<T0: C->G or S, and T>=T0: C->R)
942 !-------------------------------------------------------------
943 if(qrs(i,k,2).gt.qcrmin.and.qrs(i,k,3).gt.qcrmin) then
944 paacw(i,k) = (qrs(i,k,2)*psacw(i,k)+qrs(i,k,3)*pgacw(i,k)) &
947 !-------------------------------------------------------------
948 ! pracs: Accretion of snow by rain [HL A11] [LFO 27]
950 !-------------------------------------------------------------
951 if(qrs(i,k,2).gt.qcrmin.and.qrs(i,k,1).gt.qcrmin) then
953 acrfac = 5.*rslope3(i,k,2)*rslope3(i,k,2)*rslope(i,k,1) &
954 +2.*rslope3(i,k,2)*rslope2(i,k,2)*rslope2(i,k,1) &
955 +.5*rslope2(i,k,2)*rslope2(i,k,2)*rslope3(i,k,1)
956 pracs(i,k) = pi**2*n0r*n0s*n0sfac(i,k)*abs(vt2r-vt2ave) &
957 *(dens/den(i,k))*acrfac
958 pracs(i,k) = min(pracs(i,k),qrs(i,k,2)/dtcld)
960 !-------------------------------------------------------------
961 ! psacr: Accretion of rain by snow [HL A10] [LFO 28]
962 ! (T<T0:R->S or R->G) (T>=T0: enhance melting of snow)
963 !-------------------------------------------------------------
964 acrfac = 5.*rslope3(i,k,1)*rslope3(i,k,1)*rslope(i,k,2) &
965 +2.*rslope3(i,k,1)*rslope2(i,k,1)*rslope2(i,k,2) &
966 +.5*rslope2(i,k,1)*rslope2(i,k,1)*rslope3(i,k,2)
967 psacr(i,k) = pi**2*n0r*n0s*n0sfac(i,k)*abs(vt2ave-vt2r) &
968 *(denr/den(i,k))*acrfac
969 psacr(i,k) = min(psacr(i,k),qrs(i,k,1)/dtcld)
971 !-------------------------------------------------------------
972 ! pgacr: Accretion of rain by graupel [HL A12] [LFO 42]
973 ! (T<T0: R->G) (T>=T0: enhance melting of graupel)
974 !-------------------------------------------------------------
975 if(qrs(i,k,3).gt.qcrmin.and.qrs(i,k,1).gt.qcrmin) then
976 acrfac = 5.*rslope3(i,k,1)*rslope3(i,k,1)*rslope(i,k,3) &
977 +2.*rslope3(i,k,1)*rslope2(i,k,1)*rslope2(i,k,3) &
978 +.5*rslope2(i,k,1)*rslope2(i,k,1)*rslope3(i,k,3)
979 pgacr(i,k) = pi**2*n0r*n0g*abs(vt2ave-vt2r)*(denr/den(i,k)) &
981 pgacr(i,k) = min(pgacr(i,k),qrs(i,k,1)/dtcld)
984 !-------------------------------------------------------------
985 ! pgacs: Accretion of snow by graupel [HL A13] [LFO 29]
986 ! (S->G): This process is eliminated in V3.0 with the
987 ! new combined snow/graupel fall speeds
988 !-------------------------------------------------------------
989 if(qrs(i,k,3).gt.qcrmin.and.qrs(i,k,2).gt.qcrmin) then
994 !-------------------------------------------------------------
995 ! pseml: Enhanced melting of snow by accretion of water [HL A34]
997 !-------------------------------------------------------------
998 if(qrs(i,k,2).gt.0.) &
999 pseml(i,k) = min(max(cliq*supcol*(paacw(i,k)+psacr(i,k)) &
1000 /xlf,-qrs(i,k,2)/dtcld),0.)
1001 !-------------------------------------------------------------
1002 ! pgeml: Enhanced melting of graupel by accretion of water [HL A24] [RH84 A21-A22]
1004 !-------------------------------------------------------------
1005 if(qrs(i,k,3).gt.0.) &
1006 pgeml(i,k) = min(max(cliq*supcol*(paacw(i,k)+pgacr(i,k)) &
1007 /xlf,-qrs(i,k,3)/dtcld),0.)
1009 if(supcol.gt.0) then
1010 !-------------------------------------------------------------
1011 ! pidep: Deposition/Sublimation rate of ice [HDC 9]
1012 ! (T<T0: V->I or I->V)
1013 !-------------------------------------------------------------
1014 if(qci(i,k,2).gt.0.and.ifsat.ne.1) then
1015 pidep(i,k) = 4.*diameter*xni(i,k)*(rh(i,k,2)-1.)/work1(i,k,2)
1016 supice = satdt-prevp(i,k)
1017 if(pidep(i,k).lt.0.) then
1018 pidep(i,k) = max(max(pidep(i,k),satdt/2),supice)
1019 pidep(i,k) = max(pidep(i,k),-qci(i,k,2)/dtcld)
1021 pidep(i,k) = min(min(pidep(i,k),satdt/2),supice)
1023 if(abs(prevp(i,k)+pidep(i,k)).ge.abs(satdt)) ifsat = 1
1025 !-------------------------------------------------------------
1026 ! psdep: deposition/sublimation rate of snow [HDC 14]
1027 ! (T<T0: V->S or S->V)
1028 !-------------------------------------------------------------
1029 if(qrs(i,k,2).gt.0..and.ifsat.ne.1) then
1030 coeres = rslope2(i,k,2)*sqrt(rslope(i,k,2)*rslopeb(i,k,2))
1031 psdep(i,k) = (rh(i,k,2)-1.)*n0sfac(i,k)*(precs1*rslope2(i,k,2) &
1032 + precs2*work2(i,k)*coeres)/work1(i,k,2)
1033 supice = satdt-prevp(i,k)-pidep(i,k)
1034 if(psdep(i,k).lt.0.) then
1035 psdep(i,k) = max(psdep(i,k),-qrs(i,k,2)/dtcld)
1036 psdep(i,k) = max(max(psdep(i,k),satdt/2),supice)
1038 psdep(i,k) = min(min(psdep(i,k),satdt/2),supice)
1040 if(abs(prevp(i,k)+pidep(i,k)+psdep(i,k)).ge.abs(satdt)) &
1043 !-------------------------------------------------------------
1044 ! pgdep: deposition/sublimation rate of graupel [HL A21] [LFO 46]
1045 ! (T<T0: V->G or G->V)
1046 !-------------------------------------------------------------
1047 if(qrs(i,k,3).gt.0..and.ifsat.ne.1) then
1048 coeres = rslope2(i,k,3)*sqrt(rslope(i,k,3)*rslopeb(i,k,3))
1049 pgdep(i,k) = (rh(i,k,2)-1.)*(precg1*rslope2(i,k,3) &
1050 +precg2*work2(i,k)*coeres)/work1(i,k,2)
1051 supice = satdt-prevp(i,k)-pidep(i,k)-psdep(i,k)
1052 if(pgdep(i,k).lt.0.) then
1053 pgdep(i,k) = max(pgdep(i,k),-qrs(i,k,3)/dtcld)
1054 pgdep(i,k) = max(max(pgdep(i,k),satdt/2),supice)
1056 pgdep(i,k) = min(min(pgdep(i,k),satdt/2),supice)
1058 if(abs(prevp(i,k)+pidep(i,k)+psdep(i,k)+pgdep(i,k)).ge. &
1059 abs(satdt)) ifsat = 1
1061 !-------------------------------------------------------------
1062 ! pigen: generation(nucleation) of ice from vapor [HL 50] [HDC 7-8]
1064 !-------------------------------------------------------------
1065 if(supsat.gt.0.and.ifsat.ne.1) then
1066 supice = satdt-prevp(i,k)-pidep(i,k)-psdep(i,k)-pgdep(i,k)
1067 xni0 = 1.e3*exp(0.1*supcol)
1068 roqi0 = 4.92e-11*xni0**1.33
1069 pigen(i,k) = max(0.,(roqi0/den(i,k)-max(qci(i,k,2),0.))/dtcld)
1070 pigen(i,k) = min(min(pigen(i,k),satdt),supice)
1073 !-------------------------------------------------------------
1074 ! psaut: conversion(aggregation) of ice to snow [HDC 12]
1076 !-------------------------------------------------------------
1077 if(qci(i,k,2).gt.0.) then
1078 qimax = roqimax/den(i,k)
1079 psaut(i,k) = max(0.,(qci(i,k,2)-qimax)/dtcld)
1082 !-------------------------------------------------------------
1083 ! pgaut: conversion(aggregation) of snow to graupel [HL A4] [LFO 37]
1085 !-------------------------------------------------------------
1086 if(qrs(i,k,2).gt.0.) then
1087 alpha2 = 1.e-3*exp(0.09*(-supcol))
1088 pgaut(i,k) = min(max(0.,alpha2*(qrs(i,k,2)-qs0)),qrs(i,k,2)/dtcld)
1092 !-------------------------------------------------------------
1093 ! psevp: Evaporation of melting snow [HL A35] [RH83 A27]
1095 !-------------------------------------------------------------
1096 if(supcol.lt.0.) then
1097 if(qrs(i,k,2).gt.0..and.rh(i,k,1).lt.1.) then
1098 coeres = rslope2(i,k,2)*sqrt(rslope(i,k,2)*rslopeb(i,k,2))
1099 psevp(i,k) = (rh(i,k,1)-1.)*n0sfac(i,k)*(precs1 &
1100 *rslope2(i,k,2)+precs2*work2(i,k) &
1101 *coeres)/work1(i,k,1)
1102 psevp(i,k) = min(max(psevp(i,k),-qrs(i,k,2)/dtcld),0.)
1104 !-------------------------------------------------------------
1105 ! pgevp: Evaporation of melting graupel [HL A25] [RH84 A19]
1107 !-------------------------------------------------------------
1108 if(qrs(i,k,3).gt.0..and.rh(i,k,1).lt.1.) then
1109 coeres = rslope2(i,k,3)*sqrt(rslope(i,k,3)*rslopeb(i,k,3))
1110 pgevp(i,k) = (rh(i,k,1)-1.)*(precg1*rslope2(i,k,3) &
1111 +precg2*work2(i,k)*coeres)/work1(i,k,1)
1112 pgevp(i,k) = min(max(pgevp(i,k),-qrs(i,k,3)/dtcld),0.)
1119 !----------------------------------------------------------------
1120 ! check mass conservation of generation terms and feedback to the
1128 if(qrs(i,k,1).lt.1.e-4.and.qrs(i,k,2).lt.1.e-4) delta2=1.
1129 if(qrs(i,k,1).lt.1.e-4) delta3=1.
1130 if(t(i,k).le.t0c) then
1134 value = max(qmin,qci(i,k,1))
1135 source = (praut(i,k)+pracw(i,k)+paacw(i,k)+paacw(i,k))*dtcld
1136 if (source.gt.value) then
1137 factor = value/source
1138 praut(i,k) = praut(i,k)*factor
1139 pracw(i,k) = pracw(i,k)*factor
1140 paacw(i,k) = paacw(i,k)*factor
1145 value = max(qmin,qci(i,k,2))
1146 source = (psaut(i,k)-pigen(i,k)-pidep(i,k)+praci(i,k)+psaci(i,k) &
1148 if (source.gt.value) then
1149 factor = value/source
1150 psaut(i,k) = psaut(i,k)*factor
1151 pigen(i,k) = pigen(i,k)*factor
1152 pidep(i,k) = pidep(i,k)*factor
1153 praci(i,k) = praci(i,k)*factor
1154 psaci(i,k) = psaci(i,k)*factor
1155 pgaci(i,k) = pgaci(i,k)*factor
1160 value = max(qmin,qrs(i,k,1))
1161 source = (-praut(i,k)-prevp(i,k)-pracw(i,k)+piacr(i,k)+psacr(i,k) &
1163 if (source.gt.value) then
1164 factor = value/source
1165 praut(i,k) = praut(i,k)*factor
1166 prevp(i,k) = prevp(i,k)*factor
1167 pracw(i,k) = pracw(i,k)*factor
1168 piacr(i,k) = piacr(i,k)*factor
1169 psacr(i,k) = psacr(i,k)*factor
1170 pgacr(i,k) = pgacr(i,k)*factor
1175 value = max(qmin,qrs(i,k,2))
1176 source = -(psdep(i,k)+psaut(i,k)-pgaut(i,k)+paacw(i,k)+piacr(i,k) &
1177 *delta3+praci(i,k)*delta3-pracs(i,k)*(1.-delta2) &
1178 +psacr(i,k)*delta2+psaci(i,k)-pgacs(i,k) )*dtcld
1179 if (source.gt.value) then
1180 factor = value/source
1181 psdep(i,k) = psdep(i,k)*factor
1182 psaut(i,k) = psaut(i,k)*factor
1183 pgaut(i,k) = pgaut(i,k)*factor
1184 paacw(i,k) = paacw(i,k)*factor
1185 piacr(i,k) = piacr(i,k)*factor
1186 praci(i,k) = praci(i,k)*factor
1187 psaci(i,k) = psaci(i,k)*factor
1188 pracs(i,k) = pracs(i,k)*factor
1189 psacr(i,k) = psacr(i,k)*factor
1190 pgacs(i,k) = pgacs(i,k)*factor
1195 value = max(qmin,qrs(i,k,3))
1196 source = -(pgdep(i,k)+pgaut(i,k) &
1197 +piacr(i,k)*(1.-delta3)+praci(i,k)*(1.-delta3) &
1198 +psacr(i,k)*(1.-delta2)+pracs(i,k)*(1.-delta2) &
1199 +pgaci(i,k)+paacw(i,k)+pgacr(i,k)+pgacs(i,k))*dtcld
1200 if (source.gt.value) then
1201 factor = value/source
1202 pgdep(i,k) = pgdep(i,k)*factor
1203 pgaut(i,k) = pgaut(i,k)*factor
1204 piacr(i,k) = piacr(i,k)*factor
1205 praci(i,k) = praci(i,k)*factor
1206 psacr(i,k) = psacr(i,k)*factor
1207 pracs(i,k) = pracs(i,k)*factor
1208 paacw(i,k) = paacw(i,k)*factor
1209 pgaci(i,k) = pgaci(i,k)*factor
1210 pgacr(i,k) = pgacr(i,k)*factor
1211 pgacs(i,k) = pgacs(i,k)*factor
1214 work2(i,k)=-(prevp(i,k)+psdep(i,k)+pgdep(i,k)+pigen(i,k)+pidep(i,k))
1216 q(i,k) = q(i,k)+work2(i,k)*dtcld
1217 qci(i,k,1) = max(qci(i,k,1)-(praut(i,k)+pracw(i,k) &
1218 +paacw(i,k)+paacw(i,k))*dtcld,0.)
1219 qrs(i,k,1) = max(qrs(i,k,1)+(praut(i,k)+pracw(i,k) &
1220 +prevp(i,k)-piacr(i,k)-pgacr(i,k) &
1221 -psacr(i,k))*dtcld,0.)
1222 qci(i,k,2) = max(qci(i,k,2)-(psaut(i,k)+praci(i,k) &
1223 +psaci(i,k)+pgaci(i,k)-pigen(i,k)-pidep(i,k)) &
1225 qrs(i,k,2) = max(qrs(i,k,2)+(psdep(i,k)+psaut(i,k)+paacw(i,k) &
1226 -pgaut(i,k)+piacr(i,k)*delta3 &
1227 +praci(i,k)*delta3+psaci(i,k)-pgacs(i,k) &
1228 -pracs(i,k)*(1.-delta2)+psacr(i,k)*delta2) &
1230 qrs(i,k,3) = max(qrs(i,k,3)+(pgdep(i,k)+pgaut(i,k) &
1231 +piacr(i,k)*(1.-delta3) &
1232 +praci(i,k)*(1.-delta3)+psacr(i,k)*(1.-delta2) &
1233 +pracs(i,k)*(1.-delta2)+pgaci(i,k)+paacw(i,k) &
1234 +pgacr(i,k)+pgacs(i,k))*dtcld,0.)
1236 xlwork2 = -xls*(psdep(i,k)+pgdep(i,k)+pidep(i,k)+pigen(i,k)) &
1237 -xl(i,k)*prevp(i,k)-xlf*(piacr(i,k)+paacw(i,k) &
1238 +paacw(i,k)+pgacr(i,k)+psacr(i,k))
1239 t(i,k) = t(i,k)-xlwork2/cpm(i,k)*dtcld
1244 value = max(qmin,qci(i,k,1))
1245 source=(praut(i,k)+pracw(i,k)+paacw(i,k)+paacw(i,k))*dtcld
1246 if (source.gt.value) then
1247 factor = value/source
1248 praut(i,k) = praut(i,k)*factor
1249 pracw(i,k) = pracw(i,k)*factor
1250 paacw(i,k) = paacw(i,k)*factor
1255 value = max(qmin,qrs(i,k,1))
1256 source = (-paacw(i,k)-praut(i,k)+pseml(i,k)+pgeml(i,k)-pracw(i,k) &
1257 -paacw(i,k)-prevp(i,k))*dtcld
1258 if (source.gt.value) then
1259 factor = value/source
1260 praut(i,k) = praut(i,k)*factor
1261 prevp(i,k) = prevp(i,k)*factor
1262 pracw(i,k) = pracw(i,k)*factor
1263 paacw(i,k) = paacw(i,k)*factor
1264 pseml(i,k) = pseml(i,k)*factor
1265 pgeml(i,k) = pgeml(i,k)*factor
1270 value = max(qcrmin,qrs(i,k,2))
1271 source=(pgacs(i,k)-pseml(i,k)-psevp(i,k))*dtcld
1272 if (source.gt.value) then
1273 factor = value/source
1274 pgacs(i,k) = pgacs(i,k)*factor
1275 psevp(i,k) = psevp(i,k)*factor
1276 pseml(i,k) = pseml(i,k)*factor
1281 value = max(qcrmin,qrs(i,k,3))
1282 source=-(pgacs(i,k)+pgevp(i,k)+pgeml(i,k))*dtcld
1283 if (source.gt.value) then
1284 factor = value/source
1285 pgacs(i,k) = pgacs(i,k)*factor
1286 pgevp(i,k) = pgevp(i,k)*factor
1287 pgeml(i,k) = pgeml(i,k)*factor
1289 work2(i,k)=-(prevp(i,k)+psevp(i,k)+pgevp(i,k))
1291 q(i,k) = q(i,k)+work2(i,k)*dtcld
1292 qci(i,k,1) = max(qci(i,k,1)-(praut(i,k)+pracw(i,k) &
1293 +paacw(i,k)+paacw(i,k))*dtcld,0.)
1294 qrs(i,k,1) = max(qrs(i,k,1)+(praut(i,k)+pracw(i,k) &
1295 +prevp(i,k)+paacw(i,k)+paacw(i,k)-pseml(i,k) &
1296 -pgeml(i,k))*dtcld,0.)
1297 qrs(i,k,2) = max(qrs(i,k,2)+(psevp(i,k)-pgacs(i,k) &
1298 +pseml(i,k))*dtcld,0.)
1299 qrs(i,k,3) = max(qrs(i,k,3)+(pgacs(i,k)+pgevp(i,k) &
1300 +pgeml(i,k))*dtcld,0.)
1302 xlwork2 = -xl(i,k)*(prevp(i,k)+psevp(i,k)+pgevp(i,k)) &
1303 -xlf*(pseml(i,k)+pgeml(i,k))
1304 t(i,k) = t(i,k)-xlwork2/cpm(i,k)*dtcld
1309 ! Inline expansion for fpvs
1310 ! qs(i,k,1) = fpvs(t(i,k),0,rd,rv,cpv,cliq,cice,xlv0,xls,psat,t0c)
1311 ! qs(i,k,2) = fpvs(t(i,k),1,rd,rv,cpv,cliq,cice,xlv0,xls,psat,t0c)
1321 xbi=xai+hsub/(rv*ttp)
1325 qs(i,k,1)=psat*exp(log(tr)*(xa))*exp(xb*(1.-tr))
1326 qs(i,k,1) = min(qs(i,k,1),0.99*p(i,k))
1327 qs(i,k,1) = ep2 * qs(i,k,1) / (p(i,k) - qs(i,k,1))
1328 qs(i,k,1) = max(qs(i,k,1),qmin)
1330 if(t(i,k).lt.ttp) then
1331 qs(i,k,2)=psat*exp(log(tr)*(xai))*exp(xbi*(1.-tr))
1333 qs(i,k,2)=psat*exp(log(tr)*(xa))*exp(xb*(1.-tr))
1335 qs(i,k,2) = min(qs(i,k,2),0.99*p(i,k))
1336 qs(i,k,2) = ep2 * qs(i,k,2) / (p(i,k) - qs(i,k,2))
1337 qs(i,k,2) = max(qs(i,k,2),qmin)
1341 !----------------------------------------------------------------
1342 ! pcond: condensational/evaporational rate of cloud water [HL A46] [RH83 A6]
1343 ! if there exists additional water vapor condensated/if
1344 ! evaporation of cloud water is not enough to remove subsaturation
1348 work1(i,k,1) = conden(t(i,k),q(i,k),qs(i,k,1),xl(i,k),cpm(i,k))
1349 work2(i,k) = qci(i,k,1)+work1(i,k,1)
1350 pcond(i,k) = min(max(work1(i,k,1)/dtcld,0.),max(q(i,k),0.)/dtcld)
1351 if(qci(i,k,1).gt.0..and.work1(i,k,1).lt.0.) &
1352 pcond(i,k) = max(work1(i,k,1),-qci(i,k,1))/dtcld
1353 q(i,k) = q(i,k)-pcond(i,k)*dtcld
1354 qci(i,k,1) = max(qci(i,k,1)+pcond(i,k)*dtcld,0.)
1355 t(i,k) = t(i,k)+pcond(i,k)*xl(i,k)/cpm(i,k)*dtcld
1360 !----------------------------------------------------------------
1361 ! padding for small values
1365 if(qci(i,k,1).le.qmin) qci(i,k,1) = 0.0
1366 if(qci(i,k,2).le.qmin) qci(i,k,2) = 0.0
1370 END SUBROUTINE wsm62d
1371 ! ...................................................................
1372 REAL FUNCTION rgmma(x)
1373 !-------------------------------------------------------------------
1375 !-------------------------------------------------------------------
1376 ! rgmma function: use infinite product form
1378 PARAMETER (euler=0.577215664901532)
1384 rgmma=x*exp(euler*x)
1387 rgmma=rgmma*(1.000+x/y)*exp(-x/y)
1393 !--------------------------------------------------------------------------
1394 REAL FUNCTION fpvs(t,ice,rd,rv,cvap,cliq,cice,hvap,hsub,psat,t0c)
1395 !--------------------------------------------------------------------------
1397 !--------------------------------------------------------------------------
1398 REAL t,rd,rv,cvap,cliq,cice,hvap,hsub,psat,t0c,dldt,xa,xb,dldti, &
1401 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1408 xbi=xai+hsub/(rv*ttp)
1410 if(t.lt.ttp.and.ice.eq.1) then
1411 fpvs=psat*(tr**xai)*exp(xbi*(1.-tr))
1413 fpvs=psat*(tr**xa)*exp(xb*(1.-tr))
1415 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1417 !-------------------------------------------------------------------
1418 SUBROUTINE wsm6init(den0,denr,dens,cl,cpv,allowed_to_read)
1419 !-------------------------------------------------------------------
1421 !-------------------------------------------------------------------
1422 !.... constants which may not be tunable
1423 REAL, INTENT(IN) :: den0,denr,dens,cl,cpv
1424 LOGICAL, INTENT(IN) :: allowed_to_read
1429 qc0 = 4./3.*pi*denr*r0**3*xncr/den0 ! 0.419e-3 -- .61e-3
1430 qck1 = .104*9.8*peaut/(xncr*denr)**(1./3.)/xmyu*den0**(4./3.) ! 7.03
1437 g1pbr = rgmma(bvtr1)
1438 g3pbr = rgmma(bvtr3)
1439 g4pbr = rgmma(bvtr4) ! 17.837825
1440 g6pbr = rgmma(bvtr6)
1441 g5pbro2 = rgmma(bvtr2) ! 1.8273
1442 pvtr = avtr*g4pbr/6.
1444 pacrr = pi*n0r*avtr*g3pbr*.25*eacrr
1445 precr1 = 2.*pi*n0r*.78
1446 precr2 = 2.*pi*n0r*.31*avtr**.5*g5pbro2
1447 roqimax = 2.08e22*dimax**8
1453 g1pbs = rgmma(bvts1) !.8875
1454 g3pbs = rgmma(bvts3)
1455 g4pbs = rgmma(bvts4) ! 12.0786
1456 g5pbso2 = rgmma(bvts2)
1457 pvts = avts*g4pbs/6.
1458 pacrs = pi*n0s*avts*g3pbs*.25
1460 precs2 = 4.*n0s*.44*avts**.5*g5pbso2
1461 pidn0r = pi*denr*n0r
1462 pidn0s = pi*dens*n0s
1464 pacrc = pi*n0s*avts*g3pbs*.25*eacrc
1470 g1pbg = rgmma(bvtg1)
1471 g3pbg = rgmma(bvtg3)
1472 g4pbg = rgmma(bvtg4)
1473 pacrg = pi*n0g*avtg*g3pbg*.25
1474 g5pbgo2 = rgmma(bvtg2)
1475 pvtg = avtg*g4pbg/6.
1476 precg1 = 2.*pi*n0g*.78
1477 precg2 = 2.*pi*n0g*.31*avtg**.5*g5pbgo2
1478 pidn0g = pi*deng*n0g
1480 rslopermax = 1./lamdarmax
1481 rslopesmax = 1./lamdasmax
1482 rslopegmax = 1./lamdagmax
1483 rsloperbmax = rslopermax ** bvtr
1484 rslopesbmax = rslopesmax ** bvts
1485 rslopegbmax = rslopegmax ** bvtg
1486 rsloper2max = rslopermax * rslopermax
1487 rslopes2max = rslopesmax * rslopesmax
1488 rslopeg2max = rslopegmax * rslopegmax
1489 rsloper3max = rsloper2max * rslopermax
1490 rslopes3max = rslopes2max * rslopesmax
1491 rslopeg3max = rslopeg2max * rslopegmax
1493 END SUBROUTINE wsm6init
1494 !------------------------------------------------------------------------------
1495 subroutine slope_wsm6(qrs,den,denfac,t,rslope,rslopeb,rslope2,rslope3, &
1498 INTEGER :: its,ite, jts,jte, kts,kte
1499 REAL, DIMENSION( its:ite , kts:kte,3) :: &
1506 REAL, DIMENSION( its:ite , kts:kte) :: &
1510 REAL, PARAMETER :: t0c = 273.15
1511 REAL, DIMENSION( its:ite , kts:kte ) :: &
1513 REAL :: lamdar, lamdas, lamdag, x, y, z, supcol
1515 !----------------------------------------------------------------
1516 ! size distributions: (x=mixing ratio, y=air density):
1517 ! valid for mixing ratio > 1.e-9 kg/kg.
1518 lamdar(x,y)= sqrt(sqrt(pidn0r/(x*y))) ! (pidn0r/(x*y))**.25
1519 lamdas(x,y,z)= sqrt(sqrt(pidn0s*z/(x*y))) ! (pidn0s*z/(x*y))**.25
1520 lamdag(x,y)= sqrt(sqrt(pidn0g/(x*y))) ! (pidn0g/(x*y))**.25
1525 !---------------------------------------------------------------
1526 ! n0s: Intercept parameter for snow [m-4] [HDC 6]
1527 !---------------------------------------------------------------
1528 n0sfac(i,k) = max(min(exp(alpha*supcol),n0smax/n0s),1.)
1529 if(qrs(i,k,1).le.qcrmin)then
1530 rslope(i,k,1) = rslopermax
1531 rslopeb(i,k,1) = rsloperbmax
1532 rslope2(i,k,1) = rsloper2max
1533 rslope3(i,k,1) = rsloper3max
1535 rslope(i,k,1) = 1./lamdar(qrs(i,k,1),den(i,k))
1536 rslopeb(i,k,1) = rslope(i,k,1)**bvtr
1537 rslope2(i,k,1) = rslope(i,k,1)*rslope(i,k,1)
1538 rslope3(i,k,1) = rslope2(i,k,1)*rslope(i,k,1)
1540 if(qrs(i,k,2).le.qcrmin)then
1541 rslope(i,k,2) = rslopesmax
1542 rslopeb(i,k,2) = rslopesbmax
1543 rslope2(i,k,2) = rslopes2max
1544 rslope3(i,k,2) = rslopes3max
1546 rslope(i,k,2) = 1./lamdas(qrs(i,k,2),den(i,k),n0sfac(i,k))
1547 rslopeb(i,k,2) = rslope(i,k,2)**bvts
1548 rslope2(i,k,2) = rslope(i,k,2)*rslope(i,k,2)
1549 rslope3(i,k,2) = rslope2(i,k,2)*rslope(i,k,2)
1551 if(qrs(i,k,3).le.qcrmin)then
1552 rslope(i,k,3) = rslopegmax
1553 rslopeb(i,k,3) = rslopegbmax
1554 rslope2(i,k,3) = rslopeg2max
1555 rslope3(i,k,3) = rslopeg3max
1557 rslope(i,k,3) = 1./lamdag(qrs(i,k,3),den(i,k))
1558 rslopeb(i,k,3) = rslope(i,k,3)**bvtg
1559 rslope2(i,k,3) = rslope(i,k,3)*rslope(i,k,3)
1560 rslope3(i,k,3) = rslope2(i,k,3)*rslope(i,k,3)
1562 vt(i,k,1) = pvtr*rslopeb(i,k,1)*denfac(i,k)
1563 vt(i,k,2) = pvts*rslopeb(i,k,2)*denfac(i,k)
1564 vt(i,k,3) = pvtg*rslopeb(i,k,3)*denfac(i,k)
1565 if(qrs(i,k,1).le.0.0) vt(i,k,1) = 0.0
1566 if(qrs(i,k,2).le.0.0) vt(i,k,2) = 0.0
1567 if(qrs(i,k,3).le.0.0) vt(i,k,3) = 0.0
1570 END subroutine slope_wsm6
1571 !-----------------------------------------------------------------------------
1572 subroutine slope_rain(qrs,den,denfac,t,rslope,rslopeb,rslope2,rslope3, &
1575 INTEGER :: its,ite, jts,jte, kts,kte
1576 REAL, DIMENSION( its:ite , kts:kte) :: &
1586 REAL, PARAMETER :: t0c = 273.15
1587 REAL, DIMENSION( its:ite , kts:kte ) :: &
1589 REAL :: lamdar, x, y, z, supcol
1591 !----------------------------------------------------------------
1592 ! size distributions: (x=mixing ratio, y=air density):
1593 ! valid for mixing ratio > 1.e-9 kg/kg.
1594 lamdar(x,y)= sqrt(sqrt(pidn0r/(x*y))) ! (pidn0r/(x*y))**.25
1598 if(qrs(i,k).le.qcrmin)then
1599 rslope(i,k) = rslopermax
1600 rslopeb(i,k) = rsloperbmax
1601 rslope2(i,k) = rsloper2max
1602 rslope3(i,k) = rsloper3max
1604 rslope(i,k) = 1./lamdar(qrs(i,k),den(i,k))
1605 rslopeb(i,k) = rslope(i,k)**bvtr
1606 rslope2(i,k) = rslope(i,k)*rslope(i,k)
1607 rslope3(i,k) = rslope2(i,k)*rslope(i,k)
1609 vt(i,k) = pvtr*rslopeb(i,k)*denfac(i,k)
1610 if(qrs(i,k).le.0.0) vt(i,k) = 0.0
1613 END subroutine slope_rain
1614 !------------------------------------------------------------------------------
1615 subroutine slope_snow(qrs,den,denfac,t,rslope,rslopeb,rslope2,rslope3, &
1618 INTEGER :: its,ite, jts,jte, kts,kte
1619 REAL, DIMENSION( its:ite , kts:kte) :: &
1629 REAL, PARAMETER :: t0c = 273.15
1630 REAL, DIMENSION( its:ite , kts:kte ) :: &
1632 REAL :: lamdas, x, y, z, supcol
1634 !----------------------------------------------------------------
1635 ! size distributions: (x=mixing ratio, y=air density):
1636 ! valid for mixing ratio > 1.e-9 kg/kg.
1637 lamdas(x,y,z)= sqrt(sqrt(pidn0s*z/(x*y))) ! (pidn0s*z/(x*y))**.25
1642 !---------------------------------------------------------------
1643 ! n0s: Intercept parameter for snow [m-4] [HDC 6]
1644 !---------------------------------------------------------------
1645 n0sfac(i,k) = max(min(exp(alpha*supcol),n0smax/n0s),1.)
1646 if(qrs(i,k).le.qcrmin)then
1647 rslope(i,k) = rslopesmax
1648 rslopeb(i,k) = rslopesbmax
1649 rslope2(i,k) = rslopes2max
1650 rslope3(i,k) = rslopes3max
1652 rslope(i,k) = 1./lamdas(qrs(i,k),den(i,k),n0sfac(i,k))
1653 rslopeb(i,k) = rslope(i,k)**bvts
1654 rslope2(i,k) = rslope(i,k)*rslope(i,k)
1655 rslope3(i,k) = rslope2(i,k)*rslope(i,k)
1657 vt(i,k) = pvts*rslopeb(i,k)*denfac(i,k)
1658 if(qrs(i,k).le.0.0) vt(i,k) = 0.0
1661 END subroutine slope_snow
1662 !----------------------------------------------------------------------------------
1663 subroutine slope_graup(qrs,den,denfac,t,rslope,rslopeb,rslope2,rslope3, &
1666 INTEGER :: its,ite, jts,jte, kts,kte
1667 REAL, DIMENSION( its:ite , kts:kte) :: &
1677 REAL, PARAMETER :: t0c = 273.15
1678 REAL, DIMENSION( its:ite , kts:kte ) :: &
1680 REAL :: lamdag, x, y, z, supcol
1682 !----------------------------------------------------------------
1683 ! size distributions: (x=mixing ratio, y=air density):
1684 ! valid for mixing ratio > 1.e-9 kg/kg.
1685 lamdag(x,y)= sqrt(sqrt(pidn0g/(x*y))) ! (pidn0g/(x*y))**.25
1689 !---------------------------------------------------------------
1690 ! n0s: Intercept parameter for snow [m-4] [HDC 6]
1691 !---------------------------------------------------------------
1692 if(qrs(i,k).le.qcrmin)then
1693 rslope(i,k) = rslopegmax
1694 rslopeb(i,k) = rslopegbmax
1695 rslope2(i,k) = rslopeg2max
1696 rslope3(i,k) = rslopeg3max
1698 rslope(i,k) = 1./lamdag(qrs(i,k),den(i,k))
1699 rslopeb(i,k) = rslope(i,k)**bvtg
1700 rslope2(i,k) = rslope(i,k)*rslope(i,k)
1701 rslope3(i,k) = rslope2(i,k)*rslope(i,k)
1703 vt(i,k) = pvtg*rslopeb(i,k)*denfac(i,k)
1704 if(qrs(i,k).le.0.0) vt(i,k) = 0.0
1707 END subroutine slope_graup
1708 !---------------------------------------------------------------------------------
1709 !-------------------------------------------------------------------
1710 SUBROUTINE nislfv_rain_plm(im,km,denl,denfacl,tkl,dzl,wwl,rql,precip,dt,id,iter)
1711 !-------------------------------------------------------------------
1713 ! for non-iteration semi-Lagrangain forward advection for cloud
1714 ! with mass conservation and positive definite advection
1715 ! 2nd order interpolation with monotonic piecewise linear method
1716 ! this routine is under assumption of decfl < 1 for semi_Lagrangian
1718 ! dzl depth of model layer in meter
1719 ! wwl terminal velocity at model layer m/s
1720 ! rql cloud density*mixing ration
1721 ! precip precipitation
1723 ! id kind of precip: 0 test case; 1 raindrop
1724 ! iter how many time to guess mean terminal velocity: 0 pure forward.
1725 ! 0 : use departure wind for advection
1726 ! 1 : use mean wind for advection
1727 ! > 1 : use mean wind after iter-1 iterations
1729 ! author: hann-ming henry juang <henry.juang@noaa.gov>
1730 ! implemented by song-you hong
1735 real dzl(im,km),wwl(im,km),rql(im,km),precip(im)
1736 real denl(im,km),denfacl(im,km),tkl(im,km)
1738 integer i,k,n,m,kk,kb,kt,iter
1739 real tl,tl2,qql,dql,qqd
1741 real zsum,qsum,dim,dip,c1,con1,fa1,fa2
1742 real allold, allnew, zz, dzamin, cflmax, decfl
1743 real dz(km), ww(km), qq(km), wd(km), wa(km), was(km)
1744 real den(km), denfac(km), tk(km)
1745 real wi(km+1), zi(km+1), za(km+1)
1746 real qn(km), qr(km),tmp(km),tmp1(km),tmp2(km),tmp3(km)
1747 real dza(km+1), qa(km+1), qmi(km+1), qpi(km+1)
1752 ! -----------------------------------
1757 denfac(:) = denfacl(i,:)
1759 ! skip for no precipitation for all layers
1762 allold = allold + qq(k)
1764 if(allold.le.0.0) then
1768 ! compute interface values
1771 zi(k+1) = zi(k)+dz(k)
1774 ! save departure wind
1778 ! plm is 2nd order, we can use 2nd order wi or 3rd order wi
1779 ! 2nd order interpolation to get wi
1783 wi(k) = (ww(k)*dz(k-1)+ww(k-1)*dz(k))/(dz(k-1)+dz(k))
1785 ! 3rd order interpolation to get wi
1789 wi(2) = 0.5*(ww(2)+ww(1))
1791 wi(k) = fa1*(ww(k)+ww(k-1))-fa2*(ww(k+1)+ww(k-2))
1793 wi(km) = 0.5*(ww(km)+ww(km-1))
1796 ! terminate of top of raingroup
1798 if( ww(k).eq.0.0 ) wi(k)=ww(k-1)
1804 decfl = (wi(k+1)-wi(k))*dt/dz(k)
1805 if( decfl .gt. con1 ) then
1806 wi(k) = wi(k+1) - con1*dz(k)/dt
1809 ! compute arrival point
1811 za(k) = zi(k) - wi(k)*dt
1815 dza(k) = za(k+1)-za(k)
1817 dza(km+1) = zi(km+1) - za(km+1)
1819 ! computer deformation at arrival point
1821 qa(k) = qq(k)*dz(k)/dza(k)
1822 qr(k) = qa(k)/den(k)
1825 ! call maxmin(km,1,qa,' arrival points ')
1827 ! compute arrival terminal velocity, and estimate mean terminal velocity
1828 ! then back to use mean terminal velocity
1829 if( n.le.iter ) then
1830 call slope_rain(qr,den,denfac,tk,tmp,tmp1,tmp2,tmp3,wa,1,1,1,km)
1831 if( n.ge.2 ) wa(1:km)=0.5*(wa(1:km)+was(1:km))
1834 ! print*,' slope_wsm3 ',qr(k)*1000.,den(k),denfac(k),tk(k),tmp(k),tmp1(k),tmp2(k),ww(k),wa(k)
1836 ! mean wind is average of departure and new arrival winds
1837 ww(k) = 0.5* ( wd(k)+wa(k) )
1844 ! estimate values at arrival cell interface with monotone
1846 dip=(qa(k+1)-qa(k))/(dza(k+1)+dza(k))
1847 dim=(qa(k)-qa(k-1))/(dza(k-1)+dza(k))
1848 if( dip*dim.le.0.0 ) then
1852 qpi(k)=qa(k)+0.5*(dip+dim)*dza(k)
1853 qmi(k)=2.0*qa(k)-qpi(k)
1854 if( qpi(k).lt.0.0 .or. qmi(k).lt.0.0 ) then
1865 ! interpolation to regular point
1873 if( zi(k).ge.za(km+1) ) then
1876 find_kb : do kk=kb,km
1877 if( zi(k).le.za(kk+1) ) then
1884 find_kt : do kk=kt,km
1885 if( zi(k+1).le.za(kk) ) then
1893 ! compute q with piecewise constant method
1895 tl=(zi(k)-za(kb))/dza(kb)
1896 th=(zi(k+1)-za(kb))/dza(kb)
1899 qqd=0.5*(qpi(kb)-qmi(kb))
1900 qqh=qqd*th2+qmi(kb)*th
1901 qql=qqd*tl2+qmi(kb)*tl
1902 qn(k) = (qqh-qql)/(th-tl)
1903 else if( kt.gt.kb ) then
1904 tl=(zi(k)-za(kb))/dza(kb)
1906 qqd=0.5*(qpi(kb)-qmi(kb))
1907 qql=qqd*tl2+qmi(kb)*tl
1909 zsum = (1.-tl)*dza(kb)
1911 if( kt-kb.gt.1 ) then
1913 zsum = zsum + dza(m)
1914 qsum = qsum + qa(m) * dza(m)
1917 th=(zi(k+1)-za(kt))/dza(kt)
1919 qqd=0.5*(qpi(kt)-qmi(kt))
1920 dqh=qqd*th2+qmi(kt)*th
1921 zsum = zsum + th*dza(kt)
1922 qsum = qsum + dqh*dza(kt)
1931 sum_precip: do k=1,km
1932 if( za(k).lt.0.0 .and. za(k+1).lt.0.0 ) then
1933 precip(i) = precip(i) + qa(k)*dza(k)
1935 else if ( za(k).lt.0.0 .and. za(k+1).ge.0.0 ) then
1936 precip(i) = precip(i) + qa(k)*(0.0-za(k))
1942 ! replace the new values
1945 ! ----------------------------------
1948 END SUBROUTINE nislfv_rain_plm
1949 !-------------------------------------------------------------------
1950 SUBROUTINE nislfv_rain_plm6(im,km,denl,denfacl,tkl,dzl,wwl,rql,rql2, precip1, precip2,dt,id,iter)
1951 !-------------------------------------------------------------------
1953 ! for non-iteration semi-Lagrangain forward advection for cloud
1954 ! with mass conservation and positive definite advection
1955 ! 2nd order interpolation with monotonic piecewise linear method
1956 ! this routine is under assumption of decfl < 1 for semi_Lagrangian
1958 ! dzl depth of model layer in meter
1959 ! wwl terminal velocity at model layer m/s
1960 ! rql cloud density*mixing ration
1961 ! precip precipitation
1963 ! id kind of precip: 0 test case; 1 raindrop
1964 ! iter how many time to guess mean terminal velocity: 0 pure forward.
1965 ! 0 : use departure wind for advection
1966 ! 1 : use mean wind for advection
1967 ! > 1 : use mean wind after iter-1 iterations
1969 ! author: hann-ming henry juang <henry.juang@noaa.gov>
1970 ! implemented by song-you hong
1975 real dzl(im,km),wwl(im,km),rql(im,km),rql2(im,km),precip(im),precip1(im),precip2(im)
1976 real denl(im,km),denfacl(im,km),tkl(im,km)
1978 integer i,k,n,m,kk,kb,kt,iter,ist
1979 real tl,tl2,qql,dql,qqd
1981 real zsum,qsum,dim,dip,c1,con1,fa1,fa2
1982 real allold, allnew, zz, dzamin, cflmax, decfl
1983 real dz(km), ww(km), qq(km), qq2(km), wd(km), wa(km), wa2(km), was(km)
1984 real den(km), denfac(km), tk(km)
1985 real wi(km+1), zi(km+1), za(km+1)
1986 real qn(km), qr(km),qr2(km),tmp(km),tmp1(km),tmp2(km),tmp3(km)
1987 real dza(km+1), qa(km+1), qa2(km+1),qmi(km+1), qpi(km+1)
1994 ! -----------------------------------
2000 denfac(:) = denfacl(i,:)
2002 ! skip for no precipitation for all layers
2005 allold = allold + qq(k)
2007 if(allold.le.0.0) then
2011 ! compute interface values
2014 zi(k+1) = zi(k)+dz(k)
2017 ! save departure wind
2021 ! plm is 2nd order, we can use 2nd order wi or 3rd order wi
2022 ! 2nd order interpolation to get wi
2026 wi(k) = (ww(k)*dz(k-1)+ww(k-1)*dz(k))/(dz(k-1)+dz(k))
2028 ! 3rd order interpolation to get wi
2032 wi(2) = 0.5*(ww(2)+ww(1))
2034 wi(k) = fa1*(ww(k)+ww(k-1))-fa2*(ww(k+1)+ww(k-2))
2036 wi(km) = 0.5*(ww(km)+ww(km-1))
2039 ! terminate of top of raingroup
2041 if( ww(k).eq.0.0 ) wi(k)=ww(k-1)
2047 decfl = (wi(k+1)-wi(k))*dt/dz(k)
2048 if( decfl .gt. con1 ) then
2049 wi(k) = wi(k+1) - con1*dz(k)/dt
2052 ! compute arrival point
2054 za(k) = zi(k) - wi(k)*dt
2058 dza(k) = za(k+1)-za(k)
2060 dza(km+1) = zi(km+1) - za(km+1)
2062 ! computer deformation at arrival point
2064 qa(k) = qq(k)*dz(k)/dza(k)
2065 qa2(k) = qq2(k)*dz(k)/dza(k)
2066 qr(k) = qa(k)/den(k)
2067 qr2(k) = qa2(k)/den(k)
2071 ! call maxmin(km,1,qa,' arrival points ')
2073 ! compute arrival terminal velocity, and estimate mean terminal velocity
2074 ! then back to use mean terminal velocity
2075 if( n.le.iter ) then
2076 call slope_snow(qr,den,denfac,tk,tmp,tmp1,tmp2,tmp3,wa,1,1,1,km)
2077 call slope_graup(qr2,den,denfac,tk,tmp,tmp1,tmp2,tmp3,wa2,1,1,1,km)
2079 tmp(k) = max((qr(k)+qr2(k)), 1.E-15)
2080 IF ( tmp(k) .gt. 1.e-15 ) THEN
2081 wa(k) = (wa(k)*qr(k) + wa2(k)*qr2(k))/tmp(k)
2086 if( n.ge.2 ) wa(1:km)=0.5*(wa(1:km)+was(1:km))
2089 ! print*,' slope_wsm3 ',qr(k)*1000.,den(k),denfac(k),tk(k),tmp(k),tmp1(k),tmp2(k), &
2092 ! mean wind is average of departure and new arrival winds
2093 ww(k) = 0.5* ( wd(k)+wa(k) )
2099 ist_loop : do ist = 1, 2
2106 ! estimate values at arrival cell interface with monotone
2108 dip=(qa(k+1)-qa(k))/(dza(k+1)+dza(k))
2109 dim=(qa(k)-qa(k-1))/(dza(k-1)+dza(k))
2110 if( dip*dim.le.0.0 ) then
2114 qpi(k)=qa(k)+0.5*(dip+dim)*dza(k)
2115 qmi(k)=2.0*qa(k)-qpi(k)
2116 if( qpi(k).lt.0.0 .or. qmi(k).lt.0.0 ) then
2127 ! interpolation to regular point
2135 if( zi(k).ge.za(km+1) ) then
2138 find_kb : do kk=kb,km
2139 if( zi(k).le.za(kk+1) ) then
2146 find_kt : do kk=kt,km
2147 if( zi(k+1).le.za(kk) ) then
2155 ! compute q with piecewise constant method
2157 tl=(zi(k)-za(kb))/dza(kb)
2158 th=(zi(k+1)-za(kb))/dza(kb)
2161 qqd=0.5*(qpi(kb)-qmi(kb))
2162 qqh=qqd*th2+qmi(kb)*th
2163 qql=qqd*tl2+qmi(kb)*tl
2164 qn(k) = (qqh-qql)/(th-tl)
2165 else if( kt.gt.kb ) then
2166 tl=(zi(k)-za(kb))/dza(kb)
2168 qqd=0.5*(qpi(kb)-qmi(kb))
2169 qql=qqd*tl2+qmi(kb)*tl
2171 zsum = (1.-tl)*dza(kb)
2173 if( kt-kb.gt.1 ) then
2175 zsum = zsum + dza(m)
2176 qsum = qsum + qa(m) * dza(m)
2179 th=(zi(k+1)-za(kt))/dza(kt)
2181 qqd=0.5*(qpi(kt)-qmi(kt))
2182 dqh=qqd*th2+qmi(kt)*th
2183 zsum = zsum + th*dza(kt)
2184 qsum = qsum + dqh*dza(kt)
2193 sum_precip: do k=1,km
2194 if( za(k).lt.0.0 .and. za(k+1).lt.0.0 ) then
2195 precip(i) = precip(i) + qa(k)*dza(k)
2197 else if ( za(k).lt.0.0 .and. za(k+1).ge.0.0 ) then
2198 precip(i) = precip(i) + qa(k)*(0.0-za(k))
2204 ! replace the new values
2207 precip1(i) = precip(i)
2210 precip2(i) = precip(i)
2214 ! ----------------------------------
2217 END SUBROUTINE nislfv_rain_plm6
2218 END MODULE module_mp_wsm6