module_mp_wsm6.F

References to this file elsewhere.
1 #if ( RWORDSIZE == 4 )
2 #  define VREC vsrec
3 #  define VSQRT vssqrt
4 #else
5 #  define VREC vrec
6 #  define VSQRT vsqrt
7 #endif
8 
9 MODULE module_mp_wsm6
10 !
11 !
12    REAL, PARAMETER, PRIVATE :: dtcldcr     = 120.
13    REAL, PARAMETER, PRIVATE :: n0r = 8.e6
14    REAL, PARAMETER, PRIVATE :: n0g = 4.e6
15    REAL, PARAMETER, PRIVATE :: avtr = 841.9
16    REAL, PARAMETER, PRIVATE :: bvtr = 0.8
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
22    REAL, PARAMETER, PRIVATE :: bvts = .41
23    REAL, PARAMETER, PRIVATE :: avtg = 330.
24    REAL, PARAMETER, PRIVATE :: bvtg = 0.8
25    REAL, PARAMETER, PRIVATE :: deng = 500.
26    REAL, PARAMETER, PRIVATE :: n0smax =  1.e11 ! t=-90C unlimited
27    REAL, PARAMETER, PRIVATE :: lamdarmax = 8.e4
28    REAL, PARAMETER, PRIVATE :: lamdasmax = 1.e5
29    REAL, PARAMETER, PRIVATE :: lamdagmax = 6.e4
30    REAL, PARAMETER, PRIVATE :: betai = .6
31    REAL, PARAMETER, PRIVATE :: xn0 = 1.e-2
32    REAL, PARAMETER, PRIVATE :: dicon = 11.9
33    REAL, PARAMETER, PRIVATE :: di0 = 12.9e-6
34    REAL, PARAMETER, PRIVATE :: dimax = 500.e-6
35    REAL, PARAMETER, PRIVATE :: n0s = 2.e6             ! temperature dependent n0s
36    REAL, PARAMETER, PRIVATE :: alpha = .12        ! .122 exponen factor for n0s
37    REAL, PARAMETER, PRIVATE :: pfrz1 = 100.
38    REAL, PARAMETER, PRIVATE :: pfrz2 = 0.66
39    REAL, PARAMETER, PRIVATE :: qcrmin = 1.e-9
40    REAL, PARAMETER, PRIVATE :: t40c = 233.16
41    REAL, PARAMETER, PRIVATE :: eacrc = 1.0
42    REAL, PARAMETER, PRIVATE :: dens  =  100.0
43    REAL, PARAMETER, PRIVATE :: qs0   =  6.e-4   ! pgaut
44    REAL, SAVE ::                                     &
45              qc0, qck1,bvtr1,bvtr2,bvtr3,bvtr4,g1pbr,&
46              g3pbr,g4pbr,g5pbro2,pvtr,eacrr,pacrr,   &
47              bvtr6,g6pbr,                            &
48              precr1,precr2,xm0,xmmax,roqimax,bvts1,  &
49              bvts2,bvts3,bvts4,g1pbs,g3pbs,g4pbs,    &
50              g5pbso2,pvts,pacrs,precs1,precs2,pidn0r,&
51              pidn0s,xlv1,pacrc,                      &
52              bvtg1,bvtg2,bvtg3,bvtg4,g1pbg,          &
53              g3pbg,g4pbg,g5pbgo2,pvtg,pacrg,         &
54              precg1,precg2,pidn0g,                   &
55              rslopermax,rslopesmax,rslopegmax,       &
56              rsloperbmax,rslopesbmax,rslopegbmax,    &
57              rsloper2max,rslopes2max,rslopeg2max,    &
58              rsloper3max,rslopes3max,rslopeg3max
59 CONTAINS
60 !===================================================================
61 !
62   SUBROUTINE wsm6(th, q, qc, qr, qi, qs, qg                        &
63                  ,den, pii, p, delz                                &
64                  ,delt,g, cpd, cpv, rd, rv, t0c                    &
65                  ,ep1, ep2, qmin                                   &
66                  ,XLS, XLV0, XLF0, den0, denr                      &
67                  ,cliq,cice,psat                                   &
68                  ,rain, rainncv                                    &
69                  ,snow, snowncv                                    &
70                  ,graupel, graupelncv                              &
71                  ,sr                                               &
72                  ,ids,ide, jds,jde, kds,kde                        &
73                  ,ims,ime, jms,jme, kms,kme                        &
74                  ,its,ite, jts,jte, kts,kte                        &
75                                                                    )
76 !-------------------------------------------------------------------
77   IMPLICIT NONE
78 !-------------------------------------------------------------------
79 !
80 !  This code is a 6-class GRAUPEL phase microphyiscs scheme (WSM6) of the WRF
81 !  Single-Moment MicroPhyiscs (WSMMP). The WSMMP assumes that ice nuclei
82 !  number concentration is a function of temperature, and seperate assumption
83 !  is developed, in which ice crystal number concentration is a function
84 !  of ice amount. A theoretical background of the ice-microphysics and related
85 !  processes in the WSMMPs are described in Hong et al. (2004).
86 !  All production terms in the WSM6 scheme are described in Hong and Lim (2006).
87 !  All units are in m.k.s. and source/sink terms in kgkg-1s-1.
88 !
89 !  WSM6 cloud scheme
90 !
91 !  Coded by Song-You Hong and Jeong-Ock Jade Lim (Yonsei Univ.)
92 !           Summer 2003
93 !
94 !  Implemented by Song-You Hong (Yonsei Univ.) and Jimy Dudhia (NCAR)
95 !           Summer 2004
96 !
97 !  Reference) Hong, Dudhia, Chen (HDC, 2004) Mon. Wea. Rev. 
98 !             Hong and Lim (HL, 2006) J. Korean Meteor. Soc. 
99 !             Lin, Farley, Orville (LFO, 1983) J. Appl. Meteor.
100 !             Rutledge, Hobbs (RH83, 1983) J. Atmos. Sci.
101 !             Rutledge, Hobbs (RH84, 1984) J. Atmos. Sci.
102 !
103   INTEGER,      INTENT(IN   )    ::   ids,ide, jds,jde, kds,kde , &
104                                       ims,ime, jms,jme, kms,kme , &
105                                       its,ite, jts,jte, kts,kte
106   REAL, DIMENSION( ims:ime , kms:kme , jms:jme ),                 &
107         INTENT(INOUT) ::                                          &
108                                                              th,  &
109                                                               q,  &
110                                                               qc, &
111                                                               qi, &
112                                                               qr, &
113                                                               qs, &
114                                                               qg
115   REAL, DIMENSION( ims:ime , kms:kme , jms:jme ),                 &
116         INTENT(IN   ) ::                                          &
117                                                              den, &
118                                                              pii, &
119                                                                p, &
120                                                             delz
121   REAL, INTENT(IN   ) ::                                    delt, &
122                                                                g, &
123                                                               rd, &
124                                                               rv, &
125                                                              t0c, &
126                                                             den0, &
127                                                              cpd, &
128                                                              cpv, &
129                                                              ep1, &
130                                                              ep2, &
131                                                             qmin, &
132                                                              XLS, &
133                                                             XLV0, &
134                                                             XLF0, &
135                                                             cliq, &
136                                                             cice, &
137                                                             psat, &
138                                                             denr
139   REAL, DIMENSION( ims:ime , jms:jme ),                           &
140         INTENT(INOUT) ::                                    rain, &
141                                                          rainncv, &
142                                                               sr
143 
144   REAL, DIMENSION( ims:ime , jms:jme ), OPTIONAL,                &
145         INTENT(INOUT) ::                                    snow, &
146                                                          snowncv
147 
148   REAL, DIMENSION( ims:ime , jms:jme ), OPTIONAL,                &
149         INTENT(INOUT) ::                                graupel, &
150                                                         graupelncv
151 ! LOCAL VAR
152   REAL, DIMENSION( its:ite , kts:kte ) ::   t
153   REAL, DIMENSION( its:ite , kts:kte, 2 ) ::   qci
154   REAL, DIMENSION( its:ite , kts:kte, 3 ) ::   qrs
155   INTEGER ::               i,j,k
156 !-------------------------------------------------------------------
157       DO j=jts,jte
158          DO k=kts,kte
159          DO i=its,ite
160             t(i,k)=th(i,k,j)*pii(i,k,j)
161             qci(i,k,1) = qc(i,k,j)
162             qci(i,k,2) = qi(i,k,j)
163             qrs(i,k,1) = qr(i,k,j)
164             qrs(i,k,2) = qs(i,k,j)
165             qrs(i,k,3) = qg(i,k,j)
166          ENDDO
167          ENDDO
168          CALL wsm62D(t, q(ims,kms,j), qci, qrs                     &
169                     ,den(ims,kms,j)                                &
170                     ,p(ims,kms,j), delz(ims,kms,j)                 &
171                     ,delt,g, cpd, cpv, rd, rv, t0c                 &
172                     ,ep1, ep2, qmin                                &
173                     ,XLS, XLV0, XLF0, den0, denr                   &
174                     ,cliq,cice,psat                                &
175                     ,j                                             &
176                     ,rain(ims,j),rainncv(ims,j)                    &
177                     ,sr(ims,j)                                     &
178                     ,ids,ide, jds,jde, kds,kde                     &
179                     ,ims,ime, jms,jme, kms,kme                     &
180                     ,its,ite, jts,jte, kts,kte                     &
181                     ,snow(ims,j),snowncv(ims,j)                    &
182                     ,graupel(ims,j),graupelncv(ims,j)              &
183                                                                    )
184          DO K=kts,kte
185          DO I=its,ite
186             th(i,k,j)=t(i,k)/pii(i,k,j)
187             qc(i,k,j) = qci(i,k,1)
188             qi(i,k,j) = qci(i,k,2)
189             qr(i,k,j) = qrs(i,k,1)
190             qs(i,k,j) = qrs(i,k,2)
191             qg(i,k,j) = qrs(i,k,3)
192          ENDDO
193          ENDDO
194       ENDDO
195   END SUBROUTINE wsm6
196 !===================================================================
197 !
198   SUBROUTINE wsm62D(t, q, qci, qrs, den, p, delz                  &
199                    ,delt,g, cpd, cpv, rd, rv, t0c                 &
200                    ,ep1, ep2, qmin                                &
201                    ,XLS, XLV0, XLF0, den0, denr                   &
202                    ,cliq,cice,psat                                &
203                    ,lat                                           &
204                    ,rain,rainncv                                  &
205                    ,sr                                            &
206                    ,ids,ide, jds,jde, kds,kde                     &
207                    ,ims,ime, jms,jme, kms,kme                     &
208                    ,its,ite, jts,jte, kts,kte                     &
209                    ,snow,snowncv                                  &
210                    ,graupel,graupelncv                            &
211                                                                   )
212 !-------------------------------------------------------------------
213   IMPLICIT NONE
214 !-------------------------------------------------------------------
215   INTEGER,      INTENT(IN   )    ::   ids,ide, jds,jde, kds,kde , &
216                                       ims,ime, jms,jme, kms,kme , &
217                                       its,ite, jts,jte, kts,kte,  &
218                                       lat
219   REAL, DIMENSION( its:ite , kts:kte ),                           &
220         INTENT(INOUT) ::                                          &
221                                                                t
222   REAL, DIMENSION( its:ite , kts:kte, 2 ),                        &
223         INTENT(INOUT) ::                                          &
224                                                              qci
225   REAL, DIMENSION( its:ite , kts:kte, 3 ),                        &
226         INTENT(INOUT) ::                                          &
227                                                              qrs
228   REAL, DIMENSION( ims:ime , kms:kme ),                           &
229         INTENT(INOUT) ::                                          &
230                                                                q
231   REAL, DIMENSION( ims:ime , kms:kme ),                           &
232         INTENT(IN   ) ::                                          &
233                                                              den, &
234                                                                p, &
235                                                             delz
236   REAL, INTENT(IN   ) ::                                    delt, &
237                                                                g, &
238                                                              cpd, &
239                                                              cpv, &
240                                                              t0c, &
241                                                             den0, &
242                                                               rd, &
243                                                               rv, &
244                                                              ep1, &
245                                                              ep2, &
246                                                             qmin, &
247                                                              XLS, &
248                                                             XLV0, &
249                                                             XLF0, &
250                                                             cliq, &
251                                                             cice, &
252                                                             psat, &
253                                                             denr
254   REAL, DIMENSION( ims:ime ),                                     &
255         INTENT(INOUT) ::                                    rain, &
256                                                          rainncv, &
257                                                               sr
258 
259   REAL, DIMENSION( ims:ime ),     OPTIONAL,                       &
260         INTENT(INOUT) ::                                    snow, &
261                                                          snowncv
262 
263   REAL, DIMENSION( ims:ime ),     OPTIONAL,                       &
264         INTENT(INOUT) ::                                 graupel, &
265                                                       graupelncv
266 ! LOCAL VAR
267   REAL, DIMENSION( its:ite , kts:kte , 3) ::                      &
268         rh, qs, rslope, rslope2, rslope3, rslopeb,                &
269         falk, fall, work1
270   REAL, DIMENSION( its:ite , kts:kte ) ::                         &
271               falkc, work1c, work2c, fallc
272   REAL, DIMENSION( its:ite , kts:kte) ::                          &
273         prevp, psdep, pgdep, praut, psaut, pgaut,                 &
274         pracw, psacw, pgacw, pgacr, pgacs, psaci, pgmlt, praci,   &
275         piacr, pracs, psacr, pgaci, pseml, pgeml      
276   REAL, DIMENSION( its:ite , kts:kte ) ::                         &
277         pigen, pidep, pcond, xl, cpm, work2, psmlt, psevp, denfac,     &
278         xni, pgevp,n0sfac
279 ! variables for optimization
280   REAL, DIMENSION( its:ite )           :: tvec1
281   REAL :: temp
282   INTEGER, DIMENSION( its:ite ) :: mstep, numdt
283   LOGICAL, DIMENSION( its:ite ) :: flgcld
284   REAL  ::  pi,                                                   &
285             cpmcal, xlcal, lamdar, lamdas, lamdag, diffus,        &
286             viscos, xka, venfac, conden, diffac,                  &
287             x, y, z, a, b, c, d, e,                               &
288             qdt, holdrr, holdrs, holdrg, supcol, pvt,             &
289             coeres, supsat, dtcld, xmi, eacrs, satdt,             &
290             qimax, diameter, xni0, roqi0,                         &
291             fallsum, fallsum_qsi, fallsum_qg,                     &
292              vt2i,vt2r,vt2s,vt2g,acrfac,egs,egi,     &
293             xlwork2, factor, source, value,              &
294             xlf, pfrzdtc, pfrzdtr, supice, alpha2, delta2, delta3  
295   REAL  :: holdc, holdci
296   INTEGER :: i, j, k, mstepmax,                                   &
297             iprt, latd, lond, loop, loops, ifsat, n
298 ! Temporaries used for inlining fpvs function
299   REAL  :: dldti, xb, xai, tr, xbi, xa, hvap, cvap, hsub, dldt, ttp
300 !
301 !=================================================================
302 !   compute internal functions
303 !
304       cpmcal(x) = cpd*(1.-max(x,qmin))+max(x,qmin)*cpv
305       xlcal(x) = xlv0-xlv1*(x-t0c)
306 !----------------------------------------------------------------
307 !     size distributions: (x=mixing ratio, y=air density):
308 !     valid for mixing ratio > 1.e-9 kg/kg.
309 !
310 ! Optimizatin : A**B => exp(log(A)*(B)) 
311       lamdar(x,y)=   sqrt(sqrt(pidn0r/(x*y)))      ! (pidn0r/(x*y))**.25
312       lamdas(x,y,z)= sqrt(sqrt(pidn0s*z/(x*y)))    ! (pidn0s*z/(x*y))**.25
313       lamdag(x,y)=   sqrt(sqrt(pidn0g/(x*y)))      ! (pidn0g/(x*y))**.25
314 !
315 !----------------------------------------------------------------
316 !     diffus: diffusion coefficient of the water vapor
317 !     viscos: kinematic viscosity(m2s-1)
318 !
319       diffus(x,y) = 8.794e-5 * exp(log(x)*(1.81)) / y        ! 8.794e-5*x**1.81/y
320       viscos(x,y) = 1.496e-6 * (x*sqrt(x)) /(x+120.)/y  ! 1.496e-6*x**1.5/(x+120.)/y
321       xka(x,y) = 1.414e3*viscos(x,y)*y
322       diffac(a,b,c,d,e) = d*a*a/(xka(c,d)*rv*c*c)+1./(e*diffus(c,b))
323       venfac(a,b,c) = exp(log((viscos(b,c)/diffus(b,a)))*((.3333333)))    &
324                      /sqrt(viscos(b,c))*sqrt(sqrt(den0/c))
325       conden(a,b,c,d,e) = (max(b,qmin)-c)/(1.+d*d/(rv*e)*c/(a*a))
326 !
327       pi = 4. * atan(1.)
328 !
329 !
330 !----------------------------------------------------------------
331 !     paddint 0 for negative values generated by dynamics
332 !
333       do k = kts, kte
334         do i = its, ite
335           qci(i,k,1) = max(qci(i,k,1),0.0)
336           qrs(i,k,1) = max(qrs(i,k,1),0.0)
337           qci(i,k,2) = max(qci(i,k,2),0.0)
338           qrs(i,k,2) = max(qrs(i,k,2),0.0)
339           qrs(i,k,3) = max(qrs(i,k,3),0.0)
340         enddo
341       enddo
342 !
343 !----------------------------------------------------------------
344 !     latent heat for phase changes and heat capacity. neglect the
345 !     changes during microphysical process calculation
346 !     emanuel(1994)
347 !
348       do k = kts, kte
349         do i = its, ite
350           cpm(i,k) = cpmcal(q(i,k))
351           xl(i,k) = xlcal(t(i,k))
352         enddo
353       enddo
354 !
355 !----------------------------------------------------------------
356 !     compute the minor time steps.
357 !
358       loops = max(nint(delt/dtcldcr),1)
359       dtcld = delt/loops
360       if(delt.le.dtcldcr) dtcld = delt
361 !
362       do loop = 1,loops
363 !
364 !----------------------------------------------------------------
365 !     initialize the large scale variables
366 !
367       do i = its, ite
368         mstep(i) = 1
369         flgcld(i) = .true.
370       enddo
371 !
372 !     do k = kts, kte
373 !       do i = its, ite
374 !         denfac(i,k) = sqrt(den0/den(i,k))
375 !       enddo
376 !     enddo
377       do k = kts, kte
378         CALL VREC( tvec1(its), den(its,k), ite-its+1)
379         do i = its, ite
380           tvec1(i) = tvec1(i)*den0
381         enddo
382         CALL VSQRT( denfac(its,k), tvec1(its), ite-its+1)
383       enddo
384 !
385 ! Inline expansion for fpvs
386 !         qs(i,k,1) = fpvs(t(i,k),0,rd,rv,cpv,cliq,cice,xlv0,xls,psat,t0c)
387 !         qs(i,k,2) = fpvs(t(i,k),1,rd,rv,cpv,cliq,cice,xlv0,xls,psat,t0c)
388       hsub = xls
389       hvap = xlv0
390       cvap = cpv
391       ttp=t0c+0.01
392       dldt=cvap-cliq
393       xa=-dldt/rv
394       xb=xa+hvap/(rv*ttp)
395       dldti=cvap-cice
396       xai=-dldti/rv
397       xbi=xai+hsub/(rv*ttp)
398       do k = kts, kte
399         do i = its, ite
400           tr=ttp/t(i,k)
401           qs(i,k,1)=psat*exp(log(tr)*(xa))*exp(xb*(1.-tr))
402           qs(i,k,1) = ep2 * qs(i,k,1) / (p(i,k) - qs(i,k,1))
403           qs(i,k,1) = max(qs(i,k,1),qmin)
404           rh(i,k,1) = max(q(i,k) / qs(i,k,1),qmin)
405           tr=ttp/t(i,k)
406           if(t(i,k).lt.ttp) then
407             qs(i,k,2)=psat*exp(log(tr)*(xai))*exp(xbi*(1.-tr))
408           else
409             qs(i,k,2)=psat*exp(log(tr)*(xa))*exp(xb*(1.-tr))
410           endif
411           qs(i,k,2) = ep2 * qs(i,k,2) / (p(i,k) - qs(i,k,2))
412           qs(i,k,2) = max(qs(i,k,2),qmin)
413           rh(i,k,2) = max(q(i,k) / qs(i,k,2),qmin)
414         enddo
415       enddo
416 !
417 !----------------------------------------------------------------
418 !     initialize the variables for microphysical physics
419 !
420 !
421       do k = kts, kte
422         do i = its, ite
423           prevp(i,k) = 0.
424           psdep(i,k) = 0.
425           pgdep(i,k) = 0.
426           praut(i,k) = 0.
427           psaut(i,k) = 0.
428           pgaut(i,k) = 0.
429           pracw(i,k) = 0.
430           praci(i,k) = 0.
431           piacr(i,k) = 0.
432           psaci(i,k) = 0.
433           psacw(i,k) = 0.
434           pracs(i,k) = 0.
435           psacr(i,k) = 0.
436           pgacw(i,k) = 0.
437           pgaci(i,k) = 0.
438           pgacr(i,k) = 0.
439           pgacs(i,k) = 0.
440           pigen(i,k) = 0.
441           pidep(i,k) = 0.
442           pcond(i,k) = 0.
443           psmlt(i,k) = 0.
444           pgmlt(i,k) = 0.
445           pseml(i,k) = 0.
446           pgeml(i,k) = 0.
447           psevp(i,k) = 0.
448           pgevp(i,k) = 0.
449           falk(i,k,1) = 0.
450           falk(i,k,2) = 0.
451           falk(i,k,3) = 0.
452           fall(i,k,1) = 0.
453           fall(i,k,2) = 0.
454           fall(i,k,3) = 0.
455           fallc(i,k) = 0.
456           falkc(i,k) = 0.
457           xni(i,k) = 1.e3
458         enddo
459       enddo
460 !
461 !----------------------------------------------------------------
462 !     compute the fallout term:
463 !     first, vertical terminal velosity for minor loops
464 !
465       do k = kts, kte
466         do i = its, ite
467           supcol = t0c-t(i,k)
468 !---------------------------------------------------------------
469 ! n0s: Intercept parameter for snow [m-4] [HDC 6]
470 !---------------------------------------------------------------
471           n0sfac(i,k) = max(min(exp(alpha*supcol),n0smax/n0s),1.)
472           if(qrs(i,k,1).le.qcrmin)then
473             rslope(i,k,1) = rslopermax
474             rslopeb(i,k,1) = rsloperbmax
475             rslope2(i,k,1) = rsloper2max
476             rslope3(i,k,1) = rsloper3max
477           else
478             rslope(i,k,1) = 1./lamdar(qrs(i,k,1),den(i,k))
479             rslopeb(i,k,1) = rslope(i,k,1)**bvtr
480             rslope2(i,k,1) = rslope(i,k,1)*rslope(i,k,1)
481             rslope3(i,k,1) = rslope2(i,k,1)*rslope(i,k,1)
482           endif
483           if(qrs(i,k,2).le.qcrmin)then
484             rslope(i,k,2) = rslopesmax
485             rslopeb(i,k,2) = rslopesbmax
486             rslope2(i,k,2) = rslopes2max
487             rslope3(i,k,2) = rslopes3max
488           else
489             rslope(i,k,2) = 1./lamdas(qrs(i,k,2),den(i,k),n0sfac(i,k))
490             rslopeb(i,k,2) = rslope(i,k,2)**bvts
491             rslope2(i,k,2) = rslope(i,k,2)*rslope(i,k,2)
492             rslope3(i,k,2) = rslope2(i,k,2)*rslope(i,k,2)
493           endif
494           if(qrs(i,k,3).le.qcrmin)then
495             rslope(i,k,3) = rslopegmax
496             rslopeb(i,k,3) = rslopegbmax
497             rslope2(i,k,3) = rslopeg2max
498             rslope3(i,k,3) = rslopeg3max
499           else
500             rslope(i,k,3) = 1./lamdag(qrs(i,k,3),den(i,k))
501             rslopeb(i,k,3) = rslope(i,k,3)**bvtg
502             rslope2(i,k,3) = rslope(i,k,3)*rslope(i,k,3)
503             rslope3(i,k,3) = rslope2(i,k,3)*rslope(i,k,3)
504           endif
505 !-------------------------------------------------------------
506 ! Ni: ice crystal number concentraiton   [HDC 5c]
507 !-------------------------------------------------------------
508 !         xni(i,k) = min(max(5.38e7*(den(i,k)                           &
509 !                   *max(qci(i,k,2),qmin))**0.75,1.e3),1.e6)
510           temp = (den(i,k)*max(qci(i,k,2),qmin))
511           temp = sqrt(sqrt(temp*temp*temp))
512           xni(i,k) = min(max(5.38e7*temp,1.e3),1.e6)
513         enddo
514       enddo
515 !
516       mstepmax = 1
517       numdt = 1
518       do k = kte, kts, -1
519         do i = its, ite
520           work1(i,k,1) = pvtr*rslopeb(i,k,1)*denfac(i,k)/delz(i,k)
521           work1(i,k,2) = pvts*rslopeb(i,k,2)*denfac(i,k)/delz(i,k)
522           work1(i,k,3) = pvtg*rslopeb(i,k,3)*denfac(i,k)/delz(i,k)
523           numdt(i) = max(nint(max(work1(i,k,1),work1(i,k,2),work1(i,k,3)) &
524                     *dtcld+.5),1)
525           if(numdt(i).ge.mstep(i)) mstep(i) = numdt(i)
526         enddo
527       enddo
528       do i = its, ite
529         if(mstepmax.le.mstep(i)) mstepmax = mstep(i)
530       enddo
531 !
532       do n = 1, mstepmax
533         k = kte
534         do i = its, ite
535           if(n.le.mstep(i)) then
536               falk(i,k,1) = den(i,k)*qrs(i,k,1)*work1(i,k,1)/mstep(i)
537               falk(i,k,2) = den(i,k)*qrs(i,k,2)*work1(i,k,2)/mstep(i)
538               falk(i,k,3) = den(i,k)*qrs(i,k,3)*work1(i,k,3)/mstep(i)
539               fall(i,k,1) = fall(i,k,1)+falk(i,k,1)
540               fall(i,k,2) = fall(i,k,2)+falk(i,k,2)
541               fall(i,k,3) = fall(i,k,3)+falk(i,k,3)
542               qrs(i,k,1) = max(qrs(i,k,1)-falk(i,k,1)*dtcld/den(i,k),0.)
543               qrs(i,k,2) = max(qrs(i,k,2)-falk(i,k,2)*dtcld/den(i,k),0.)
544               qrs(i,k,3) = max(qrs(i,k,3)-falk(i,k,3)*dtcld/den(i,k),0.)
545             endif
546           enddo
547         do k = kte-1, kts, -1
548           do i = its, ite
549             if(n.le.mstep(i)) then
550               falk(i,k,1) = den(i,k)*qrs(i,k,1)*work1(i,k,1)/mstep(i)
551               falk(i,k,2) = den(i,k)*qrs(i,k,2)*work1(i,k,2)/mstep(i)
552               falk(i,k,3) = den(i,k)*qrs(i,k,3)*work1(i,k,3)/mstep(i)
553               fall(i,k,1) = fall(i,k,1)+falk(i,k,1)
554               fall(i,k,2) = fall(i,k,2)+falk(i,k,2)
555               fall(i,k,3) = fall(i,k,3)+falk(i,k,3)
556               qrs(i,k,1) = max(qrs(i,k,1)-(falk(i,k,1)-falk(i,k+1,1)    &
557                           *delz(i,k+1)/delz(i,k))*dtcld/den(i,k),0.)
558               qrs(i,k,2) = max(qrs(i,k,2)-(falk(i,k,2)-falk(i,k+1,2)    &
559                           *delz(i,k+1)/delz(i,k))*dtcld/den(i,k),0.)
560               qrs(i,k,3) = max(qrs(i,k,3)-(falk(i,k,3)-falk(i,k+1,3)    &
561                           *delz(i,k+1)/delz(i,k))*dtcld/den(i,k),0.)
562             endif
563           enddo
564         enddo
565         do k = kte, kts, -1
566           do i = its, ite
567             if(n.le.mstep(i).and.t(i,k).gt.t0c) then
568 !---------------------------------------------------------------
569 ! psmlt: melting of snow [HL A33] [RH83 A25]
570 !       (T>T0: S->R)
571 !---------------------------------------------------------------
572               xlf = xlf0
573               work2(i,k) = venfac(p(i,k),t(i,k),den(i,k))
574               if(qrs(i,k,2).gt.0.) then
575                 coeres = rslope2(i,k,2)*sqrt(rslope(i,k,2)*rslopeb(i,k,2))
576                 psmlt(i,k) = xka(t(i,k),den(i,k))/xlf*(t0c-t(i,k))*pi/2. &
577                            *n0sfac(i,k)*(precs1*rslope2(i,k,2)          &
578                            +precs2*work2(i,k)*coeres)
579                 psmlt(i,k) = min(max(psmlt(i,k)*dtcld/mstep(i),           &
580                             -qrs(i,k,2)/mstep(i)),0.)
581                 qrs(i,k,2) = qrs(i,k,2) + psmlt(i,k)
582                 qrs(i,k,1) = qrs(i,k,1) - psmlt(i,k)
583                 t(i,k) = t(i,k) + xlf/cpm(i,k)*psmlt(i,k)
584               endif
585 !---------------------------------------------------------------
586 ! pgmlt: melting of graupel [HL A23]  [LFO 47]
587 !       (T>T0: G->R)
588 !---------------------------------------------------------------
589               if(qrs(i,k,3).gt.0.) then
590                 coeres = rslope2(i,k,3)*sqrt(rslope(i,k,3)*rslopeb(i,k,3))
591                 pgmlt(i,k) = xka(t(i,k),den(i,k))/xlf                    &
592                            *(t0c-t(i,k))*(precg1*rslope2(i,k,3)         &
593                            +precg2*work2(i,k)*coeres)
594                 pgmlt(i,k) = min(max(pgmlt(i,k)*dtcld/mstep(i),           &
595                             -qrs(i,k,3)/mstep(i)),0.)
596                 qrs(i,k,3) = qrs(i,k,3) + pgmlt(i,k)
597                 qrs(i,k,1) = qrs(i,k,1) - pgmlt(i,k)
598                 t(i,k) = t(i,k) + xlf/cpm(i,k)*pgmlt(i,k)
599               endif
600             endif
601           enddo
602         enddo
603       enddo
604 !---------------------------------------------------------------
605 ! Vice [ms-1] : fallout of ice crystal [HDC 5a]
606 !---------------------------------------------------------------
607       mstepmax = 1
608       mstep = 1
609       numdt = 1
610       do k = kte, kts, -1
611         do i = its, ite
612           if(qci(i,k,2).le.0.) then
613             work2c(i,k) = 0.
614           else
615             xmi = den(i,k)*qci(i,k,2)/xni(i,k)
616 !           diameter  = min(dicon * sqrt(xmi),dimax)
617             diameter  = max(min(dicon * sqrt(xmi),dimax), 1.e-25)
618             work1c(i,k) = 1.49e4*diameter**1.31
619             work2c(i,k) = work1c(i,k)/delz(i,k)
620           endif
621           numdt(i) = max(nint(work2c(i,k)*dtcld+.5),1)
622           if(numdt(i).ge.mstep(i)) mstep(i) = numdt(i)
623         enddo
624       enddo
625       do i = its, ite
626         if(mstepmax.le.mstep(i)) mstepmax = mstep(i)
627       enddo
628 !
629       do n = 1, mstepmax
630         k = kte
631         do i = its, ite
632           if(n.le.mstep(i)) then
633             falkc(i,k) = den(i,k)*qci(i,k,2)*work2c(i,k)/mstep(i)
634             holdc = falkc(i,k)
635             fallc(i,k) = fallc(i,k)+falkc(i,k)
636             holdci = qci(i,k,2)
637             qci(i,k,2) = max(qci(i,k,2)-falkc(i,k)*dtcld/den(i,k),0.)
638           endif
639         enddo
640         do k = kte-1, kts, -1
641           do i = its, ite
642             if(n.le.mstep(i)) then
643               falkc(i,k) = den(i,k)*qci(i,k,2)*work2c(i,k)/mstep(i)
644               holdc = falkc(i,k)
645               fallc(i,k) = fallc(i,k)+falkc(i,k)
646               holdci = qci(i,k,2)
647               qci(i,k,2) = max(qci(i,k,2)-(falkc(i,k)-falkc(i,k+1)      &
648                           *delz(i,k+1)/delz(i,k))*dtcld/den(i,k),0.)
649             endif
650           enddo
651         enddo
652       enddo
653 !
654 !----------------------------------------------------------------
655 !      rain (unit is mm/sec;kgm-2s-1: /1000*delt ===> m)==> mm for wrf
656 !
657       do i = its, ite
658         fallsum = fall(i,kts,1)+fall(i,kts,2)+fall(i,kts,3)+fallc(i,kts)
659         fallsum_qsi = fall(i,kts,2)+fallc(i,kts)
660         fallsum_qg = fall(i,kts,3)
661         rainncv(i) = 0.
662         if(fallsum.gt.0.) then
663           rainncv(i) = fallsum*delz(i,kts)/denr*dtcld*1000.
664           rain(i) = fallsum*delz(i,kts)/denr*dtcld*1000. + rain(i)
665         endif
666         IF ( PRESENT (snowncv) .AND. PRESENT (snow)) THEN
667         snowncv(i) = 0.
668         if(fallsum_qsi.gt.0.) then
669           snowncv(i) = fallsum_qsi*delz(i,kts)/denr*dtcld*1000.
670           snow(i) = fallsum_qsi*delz(i,kts)/denr*dtcld*1000. + snow(i)
671         endif
672         ENDIF
673         IF ( PRESENT (graupelncv) .AND. PRESENT (graupel)) THEN
674         graupelncv(i) = 0.
675         if(fallsum_qg.gt.0.) then
676           graupelncv(i) = fallsum_qg*delz(i,kts)/denr*dtcld*1000.
677           graupel(i) = fallsum_qg*delz(i,kts)/denr*dtcld*1000. + graupel(i)
678         endif
679         ENDIF
680         sr(i) = 0.
681         if(fallsum.gt.0.)sr(i)=(fallsum_qsi*delz(i,kts)/denr*dtcld*1000. + &
682                                 fallsum_qg*delz(i,kts)/denr*dtcld*1000.)/(rainncv(i)+1.e-12)
683       enddo
684 !
685 !---------------------------------------------------------------
686 ! pimlt: instantaneous melting of cloud ice [HL A47] [RH83 A28]
687 !       (T>T0: I->C)
688 !---------------------------------------------------------------
689       do k = kts, kte
690         do i = its, ite
691           supcol = t0c-t(i,k)
692           xlf = xls-xl(i,k)
693           if(supcol.lt.0.) xlf = xlf0
694           if(supcol.lt.0.and.qci(i,k,2).gt.0.) then
695             qci(i,k,1) = qci(i,k,1) + qci(i,k,2)
696             t(i,k) = t(i,k) - xlf/cpm(i,k)*qci(i,k,2)
697             qci(i,k,2) = 0.
698           endif
699 !---------------------------------------------------------------
700 ! pihmf: homogeneous freezing of cloud water below -40c [HL A45]
701 !        (T<-40C: C->I)
702 !---------------------------------------------------------------
703           if(supcol.gt.40..and.qci(i,k,1).gt.0.) then
704             qci(i,k,2) = qci(i,k,2) + qci(i,k,1)
705             t(i,k) = t(i,k) + xlf/cpm(i,k)*qci(i,k,1)
706             qci(i,k,1) = 0.
707           endif
708 !---------------------------------------------------------------
709 ! pihtf: heterogeneous freezing of cloud water [HL A44]
710 !        (T0>T>-40C: C->I)
711 !---------------------------------------------------------------
712           if(supcol.gt.0..and.qci(i,k,1).gt.qmin) then
713 !           pfrzdtc = min(pfrz1*(exp(pfrz2*supcol)-1.)                  &
714 !              *den(i,k)/denr/xncr*qci(i,k,1)**2*dtcld,qci(i,k,1))
715             pfrzdtc = min(pfrz1*(exp(pfrz2*supcol)-1.)                  &
716             *den(i,k)/denr/xncr*qci(i,k,1)*qci(i,k,1)*dtcld,qci(i,k,1))
717             qci(i,k,2) = qci(i,k,2) + pfrzdtc
718             t(i,k) = t(i,k) + xlf/cpm(i,k)*pfrzdtc
719             qci(i,k,1) = qci(i,k,1)-pfrzdtc
720           endif
721 !---------------------------------------------------------------
722 ! pgfrz: freezing of rain water [HL A20] [LFO 45]
723 !        (T<T0, R->G)
724 !---------------------------------------------------------------
725           if(supcol.gt.0..and.qrs(i,k,1).gt.0.) then
726 !           pfrzdtr = min(20.*pi**2*pfrz1*n0r*denr/den(i,k)             &
727 !                 *(exp(pfrz2*supcol)-1.)*rslope3(i,k,1)**2             &
728 !                 *rslope(i,k,1)*dtcld,qrs(i,k,1))
729             temp = rslope3(i,k,1)
730             temp = temp*temp*rslope(i,k,1)
731             pfrzdtr = min(20.*(pi*pi)*pfrz1*n0r*denr/den(i,k)           &
732                   *(exp(pfrz2*supcol)-1.)*temp*dtcld,                   &
733                   qrs(i,k,1))
734             qrs(i,k,3) = qrs(i,k,3) + pfrzdtr
735             t(i,k) = t(i,k) + xlf/cpm(i,k)*pfrzdtr
736             qrs(i,k,1) = qrs(i,k,1)-pfrzdtr
737           endif
738         enddo
739       enddo
740 !
741 !
742 !----------------------------------------------------------------
743 !     rsloper: reverse of the slope parameter of the rain(m)
744 !     xka:    thermal conductivity of air(jm-1s-1k-1)
745 !     work1:  the thermodynamic term in the denominator associated with
746 !             heat conduction and vapor diffusion
747 !             (ry88, y93, h85)
748 !     work2: parameter associated with the ventilation effects(y93)
749 !
750       do k = kts, kte
751         do i = its, ite
752           if(qrs(i,k,1).le.qcrmin)then
753             rslope(i,k,1) = rslopermax
754             rslopeb(i,k,1) = rsloperbmax
755             rslope2(i,k,1) = rsloper2max
756             rslope3(i,k,1) = rsloper3max
757           else
758             rslope(i,k,1) = 1./lamdar(qrs(i,k,1),den(i,k))
759             rslopeb(i,k,1) = rslope(i,k,1)**bvtr
760             rslope2(i,k,1) = rslope(i,k,1)*rslope(i,k,1)
761             rslope3(i,k,1) = rslope2(i,k,1)*rslope(i,k,1)
762           endif
763           if(qrs(i,k,2).le.qcrmin)then
764             rslope(i,k,2) = rslopesmax
765             rslopeb(i,k,2) = rslopesbmax
766             rslope2(i,k,2) = rslopes2max
767             rslope3(i,k,2) = rslopes3max
768           else
769             rslope(i,k,2) = 1./lamdas(qrs(i,k,2),den(i,k),n0sfac(i,k))
770             rslopeb(i,k,2) = rslope(i,k,2)**bvts
771             rslope2(i,k,2) = rslope(i,k,2)*rslope(i,k,2)
772             rslope3(i,k,2) = rslope2(i,k,2)*rslope(i,k,2)
773           endif
774           if(qrs(i,k,3).le.qcrmin)then
775             rslope(i,k,3) = rslopegmax
776             rslopeb(i,k,3) = rslopegbmax
777             rslope2(i,k,3) = rslopeg2max
778             rslope3(i,k,3) = rslopeg3max
779           else
780             rslope(i,k,3) = 1./lamdag(qrs(i,k,3),den(i,k))
781             rslopeb(i,k,3) = rslope(i,k,3)**bvtg
782             rslope2(i,k,3) = rslope(i,k,3)*rslope(i,k,3)
783             rslope3(i,k,3) = rslope2(i,k,3)*rslope(i,k,3)
784           endif
785         enddo
786       enddo
787 !
788       do k = kts, kte
789         do i = its, ite
790           work1(i,k,1) = diffac(xl(i,k),p(i,k),t(i,k),den(i,k),qs(i,k,1))
791           work1(i,k,2) = diffac(xls,p(i,k),t(i,k),den(i,k),qs(i,k,2))
792           work2(i,k) = venfac(p(i,k),t(i,k),den(i,k))
793         enddo
794       enddo
795 !
796 !===============================================================
797 !
798 ! warm rain processes
799 !
800 ! - follows the processes in RH83 and LFO except for autoconcersion
801 !
802 !===============================================================
803 !
804       do k = kts, kte
805         do i = its, ite
806           supsat = max(q(i,k),qmin)-qs(i,k,1)
807           satdt = supsat/dtcld
808 !---------------------------------------------------------------
809 ! praut: auto conversion rate from cloud to rain [HDC 16]
810 !        (C->R)
811 !---------------------------------------------------------------
812           if(qci(i,k,1).gt.qc0) then
813             praut(i,k) = qck1*qci(i,k,1)**(7./3.)
814             praut(i,k) = min(praut(i,k),qci(i,k,1)/dtcld)
815           endif
816 !---------------------------------------------------------------
817 ! pracw: accretion of cloud water by rain [HL A40] [LFO 51]
818 !        (C->R)
819 !---------------------------------------------------------------
820           if(qrs(i,k,1).gt.qcrmin.and.qci(i,k,1).gt.qmin) then
821             pracw(i,k) = min(pacrr*rslope3(i,k,1)*rslopeb(i,k,1)        &
822                         *qci(i,k,1)*denfac(i,k),qci(i,k,1)/dtcld)
823           endif
824 !---------------------------------------------------------------
825 ! prevp: evaporation/condensation rate of rain [HDC 14]
826 !        (V->R or R->V)
827 !---------------------------------------------------------------
828           if(qrs(i,k,1).gt.0.) then
829             coeres = rslope2(i,k,1)*sqrt(rslope(i,k,1)*rslopeb(i,k,1))
830             prevp(i,k) = (rh(i,k,1)-1.)*(precr1*rslope2(i,k,1)         &
831                          +precr2*work2(i,k)*coeres)/work1(i,k,1)
832             if(prevp(i,k).lt.0.) then
833               prevp(i,k) = max(prevp(i,k),-qrs(i,k,1)/dtcld)
834               prevp(i,k) = max(prevp(i,k),satdt/2)
835             else
836               prevp(i,k) = min(prevp(i,k),satdt/2)
837             endif
838           endif
839         enddo
840       enddo
841 !
842 !===============================================================
843 !
844 ! cold rain processes
845 !
846 ! - follows the revised ice microphysics processes in HDC
847 ! - the processes same as in RH83 and RH84  and LFO behave
848 !   following ice crystal hapits defined in HDC, inclduing
849 !   intercept parameter for snow (n0s), ice crystal number
850 !   concentration (ni), ice nuclei number concentration
851 !   (n0i), ice diameter (d)
852 !
853 !===============================================================
854 !
855       do k = kts, kte
856         do i = its, ite
857           supcol = t0c-t(i,k)
858           supsat = max(q(i,k),qmin)-qs(i,k,2)
859           satdt = supsat/dtcld
860           ifsat = 0
861 !-------------------------------------------------------------
862 ! Ni: ice crystal number concentraiton   [HDC 5c]
863 !-------------------------------------------------------------
864 !         xni(i,k) = min(max(5.38e7*(den(i,k)                           &
865 !                      *max(qci(i,k,2),qmin))**0.75,1.e3),1.e6)
866           temp = (den(i,k)*max(qci(i,k,2),qmin))
867           temp = sqrt(sqrt(temp*temp*temp))
868           xni(i,k) = min(max(5.38e7*temp,1.e3),1.e6)
869           eacrs = exp(0.07*(-supcol))
870 !
871           xmi = den(i,k)*qci(i,k,2)/xni(i,k)
872           diameter  = min(dicon * sqrt(xmi),dimax)
873           vt2i = 1.49e4*diameter**1.31
874           vt2r=pvtr*rslopeb(i,k,1)*denfac(i,k)
875           vt2s=pvts*rslopeb(i,k,2)*denfac(i,k)
876           vt2g=pvtg*rslopeb(i,k,3)*denfac(i,k)
877           if(supcol.gt.0.and.qci(i,k,2).gt.qmin) then
878             if(qrs(i,k,1).gt.qcrmin) then
879 !-------------------------------------------------------------
880 ! praci: Accretion of cloud ice by rain [HL A15] [LFO 25]
881 !        (T<T0: I->R)
882 !-------------------------------------------------------------
883               acrfac = 2.*rslope3(i,k,1)+2.*diameter*rslope2(i,k,1)     &
884                       +diameter**2*rslope(i,k,1)
885               praci(i,k) = pi*qci(i,k,2)*n0r*abs(vt2r-vt2i)*acrfac/4.
886               praci(i,k) = min(praci(i,k),qci(i,k,2)/dtcld)
887 !-------------------------------------------------------------
888 ! piacr: Accretion of rain by cloud ice [HL A19] [LFO 26]
889 !        (T<T0: R->S or R->G)
890 !-------------------------------------------------------------
891               piacr(i,k) = pi**2*avtr*n0r*denr*xni(i,k)*denfac(i,k)     &
892                           *g6pbr*rslope3(i,k,1)*rslope3(i,k,1)          &
893                           *rslopeb(i,k,1)/24./den(i,k)
894               piacr(i,k) = min(piacr(i,k),qrs(i,k,1)/dtcld)
895             endif
896 !-------------------------------------------------------------
897 ! psaci: Accretion of cloud ice by snow [HDC 10]
898 !        (T<T0: I->S)
899 !-------------------------------------------------------------
900             if(qrs(i,k,2).gt.qcrmin) then
901               acrfac = 2.*rslope3(i,k,2)+2.*diameter*rslope2(i,k,2)     &
902                       +diameter**2*rslope(i,k,2)
903               psaci(i,k) = pi*qci(i,k,2)*eacrs*n0s*n0sfac(i,k)          &
904                           *abs(vt2s-vt2i)*acrfac/4.
905               psaci(i,k) = min(psaci(i,k),qci(i,k,2)/dtcld)
906             endif
907 !-------------------------------------------------------------
908 ! pgaci: Accretion of cloud ice by graupel [HL A17] [LFO 41]
909 !        (T<T0: I->G)
910 !-------------------------------------------------------------
911             if(qrs(i,k,3).gt.qcrmin) then
912               egi = exp(0.07*(-supcol))
913               acrfac = 2.*rslope3(i,k,3)+2.*diameter*rslope2(i,k,3)     &
914                       +diameter**2*rslope(i,k,3)
915               pgaci(i,k) = pi*egi*qci(i,k,2)*n0g*abs(vt2g-vt2i)*acrfac/4.
916               pgaci(i,k) = min(pgaci(i,k),qci(i,k,2)/dtcld)
917             endif
918           endif
919 !-------------------------------------------------------------
920 ! psacw: Accretion of cloud water by snow  [HL A7] [LFO 24]
921 !        (T<T0: C->G, and T>=T0: C->R)
922 !-------------------------------------------------------------
923           if(qrs(i,k,2).gt.qcrmin.and.qci(i,k,1).gt.qmin) then
924             psacw(i,k) = min(pacrc*n0sfac(i,k)*rslope3(i,k,2)           &
925                         *rslopeb(i,k,2)*qci(i,k,1)*denfac(i,k)          &
926                         ,qci(i,k,1)/dtcld)
927           endif
928 !-------------------------------------------------------------
929 ! pgacw: Accretion of cloud water by graupel [HL A6] [LFO 40]
930 !        (T<T0: C->G, and T>=T0: C->R)
931 !-------------------------------------------------------------
932           if(qrs(i,k,3).gt.qcrmin.and.qci(i,k,1).gt.qmin) then
933             pgacw(i,k) = min(pacrg*rslope3(i,k,3)*rslopeb(i,k,3)        &
934                         *qci(i,k,1)*denfac(i,k),qci(i,k,1)/dtcld)
935           endif
936 !-------------------------------------------------------------
937 ! pracs: Accretion of snow by rain [HL A11] [LFO 27]
938 !         (T<T0: S->G)
939 !-------------------------------------------------------------
940           if(qrs(i,k,2).gt.qcrmin.and.qrs(i,k,1).gt.qcrmin) then
941             if(supcol.gt.0) then
942               acrfac = 5.*rslope3(i,k,2)*rslope3(i,k,2)*rslope(i,k,1)   &
943                       +2.*rslope3(i,k,2)*rslope2(i,k,2)*rslope2(i,k,1)  &
944                       +.5*rslope2(i,k,2)*rslope2(i,k,2)*rslope3(i,k,1)
945               pracs(i,k) = pi**2*n0r*n0s*n0sfac(i,k)*abs(vt2r-vt2s)     &
946                           *(dens/den(i,k))*acrfac
947               pracs(i,k) = min(pracs(i,k),qrs(i,k,2)/dtcld)
948             endif
949 !-------------------------------------------------------------
950 ! psacr: Accretion of rain by snow [HL A10] [LFO 28]
951 !         (T<T0:R->S or R->G) (T>=T0: enhance melting of snow)
952 !-------------------------------------------------------------
953             acrfac = 5.*rslope3(i,k,1)*rslope3(i,k,1)*rslope(i,k,2)     &
954                     +2.*rslope3(i,k,1)*rslope2(i,k,1)*rslope2(i,k,2)    &
955                     +.5*rslope2(i,k,1)*rslope2(i,k,1)*rslope3(i,k,2)
956             psacr(i,k) = pi**2*n0r*n0s*n0sfac(i,k)*abs(vt2s-vt2r)       &
957                         *(denr/den(i,k))*acrfac
958             psacr(i,k) = min(psacr(i,k),qrs(i,k,1)/dtcld)
959           endif
960 !-------------------------------------------------------------
961 ! pgacr: Accretion of rain by graupel [HL A12] [LFO 42]
962 !         (T<T0: R->G) (T>=T0: enhance melting of graupel)
963 !-------------------------------------------------------------
964           if(qrs(i,k,3).gt.qcrmin.and.qrs(i,k,1).gt.qcrmin) then
965             acrfac = 5.*rslope3(i,k,1)*rslope3(i,k,1)*rslope(i,k,3)     &
966                     +2.*rslope3(i,k,1)*rslope2(i,k,1)*rslope2(i,k,3)    &
967                     +.5*rslope2(i,k,1)*rslope2(i,k,1)*rslope3(i,k,3)
968             pgacr(i,k) = pi**2*n0r*n0g*abs(vt2g-vt2r)*(denr/den(i,k))   &
969                         *acrfac
970             pgacr(i,k) = min(pgacr(i,k),qrs(i,k,1)/dtcld)
971           endif
972 !
973 !-------------------------------------------------------------
974 ! pgacs: Accretion of snow by graupel [HL A13] [LFO 29]
975 !        (S->G)
976 !-------------------------------------------------------------
977           if(qrs(i,k,3).gt.qcrmin.and.qrs(i,k,2).gt.qcrmin) then
978             acrfac = 5.*rslope3(i,k,2)*rslope3(i,k,2)*rslope(i,k,3)     &
979                     +2.*rslope3(i,k,2)*rslope2(i,k,2)*rslope2(i,k,3)    &
980                     +.5*rslope2(i,k,2)*rslope2(i,k,2)*rslope3(i,k,3)
981             if(supcol.gt.0) then
982               egs = exp(-0.09*supcol)
983             else
984               egs = 1.
985             endif
986             pgacs(i,k) = pi**2*egs*n0s*n0sfac(i,k)*n0g*abs(vt2g-vt2s)   &
987                         *(dens/den(i,k))*acrfac
988             pgacs(i,k) = min(pgacs(i,k),qrs(i,k,2)/dtcld)
989           endif
990           if(supcol.le.0) then
991             xlf = xlf0
992 !-------------------------------------------------------------
993 ! pseml: Enhanced melting of snow by accretion of water [HL A34]
994 !        (T>=T0: S->R)
995 !-------------------------------------------------------------
996             if(qrs(i,k,2).gt.0.)                                        &
997               pseml(i,k) = min(max(cliq*supcol*(psacw(i,k)+psacr(i,k))  &
998                           /xlf,-qrs(i,k,2)/dtcld),0.)
999 !-------------------------------------------------------------
1000 ! pgeml: Enhanced melting of graupel by accretion of water [HL A24] [RH84 A21-A22]
1001 !        (T>=T0: G->R)
1002 !-------------------------------------------------------------
1003             if(qrs(i,k,3).gt.0.)                                        &
1004               pgeml(i,k) = min(max(cliq*supcol*(pgacw(i,k)+pgacr(i,k))  &
1005                           /xlf,-qrs(i,k,3)/dtcld),0.)
1006           endif
1007           if(supcol.gt.0) then
1008 !-------------------------------------------------------------
1009 ! pidep: Deposition/Sublimation rate of ice [HDC 9]
1010 !       (T<T0: V->I or I->V)
1011 !-------------------------------------------------------------
1012             if(qci(i,k,2).gt.0.and.ifsat.ne.1) then
1013               pidep(i,k) = 4.*diameter*xni(i,k)*(rh(i,k,2)-1.)/work1(i,k,2)
1014               supice = satdt-prevp(i,k)
1015               if(pidep(i,k).lt.0.) then
1016                 pidep(i,k) = max(max(pidep(i,k),satdt/2),supice)
1017                 pidep(i,k) = max(pidep(i,k),-qci(i,k,2)/dtcld)
1018               else
1019                 pidep(i,k) = min(min(pidep(i,k),satdt/2),supice)
1020               endif
1021               if(abs(prevp(i,k)+pidep(i,k)).ge.abs(satdt)) ifsat = 1
1022             endif
1023 !-------------------------------------------------------------
1024 ! psdep: deposition/sublimation rate of snow [HDC 14]
1025 !        (T<T0: V->S or S->V)
1026 !-------------------------------------------------------------
1027             if(qrs(i,k,2).gt.0..and.ifsat.ne.1) then
1028               coeres = rslope2(i,k,2)*sqrt(rslope(i,k,2)*rslopeb(i,k,2))
1029               psdep(i,k) = (rh(i,k,2)-1.)*n0sfac(i,k)*(precs1          &
1030                            *rslope2(i,k,2)+precs2*work2(i,k)            &
1031                            *coeres)/work1(i,k,2)
1032               supice = satdt-prevp(i,k)-pidep(i,k)
1033               if(psdep(i,k).lt.0.) then
1034                 psdep(i,k) = max(psdep(i,k),-qrs(i,k,2)/dtcld)
1035                 psdep(i,k) = max(max(psdep(i,k),satdt/2),supice)
1036               else
1037                 psdep(i,k) = min(min(psdep(i,k),satdt/2),supice)
1038               endif
1039               if(abs(prevp(i,k)+pidep(i,k)+psdep(i,k)).ge.abs(satdt))  &
1040                 ifsat = 1
1041             endif
1042 !-------------------------------------------------------------
1043 ! pgdep: deposition/sublimation rate of graupel [HL A21] [LFO 46]
1044 !        (T<T0: V->G or G->V)
1045 !-------------------------------------------------------------
1046             if(qrs(i,k,3).gt.0..and.ifsat.ne.1) then
1047               coeres = rslope2(i,k,3)*sqrt(rslope(i,k,3)*rslopeb(i,k,3))
1048               pgdep(i,k) = (rh(i,k,2)-1.)*(precg1*rslope2(i,k,3)       &
1049                               +precg2*work2(i,k)*coeres)/work1(i,k,2)
1050               supice = satdt-prevp(i,k)-pidep(i,k)-psdep(i,k)
1051               if(pgdep(i,k).lt.0.) then
1052                 pgdep(i,k) = max(pgdep(i,k),-qrs(i,k,3)/dtcld)
1053                 pgdep(i,k) = max(max(pgdep(i,k),satdt/2),supice)
1054               else
1055                 pgdep(i,k) = min(min(pgdep(i,k),satdt/2),supice)
1056               endif
1057               if(abs(prevp(i,k)+pidep(i,k)+psdep(i,k)+pgdep(i,k)).ge. &
1058                 abs(satdt)) ifsat = 1
1059             endif
1060 !-------------------------------------------------------------
1061 ! pigen: generation(nucleation) of ice from vapor [HL 50] [HDC 7-8]
1062 !       (T<T0: V->I)
1063 !-------------------------------------------------------------
1064             if(supsat.gt.0.and.ifsat.ne.1) then
1065               supice = satdt-prevp(i,k)-pidep(i,k)-psdep(i,k)-pgdep(i,k)
1066               xni0 = 1.e3*exp(0.1*supcol)
1067               roqi0 = 4.92e-11*xni0**1.33
1068               pigen(i,k) = max(0.,(roqi0/den(i,k)-max(qci(i,k,2),0.))    &
1069                          /dtcld)
1070               pigen(i,k) = min(min(pigen(i,k),satdt),supice)
1071             endif
1072 !
1073 !-------------------------------------------------------------
1074 ! psaut: conversion(aggregation) of ice to snow [HDC 12]
1075 !        (T<T0: I->S)
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)
1080             endif
1081 !
1082 !-------------------------------------------------------------
1083 ! pgaut: conversion(aggregation) of snow to graupel [HL A4] [LFO 37]
1084 !        (T<T0: S->G)
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))         &
1089                            ,qrs(i,k,2)/dtcld)
1090             endif
1091           endif
1092 !
1093 !-------------------------------------------------------------
1094 ! psevp: Evaporation of melting snow [HL A35] [RH83 A27]
1095 !       (T>=T0: S->V)
1096 !-------------------------------------------------------------
1097           if(supcol.lt.0.) then
1098             if(qrs(i,k,2).gt.0..and.rh(i,k,1).lt.1.) then
1099               coeres = rslope2(i,k,2)*sqrt(rslope(i,k,2)*rslopeb(i,k,2))
1100               psevp(i,k) = (rh(i,k,1)-1.)*n0sfac(i,k)*(precs1            &
1101                            *rslope2(i,k,2)+precs2*work2(i,k)            &
1102                            *coeres)/work1(i,k,1)
1103               psevp(i,k) = min(max(psevp(i,k),-qrs(i,k,2)/dtcld),0.)
1104             endif
1105 !-------------------------------------------------------------
1106 ! pgevp: Evaporation of melting graupel [HL A25] [RH84 A19]
1107 !       (T>=T0: G->V)
1108 !-------------------------------------------------------------
1109             if(qrs(i,k,3).gt.0..and.rh(i,k,1).lt.1.) then
1110               coeres = rslope2(i,k,3)*sqrt(rslope(i,k,3)*rslopeb(i,k,3))
1111               pgevp(i,k) = (rh(i,k,1)-1.)*(precg1*rslope2(i,k,3)         &
1112                          +precg2*work2(i,k)*coeres)/work1(i,k,1)
1113               pgevp(i,k) = min(max(pgevp(i,k),-qrs(i,k,3)/dtcld),0.)
1114             endif
1115           endif
1116         enddo
1117       enddo
1118 !
1119 !
1120 !----------------------------------------------------------------
1121 !     check mass conservation of generation terms and feedback to the
1122 !     large scale
1123 !
1124       do k = kts, kte
1125         do i = its, ite
1126 !
1127           delta2=0.
1128           delta3=0.
1129           if(qrs(i,k,1).lt.1.e-4.and.qrs(i,k,2).lt.1.e-4) delta2=1.
1130           if(qrs(i,k,1).lt.1.e-4) delta3=1.
1131           if(t(i,k).le.t0c) then
1132 !
1133 !     cloud water
1134 !
1135             value = max(qmin,qci(i,k,1))
1136             source = (praut(i,k)+pracw(i,k)+psacw(i,k)+pgacw(i,k))*dtcld
1137             if (source.gt.value) then
1138               factor = value/source
1139               praut(i,k) = praut(i,k)*factor
1140               pracw(i,k) = pracw(i,k)*factor
1141               psacw(i,k) = psacw(i,k)*factor
1142               pgacw(i,k) = pgacw(i,k)*factor
1143             endif
1144 !
1145 !     cloud ice
1146 !
1147             value = max(qmin,qci(i,k,2))
1148             source = (psaut(i,k)-pigen(i,k)-pidep(i,k)+praci(i,k)        &
1149                     +psaci(i,k)+pgaci(i,k))*dtcld
1150             if (source.gt.value) then
1151               factor = value/source
1152               psaut(i,k) = psaut(i,k)*factor
1153               pigen(i,k) = pigen(i,k)*factor
1154               pidep(i,k) = pidep(i,k)*factor
1155               praci(i,k) = praci(i,k)*factor
1156               psaci(i,k) = psaci(i,k)*factor
1157               pgaci(i,k) = pgaci(i,k)*factor
1158             endif
1159 !
1160 !     rain
1161 !
1162             value = max(qmin,qrs(i,k,1))
1163             source = (-praut(i,k)-prevp(i,k)-pracw(i,k)+piacr(i,k)    &
1164                     +psacr(i,k)+pgacr(i,k))*dtcld
1165             if (source.gt.value) then
1166               factor = value/source
1167               praut(i,k) = praut(i,k)*factor
1168               prevp(i,k) = prevp(i,k)*factor
1169               pracw(i,k) = pracw(i,k)*factor
1170               piacr(i,k) = piacr(i,k)*factor
1171               psacr(i,k) = psacr(i,k)*factor
1172               pgacr(i,k) = pgacr(i,k)*factor
1173             endif
1174 !
1175 !     snow
1176 !
1177             value = max(qmin,qrs(i,k,2))
1178             source = -(psdep(i,k)+psaut(i,k)-pgaut(i,k)+psacw(i,k)      &
1179                      +piacr(i,k)*delta3+praci(i,k)*delta3               &
1180                      -pracs(i,k)*(1.-delta2)+psacr(i,k)*delta2          &
1181                      +psaci(i,k)-pgacs(i,k) )*dtcld
1182             if (source.gt.value) then
1183               factor = value/source
1184               psdep(i,k) = psdep(i,k)*factor
1185               psaut(i,k) = psaut(i,k)*factor
1186               pgaut(i,k) = pgaut(i,k)*factor
1187               psacw(i,k) = psacw(i,k)*factor
1188               piacr(i,k) = piacr(i,k)*factor
1189               praci(i,k) = praci(i,k)*factor
1190               psaci(i,k) = psaci(i,k)*factor
1191               pracs(i,k) = pracs(i,k)*factor
1192               psacr(i,k) = psacr(i,k)*factor
1193               pgacs(i,k) = pgacs(i,k)*factor
1194             endif
1195 !
1196 !     graupel
1197 !
1198             value = max(qmin,qrs(i,k,3))
1199             source = -(pgdep(i,k)+pgaut(i,k)               &
1200                      +piacr(i,k)*(1.-delta3)+praci(i,k)*(1.-delta3)     &
1201                      +psacr(i,k)*(1.-delta2)+pracs(i,k)*(1.-delta2)     &
1202                      +pgaci(i,k)+pgacw(i,k)+pgacr(i,k)+pgacs(i,k))*dtcld
1203             if (source.gt.value) then
1204               factor = value/source
1205               pgdep(i,k) = pgdep(i,k)*factor
1206               pgaut(i,k) = pgaut(i,k)*factor
1207               piacr(i,k) = piacr(i,k)*factor
1208               praci(i,k) = praci(i,k)*factor
1209               psacr(i,k) = psacr(i,k)*factor
1210               pracs(i,k) = pracs(i,k)*factor
1211               pgacw(i,k) = pgacw(i,k)*factor
1212               pgaci(i,k) = pgaci(i,k)*factor
1213               pgacr(i,k) = pgacr(i,k)*factor
1214               pgacs(i,k) = pgacs(i,k)*factor
1215             endif
1216 !
1217             work2(i,k)=-(prevp(i,k)+psdep(i,k)+pgdep(i,k)+pigen(i,k)   &
1218                        +pidep(i,k))
1219 !     update
1220             q(i,k) = q(i,k)+work2(i,k)*dtcld
1221             qci(i,k,1) = max(qci(i,k,1)-(praut(i,k)+pracw(i,k)          &
1222                            +psacw(i,k)+pgacw(i,k))*dtcld,0.)
1223             qrs(i,k,1) = max(qrs(i,k,1)+(praut(i,k)+pracw(i,k)          &
1224                            +prevp(i,k)-piacr(i,k)-pgacr(i,k)            &
1225                            -psacr(i,k))*dtcld,0.)
1226             qci(i,k,2) = max(qci(i,k,2)-(psaut(i,k)+praci(i,k)          &
1227                            +psaci(i,k)+pgaci(i,k)-pigen(i,k)-pidep(i,k))   &
1228                            *dtcld,0.)
1229             qrs(i,k,2) = max(qrs(i,k,2)+(psdep(i,k)+psaut(i,k)+psacw(i,k)  &
1230                            -pgaut(i,k)+piacr(i,k)*delta3                &
1231                            +praci(i,k)*delta3+psaci(i,k)-pgacs(i,k)      &
1232                            -pracs(i,k)*(1.-delta2)+psacr(i,k)*delta2)    &
1233                            *dtcld,0.)
1234             qrs(i,k,3) = max(qrs(i,k,3)+(pgdep(i,k)+pgaut(i,k)         &
1235                            +piacr(i,k)*(1.-delta3)            &
1236                            +praci(i,k)*(1.-delta3)+psacr(i,k)*(1.-delta2)&
1237                            +pracs(i,k)*(1.-delta2)+pgaci(i,k)+pgacw(i,k) &
1238                            +pgacr(i,k)+pgacs(i,k))*dtcld,0.)
1239             xlf = xls-xl(i,k)
1240             xlwork2 = -xls*(psdep(i,k)+pgdep(i,k)+pidep(i,k)+pigen(i,k)) &
1241                       -xl(i,k)*prevp(i,k)-xlf*(piacr(i,k)+psacw(i,k)    &
1242                       +pgacw(i,k)+pgacr(i,k)+psacr(i,k))
1243             t(i,k) = t(i,k)-xlwork2/cpm(i,k)*dtcld
1244           else
1245 !
1246 !     cloud water
1247 !
1248             value = max(qmin,qci(i,k,1))
1249             source=(praut(i,k)+pracw(i,k)+psacw(i,k)+pgacw(i,k))*dtcld
1250             if (source.gt.value) then
1251               factor = value/source
1252               praut(i,k) = praut(i,k)*factor
1253               pracw(i,k) = pracw(i,k)*factor
1254               psacw(i,k) = psacw(i,k)*factor
1255               pgacw(i,k) = pgacw(i,k)*factor
1256             endif
1257 !
1258 !     rain
1259 !
1260             value = max(qmin,qrs(i,k,1))
1261             source = (-psacw(i,k)-praut(i,k)+pseml(i,k)+pgeml(i,k)     &
1262                      -pracw(i,k)-pgacw(i,k)-prevp(i,k))*dtcld
1263             if (source.gt.value) then
1264               factor = value/source
1265               praut(i,k) = praut(i,k)*factor
1266               prevp(i,k) = prevp(i,k)*factor
1267               pgacw(i,k) = pgacw(i,k)*factor
1268               pracw(i,k) = pracw(i,k)*factor
1269               psacw(i,k) = psacw(i,k)*factor
1270               pseml(i,k) = pseml(i,k)*factor
1271               pgeml(i,k) = pgeml(i,k)*factor
1272             endif
1273 !
1274 !     snow
1275 !
1276             value = max(qcrmin,qrs(i,k,2))
1277             source=(pgacs(i,k)-pseml(i,k)-psevp(i,k))*dtcld
1278             if (source.gt.value) then
1279               factor = value/source
1280               pgacs(i,k) = pgacs(i,k)*factor
1281               psevp(i,k) = psevp(i,k)*factor
1282               pseml(i,k) = pseml(i,k)*factor
1283             endif
1284 !
1285 !     graupel
1286 !
1287             value = max(qcrmin,qrs(i,k,3))
1288             source=-(pgacs(i,k)+pgevp(i,k)+pgeml(i,k))*dtcld
1289             if (source.gt.value) then
1290               factor = value/source
1291               pgacs(i,k) = pgacs(i,k)*factor
1292               pgevp(i,k) = pgevp(i,k)*factor
1293               pgeml(i,k) = pgeml(i,k)*factor
1294             endif
1295             work2(i,k)=-(prevp(i,k)+psevp(i,k)+pgevp(i,k))
1296 !     update
1297             q(i,k) = q(i,k)+work2(i,k)*dtcld
1298             qci(i,k,1) = max(qci(i,k,1)-(praut(i,k)+pracw(i,k)         &
1299                     +psacw(i,k)+pgacw(i,k))*dtcld,0.)
1300             qrs(i,k,1) = max(qrs(i,k,1)+(praut(i,k)+pracw(i,k)         &
1301                     +prevp(i,k)+psacw(i,k)+pgacw(i,k)-pseml(i,k)       &
1302                     -pgeml(i,k))*dtcld,0.)
1303             qrs(i,k,2) = max(qrs(i,k,2)+(psevp(i,k)-pgacs(i,k)           &
1304                     +pseml(i,k))*dtcld,0.)
1305             qrs(i,k,3) = max(qrs(i,k,3)+(pgacs(i,k)+pgevp(i,k)           &
1306                     +pgeml(i,k))*dtcld,0.)
1307             xlf = xls-xl(i,k)
1308             xlwork2 = -xl(i,k)*(prevp(i,k)+psevp(i,k)+pgevp(i,k))        &
1309                       -xlf*(pseml(i,k)+pgeml(i,k))
1310             t(i,k) = t(i,k)-xlwork2/cpm(i,k)*dtcld
1311           endif
1312         enddo
1313       enddo
1314 !
1315 ! Inline expansion for fpvs
1316 !         qs(i,k,1) = fpvs(t(i,k),0,rd,rv,cpv,cliq,cice,xlv0,xls,psat,t0c)
1317 !         qs(i,k,2) = fpvs(t(i,k),1,rd,rv,cpv,cliq,cice,xlv0,xls,psat,t0c)
1318       hsub = xls
1319       hvap = xlv0
1320       cvap = cpv
1321       ttp=t0c+0.01
1322       dldt=cvap-cliq
1323       xa=-dldt/rv
1324       xb=xa+hvap/(rv*ttp)
1325       dldti=cvap-cice
1326       xai=-dldti/rv
1327       xbi=xai+hsub/(rv*ttp)
1328       do k = kts, kte
1329         do i = its, ite
1330           tr=ttp/t(i,k)
1331           qs(i,k,1)=psat*exp(log(tr)*(xa))*exp(xb*(1.-tr))
1332           qs(i,k,1) = ep2 * qs(i,k,1) / (p(i,k) - qs(i,k,1))
1333           qs(i,k,1) = max(qs(i,k,1),qmin)
1334           tr=ttp/t(i,k)
1335           if(t(i,k).lt.ttp) then
1336             qs(i,k,2)=psat*exp(log(tr)*(xai))*exp(xbi*(1.-tr))
1337           else
1338             qs(i,k,2)=psat*exp(log(tr)*(xa))*exp(xb*(1.-tr))
1339           endif
1340           qs(i,k,2) = ep2 * qs(i,k,2) / (p(i,k) - qs(i,k,2))
1341           qs(i,k,2) = max(qs(i,k,2),qmin)
1342         enddo
1343       enddo
1344 !
1345 !----------------------------------------------------------------
1346 !  pcond: condensational/evaporational rate of cloud water [HL A46] [RH83 A6]
1347 !     if there exists additional water vapor condensated/if
1348 !     evaporation of cloud water is not enough to remove subsaturation
1349 !
1350       do k = kts, kte
1351         do i = its, ite
1352           work1(i,k,1) = conden(t(i,k),q(i,k),qs(i,k,1),xl(i,k),cpm(i,k))
1353           work2(i,k) = qci(i,k,1)+work1(i,k,1)
1354           pcond(i,k) = min(max(work1(i,k,1)/dtcld,0.),max(q(i,k),0.)/dtcld)
1355           if(qci(i,k,1).gt.0..and.work1(i,k,1).lt.0.)                   &
1356             pcond(i,k) = max(work1(i,k,1),-qci(i,k,1))/dtcld
1357           q(i,k) = q(i,k)-pcond(i,k)*dtcld
1358           qci(i,k,1) = max(qci(i,k,1)+pcond(i,k)*dtcld,0.)
1359           t(i,k) = t(i,k)+pcond(i,k)*xl(i,k)/cpm(i,k)*dtcld
1360         enddo
1361       enddo
1362 !
1363 !
1364 !----------------------------------------------------------------
1365 !     padding for small values
1366 !
1367       do k = kts, kte
1368         do i = its, ite
1369           if(qci(i,k,1).le.qmin) qci(i,k,1) = 0.0
1370           if(qci(i,k,2).le.qmin) qci(i,k,2) = 0.0
1371         enddo
1372       enddo
1373       enddo                  ! big loops
1374   END SUBROUTINE wsm62d
1375 ! ...................................................................
1376       REAL FUNCTION rgmma(x)
1377 !-------------------------------------------------------------------
1378   IMPLICIT NONE
1379 !-------------------------------------------------------------------
1380 !     rgmma function:  use infinite product form
1381       REAL :: euler
1382       PARAMETER (euler=0.577215664901532)
1383       REAL :: x, y
1384       INTEGER :: i
1385       if(x.eq.1.)then
1386         rgmma=0.
1387           else
1388         rgmma=x*exp(euler*x)
1389         do i=1,10000
1390           y=float(i)
1391           rgmma=rgmma*(1.000+x/y)*exp(-x/y)
1392         enddo
1393         rgmma=1./rgmma
1394       endif
1395       END FUNCTION rgmma
1396 !
1397 !--------------------------------------------------------------------------
1398       REAL FUNCTION fpvs(t,ice,rd,rv,cvap,cliq,cice,hvap,hsub,psat,t0c)
1399 !--------------------------------------------------------------------------
1400       IMPLICIT NONE
1401 !--------------------------------------------------------------------------
1402       REAL t,rd,rv,cvap,cliq,cice,hvap,hsub,psat,t0c,dldt,xa,xb,dldti,  &
1403            xai,xbi,ttp,tr
1404       INTEGER ice
1405 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1406       ttp=t0c+0.01
1407       dldt=cvap-cliq
1408       xa=-dldt/rv
1409       xb=xa+hvap/(rv*ttp)
1410       dldti=cvap-cice
1411       xai=-dldti/rv
1412       xbi=xai+hsub/(rv*ttp)
1413       tr=ttp/t
1414       if(t.lt.ttp.and.ice.eq.1) then
1415         fpvs=psat*(tr**xai)*exp(xbi*(1.-tr))
1416       else
1417         fpvs=psat*(tr**xa)*exp(xb*(1.-tr))
1418       endif
1419 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1420       END FUNCTION fpvs
1421 !-------------------------------------------------------------------
1422   SUBROUTINE wsm6init(den0,denr,dens,cl,cpv,allowed_to_read)
1423 !-------------------------------------------------------------------
1424   IMPLICIT NONE
1425 !-------------------------------------------------------------------
1426 !.... constants which may not be tunable
1427    REAL, INTENT(IN) :: den0,denr,dens,cl,cpv
1428    LOGICAL, INTENT(IN) :: allowed_to_read
1429    REAL :: pi
1430 !
1431    pi = 4.*atan(1.)
1432    xlv1 = cl-cpv
1433 !
1434    qc0  = 4./3.*pi*denr*r0**3*xncr/den0  ! 0.419e-3 -- .61e-3
1435    qck1 = .104*9.8*peaut/(xncr*denr)**(1./3.)/xmyu*den0**(4./3.) ! 7.03
1436 !
1437    bvtr1 = 1.+bvtr
1438    bvtr2 = 2.5+.5*bvtr
1439    bvtr3 = 3.+bvtr
1440    bvtr4 = 4.+bvtr
1441    bvtr6 = 6.+bvtr
1442    g1pbr = rgmma(bvtr1)
1443    g3pbr = rgmma(bvtr3)
1444    g4pbr = rgmma(bvtr4)            ! 17.837825
1445    g6pbr = rgmma(bvtr6)
1446    g5pbro2 = rgmma(bvtr2)          ! 1.8273
1447    pvtr = avtr*g4pbr/6.
1448    eacrr = 1.0
1449    pacrr = pi*n0r*avtr*g3pbr*.25*eacrr
1450    precr1 = 2.*pi*n0r*.78
1451    precr2 = 2.*pi*n0r*.31*avtr**.5*g5pbro2
1452    xm0  = (di0/dicon)**2
1453    xmmax = (dimax/dicon)**2
1454    roqimax = 2.08e22*dimax**8
1455 !
1456    bvts1 = 1.+bvts
1457    bvts2 = 2.5+.5*bvts
1458    bvts3 = 3.+bvts
1459    bvts4 = 4.+bvts
1460    g1pbs = rgmma(bvts1)    !.8875
1461    g3pbs = rgmma(bvts3)
1462    g4pbs = rgmma(bvts4)    ! 12.0786
1463    g5pbso2 = rgmma(bvts2)
1464    pvts = avts*g4pbs/6.
1465    pacrs = pi*n0s*avts*g3pbs*.25
1466    precs1 = 4.*n0s*.65
1467    precs2 = 4.*n0s*.44*avts**.5*g5pbso2
1468    pidn0r =  pi*denr*n0r
1469    pidn0s =  pi*dens*n0s
1470 !
1471    pacrc = pi*n0s*avts*g3pbs*.25*eacrc
1472 !
1473    bvtg1 = 1.+bvtg
1474    bvtg2 = 2.5+.5*bvtg
1475    bvtg3 = 3.+bvtg
1476    bvtg4 = 4.+bvtg
1477    g1pbg = rgmma(bvtg1)
1478    g3pbg = rgmma(bvtg3)
1479    g4pbg = rgmma(bvtg4)
1480    pacrg = pi*n0g*avtg*g3pbg*.25
1481    g5pbgo2 = rgmma(bvtg2)
1482    pvtg = avtg*g4pbg/6.
1483    precg1 = 2.*pi*n0g*.78
1484    precg2 = 2.*pi*n0g*.31*avtg**.5*g5pbgo2
1485    pidn0g =  pi*deng*n0g
1486 !
1487    rslopermax = 1./lamdarmax
1488    rslopesmax = 1./lamdasmax
1489    rslopegmax = 1./lamdagmax
1490    rsloperbmax = rslopermax ** bvtr
1491    rslopesbmax = rslopesmax ** bvts
1492    rslopegbmax = rslopegmax ** bvtg
1493    rsloper2max = rslopermax * rslopermax
1494    rslopes2max = rslopesmax * rslopesmax
1495    rslopeg2max = rslopegmax * rslopegmax
1496    rsloper3max = rsloper2max * rslopermax
1497    rslopes3max = rslopes2max * rslopesmax
1498    rslopeg3max = rslopeg2max * rslopegmax
1499 !
1500   END SUBROUTINE wsm6init
1501 END MODULE module_mp_wsm6