PageRenderTime 81ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 1ms

/wrfv2_fire/phys/module_mp_wsm6.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 2218 lines | 1636 code | 1 blank | 581 comment | 120 complexity | c10535f792aaff054b814b969f7f2130 MD5 | raw file
Possible License(s): AGPL-1.0
  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. MODULE module_mp_wsm6
  9. !
  10. !
  11. REAL, PARAMETER, PRIVATE :: dtcldcr = 120. ! maximum time step for minor loops
  12. REAL, PARAMETER, PRIVATE :: n0r = 8.e6 ! intercept parameter rain
  13. REAL, PARAMETER, PRIVATE :: n0g = 4.e6 ! intercept parameter graupel
  14. REAL, PARAMETER, PRIVATE :: avtr = 841.9 ! a constant for terminal velocity of rain
  15. REAL, PARAMETER, PRIVATE :: bvtr = 0.8 ! a constant for terminal velocity of rain
  16. REAL, PARAMETER, PRIVATE :: r0 = .8e-5 ! 8 microm in contrast to 10 micro m
  17. REAL, PARAMETER, PRIVATE :: peaut = .55 ! collection efficiency
  18. REAL, PARAMETER, PRIVATE :: xncr = 3.e8 ! maritime cloud in contrast to 3.e8 in tc80
  19. REAL, PARAMETER, PRIVATE :: xmyu = 1.718e-5 ! the dynamic viscosity kgm-1s-1
  20. REAL, PARAMETER, PRIVATE :: avts = 11.72 ! a constant for terminal velocity of snow
  21. REAL, PARAMETER, PRIVATE :: bvts = .41 ! a constant for terminal velocity of snow
  22. REAL, PARAMETER, PRIVATE :: avtg = 330. ! a constant for terminal velocity of graupel
  23. REAL, PARAMETER, PRIVATE :: bvtg = 0.8 ! a constant for terminal velocity of graupel
  24. REAL, PARAMETER, PRIVATE :: deng = 500. ! density of graupel
  25. REAL, PARAMETER, PRIVATE :: n0smax = 1.e11 ! maximum n0s (t=-90C unlimited)
  26. REAL, PARAMETER, PRIVATE :: lamdarmax = 8.e4 ! limited maximum value for slope parameter of rain
  27. REAL, PARAMETER, PRIVATE :: lamdasmax = 1.e5 ! limited maximum value for slope parameter of snow
  28. REAL, PARAMETER, PRIVATE :: lamdagmax = 6.e4 ! limited maximum value for slope parameter of graupel
  29. REAL, PARAMETER, PRIVATE :: dicon = 11.9 ! constant for the cloud-ice diamter
  30. REAL, PARAMETER, PRIVATE :: dimax = 500.e-6 ! limited maximum value for the cloud-ice diamter
  31. REAL, PARAMETER, PRIVATE :: n0s = 2.e6 ! temperature dependent intercept parameter snow
  32. REAL, PARAMETER, PRIVATE :: alpha = .12 ! .122 exponen factor for n0s
  33. REAL, PARAMETER, PRIVATE :: pfrz1 = 100. ! constant in Biggs freezing
  34. REAL, PARAMETER, PRIVATE :: pfrz2 = 0.66 ! constant in Biggs freezing
  35. REAL, PARAMETER, PRIVATE :: qcrmin = 1.e-9 ! minimun values for qr, qs, and qg
  36. REAL, PARAMETER, PRIVATE :: eacrc = 1.0 ! Snow/cloud-water collection efficiency
  37. REAL, PARAMETER, PRIVATE :: dens = 100.0 ! Density of snow
  38. REAL, PARAMETER, PRIVATE :: qs0 = 6.e-4 ! threshold amount for aggretion to occur
  39. REAL, SAVE :: &
  40. qc0, qck1,bvtr1,bvtr2,bvtr3,bvtr4,g1pbr, &
  41. g3pbr,g4pbr,g5pbro2,pvtr,eacrr,pacrr, &
  42. bvtr6,g6pbr, &
  43. precr1,precr2,roqimax,bvts1, &
  44. bvts2,bvts3,bvts4,g1pbs,g3pbs,g4pbs, &
  45. g5pbso2,pvts,pacrs,precs1,precs2,pidn0r, &
  46. pidn0s,xlv1,pacrc,pi, &
  47. bvtg1,bvtg2,bvtg3,bvtg4,g1pbg, &
  48. g3pbg,g4pbg,g5pbgo2,pvtg,pacrg, &
  49. precg1,precg2,pidn0g, &
  50. rslopermax,rslopesmax,rslopegmax, &
  51. rsloperbmax,rslopesbmax,rslopegbmax, &
  52. rsloper2max,rslopes2max,rslopeg2max, &
  53. rsloper3max,rslopes3max,rslopeg3max
  54. CONTAINS
  55. !===================================================================
  56. !
  57. SUBROUTINE wsm6(th, q, qc, qr, qi, qs, qg &
  58. ,den, pii, p, delz &
  59. ,delt,g, cpd, cpv, rd, rv, t0c &
  60. ,ep1, ep2, qmin &
  61. ,XLS, XLV0, XLF0, den0, denr &
  62. ,cliq,cice,psat &
  63. ,rain, rainncv &
  64. ,snow, snowncv &
  65. ,sr &
  66. ,graupel, graupelncv &
  67. ,ids,ide, jds,jde, kds,kde &
  68. ,ims,ime, jms,jme, kms,kme &
  69. ,its,ite, jts,jte, kts,kte &
  70. )
  71. !-------------------------------------------------------------------
  72. IMPLICIT NONE
  73. !-------------------------------------------------------------------
  74. INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde , &
  75. ims,ime, jms,jme, kms,kme , &
  76. its,ite, jts,jte, kts,kte
  77. REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), &
  78. INTENT(INOUT) :: &
  79. th, &
  80. q, &
  81. qc, &
  82. qi, &
  83. qr, &
  84. qs, &
  85. qg
  86. REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), &
  87. INTENT(IN ) :: &
  88. den, &
  89. pii, &
  90. p, &
  91. delz
  92. REAL, INTENT(IN ) :: delt, &
  93. g, &
  94. rd, &
  95. rv, &
  96. t0c, &
  97. den0, &
  98. cpd, &
  99. cpv, &
  100. ep1, &
  101. ep2, &
  102. qmin, &
  103. XLS, &
  104. XLV0, &
  105. XLF0, &
  106. cliq, &
  107. cice, &
  108. psat, &
  109. denr
  110. REAL, DIMENSION( ims:ime , jms:jme ), &
  111. INTENT(INOUT) :: rain, &
  112. rainncv, &
  113. sr
  114. REAL, DIMENSION( ims:ime , jms:jme ), OPTIONAL, &
  115. INTENT(INOUT) :: snow, &
  116. snowncv
  117. REAL, DIMENSION( ims:ime , jms:jme ), OPTIONAL, &
  118. INTENT(INOUT) :: graupel, &
  119. graupelncv
  120. ! LOCAL VAR
  121. REAL, DIMENSION( its:ite , kts:kte ) :: t
  122. REAL, DIMENSION( its:ite , kts:kte, 2 ) :: qci
  123. REAL, DIMENSION( its:ite , kts:kte, 3 ) :: qrs
  124. INTEGER :: i,j,k
  125. !-------------------------------------------------------------------
  126. DO j=jts,jte
  127. DO k=kts,kte
  128. DO i=its,ite
  129. t(i,k)=th(i,k,j)*pii(i,k,j)
  130. qci(i,k,1) = qc(i,k,j)
  131. qci(i,k,2) = qi(i,k,j)
  132. qrs(i,k,1) = qr(i,k,j)
  133. qrs(i,k,2) = qs(i,k,j)
  134. qrs(i,k,3) = qg(i,k,j)
  135. ENDDO
  136. ENDDO
  137. ! Sending array starting locations of optional variables may cause
  138. ! troubles, so we explicitly change the call.
  139. CALL wsm62D(t, q(ims,kms,j), qci, qrs &
  140. ,den(ims,kms,j) &
  141. ,p(ims,kms,j), delz(ims,kms,j) &
  142. ,delt,g, cpd, cpv, rd, rv, t0c &
  143. ,ep1, ep2, qmin &
  144. ,XLS, XLV0, XLF0, den0, denr &
  145. ,cliq,cice,psat &
  146. ,j &
  147. ,rain(ims,j),rainncv(ims,j) &
  148. ,sr(ims,j) &
  149. ,ids,ide, jds,jde, kds,kde &
  150. ,ims,ime, jms,jme, kms,kme &
  151. ,its,ite, jts,jte, kts,kte &
  152. ,snow,snowncv &
  153. ,graupel,graupelncv &
  154. )
  155. DO K=kts,kte
  156. DO I=its,ite
  157. th(i,k,j)=t(i,k)/pii(i,k,j)
  158. qc(i,k,j) = qci(i,k,1)
  159. qi(i,k,j) = qci(i,k,2)
  160. qr(i,k,j) = qrs(i,k,1)
  161. qs(i,k,j) = qrs(i,k,2)
  162. qg(i,k,j) = qrs(i,k,3)
  163. ENDDO
  164. ENDDO
  165. ENDDO
  166. END SUBROUTINE wsm6
  167. !===================================================================
  168. !
  169. SUBROUTINE wsm62D(t, q &
  170. ,qci, qrs, den, p, delz &
  171. ,delt,g, cpd, cpv, rd, rv, t0c &
  172. ,ep1, ep2, qmin &
  173. ,XLS, XLV0, XLF0, den0, denr &
  174. ,cliq,cice,psat &
  175. ,lat &
  176. ,rain,rainncv &
  177. ,sr &
  178. ,ids,ide, jds,jde, kds,kde &
  179. ,ims,ime, jms,jme, kms,kme &
  180. ,its,ite, jts,jte, kts,kte &
  181. ,snow,snowncv &
  182. ,graupel,graupelncv &
  183. )
  184. !-------------------------------------------------------------------
  185. IMPLICIT NONE
  186. !-------------------------------------------------------------------
  187. !
  188. ! This code is a 6-class GRAUPEL phase microphyiscs scheme (WSM6) of the
  189. ! Single-Moment MicroPhyiscs (WSMMP). The WSMMP assumes that ice nuclei
  190. ! number concentration is a function of temperature, and seperate assumption
  191. ! is developed, in which ice crystal number concentration is a function
  192. ! of ice amount. A theoretical background of the ice-microphysics and related
  193. ! processes in the WSMMPs are described in Hong et al. (2004).
  194. ! All production terms in the WSM6 scheme are described in Hong and Lim (2006).
  195. ! All units are in m.k.s. and source/sink terms in kgkg-1s-1.
  196. !
  197. ! WSM6 cloud scheme
  198. !
  199. ! Coded by Song-You Hong and Jeong-Ock Jade Lim (Yonsei Univ.)
  200. ! Summer 2003
  201. !
  202. ! Implemented by Song-You Hong (Yonsei Univ.) and Jimy Dudhia (NCAR)
  203. ! Summer 2004
  204. !
  205. ! History : semi-lagrangian scheme sedimentation(JH), and clean up
  206. ! Hong, August 2009
  207. !
  208. ! Reference) Hong, Dudhia, Chen (HDC, 2004) Mon. Wea. Rev.
  209. ! Hong and Lim (HL, 2006) J. Korean Meteor. Soc.
  210. ! Dudhia, Hong and Lim (DHL, 2008) J. Meteor. Soc. Japan
  211. ! Lin, Farley, Orville (LFO, 1983) J. Appl. Meteor.
  212. ! Rutledge, Hobbs (RH83, 1983) J. Atmos. Sci.
  213. ! Rutledge, Hobbs (RH84, 1984) J. Atmos. Sci.
  214. ! Juang and Hong (JH, 2010) Mon. Wea. Rev.
  215. !
  216. INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde , &
  217. ims,ime, jms,jme, kms,kme , &
  218. its,ite, jts,jte, kts,kte, &
  219. lat
  220. REAL, DIMENSION( its:ite , kts:kte ), &
  221. INTENT(INOUT) :: &
  222. t
  223. REAL, DIMENSION( its:ite , kts:kte, 2 ), &
  224. INTENT(INOUT) :: &
  225. qci
  226. REAL, DIMENSION( its:ite , kts:kte, 3 ), &
  227. INTENT(INOUT) :: &
  228. qrs
  229. REAL, DIMENSION( ims:ime , kms:kme ), &
  230. INTENT(INOUT) :: &
  231. q
  232. REAL, DIMENSION( ims:ime , kms:kme ), &
  233. INTENT(IN ) :: &
  234. den, &
  235. p, &
  236. delz
  237. REAL, INTENT(IN ) :: delt, &
  238. g, &
  239. cpd, &
  240. cpv, &
  241. t0c, &
  242. den0, &
  243. rd, &
  244. rv, &
  245. ep1, &
  246. ep2, &
  247. qmin, &
  248. XLS, &
  249. XLV0, &
  250. XLF0, &
  251. cliq, &
  252. cice, &
  253. psat, &
  254. denr
  255. REAL, DIMENSION( ims:ime ), &
  256. INTENT(INOUT) :: rain, &
  257. rainncv, &
  258. sr
  259. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, &
  260. INTENT(INOUT) :: snow, &
  261. snowncv
  262. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, &
  263. INTENT(INOUT) :: graupel, &
  264. graupelncv
  265. ! LOCAL VAR
  266. REAL, DIMENSION( its:ite , kts:kte , 3) :: &
  267. rh, &
  268. qs, &
  269. rslope, &
  270. rslope2, &
  271. rslope3, &
  272. rslopeb, &
  273. qrs_tmp, &
  274. falk, &
  275. fall, &
  276. work1
  277. REAL, DIMENSION( its:ite , kts:kte ) :: &
  278. fallc, &
  279. falkc, &
  280. work1c, &
  281. work2c, &
  282. workr, &
  283. worka
  284. REAL, DIMENSION( its:ite , kts:kte ) :: &
  285. den_tmp, &
  286. delz_tmp
  287. REAL, DIMENSION( its:ite , kts:kte ) :: &
  288. pigen, &
  289. pidep, &
  290. pcond, &
  291. prevp, &
  292. psevp, &
  293. pgevp, &
  294. psdep, &
  295. pgdep, &
  296. praut, &
  297. psaut, &
  298. pgaut, &
  299. piacr, &
  300. pracw, &
  301. praci, &
  302. pracs, &
  303. psacw, &
  304. psaci, &
  305. psacr, &
  306. pgacw, &
  307. pgaci, &
  308. pgacr, &
  309. pgacs, &
  310. paacw, &
  311. psmlt, &
  312. pgmlt, &
  313. pseml, &
  314. pgeml
  315. REAL, DIMENSION( its:ite , kts:kte ) :: &
  316. qsum, &
  317. xl, &
  318. cpm, &
  319. work2, &
  320. denfac, &
  321. xni, &
  322. denqrs1, &
  323. denqrs2, &
  324. denqrs3, &
  325. denqci, &
  326. n0sfac
  327. REAL, DIMENSION( its:ite ) :: delqrs1, &
  328. delqrs2, &
  329. delqrs3, &
  330. delqi
  331. REAL, DIMENSION( its:ite ) :: tstepsnow, &
  332. tstepgraup
  333. INTEGER, DIMENSION( its:ite ) :: mstep, &
  334. numdt
  335. LOGICAL, DIMENSION( its:ite ) :: flgcld
  336. REAL :: &
  337. cpmcal, xlcal, diffus, &
  338. viscos, xka, venfac, conden, diffac, &
  339. x, y, z, a, b, c, d, e, &
  340. qdt, holdrr, holdrs, holdrg, supcol, supcolt, pvt, &
  341. coeres, supsat, dtcld, xmi, eacrs, satdt, &
  342. qimax, diameter, xni0, roqi0, &
  343. fallsum, fallsum_qsi, fallsum_qg, &
  344. vt2i,vt2r,vt2s,vt2g,acrfac,egs,egi, &
  345. xlwork2, factor, source, value, &
  346. xlf, pfrzdtc, pfrzdtr, supice, alpha2, delta2, delta3
  347. REAL :: vt2ave
  348. REAL :: holdc, holdci
  349. INTEGER :: i, j, k, mstepmax, &
  350. iprt, latd, lond, loop, loops, ifsat, n, idim, kdim
  351. ! Temporaries used for inlining fpvs function
  352. REAL :: dldti, xb, xai, tr, xbi, xa, hvap, cvap, hsub, dldt, ttp
  353. ! variables for optimization
  354. REAL, DIMENSION( its:ite ) :: tvec1
  355. REAL :: temp
  356. !
  357. !=================================================================
  358. ! compute internal functions
  359. !
  360. cpmcal(x) = cpd*(1.-max(x,qmin))+max(x,qmin)*cpv
  361. xlcal(x) = xlv0-xlv1*(x-t0c)
  362. !----------------------------------------------------------------
  363. ! diffus: diffusion coefficient of the water vapor
  364. ! viscos: kinematic viscosity(m2s-1)
  365. ! Optimizatin : A**B => exp(log(A)*(B))
  366. !
  367. diffus(x,y) = 8.794e-5 * exp(log(x)*(1.81)) / y ! 8.794e-5*x**1.81/y
  368. viscos(x,y) = 1.496e-6 * (x*sqrt(x)) /(x+120.)/y ! 1.496e-6*x**1.5/(x+120.)/y
  369. xka(x,y) = 1.414e3*viscos(x,y)*y
  370. diffac(a,b,c,d,e) = d*a*a/(xka(c,d)*rv*c*c)+1./(e*diffus(c,b))
  371. venfac(a,b,c) = exp(log((viscos(b,c)/diffus(b,a)))*((.3333333))) &
  372. /sqrt(viscos(b,c))*sqrt(sqrt(den0/c))
  373. conden(a,b,c,d,e) = (max(b,qmin)-c)/(1.+d*d/(rv*e)*c/(a*a))
  374. !
  375. !
  376. idim = ite-its+1
  377. kdim = kte-kts+1
  378. !
  379. !----------------------------------------------------------------
  380. ! paddint 0 for negative values generated by dynamics
  381. !
  382. do k = kts, kte
  383. do i = its, ite
  384. qci(i,k,1) = max(qci(i,k,1),0.0)
  385. qrs(i,k,1) = max(qrs(i,k,1),0.0)
  386. qci(i,k,2) = max(qci(i,k,2),0.0)
  387. qrs(i,k,2) = max(qrs(i,k,2),0.0)
  388. qrs(i,k,3) = max(qrs(i,k,3),0.0)
  389. enddo
  390. enddo
  391. !
  392. !----------------------------------------------------------------
  393. ! latent heat for phase changes and heat capacity. neglect the
  394. ! changes during microphysical process calculation
  395. ! emanuel(1994)
  396. !
  397. do k = kts, kte
  398. do i = its, ite
  399. cpm(i,k) = cpmcal(q(i,k))
  400. xl(i,k) = xlcal(t(i,k))
  401. enddo
  402. enddo
  403. do k = kts, kte
  404. do i = its, ite
  405. delz_tmp(i,k) = delz(i,k)
  406. den_tmp(i,k) = den(i,k)
  407. enddo
  408. enddo
  409. !
  410. !----------------------------------------------------------------
  411. ! initialize the surface rain, snow, graupel
  412. !
  413. do i = its, ite
  414. rainncv(i) = 0.
  415. if(PRESENT (snowncv) .AND. PRESENT (snow)) snowncv(i,lat) = 0.
  416. if(PRESENT (graupelncv) .AND. PRESENT (graupel)) graupelncv(i,lat) = 0.
  417. sr(i) = 0.
  418. ! new local array to catch step snow and graupel
  419. tstepsnow(i) = 0.
  420. tstepgraup(i) = 0.
  421. enddo
  422. !
  423. !----------------------------------------------------------------
  424. ! compute the minor time steps.
  425. !
  426. loops = max(nint(delt/dtcldcr),1)
  427. dtcld = delt/loops
  428. if(delt.le.dtcldcr) dtcld = delt
  429. !
  430. do loop = 1,loops
  431. !
  432. !----------------------------------------------------------------
  433. ! initialize the large scale variables
  434. !
  435. do i = its, ite
  436. mstep(i) = 1
  437. flgcld(i) = .true.
  438. enddo
  439. !
  440. ! do k = kts, kte
  441. ! do i = its, ite
  442. ! denfac(i,k) = sqrt(den0/den(i,k))
  443. ! enddo
  444. ! enddo
  445. do k = kts, kte
  446. CALL VREC( tvec1(its), den(its,k), ite-its+1)
  447. do i = its, ite
  448. tvec1(i) = tvec1(i)*den0
  449. enddo
  450. CALL VSQRT( denfac(its,k), tvec1(its), ite-its+1)
  451. enddo
  452. !
  453. ! Inline expansion for fpvs
  454. ! qs(i,k,1) = fpvs(t(i,k),0,rd,rv,cpv,cliq,cice,xlv0,xls,psat,t0c)
  455. ! qs(i,k,2) = fpvs(t(i,k),1,rd,rv,cpv,cliq,cice,xlv0,xls,psat,t0c)
  456. hsub = xls
  457. hvap = xlv0
  458. cvap = cpv
  459. ttp=t0c+0.01
  460. dldt=cvap-cliq
  461. xa=-dldt/rv
  462. xb=xa+hvap/(rv*ttp)
  463. dldti=cvap-cice
  464. xai=-dldti/rv
  465. xbi=xai+hsub/(rv*ttp)
  466. do k = kts, kte
  467. do i = its, ite
  468. tr=ttp/t(i,k)
  469. qs(i,k,1)=psat*exp(log(tr)*(xa))*exp(xb*(1.-tr))
  470. qs(i,k,1) = min(qs(i,k,1),0.99*p(i,k))
  471. qs(i,k,1) = ep2 * qs(i,k,1) / (p(i,k) - qs(i,k,1))
  472. qs(i,k,1) = max(qs(i,k,1),qmin)
  473. rh(i,k,1) = max(q(i,k) / qs(i,k,1),qmin)
  474. tr=ttp/t(i,k)
  475. if(t(i,k).lt.ttp) then
  476. qs(i,k,2)=psat*exp(log(tr)*(xai))*exp(xbi*(1.-tr))
  477. else
  478. qs(i,k,2)=psat*exp(log(tr)*(xa))*exp(xb*(1.-tr))
  479. endif
  480. qs(i,k,2) = min(qs(i,k,2),0.99*p(i,k))
  481. qs(i,k,2) = ep2 * qs(i,k,2) / (p(i,k) - qs(i,k,2))
  482. qs(i,k,2) = max(qs(i,k,2),qmin)
  483. rh(i,k,2) = max(q(i,k) / qs(i,k,2),qmin)
  484. enddo
  485. enddo
  486. !
  487. !----------------------------------------------------------------
  488. ! initialize the variables for microphysical physics
  489. !
  490. !
  491. do k = kts, kte
  492. do i = its, ite
  493. prevp(i,k) = 0.
  494. psdep(i,k) = 0.
  495. pgdep(i,k) = 0.
  496. praut(i,k) = 0.
  497. psaut(i,k) = 0.
  498. pgaut(i,k) = 0.
  499. pracw(i,k) = 0.
  500. praci(i,k) = 0.
  501. piacr(i,k) = 0.
  502. psaci(i,k) = 0.
  503. psacw(i,k) = 0.
  504. pracs(i,k) = 0.
  505. psacr(i,k) = 0.
  506. pgacw(i,k) = 0.
  507. paacw(i,k) = 0.
  508. pgaci(i,k) = 0.
  509. pgacr(i,k) = 0.
  510. pgacs(i,k) = 0.
  511. pigen(i,k) = 0.
  512. pidep(i,k) = 0.
  513. pcond(i,k) = 0.
  514. psmlt(i,k) = 0.
  515. pgmlt(i,k) = 0.
  516. pseml(i,k) = 0.
  517. pgeml(i,k) = 0.
  518. psevp(i,k) = 0.
  519. pgevp(i,k) = 0.
  520. falk(i,k,1) = 0.
  521. falk(i,k,2) = 0.
  522. falk(i,k,3) = 0.
  523. fall(i,k,1) = 0.
  524. fall(i,k,2) = 0.
  525. fall(i,k,3) = 0.
  526. fallc(i,k) = 0.
  527. falkc(i,k) = 0.
  528. xni(i,k) = 1.e3
  529. enddo
  530. enddo
  531. !-------------------------------------------------------------
  532. ! Ni: ice crystal number concentraiton [HDC 5c]
  533. !-------------------------------------------------------------
  534. do k = kts, kte
  535. do i = its, ite
  536. temp = (den(i,k)*max(qci(i,k,2),qmin))
  537. temp = sqrt(sqrt(temp*temp*temp))
  538. xni(i,k) = min(max(5.38e7*temp,1.e3),1.e6)
  539. enddo
  540. enddo
  541. !
  542. !----------------------------------------------------------------
  543. ! compute the fallout term:
  544. ! first, vertical terminal velosity for minor loops
  545. !----------------------------------------------------------------
  546. do k = kts, kte
  547. do i = its, ite
  548. qrs_tmp(i,k,1) = qrs(i,k,1)
  549. qrs_tmp(i,k,2) = qrs(i,k,2)
  550. qrs_tmp(i,k,3) = qrs(i,k,3)
  551. enddo
  552. enddo
  553. call slope_wsm6(qrs_tmp,den_tmp,denfac,t,rslope,rslopeb,rslope2,rslope3, &
  554. work1,its,ite,kts,kte)
  555. !
  556. do k = kte, kts, -1
  557. do i = its, ite
  558. workr(i,k) = work1(i,k,1)
  559. qsum(i,k) = max( (qrs(i,k,2)+qrs(i,k,3)), 1.E-15)
  560. IF ( qsum(i,k) .gt. 1.e-15 ) THEN
  561. worka(i,k) = (work1(i,k,2)*qrs(i,k,2) + work1(i,k,3)*qrs(i,k,3)) &
  562. /qsum(i,k)
  563. ELSE
  564. worka(i,k) = 0.
  565. ENDIF
  566. denqrs1(i,k) = den(i,k)*qrs(i,k,1)
  567. denqrs2(i,k) = den(i,k)*qrs(i,k,2)
  568. denqrs3(i,k) = den(i,k)*qrs(i,k,3)
  569. if(qrs(i,k,1).le.0.0) workr(i,k) = 0.0
  570. enddo
  571. enddo
  572. call nislfv_rain_plm(idim,kdim,den_tmp,denfac,t,delz_tmp,workr,denqrs1, &
  573. delqrs1,dtcld,1,1)
  574. call nislfv_rain_plm6(idim,kdim,den_tmp,denfac,t,delz_tmp,worka, &
  575. denqrs2,denqrs3,delqrs2,delqrs3,dtcld,1,1)
  576. do k = kts, kte
  577. do i = its, ite
  578. qrs(i,k,1) = max(denqrs1(i,k)/den(i,k),0.)
  579. qrs(i,k,2) = max(denqrs2(i,k)/den(i,k),0.)
  580. qrs(i,k,3) = max(denqrs3(i,k)/den(i,k),0.)
  581. fall(i,k,1) = denqrs1(i,k)*workr(i,k)/delz(i,k)
  582. fall(i,k,2) = denqrs2(i,k)*worka(i,k)/delz(i,k)
  583. fall(i,k,3) = denqrs3(i,k)*worka(i,k)/delz(i,k)
  584. enddo
  585. enddo
  586. do i = its, ite
  587. fall(i,1,1) = delqrs1(i)/delz(i,1)/dtcld
  588. fall(i,1,2) = delqrs2(i)/delz(i,1)/dtcld
  589. fall(i,1,3) = delqrs3(i)/delz(i,1)/dtcld
  590. enddo
  591. do k = kts, kte
  592. do i = its, ite
  593. qrs_tmp(i,k,1) = qrs(i,k,1)
  594. qrs_tmp(i,k,2) = qrs(i,k,2)
  595. qrs_tmp(i,k,3) = qrs(i,k,3)
  596. enddo
  597. enddo
  598. call slope_wsm6(qrs_tmp,den_tmp,denfac,t,rslope,rslopeb,rslope2,rslope3, &
  599. work1,its,ite,kts,kte)
  600. !
  601. do k = kte, kts, -1
  602. do i = its, ite
  603. supcol = t0c-t(i,k)
  604. n0sfac(i,k) = max(min(exp(alpha*supcol),n0smax/n0s),1.)
  605. if(t(i,k).gt.t0c) then
  606. !---------------------------------------------------------------
  607. ! psmlt: melting of snow [HL A33] [RH83 A25]
  608. ! (T>T0: S->R)
  609. !---------------------------------------------------------------
  610. xlf = xlf0
  611. work2(i,k) = venfac(p(i,k),t(i,k),den(i,k))
  612. if(qrs(i,k,2).gt.0.) then
  613. coeres = rslope2(i,k,2)*sqrt(rslope(i,k,2)*rslopeb(i,k,2))
  614. psmlt(i,k) = xka(t(i,k),den(i,k))/xlf*(t0c-t(i,k))*pi/2. &
  615. *n0sfac(i,k)*(precs1*rslope2(i,k,2) &
  616. +precs2*work2(i,k)*coeres)
  617. psmlt(i,k) = min(max(psmlt(i,k)*dtcld/mstep(i), &
  618. -qrs(i,k,2)/mstep(i)),0.)
  619. qrs(i,k,2) = qrs(i,k,2) + psmlt(i,k)
  620. qrs(i,k,1) = qrs(i,k,1) - psmlt(i,k)
  621. t(i,k) = t(i,k) + xlf/cpm(i,k)*psmlt(i,k)
  622. endif
  623. !---------------------------------------------------------------
  624. ! pgmlt: melting of graupel [HL A23] [LFO 47]
  625. ! (T>T0: G->R)
  626. !---------------------------------------------------------------
  627. if(qrs(i,k,3).gt.0.) then
  628. coeres = rslope2(i,k,3)*sqrt(rslope(i,k,3)*rslopeb(i,k,3))
  629. pgmlt(i,k) = xka(t(i,k),den(i,k))/xlf &
  630. *(t0c-t(i,k))*(precg1*rslope2(i,k,3) &
  631. +precg2*work2(i,k)*coeres)
  632. pgmlt(i,k) = min(max(pgmlt(i,k)*dtcld/mstep(i), &
  633. -qrs(i,k,3)/mstep(i)),0.)
  634. qrs(i,k,3) = qrs(i,k,3) + pgmlt(i,k)
  635. qrs(i,k,1) = qrs(i,k,1) - pgmlt(i,k)
  636. t(i,k) = t(i,k) + xlf/cpm(i,k)*pgmlt(i,k)
  637. endif
  638. endif
  639. enddo
  640. enddo
  641. !---------------------------------------------------------------
  642. ! Vice [ms-1] : fallout of ice crystal [HDC 5a]
  643. !---------------------------------------------------------------
  644. do k = kte, kts, -1
  645. do i = its, ite
  646. if(qci(i,k,2).le.0.) then
  647. work1c(i,k) = 0.
  648. else
  649. xmi = den(i,k)*qci(i,k,2)/xni(i,k)
  650. diameter = max(min(dicon * sqrt(xmi),dimax), 1.e-25)
  651. work1c(i,k) = 1.49e4*exp(log(diameter)*(1.31))
  652. endif
  653. enddo
  654. enddo
  655. !
  656. ! forward semi-laglangian scheme (JH), PCM (piecewise constant), (linear)
  657. !
  658. do k = kte, kts, -1
  659. do i = its, ite
  660. denqci(i,k) = den(i,k)*qci(i,k,2)
  661. enddo
  662. enddo
  663. call nislfv_rain_plm(idim,kdim,den_tmp,denfac,t,delz_tmp,work1c,denqci, &
  664. delqi,dtcld,1,0)
  665. do k = kts, kte
  666. do i = its, ite
  667. qci(i,k,2) = max(denqci(i,k)/den(i,k),0.)
  668. enddo
  669. enddo
  670. do i = its, ite
  671. fallc(i,1) = delqi(i)/delz(i,1)/dtcld
  672. enddo
  673. !
  674. !----------------------------------------------------------------
  675. ! rain (unit is mm/sec;kgm-2s-1: /1000*delt ===> m)==> mm for wrf
  676. !
  677. do i = its, ite
  678. fallsum = fall(i,kts,1)+fall(i,kts,2)+fall(i,kts,3)+fallc(i,kts)
  679. fallsum_qsi = fall(i,kts,2)+fallc(i,kts)
  680. fallsum_qg = fall(i,kts,3)
  681. if(fallsum.gt.0.) then
  682. rainncv(i) = fallsum*delz(i,kts)/denr*dtcld*1000. + rainncv(i)
  683. rain(i) = fallsum*delz(i,kts)/denr*dtcld*1000. + rain(i)
  684. endif
  685. if(fallsum_qsi.gt.0.) then
  686. tstepsnow(i) = fallsum_qsi*delz(i,kts)/denr*dtcld*1000. &
  687. +tstepsnow(i)
  688. IF ( PRESENT (snowncv) .AND. PRESENT (snow)) THEN
  689. snowncv(i,lat) = fallsum_qsi*delz(i,kts)/denr*dtcld*1000. &
  690. +snowncv(i,lat)
  691. snow(i,lat) = fallsum_qsi*delz(i,kts)/denr*dtcld*1000. + snow(i,lat)
  692. ENDIF
  693. endif
  694. if(fallsum_qg.gt.0.) then
  695. tstepgraup(i) = fallsum_qsi*delz(i,kts)/denr*dtcld*1000. &
  696. +tstepgraup(i)
  697. IF ( PRESENT (graupelncv) .AND. PRESENT (graupel)) THEN
  698. graupelncv(i,lat) = fallsum_qg*delz(i,kts)/denr*dtcld*1000. &
  699. + graupelncv(i,lat)
  700. graupel(i,lat) = fallsum_qg*delz(i,kts)/denr*dtcld*1000. + graupel(i,lat)
  701. ENDIF
  702. endif
  703. ! if(fallsum.gt.0.)sr(i)=(snowncv(i,lat) + graupelncv(i,lat))/(rainncv(i)+1.e-12)
  704. if(fallsum.gt.0.)sr(i)=(tstepsnow(i) + tstepgraup(i))/(rainncv(i)+1.e-12)
  705. enddo
  706. !
  707. !---------------------------------------------------------------
  708. ! pimlt: instantaneous melting of cloud ice [HL A47] [RH83 A28]
  709. ! (T>T0: I->C)
  710. !---------------------------------------------------------------
  711. do k = kts, kte
  712. do i = its, ite
  713. supcol = t0c-t(i,k)
  714. xlf = xls-xl(i,k)
  715. if(supcol.lt.0.) xlf = xlf0
  716. if(supcol.lt.0.and.qci(i,k,2).gt.0.) then
  717. qci(i,k,1) = qci(i,k,1) + qci(i,k,2)
  718. t(i,k) = t(i,k) - xlf/cpm(i,k)*qci(i,k,2)
  719. qci(i,k,2) = 0.
  720. endif
  721. !---------------------------------------------------------------
  722. ! pihmf: homogeneous freezing of cloud water below -40c [HL A45]
  723. ! (T<-40C: C->I)
  724. !---------------------------------------------------------------
  725. if(supcol.gt.40..and.qci(i,k,1).gt.0.) then
  726. qci(i,k,2) = qci(i,k,2) + qci(i,k,1)
  727. t(i,k) = t(i,k) + xlf/cpm(i,k)*qci(i,k,1)
  728. qci(i,k,1) = 0.
  729. endif
  730. !---------------------------------------------------------------
  731. ! pihtf: heterogeneous freezing of cloud water [HL A44]
  732. ! (T0>T>-40C: C->I)
  733. !---------------------------------------------------------------
  734. if(supcol.gt.0..and.qci(i,k,1).gt.qmin) then
  735. ! pfrzdtc = min(pfrz1*(exp(pfrz2*supcol)-1.) &
  736. ! *den(i,k)/denr/xncr*qci(i,k,1)**2*dtcld,qci(i,k,1))
  737. supcolt=min(supcol,50.)
  738. pfrzdtc = min(pfrz1*(exp(pfrz2*supcolt)-1.) &
  739. *den(i,k)/denr/xncr*qci(i,k,1)*qci(i,k,1)*dtcld,qci(i,k,1))
  740. qci(i,k,2) = qci(i,k,2) + pfrzdtc
  741. t(i,k) = t(i,k) + xlf/cpm(i,k)*pfrzdtc
  742. qci(i,k,1) = qci(i,k,1)-pfrzdtc
  743. endif
  744. !---------------------------------------------------------------
  745. ! pgfrz: freezing of rain water [HL A20] [LFO 45]
  746. ! (T<T0, R->G)
  747. !---------------------------------------------------------------
  748. if(supcol.gt.0..and.qrs(i,k,1).gt.0.) then
  749. ! pfrzdtr = min(20.*pi**2*pfrz1*n0r*denr/den(i,k) &
  750. ! *(exp(pfrz2*supcol)-1.)*rslope3(i,k,1)**2 &
  751. ! *rslope(i,k,1)*dtcld,qrs(i,k,1))
  752. temp = rslope3(i,k,1)
  753. temp = temp*temp*rslope(i,k,1)
  754. supcolt=min(supcol,50.)
  755. pfrzdtr = min(20.*(pi*pi)*pfrz1*n0r*denr/den(i,k) &
  756. *(exp(pfrz2*supcolt)-1.)*temp*dtcld, &
  757. qrs(i,k,1))
  758. qrs(i,k,3) = qrs(i,k,3) + pfrzdtr
  759. t(i,k) = t(i,k) + xlf/cpm(i,k)*pfrzdtr
  760. qrs(i,k,1) = qrs(i,k,1)-pfrzdtr
  761. endif
  762. enddo
  763. enddo
  764. !
  765. !
  766. !----------------------------------------------------------------
  767. ! update the slope parameters for microphysics computation
  768. !
  769. do k = kts, kte
  770. do i = its, ite
  771. qrs_tmp(i,k,1) = qrs(i,k,1)
  772. qrs_tmp(i,k,2) = qrs(i,k,2)
  773. qrs_tmp(i,k,3) = qrs(i,k,3)
  774. enddo
  775. enddo
  776. call slope_wsm6(qrs_tmp,den_tmp,denfac,t,rslope,rslopeb,rslope2,rslope3, &
  777. work1,its,ite,kts,kte)
  778. !------------------------------------------------------------------
  779. ! work1: the thermodynamic term in the denominator associated with
  780. ! heat conduction and vapor diffusion
  781. ! (ry88, y93, h85)
  782. ! work2: parameter associated with the ventilation effects(y93)
  783. !
  784. do k = kts, kte
  785. do i = its, ite
  786. work1(i,k,1) = diffac(xl(i,k),p(i,k),t(i,k),den(i,k),qs(i,k,1))
  787. work1(i,k,2) = diffac(xls,p(i,k),t(i,k),den(i,k),qs(i,k,2))
  788. work2(i,k) = venfac(p(i,k),t(i,k),den(i,k))
  789. enddo
  790. enddo
  791. !
  792. !===============================================================
  793. !
  794. ! warm rain processes
  795. !
  796. ! - follows the processes in RH83 and LFO except for autoconcersion
  797. !
  798. !===============================================================
  799. !
  800. do k = kts, kte
  801. do i = its, ite
  802. supsat = max(q(i,k),qmin)-qs(i,k,1)
  803. satdt = supsat/dtcld
  804. !---------------------------------------------------------------
  805. ! praut: auto conversion rate from cloud to rain [HDC 16]
  806. ! (C->R)
  807. !---------------------------------------------------------------
  808. if(qci(i,k,1).gt.qc0) then
  809. praut(i,k) = qck1*qci(i,k,1)**(7./3.)
  810. praut(i,k) = min(praut(i,k),qci(i,k,1)/dtcld)
  811. endif
  812. !---------------------------------------------------------------
  813. ! pracw: accretion of cloud water by rain [HL A40] [LFO 51]
  814. ! (C->R)
  815. !---------------------------------------------------------------
  816. if(qrs(i,k,1).gt.qcrmin.and.qci(i,k,1).gt.qmin) then
  817. pracw(i,k) = min(pacrr*rslope3(i,k,1)*rslopeb(i,k,1) &
  818. *qci(i,k,1)*denfac(i,k),qci(i,k,1)/dtcld)
  819. endif
  820. !---------------------------------------------------------------
  821. ! prevp: evaporation/condensation rate of rain [HDC 14]
  822. ! (V->R or R->V)
  823. !---------------------------------------------------------------
  824. if(qrs(i,k,1).gt.0.) then
  825. coeres = rslope2(i,k,1)*sqrt(rslope(i,k,1)*rslopeb(i,k,1))
  826. prevp(i,k) = (rh(i,k,1)-1.)*(precr1*rslope2(i,k,1) &
  827. +precr2*work2(i,k)*coeres)/work1(i,k,1)
  828. if(prevp(i,k).lt.0.) then
  829. prevp(i,k) = max(prevp(i,k),-qrs(i,k,1)/dtcld)
  830. prevp(i,k) = max(prevp(i,k),satdt/2)
  831. else
  832. prevp(i,k) = min(prevp(i,k),satdt/2)
  833. endif
  834. endif
  835. enddo
  836. enddo
  837. !
  838. !===============================================================
  839. !
  840. ! cold rain processes
  841. !
  842. ! - follows the revised ice microphysics processes in HDC
  843. ! - the processes same as in RH83 and RH84 and LFO behave
  844. ! following ice crystal hapits defined in HDC, inclduing
  845. ! intercept parameter for snow (n0s), ice crystal number
  846. ! concentration (ni), ice nuclei number concentration
  847. ! (n0i), ice diameter (d)
  848. !
  849. !===============================================================
  850. !
  851. do k = kts, kte
  852. do i = its, ite
  853. supcol = t0c-t(i,k)
  854. n0sfac(i,k) = max(min(exp(alpha*supcol),n0smax/n0s),1.)
  855. supsat = max(q(i,k),qmin)-qs(i,k,2)
  856. satdt = supsat/dtcld
  857. ifsat = 0
  858. !-------------------------------------------------------------
  859. ! Ni: ice crystal number concentraiton [HDC 5c]
  860. !-------------------------------------------------------------
  861. ! xni(i,k) = min(max(5.38e7*(den(i,k) &
  862. ! *max(qci(i,k,2),qmin))**0.75,1.e3),1.e6)
  863. temp = (den(i,k)*max(qci(i,k,2),qmin))
  864. temp = sqrt(sqrt(temp*temp*temp))
  865. xni(i,k) = min(max(5.38e7*temp,1.e3),1.e6)
  866. eacrs = exp(0.07*(-supcol))
  867. !
  868. xmi = den(i,k)*qci(i,k,2)/xni(i,k)
  869. diameter = min(dicon * sqrt(xmi),dimax)
  870. vt2i = 1.49e4*diameter**1.31
  871. vt2r=pvtr*rslopeb(i,k,1)*denfac(i,k)
  872. vt2s=pvts*rslopeb(i,k,2)*denfac(i,k)
  873. vt2g=pvtg*rslopeb(i,k,3)*denfac(i,k)
  874. qsum(i,k) = max( (qrs(i,k,2)+qrs(i,k,3)), 1.E-15)
  875. if(qsum(i,k) .gt. 1.e-15) then
  876. vt2ave=(vt2s*qrs(i,k,2)+vt2g*qrs(i,k,3))/(qsum(i,k))
  877. else
  878. vt2ave=0.
  879. endif
  880. if(supcol.gt.0.and.qci(i,k,2).gt.qmin) then
  881. if(qrs(i,k,1).gt.qcrmin) then
  882. !-------------------------------------------------------------
  883. ! praci: Accretion of cloud ice by rain [HL A15] [LFO 25]
  884. ! (T<T0: I->R)
  885. !-------------------------------------------------------------
  886. acrfac = 2.*rslope3(i,k,1)+2.*diameter*rslope2(i,k,1) &
  887. +diameter**2*rslope(i,k,1)
  888. praci(i,k) = pi*qci(i,k,2)*n0r*abs(vt2r-vt2i)*acrfac/4.
  889. praci(i,k) = min(praci(i,k),qci(i,k,2)/dtcld)
  890. !-------------------------------------------------------------
  891. ! piacr: Accretion of rain by cloud ice [HL A19] [LFO 26]
  892. ! (T<T0: R->S or R->G)
  893. !-------------------------------------------------------------
  894. piacr(i,k) = pi**2*avtr*n0r*denr*xni(i,k)*denfac(i,k) &
  895. *g6pbr*rslope3(i,k,1)*rslope3(i,k,1) &
  896. *rslopeb(i,k,1)/24./den(i,k)
  897. piacr(i,k) = min(piacr(i,k),qrs(i,k,1)/dtcld)
  898. endif
  899. !-------------------------------------------------------------
  900. ! psaci: Accretion of cloud ice by snow [HDC 10]
  901. ! (T<T0: I->S)
  902. !-------------------------------------------------------------
  903. if(qrs(i,k,2).gt.qcrmin) then
  904. acrfac = 2.*rslope3(i,k,2)+2.*diameter*rslope2(i,k,2) &
  905. +diameter**2*rslope(i,k,2)
  906. psaci(i,k) = pi*qci(i,k,2)*eacrs*n0s*n0sfac(i,k) &
  907. *abs(vt2ave-vt2i)*acrfac/4.
  908. psaci(i,k) = min(psaci(i,k),qci(i,k,2)/dtcld)
  909. endif
  910. !-------------------------------------------------------------
  911. ! pgaci: Accretion of cloud ice by graupel [HL A17] [LFO 41]
  912. ! (T<T0: I->G)
  913. !-------------------------------------------------------------
  914. if(qrs(i,k,3).gt.qcrmin) then
  915. egi = exp(0.07*(-supcol))
  916. acrfac = 2.*rslope3(i,k,3)+2.*diameter*rslope2(i,k,3) &
  917. +diameter**2*rslope(i,k,3)
  918. pgaci(i,k) = pi*egi*qci(i,k,2)*n0g*abs(vt2ave-vt2i)*acrfac/4.
  919. pgaci(i,k) = min(pgaci(i,k),qci(i,k,2)/dtcld)
  920. endif
  921. endif
  922. !-------------------------------------------------------------
  923. ! psacw: Accretion of cloud water by snow [HL A7] [LFO 24]
  924. ! (T<T0: C->S, and T>=T0: C->R)
  925. !-------------------------------------------------------------
  926. if(qrs(i,k,2).gt.qcrmin.and.qci(i,k,1).gt.qmin) then
  927. psacw(i,k) = min(pacrc*n0sfac(i,k)*rslope3(i,k,2)*rslopeb(i,k,2) &
  928. *qci(i,k,1)*denfac(i,k),qci(i,k,1)/dtcld)
  929. endif
  930. !-------------------------------------------------------------
  931. ! pgacw: Accretion of cloud water by graupel [HL A6] [LFO 40]
  932. ! (T<T0: C->G, and T>=T0: C->R)
  933. !-------------------------------------------------------------
  934. if(qrs(i,k,3).gt.qcrmin.and.qci(i,k,1).gt.qmin) then
  935. pgacw(i,k) = min(pacrg*rslope3(i,k,3)*rslopeb(i,k,3) &
  936. *qci(i,k,1)*denfac(i,k),qci(i,k,1)/dtcld)
  937. endif
  938. !-------------------------------------------------------------
  939. ! paacw: Accretion of cloud water by averaged snow/graupel
  940. ! (T<T0: C->G or S, and T>=T0: C->R)
  941. !-------------------------------------------------------------
  942. if(qrs(i,k,2).gt.qcrmin.and.qrs(i,k,3).gt.qcrmin) then
  943. paacw(i,k) = (qrs(i,k,2)*psacw(i,k)+qrs(i,k,3)*pgacw(i,k)) &
  944. /(qsum(i,k))
  945. endif
  946. !-------------------------------------------------------------
  947. ! pracs: Accretion of snow by rain [HL A11] [LFO 27]
  948. ! (T<T0: S->G)
  949. !-------------------------------------------------------------
  950. if(qrs(i,k,2).gt.qcrmin.and.qrs(i,k,1).gt.qcrmin) then
  951. if(supcol.gt.0) then
  952. acrfac = 5.*rslope3(i,k,2)*rslope3(i,k,2)*rslope(i,k,1) &
  953. +2.*rslope3(i,k,2)*rslope2(i,k,2)*rslope2(i,k,1) &
  954. +.5*rslope2(i,k,2)*rslope2(i,k,2)*rslope3(i,k,1)
  955. pracs(i,k) = pi**2*n0r*n0s*n0sfac(i,k)*abs(vt2r-vt2ave) &
  956. *(dens/den(i,k))*acrfac
  957. pracs(i,k) = min(pracs(i,k),qrs(i,k,2)/dtcld)
  958. endif
  959. !-------------------------------------------------------------
  960. ! psacr: Accretion of rain by snow [HL A10] [LFO 28]
  961. ! (T<T0:R->S or R->G) (T>=T0: enhance melting of snow)
  962. !-------------------------------------------------------------
  963. acrfac = 5.*rslope3(i,k,1)*rslope3(i,k,1)*rslope(i,k,2) &
  964. +2.*rslope3(i,k,1)*rslope2(i,k,1)*rslope2(i,k,2) &
  965. +.5*rslope2(i,k,1)*rslope2(i,k,1)*rslope3(i,k,2)
  966. psacr(i,k) = pi**2*n0r*n0s*n0sfac(i,k)*abs(vt2ave-vt2r) &
  967. *(denr/den(i,k))*acrfac
  968. psacr(i,k) = min(psacr(i,k),qrs(i,k,1)/dtcld)
  969. endif
  970. !-------------------------------------------------------------
  971. ! pgacr: Accretion of rain by graupel [HL A12] [LFO 42]
  972. ! (T<T0: R->G) (T>=T0: enhance melting of graupel)
  973. !-------------------------------------------------------------
  974. if(qrs(i,k,3).gt.qcrmin.and.qrs(i,k,1).gt.qcrmin) then
  975. acrfac = 5.*rslope3(i,k,1)*rslope3(i,k,1)*rslope(i,k,3) &
  976. +2.*rslope3(i,k,1)*rslope2(i,k,1)*rslope2(i,k,3) &
  977. +.5*rslope2(i,k,1)*rslope2(i,k,1)*rslope3(i,k,3)
  978. pgacr(i,k) = pi**2*n0r*n0g*abs(vt2ave-vt2r)*(denr/den(i,k)) &
  979. *acrfac
  980. pgacr(i,k) = min(pgacr(i,k),qrs(i,k,1)/dtcld)
  981. endif
  982. !
  983. !-------------------------------------------------------------
  984. ! pgacs: Accretion of snow by graupel [HL A13] [LFO 29]
  985. ! (S->G): This process is eliminated in V3.0 with the
  986. ! new combined snow/graupel fall speeds
  987. !-------------------------------------------------------------
  988. if(qrs(i,k,3).gt.qcrmin.and.qrs(i,k,2).gt.qcrmin) then
  989. pgacs(i,k) = 0.
  990. endif
  991. if(supcol.le.0) then
  992. xlf = xlf0
  993. !-------------------------------------------------------------
  994. ! pseml: Enhanced melting of snow by accretion of water [HL A34]
  995. ! (T>=T0: S->R)
  996. !-------------------------------------------------------------
  997. if(qrs(i,k,2).gt.0.) &
  998. pseml(i,k) = min(max(cliq*supcol*(paacw(i,k)+psacr(i,k)) &
  999. /xlf,-qrs(i,k,2)/dtcld),0.)
  1000. !-------------------------------------------------------------
  1001. ! pgeml: Enhanced melting of graupel by accretion of water [HL A24] [RH84 A21-A22]
  1002. ! (T>=T0: G->R)
  1003. !-------------------------------------------------------------
  1004. if(qrs(i,k,3).gt.0.) &
  1005. pgeml(i,k) = min(max(cliq*supcol*(paacw(i,k)+pgacr(i,k)) &
  1006. /xlf,-qrs(i,k,3)/dtcld),0.)
  1007. endif
  1008. if(supcol.gt.0) then
  1009. !-------------------------------------------------------------
  1010. ! pidep: Deposition/Sublimation rate of ice [HDC 9]
  1011. ! (T<T0: V->I or I->V)
  1012. !-------------------------------------------------------------
  1013. if(qci(i,k,2).gt.0.and.ifsat.ne.1) then
  1014. pidep(i,k) = 4.*diameter*xni(i,k)*(rh(i,k,2)-1.)/work1(i,k,2)
  1015. supice = satdt-prevp(i,k)
  1016. if(pidep(i,k).lt.0.) then
  1017. pidep(i,k) = max(max(pidep(i,k),satdt/2),supice)
  1018. pidep(i,k) = max(pidep(i,k),-qci(i,k,2)/dtcld)
  1019. else
  1020. pidep(i,k) = min(min(pidep(i,k),satdt/2),supice)
  1021. endif
  1022. if(abs(prevp(i,k)+pidep(i,k)).ge.abs(satdt)) ifsat = 1
  1023. endif
  1024. !-------------------------------------------------------------
  1025. ! psdep: deposition/sublimation rate of snow [HDC 14]
  1026. ! (T<T0: V->S or S->V)
  1027. !-------------------------------------------------------------
  1028. if(qrs(i,k,2).gt.0..and.ifsat.ne.1) then
  1029. coeres = rslope2(i,k,2)*sqrt(rslope(i,k,2)*rslopeb(i,k,2))
  1030. psdep(i,k) = (rh(i,k,2)-1.)*n0sfac(i,k)*(precs1*rslope2(i,k,2) &
  1031. + precs2*work2(i,k)*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.))/dtcld)
  1069. pigen(i,k) = min(min(pigen(i,k),satdt),supice)
  1070. endif
  1071. !
  1072. !-------------------------------------------------------------
  1073. ! psaut: conversion(aggregation) of ice to snow [HDC 12]
  1074. ! (T<T0: I->S)
  1075. !-------------------------------------------------------------
  1076. if(qci(i,k,2).gt.0.) then
  1077. qimax = roqimax/den(i,k)
  1078. psaut(i,k) = max(0.,(qci(i,k,2)-qimax)/dtcld)
  1079. endif
  1080. !
  1081. !-------------------------------------------------------------
  1082. ! pgaut: conversion(aggregation) of snow to graupel [HL A4] [LFO 37]
  1083. ! (T<T0: S->G)
  1084. !-------------------------------------------------------------
  1085. if(qrs(i,k,2).gt.0.) then
  1086. alpha2 = 1.e-3*exp(0.09*(-supcol))
  1087. pgaut(i,k) = min(max(0.,alpha2*(qrs(i,k,2)-qs0)),qrs(i,k,2)/dtcld)
  1088. endif
  1089. endif
  1090. !
  1091. !-------------------------------------------------------------
  1092. ! psevp: Evaporation of melting snow [HL A35] [RH83 A27]
  1093. ! (T>=T0: S->V)
  1094. !-------------------------------------------------------------
  1095. if(supcol.lt.0.) then
  1096. if(qrs(i,k,2).gt.0..and.rh(i,k,1).lt.1.) then
  1097. coeres = rslope2(i,k,2)*sqrt(rslope(i,k,2)*rslopeb(i,k,2))
  1098. psevp(i,k) = (rh(i,k,1)-1.)*n0sfac(i,k)*(precs1 &
  1099. *rslope2(i,k,2)+precs2*work2(i,k) &
  1100. *coeres)/work1(i,k,1)
  1101. psevp(i,k) = min(max(psevp(i,k),-qrs(i,k,2)/dtcld),0.)
  1102. endif
  1103. !-------------------------------------------------------------
  1104. ! pgevp: Evaporation of melting graupel [HL A25] [RH84 A19]
  1105. ! (T>=T0: G->V)
  1106. !-------------------------------------------------------------
  1107. if(qrs(i,k,3).gt.0..and.rh(i,k,1).lt.1.) then
  1108. coeres = rslope2(i,k,3)*sqrt(rslope(i,k,3)*rslopeb(i,k,3))
  1109. pgevp(i,k) = (rh(i,k,1)-1.)*(precg1*rslope2(i,k,3) &
  1110. +precg2*work2(i,k)*coeres)/work1(i,k,1)
  1111. pgevp(i,k) = min(max(pgevp(i,k),-qrs(i,k,3)/dtcld),0.)
  1112. endif
  1113. endif
  1114. enddo
  1115. enddo
  1116. !
  1117. !
  1118. !----------------------------------------------------------------
  1119. ! check mass conservation of generation terms and feedback to the
  1120. ! large scale
  1121. !
  1122. do k = kts, kte
  1123. do i = its, ite
  1124. !
  1125. delta2=0.
  1126. delta3=0.
  1127. if(qrs(i,k,1).lt.1.e-4.and.qrs(i,k,2).lt.1.e-4) delta2=1.
  1128. if(qrs(i,k,1).lt.1.e-4) delta3=1.
  1129. if(t(i,k).le.t0c) then
  1130. !
  1131. ! cloud water
  1132. !
  1133. value = max(qmin,qci(i,k,1))
  1134. source = (praut(i,k)+pracw(i,k)+paacw(i,k)+paacw(i,k))*dtcld
  1135. if (source.gt.value) then
  1136. factor = value/source
  1137. praut(i,k) = praut(i,k)*factor
  1138. pracw(i,k) = pracw(i,k)*factor
  1139. paacw(i,k) = paacw(i,k)*factor
  1140. endif
  1141. !
  1142. ! cloud ice
  1143. !
  1144. value = max(qmin,qci(i,k,2))
  1145. source = (psaut(i,k)-pigen(i,k)-pidep(i,k)+praci(i,k)+psaci(i,k) &
  1146. +pgaci(i,k))*dtcld
  1147. if (source.gt.value) then
  1148. factor = value/source
  1149. psaut(i,k) = psaut(i,k)*factor
  1150. pigen(i,k) = pigen(i,k)*factor
  1151. pidep(i,k) = pidep(i,k)*factor
  1152. praci(i,k) = praci(i,k)*factor
  1153. psaci(i,k) = psaci(i,k)*factor
  1154. pgaci(i,k) = pgaci(i,k)*factor
  1155. endif
  1156. !
  1157. ! rain
  1158. !
  1159. value = max(qmin,qrs(i,k,1))
  1160. source = (-praut(i,k)-prevp(i,k)-pracw(i,k)+piacr(i,k)+psacr(i,k) &
  1161. +pgacr(i,k))*dtcld
  1162. if (source.gt.value) then
  1163. factor = value/source
  1164. praut(i,k) = praut(i,k)*factor
  1165. prevp(i,k) = prevp(i,k)*factor
  1166. pracw(i,k) = pracw(i,k)*factor
  1167. piacr(i,k) = piacr(i,k)*factor
  1168. psacr(i,k) = psacr(i,k)*factor
  1169. pgacr(i,k) = pgacr(i,k)*factor
  1170. endif
  1171. !
  1172. ! snow
  1173. !
  1174. value = max(qmin,qrs(i,k,2))
  1175. source = -(psdep(i,k)+psaut(i,k)-pgaut(i,k)+paacw(i,k)+piacr(i,k) &
  1176. *delta3+praci(i,k)*delta3-pracs(i,k)*(1.-delta2) &
  1177. +psacr(i,k)*delta2+psaci(i,k)-pgacs(i,k) )*dtcld
  1178. if (source.gt.value) then
  1179. factor = value/source
  1180. psdep(i,k) = psdep(i,k)*factor
  1181. psaut(i,k) = psaut(i,k)*factor
  1182. pgaut(i,k) = pgaut(i,k)*factor
  1183. paacw(i,k) = paacw(i,k)*factor
  1184. piacr(i,k) = piacr(i,k)*factor
  1185. praci(i,k) = praci(i,k)*factor
  1186. psaci(i,k) = psaci(i,k)*factor
  1187. pracs(i,k) = pracs(i,k)*factor
  1188. psacr(i,k) = psacr(i,k)*factor
  1189. pgacs(i,k) = pgacs(i,k)*factor
  1190. endif
  1191. !
  1192. ! graupel
  1193. !
  1194. value = max(qmin,qrs(i,k,3))
  1195. source = -(pgdep(i,k)+pgaut(i,k) &
  1196. +piacr(i,k)*(1.-delta3)+praci(i,k)*(1.-delta3) &
  1197. +psacr(i,k)*(1.-delta2)+pracs(i,k)*(1.-delta2) &
  1198. +pgaci(i,k)+paacw(i,k)+pgacr(i,k)+pgacs(i,k))*dtcld
  1199. if (source.gt.value) then
  1200. factor = value/source
  1201. pgdep(i,k) = pgdep(i,k)*factor
  1202. pgaut(i,k) = pgaut(i,k)*factor
  1203. piacr(i,k) = piacr(i,k)*factor
  1204. praci(i,k) = praci(i,k)*factor
  1205. psacr(i,k) = psacr(i,k)*factor
  1206. pracs(i,k) = pracs(i,k)*factor
  1207. paacw(i,k) = paacw(i,k)*factor
  1208. pgaci(i,k) = pgaci(i,k)*factor
  1209. pgacr(i,k) = pgacr(i,k)*factor
  1210. pgacs(i,k) = pgacs(i,k)*factor
  1211. endif
  1212. !
  1213. work2(i,k)=-(prevp(i,k)+psdep(i,k)+pgdep(i,k)+pigen(i,k)+pidep(i,k))
  1214. ! update
  1215. q(i,k) = q(i,k)+work2(i,k)*dtcld
  1216. qci(i,k,1) = max(qci(i,k,1)-(praut(i,k)+pracw(i,k) &
  1217. +paacw(i,k)+paacw(i,k))*dtcld,0.)
  1218. qrs(i,k,1) = max(qrs(i,k,1)+(praut(i,k)+pracw(i,k) &
  1219. +prevp(i,k)-piacr(i,k)-pgacr(i,k) &
  1220. -psacr(i,k))*dtcld,0.)
  1221. qci(i,k,2) = max(qci(i,k,2)-(psaut(i,k)+praci(i,k) &
  1222. +psaci(i,k)+pgaci(i,k)-pigen(i,k)-pidep(i,k)) &
  1223. *dtcld,0.)
  1224. qrs(i,k,2) = max(qrs(i,k,2)+(psdep(i,k)+psaut(i,k)+paacw(i,k) &
  1225. -pgaut(i,k)+piacr(i,k)*delta3 &
  1226. +praci(i,k)*delta3+psaci(i,k)-pgacs(i,k) &
  1227. -pracs(i,k)*(1.-delta2)+psacr(i,k)*delta2) &
  1228. *dtcld,0.)
  1229. qrs(i,k,3) = max(qrs(i,k,3)+(pgdep(i,k)+pgaut(i,k) &
  1230. +piacr(i,k)*(1.-delta3) &
  1231. +praci(i,k)*(1.-delta3)+psacr(i,k)*(1.-delta2) &
  1232. +pracs(i,k)*(1.-delta2)+pgaci(i,k)+paacw(i,k) &
  1233. +pgacr(i,k)+pgacs(i,k))*dtcld,0.)
  1234. xlf = xls-xl(i,k)
  1235. xlwork2 = -xls*(psdep(i,k)+pgdep(i,k)+pidep(i,k)+pigen(i,k)) &
  1236. -xl(i,k)*prevp(i,k)-xlf*(piacr(i,k)+paacw(i,k) &
  1237. +paacw(i,k)+pgacr(i,k)+psacr(i,k))
  1238. t(i,k) = t(i,k)-xlwork2/cpm(i,k)*dtcld
  1239. else
  1240. !
  1241. ! cloud water
  1242. !
  1243. value = max(qmin,qci(i,k,1))
  1244. source=(praut(i,k)+pracw(i,k)+paacw(i,k)+paacw(i,k))*dtcld
  1245. if (source.gt.value) then
  1246. factor = value/source
  1247. praut(i,k) = praut(i,k)*factor
  1248. pracw(i,k) = pracw(i,k)*factor
  1249. paacw(i,k) = paacw(i,k)*factor
  1250. endif
  1251. !
  1252. ! rain
  1253. !
  1254. value = max(qmin,qrs(i,k,1))
  1255. source = (-paacw(i,k)-praut(i,k)+pseml(i,k)+pgeml(i,k)-pracw(i,k) &
  1256. -paacw(i,k)-prevp(i,k))*dtcld
  1257. if (source.gt.value) then
  1258. factor = value/source
  1259. praut(i,k) = praut(i,k)*factor
  1260. prevp(i,k) = prevp(i,k)*factor
  1261. pracw(i,k) = pracw(i,k)*factor
  1262. paacw(i,k) = paacw(i,k)*factor
  1263. pseml(i,k) = pseml(i,k)*factor
  1264. pgeml(i,k) = pgeml(i,k)*factor
  1265. endif
  1266. !
  1267. ! snow
  1268. !
  1269. value = max(qcrmin,qrs(i,k,2))
  1270. source=(pgacs(i,k)-pseml(i,k)-psevp(i,k))*dtcld
  1271. if (source.gt.value) then
  1272. factor = value/source
  1273. pgacs(i,k) = pgacs(i,k)*factor
  1274. psevp(i,k) = psevp(i,k)*factor
  1275. pseml(i,k) = pseml(i,k)*factor
  1276. endif
  1277. !
  1278. ! graupel
  1279. !
  1280. value = max(qcrmin,qrs(i,k,3))
  1281. source=-(pgacs(i,k)+pgevp(i,k)+pgeml(i,k))*dtcld
  1282. if (source.gt.value) then
  1283. factor = value/source
  1284. pgacs(i,k) = pgacs(i,k)*factor
  1285. pgevp(i,k) = pgevp(i,k)*factor
  1286. pgeml(i,k) = pgeml(i,k)*factor
  1287. endif
  1288. work2(i,k)=-(prevp(i,k)+psevp(i,k)+pgevp(i,k))
  1289. ! update
  1290. q(i,k) = q(i,k)+work2(i,k)*dtcld
  1291. qci(i,k,1) = max(qci(i,k,1)-(praut(i,k)+pracw(i,k) &
  1292. +paacw(i,k)+paacw(i,k))*dtcld,0.)
  1293. qrs(i,k,1) = max(qrs(i,k,1)+(praut(i,k)+pracw(i,k) &
  1294. +prevp(i,k)+paacw(i,k)+paacw(i,k)-pseml(i,k) &
  1295. -pgeml(i,k))*dtcld,0.)
  1296. qrs(i,k,2) = max(qrs(i,k,2)+(psevp(i,k)-pgacs(i,k) &
  1297. +pseml(i,k))*dtcld,0.)
  1298. qrs(i,k,3) = max(qrs(i,k,3)+(pgacs(i,k)+pgevp(i,k) &
  1299. +pgeml(i,k))*dtcld,0.)
  1300. xlf = xls-xl(i,k)
  1301. xlwork2 = -xl(i,k)*(prevp(i,k)+psevp(i,k)+pgevp(i,k)) &
  1302. -xlf*(pseml(i,k)+pgeml(i,k))
  1303. t(i,k) = t(i,k)-xlwork2/cpm(i,k)*dtcld
  1304. endif
  1305. enddo
  1306. enddo
  1307. !
  1308. ! Inline expansion for fpvs
  1309. ! qs(i,k,1) = fpvs(t(i,k),0,rd,rv,cpv,cliq,cice,xlv0,xls,psat,t0c)
  1310. ! qs(i,k,2) = fpvs(t(i,k),1,rd,rv,cpv,cliq,cice,xlv0,xls,psat,t0c)
  1311. hsub = xls
  1312. hvap = xlv0
  1313. cvap = cpv
  1314. ttp=t0c+0.01
  1315. dldt=cvap-cliq
  1316. xa=-dldt/rv
  1317. xb=xa+hvap/(rv*ttp)
  1318. dldti=cvap-cice
  1319. xai=-dldti/rv
  1320. xbi=xai+hsub/(rv*ttp)
  1321. do k = kts, kte
  1322. do i = its, ite
  1323. tr=ttp/t(i,k)
  1324. qs(i,k,1)=psat*exp(log(tr)*(xa))*exp(xb*(1.-tr))
  1325. qs(i,k,1) = min(qs(i,k,1),0.99*p(i,k))
  1326. qs(i,k,1) = ep2 * qs(i,k,1) / (p(i,k) - qs(i,k,1))
  1327. qs(i,k,1) = max(qs(i,k,1),qmin)
  1328. tr=ttp/t(i,k)
  1329. if(t(i,k).lt.ttp) then
  1330. qs(i,k,2)=psat*exp(log(tr)*(xai))*exp(xbi*(1.-tr))
  1331. else
  1332. qs(i,k,2)=psat*exp(log(tr)*(xa))*exp(xb*(1.-tr))
  1333. endif
  1334. qs(i,k,2) = min(qs(i,k,2),0.99*p(i,k))
  1335. qs(i,k,2) = ep2 * qs(i,k,2) / (p(i,k) - qs(i,k,2))
  1336. qs(i,k,2) = max(qs(i,k,2),qmin)
  1337. enddo
  1338. enddo
  1339. !
  1340. !----------------------------------------------------------------
  1341. ! pcond: condensational/evaporational rate of cloud water [HL A46] [RH83 A6]
  1342. ! if there exists additional water vapor condensated/if
  1343. ! evaporation of cloud water is not enough to remove subsaturation
  1344. !
  1345. do k = kts, kte
  1346. do i = its, ite
  1347. work1(i,k,1) = conden(t(i,k),q(i,k),qs(i,k,1),xl(i,k),cpm(i,k))
  1348. work2(i,k) = qci(i,k,1)+work1(i,k,1)
  1349. pcond(i,k) = min(max(work1(i,k,1)/dtcld,0.),max(q(i,k),0.)/dtcld)
  1350. if(qci(i,k,1).gt.0..and.work1(i,k,1).lt.0.) &
  1351. pcond(i,k) = max(work1(i,k,1),-qci(i,k,1))/dtcld
  1352. q(i,k) = q(i,k)-pcond(i,k)*dtcld
  1353. qci(i,k,1) = max(qci(i,k,1)+pcond(i,k)*dtcld,0.)
  1354. t(i,k) = t(i,k)+pcond(i,k)*xl(i,k)/cpm(i,k)*dtcld
  1355. enddo
  1356. enddo
  1357. !
  1358. !
  1359. !----------------------------------------------------------------
  1360. ! padding for small values
  1361. !
  1362. do k = kts, kte
  1363. do i = its, ite
  1364. if(qci(i,k,1).le.qmin) qci(i,k,1) = 0.0
  1365. if(qci(i,k,2).le.qmin) qci(i,k,2) = 0.0
  1366. enddo
  1367. enddo
  1368. enddo ! big loops
  1369. END SUBROUTINE wsm62d
  1370. ! ...................................................................
  1371. REAL FUNCTION rgmma(x)
  1372. !-------------------------------------------------------------------
  1373. IMPLICIT NONE
  1374. !-------------------------------------------------------------------
  1375. ! rgmma function: use infinite product form
  1376. REAL :: euler
  1377. PARAMETER (euler=0.577215664901532)
  1378. REAL :: x, y
  1379. INTEGER :: i
  1380. if(x.eq.1.)then
  1381. rgmma=0.
  1382. else
  1383. rgmma=x*exp(euler*x)
  1384. do i=1,10000
  1385. y=float(i)
  1386. rgmma=rgmma*(1.000+x/y)*exp(-x/y)
  1387. enddo
  1388. rgmma=1./rgmma
  1389. endif
  1390. END FUNCTION rgmma
  1391. !
  1392. !--------------------------------------------------------------------------
  1393. REAL FUNCTION fpvs(t,ice,rd,rv,cvap,cliq,cice,hvap,hsub,psat,t0c)
  1394. !--------------------------------------------------------------------------
  1395. IMPLICIT NONE
  1396. !--------------------------------------------------------------------------
  1397. REAL t,rd,rv,cvap,cliq,cice,hvap,hsub,psat,t0c,dldt,xa,xb,dldti, &
  1398. xai,xbi,ttp,tr
  1399. INTEGER ice
  1400. ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1401. ttp=t0c+0.01
  1402. dldt=cvap-cliq
  1403. xa=-dldt/rv
  1404. xb=xa+hvap/(rv*ttp)
  1405. dldti=cvap-cice
  1406. xai=-dldti/rv
  1407. xbi=xai+hsub/(rv*ttp)
  1408. tr=ttp/t
  1409. if(t.lt.ttp.and.ice.eq.1) then
  1410. fpvs=psat*(tr**xai)*exp(xbi*(1.-tr))
  1411. else
  1412. fpvs=psat*(tr**xa)*exp(xb*(1.-tr))
  1413. endif
  1414. ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1415. END FUNCTION fpvs
  1416. !-------------------------------------------------------------------
  1417. SUBROUTINE wsm6init(den0,denr,dens,cl,cpv,allowed_to_read)
  1418. !-------------------------------------------------------------------
  1419. IMPLICIT NONE
  1420. !-------------------------------------------------------------------
  1421. !.... constants which may not be tunable
  1422. REAL, INTENT(IN) :: den0,denr,dens,cl,cpv
  1423. LOGICAL, INTENT(IN) :: allowed_to_read
  1424. !
  1425. pi = 4.*atan(1.)
  1426. xlv1 = cl-cpv
  1427. !
  1428. qc0 = 4./3.*pi*denr*r0**3*xncr/den0 ! 0.419e-3 -- .61e-3
  1429. qck1 = .104*9.8*peaut/(xncr*denr)**(1./3.)/xmyu*den0**(4./3.) ! 7.03
  1430. !
  1431. bvtr1 = 1.+bvtr
  1432. bvtr2 = 2.5+.5*bvtr
  1433. bvtr3 = 3.+bvtr
  1434. bvtr4 = 4.+bvtr
  1435. bvtr6 = 6.+bvtr
  1436. g1pbr = rgmma(bvtr1)
  1437. g3pbr = rgmma(bvtr3)
  1438. g4pbr = rgmma(bvtr4) ! 17.837825
  1439. g6pbr = rgmma(bvtr6)
  1440. g5pbro2 = rgmma(bvtr2) ! 1.8273
  1441. pvtr = avtr*g4pbr/6.
  1442. eacrr = 1.0
  1443. pacrr = pi*n0r*avtr*g3pbr*.25*eacrr
  1444. precr1 = 2.*pi*n0r*.78
  1445. precr2 = 2.*pi*n0r*.31*avtr**.5*g5pbro2
  1446. roqimax = 2.08e22*dimax**8
  1447. !
  1448. bvts1 = 1.+bvts
  1449. bvts2 = 2.5+.5*bvts
  1450. bvts3 = 3.+bvts
  1451. bvts4 = 4.+bvts
  1452. g1pbs = rgmma(bvts1) !.8875
  1453. g3pbs = rgmma(bvts3)
  1454. g4pbs = rgmma(bvts4) ! 12.0786
  1455. g5pbso2 = rgmma(bvts2)
  1456. pvts = avts*g4pbs/6.
  1457. pacrs = pi*n0s*avts*g3pbs*.25
  1458. precs1 = 4.*n0s*.65
  1459. precs2 = 4.*n0s*.44*avts**.5*g5pbso2
  1460. pidn0r = pi*denr*n0r
  1461. pidn0s = pi*dens*n0s
  1462. !
  1463. pacrc = pi*n0s*avts*g3pbs*.25*eacrc
  1464. !
  1465. bvtg1 = 1.+bvtg
  1466. bvtg2 = 2.5+.5*bvtg
  1467. bvtg3 = 3.+bvtg
  1468. bvtg4 = 4.+bvtg
  1469. g1pbg = rgmma(bvtg1)
  1470. g3pbg = rgmma(bvtg3)
  1471. g4pbg = rgmma(bvtg4)
  1472. pacrg = pi*n0g*avtg*g3pbg*.25
  1473. g5pbgo2 = rgmma(bvtg2)
  1474. pvtg = avtg*g4pbg/6.
  1475. precg1 = 2.*pi*n0g*.78
  1476. precg2 = 2.*pi*n0g*.31*avtg**.5*g5pbgo2
  1477. pidn0g = pi*deng*n0g
  1478. !
  1479. rslopermax = 1./lamdarmax
  1480. rslopesmax = 1./lamdasmax
  1481. rslopegmax = 1./lamdagmax
  1482. rsloperbmax = rslopermax ** bvtr
  1483. rslopesbmax = rslopesmax ** bvts
  1484. rslopegbmax = rslopegmax ** bvtg
  1485. rsloper2max = rslopermax * rslopermax
  1486. rslopes2max = rslopesmax * rslopesmax
  1487. rslopeg2max = rslopegmax * rslopegmax
  1488. rsloper3max = rsloper2max * rslopermax
  1489. rslopes3max = rslopes2max * rslopesmax
  1490. rslopeg3max = rslopeg2max * rslopegmax
  1491. !
  1492. END SUBROUTINE wsm6init
  1493. !------------------------------------------------------------------------------
  1494. subroutine slope_wsm6(qrs,den,denfac,t,rslope,rslopeb,rslope2,rslope3, &
  1495. vt,its,ite,kts,kte)
  1496. IMPLICIT NONE
  1497. INTEGER :: its,ite, jts,jte, kts,kte
  1498. REAL, DIMENSION( its:ite , kts:kte,3) :: &
  1499. qrs, &
  1500. rslope, &
  1501. rslopeb, &
  1502. rslope2, &
  1503. rslope3, &
  1504. vt
  1505. REAL, DIMENSION( its:ite , kts:kte) :: &
  1506. den, &
  1507. denfac, &
  1508. t
  1509. REAL, PARAMETER :: t0c = 273.15
  1510. REAL, DIMENSION( its:ite , kts:kte ) :: &
  1511. n0sfac
  1512. REAL :: lamdar, lamdas, lamdag, x, y, z, supcol
  1513. integer :: i, j, k
  1514. !----------------------------------------------------------------
  1515. ! size distributions: (x=mixing ratio, y=air density):
  1516. ! valid for mixing ratio > 1.e-9 kg/kg.
  1517. lamdar(x,y)= sqrt(sqrt(pidn0r/(x*y))) ! (pidn0r/(x*y))**.25
  1518. lamdas(x,y,z)= sqrt(sqrt(pidn0s*z/(x*y))) ! (pidn0s*z/(x*y))**.25
  1519. lamdag(x,y)= sqrt(sqrt(pidn0g/(x*y))) ! (pidn0g/(x*y))**.25
  1520. !
  1521. do k = kts, kte
  1522. do i = its, ite
  1523. supcol = t0c-t(i,k)
  1524. !---------------------------------------------------------------
  1525. ! n0s: Intercept parameter for snow [m-4] [HDC 6]
  1526. !---------------------------------------------------------------
  1527. n0sfac(i,k) = max(min(exp(alpha*supcol),n0smax/n0s),1.)
  1528. if(qrs(i,k,1).le.qcrmin)then
  1529. rslope(i,k,1) = rslopermax
  1530. rslopeb(i,k,1) = rsloperbmax
  1531. rslope2(i,k,1) = rsloper2max
  1532. rslope3(i,k,1) = rsloper3max
  1533. else
  1534. rslope(i,k,1) = 1./lamdar(qrs(i,k,1),den(i,k))
  1535. rslopeb(i,k,1) = rslope(i,k,1)**bvtr
  1536. rslope2(i,k,1) = rslope(i,k,1)*rslope(i,k,1)
  1537. rslope3(i,k,1) = rslope2(i,k,1)*rslope(i,k,1)
  1538. endif
  1539. if(qrs(i,k,2).le.qcrmin)then
  1540. rslope(i,k,2) = rslopesmax
  1541. rslopeb(i,k,2) = rslopesbmax
  1542. rslope2(i,k,2) = rslopes2max
  1543. rslope3(i,k,2) = rslopes3max
  1544. else
  1545. rslope(i,k,2) = 1./lamdas(qrs(i,k,2),den(i,k),n0sfac(i,k))
  1546. rslopeb(i,k,2) = rslope(i,k,2)**bvts
  1547. rslope2(i,k,2) = rslope(i,k,2)*rslope(i,k,2)
  1548. rslope3(i,k,2) = rslope2(i,k,2)*rslope(i,k,2)
  1549. endif
  1550. if(qrs(i,k,3).le.qcrmin)then
  1551. rslope(i,k,3) = rslopegmax
  1552. rslopeb(i,k,3) = rslopegbmax
  1553. rslope2(i,k,3) = rslopeg2max
  1554. rslope3(i,k,3) = rslopeg3max
  1555. else
  1556. rslope(i,k,3) = 1./lamdag(qrs(i,k,3),den(i,k))
  1557. rslopeb(i,k,3) = rslope(i,k,3)**bvtg
  1558. rslope2(i,k,3) = rslope(i,k,3)*rslope(i,k,3)
  1559. rslope3(i,k,3) = rslope2(i,k,3)*rslope(i,k,3)
  1560. endif
  1561. vt(i,k,1) = pvtr*rslopeb(i,k,1)*denfac(i,k)
  1562. vt(i,k,2) = pvts*rslopeb(i,k,2)*denfac(i,k)
  1563. vt(i,k,3) = pvtg*rslopeb(i,k,3)*denfac(i,k)
  1564. if(qrs(i,k,1).le.0.0) vt(i,k,1) = 0.0
  1565. if(qrs(i,k,2).le.0.0) vt(i,k,2) = 0.0
  1566. if(qrs(i,k,3).le.0.0) vt(i,k,3) = 0.0
  1567. enddo
  1568. enddo
  1569. END subroutine slope_wsm6
  1570. !-----------------------------------------------------------------------------
  1571. subroutine slope_rain(qrs,den,denfac,t,rslope,rslopeb,rslope2,rslope3, &
  1572. vt,its,ite,kts,kte)
  1573. IMPLICIT NONE
  1574. INTEGER :: its,ite, jts,jte, kts,kte
  1575. REAL, DIMENSION( its:ite , kts:kte) :: &
  1576. qrs, &
  1577. rslope, &
  1578. rslopeb, &
  1579. rslope2, &
  1580. rslope3, &
  1581. vt, &
  1582. den, &
  1583. denfac, &
  1584. t
  1585. REAL, PARAMETER :: t0c = 273.15
  1586. REAL, DIMENSION( its:ite , kts:kte ) :: &
  1587. n0sfac
  1588. REAL :: lamdar, x, y, z, supcol
  1589. integer :: i, j, k
  1590. !----------------------------------------------------------------
  1591. ! size distributions: (x=mixing ratio, y=air density):
  1592. ! valid for mixing ratio > 1.e-9 kg/kg.
  1593. lamdar(x,y)= sqrt(sqrt(pidn0r/(x*y))) ! (pidn0r/(x*y))**.25
  1594. !
  1595. do k = kts, kte
  1596. do i = its, ite
  1597. if(qrs(i,k).le.qcrmin)then
  1598. rslope(i,k) = rslopermax
  1599. rslopeb(i,k) = rsloperbmax
  1600. rslope2(i,k) = rsloper2max
  1601. rslope3(i,k) = rsloper3max
  1602. else
  1603. rslope(i,k) = 1./lamdar(qrs(i,k),den(i,k))
  1604. rslopeb(i,k) = rslope(i,k)**bvtr
  1605. rslope2(i,k) = rslope(i,k)*rslope(i,k)
  1606. rslope3(i,k) = rslope2(i,k)*rslope(i,k)
  1607. endif
  1608. vt(i,k) = pvtr*rslopeb(i,k)*denfac(i,k)
  1609. if(qrs(i,k).le.0.0) vt(i,k) = 0.0
  1610. enddo
  1611. enddo
  1612. END subroutine slope_rain
  1613. !------------------------------------------------------------------------------
  1614. subroutine slope_snow(qrs,den,denfac,t,rslope,rslopeb,rslope2,rslope3, &
  1615. vt,its,ite,kts,kte)
  1616. IMPLICIT NONE
  1617. INTEGER :: its,ite, jts,jte, kts,kte
  1618. REAL, DIMENSION( its:ite , kts:kte) :: &
  1619. qrs, &
  1620. rslope, &
  1621. rslopeb, &
  1622. rslope2, &
  1623. rslope3, &
  1624. vt, &
  1625. den, &
  1626. denfac, &
  1627. t
  1628. REAL, PARAMETER :: t0c = 273.15
  1629. REAL, DIMENSION( its:ite , kts:kte ) :: &
  1630. n0sfac
  1631. REAL :: lamdas, x, y, z, supcol
  1632. integer :: i, j, k
  1633. !----------------------------------------------------------------
  1634. ! size distributions: (x=mixing ratio, y=air density):
  1635. ! valid for mixing ratio > 1.e-9 kg/kg.
  1636. lamdas(x,y,z)= sqrt(sqrt(pidn0s*z/(x*y))) ! (pidn0s*z/(x*y))**.25
  1637. !
  1638. do k = kts, kte
  1639. do i = its, ite
  1640. supcol = t0c-t(i,k)
  1641. !---------------------------------------------------------------
  1642. ! n0s: Intercept parameter for snow [m-4] [HDC 6]
  1643. !---------------------------------------------------------------
  1644. n0sfac(i,k) = max(min(exp(alpha*supcol),n0smax/n0s),1.)
  1645. if(qrs(i,k).le.qcrmin)then
  1646. rslope(i,k) = rslopesmax
  1647. rslopeb(i,k) = rslopesbmax
  1648. rslope2(i,k) = rslopes2max
  1649. rslope3(i,k) = rslopes3max
  1650. else
  1651. rslope(i,k) = 1./lamdas(qrs(i,k),den(i,k),n0sfac(i,k))
  1652. rslopeb(i,k) = rslope(i,k)**bvts
  1653. rslope2(i,k) = rslope(i,k)*rslope(i,k)
  1654. rslope3(i,k) = rslope2(i,k)*rslope(i,k)
  1655. endif
  1656. vt(i,k) = pvts*rslopeb(i,k)*denfac(i,k)
  1657. if(qrs(i,k).le.0.0) vt(i,k) = 0.0
  1658. enddo
  1659. enddo
  1660. END subroutine slope_snow
  1661. !----------------------------------------------------------------------------------
  1662. subroutine slope_graup(qrs,den,denfac,t,rslope,rslopeb,rslope2,rslope3, &
  1663. vt,its,ite,kts,kte)
  1664. IMPLICIT NONE
  1665. INTEGER :: its,ite, jts,jte, kts,kte
  1666. REAL, DIMENSION( its:ite , kts:kte) :: &
  1667. qrs, &
  1668. rslope, &
  1669. rslopeb, &
  1670. rslope2, &
  1671. rslope3, &
  1672. vt, &
  1673. den, &
  1674. denfac, &
  1675. t
  1676. REAL, PARAMETER :: t0c = 273.15
  1677. REAL, DIMENSION( its:ite , kts:kte ) :: &
  1678. n0sfac
  1679. REAL :: lamdag, x, y, z, supcol
  1680. integer :: i, j, k
  1681. !----------------------------------------------------------------
  1682. ! size distributions: (x=mixing ratio, y=air density):
  1683. ! valid for mixing ratio > 1.e-9 kg/kg.
  1684. lamdag(x,y)= sqrt(sqrt(pidn0g/(x*y))) ! (pidn0g/(x*y))**.25
  1685. !
  1686. do k = kts, kte
  1687. do i = its, ite
  1688. !---------------------------------------------------------------
  1689. ! n0s: Intercept parameter for snow [m-4] [HDC 6]
  1690. !---------------------------------------------------------------
  1691. if(qrs(i,k).le.qcrmin)then
  1692. rslope(i,k) = rslopegmax
  1693. rslopeb(i,k) = rslopegbmax
  1694. rslope2(i,k) = rslopeg2max
  1695. rslope3(i,k) = rslopeg3max
  1696. else
  1697. rslope(i,k) = 1./lamdag(qrs(i,k),den(i,k))
  1698. rslopeb(i,k) = rslope(i,k)**bvtg
  1699. rslope2(i,k) = rslope(i,k)*rslope(i,k)
  1700. rslope3(i,k) = rslope2(i,k)*rslope(i,k)
  1701. endif
  1702. vt(i,k) = pvtg*rslopeb(i,k)*denfac(i,k)
  1703. if(qrs(i,k).le.0.0) vt(i,k) = 0.0
  1704. enddo
  1705. enddo
  1706. END subroutine slope_graup
  1707. !---------------------------------------------------------------------------------
  1708. !-------------------------------------------------------------------
  1709. SUBROUTINE nislfv_rain_plm(im,km,denl,denfacl,tkl,dzl,wwl,rql,precip,dt,id,iter)
  1710. !-------------------------------------------------------------------
  1711. !
  1712. ! for non-iteration semi-Lagrangain forward advection for cloud
  1713. ! with mass conservation and positive definite advection
  1714. ! 2nd order interpolation with monotonic piecewise linear method
  1715. ! this routine is under assumption of decfl < 1 for semi_Lagrangian
  1716. !
  1717. ! dzl depth of model layer in meter
  1718. ! wwl terminal velocity at model layer m/s
  1719. ! rql cloud density*mixing ration
  1720. ! precip precipitation
  1721. ! dt time step
  1722. ! id kind of precip: 0 test case; 1 raindrop
  1723. ! iter how many time to guess mean terminal velocity: 0 pure forward.
  1724. ! 0 : use departure wind for advection
  1725. ! 1 : use mean wind for advection
  1726. ! > 1 : use mean wind after iter-1 iterations
  1727. !
  1728. ! author: hann-ming henry juang <henry.juang@noaa.gov>
  1729. ! implemented by song-you hong
  1730. !
  1731. implicit none
  1732. integer im,km,id
  1733. real dt
  1734. real dzl(im,km),wwl(im,km),rql(im,km),precip(im)
  1735. real denl(im,km),denfacl(im,km),tkl(im,km)
  1736. !
  1737. integer i,k,n,m,kk,kb,kt,iter
  1738. real tl,tl2,qql,dql,qqd
  1739. real th,th2,qqh,dqh
  1740. real zsum,qsum,dim,dip,c1,con1,fa1,fa2
  1741. real allold, allnew, zz, dzamin, cflmax, decfl
  1742. real dz(km), ww(km), qq(km), wd(km), wa(km), was(km)
  1743. real den(km), denfac(km), tk(km)
  1744. real wi(km+1), zi(km+1), za(km+1)
  1745. real qn(km), qr(km),tmp(km),tmp1(km),tmp2(km),tmp3(km)
  1746. real dza(km+1), qa(km+1), qmi(km+1), qpi(km+1)
  1747. !
  1748. precip(:) = 0.0
  1749. !
  1750. i_loop : do i=1,im
  1751. ! -----------------------------------
  1752. dz(:) = dzl(i,:)
  1753. qq(:) = rql(i,:)
  1754. ww(:) = wwl(i,:)
  1755. den(:) = denl(i,:)
  1756. denfac(:) = denfacl(i,:)
  1757. tk(:) = tkl(i,:)
  1758. ! skip for no precipitation for all layers
  1759. allold = 0.0
  1760. do k=1,km
  1761. allold = allold + qq(k)
  1762. enddo
  1763. if(allold.le.0.0) then
  1764. cycle i_loop
  1765. endif
  1766. !
  1767. ! compute interface values
  1768. zi(1)=0.0
  1769. do k=1,km
  1770. zi(k+1) = zi(k)+dz(k)
  1771. enddo
  1772. !
  1773. ! save departure wind
  1774. wd(:) = ww(:)
  1775. n=1
  1776. 100 continue
  1777. ! plm is 2nd order, we can use 2nd order wi or 3rd order wi
  1778. ! 2nd order interpolation to get wi
  1779. wi(1) = ww(1)
  1780. wi(km+1) = ww(km)
  1781. do k=2,km
  1782. wi(k) = (ww(k)*dz(k-1)+ww(k-1)*dz(k))/(dz(k-1)+dz(k))
  1783. enddo
  1784. ! 3rd order interpolation to get wi
  1785. fa1 = 9./16.
  1786. fa2 = 1./16.
  1787. wi(1) = ww(1)
  1788. wi(2) = 0.5*(ww(2)+ww(1))
  1789. do k=3,km-1
  1790. wi(k) = fa1*(ww(k)+ww(k-1))-fa2*(ww(k+1)+ww(k-2))
  1791. enddo
  1792. wi(km) = 0.5*(ww(km)+ww(km-1))
  1793. wi(km+1) = ww(km)
  1794. !
  1795. ! terminate of top of raingroup
  1796. do k=2,km
  1797. if( ww(k).eq.0.0 ) wi(k)=ww(k-1)
  1798. enddo
  1799. !
  1800. ! diffusivity of wi
  1801. con1 = 0.05
  1802. do k=km,1,-1
  1803. decfl = (wi(k+1)-wi(k))*dt/dz(k)
  1804. if( decfl .gt. con1 ) then
  1805. wi(k) = wi(k+1) - con1*dz(k)/dt
  1806. endif
  1807. enddo
  1808. ! compute arrival point
  1809. do k=1,km+1
  1810. za(k) = zi(k) - wi(k)*dt
  1811. enddo
  1812. !
  1813. do k=1,km
  1814. dza(k) = za(k+1)-za(k)
  1815. enddo
  1816. dza(km+1) = zi(km+1) - za(km+1)
  1817. !
  1818. ! computer deformation at arrival point
  1819. do k=1,km
  1820. qa(k) = qq(k)*dz(k)/dza(k)
  1821. qr(k) = qa(k)/den(k)
  1822. enddo
  1823. qa(km+1) = 0.0
  1824. ! call maxmin(km,1,qa,' arrival points ')
  1825. !
  1826. ! compute arrival terminal velocity, and estimate mean terminal velocity
  1827. ! then back to use mean terminal velocity
  1828. if( n.le.iter ) then
  1829. call slope_rain(qr,den,denfac,tk,tmp,tmp1,tmp2,tmp3,wa,1,1,1,km)
  1830. if( n.ge.2 ) wa(1:km)=0.5*(wa(1:km)+was(1:km))
  1831. do k=1,km
  1832. !#ifdef DEBUG
  1833. ! print*,' slope_wsm3 ',qr(k)*1000.,den(k),denfac(k),tk(k),tmp(k),tmp1(k),tmp2(k),ww(k),wa(k)
  1834. !#endif
  1835. ! mean wind is average of departure and new arrival winds
  1836. ww(k) = 0.5* ( wd(k)+wa(k) )
  1837. enddo
  1838. was(:) = wa(:)
  1839. n=n+1
  1840. go to 100
  1841. endif
  1842. !
  1843. ! estimate values at arrival cell interface with monotone
  1844. do k=2,km
  1845. dip=(qa(k+1)-qa(k))/(dza(k+1)+dza(k))
  1846. dim=(qa(k)-qa(k-1))/(dza(k-1)+dza(k))
  1847. if( dip*dim.le.0.0 ) then
  1848. qmi(k)=qa(k)
  1849. qpi(k)=qa(k)
  1850. else
  1851. qpi(k)=qa(k)+0.5*(dip+dim)*dza(k)
  1852. qmi(k)=2.0*qa(k)-qpi(k)
  1853. if( qpi(k).lt.0.0 .or. qmi(k).lt.0.0 ) then
  1854. qpi(k) = qa(k)
  1855. qmi(k) = qa(k)
  1856. endif
  1857. endif
  1858. enddo
  1859. qpi(1)=qa(1)
  1860. qmi(1)=qa(1)
  1861. qmi(km+1)=qa(km+1)
  1862. qpi(km+1)=qa(km+1)
  1863. !
  1864. ! interpolation to regular point
  1865. qn = 0.0
  1866. kb=1
  1867. kt=1
  1868. intp : do k=1,km
  1869. kb=max(kb-1,1)
  1870. kt=max(kt-1,1)
  1871. ! find kb and kt
  1872. if( zi(k).ge.za(km+1) ) then
  1873. exit intp
  1874. else
  1875. find_kb : do kk=kb,km
  1876. if( zi(k).le.za(kk+1) ) then
  1877. kb = kk
  1878. exit find_kb
  1879. else
  1880. cycle find_kb
  1881. endif
  1882. enddo find_kb
  1883. find_kt : do kk=kt,km
  1884. if( zi(k+1).le.za(kk) ) then
  1885. kt = kk
  1886. exit find_kt
  1887. else
  1888. cycle find_kt
  1889. endif
  1890. enddo find_kt
  1891. kt = kt - 1
  1892. ! compute q with piecewise constant method
  1893. if( kt.eq.kb ) then
  1894. tl=(zi(k)-za(kb))/dza(kb)
  1895. th=(zi(k+1)-za(kb))/dza(kb)
  1896. tl2=tl*tl
  1897. th2=th*th
  1898. qqd=0.5*(qpi(kb)-qmi(kb))
  1899. qqh=qqd*th2+qmi(kb)*th
  1900. qql=qqd*tl2+qmi(kb)*tl
  1901. qn(k) = (qqh-qql)/(th-tl)
  1902. else if( kt.gt.kb ) then
  1903. tl=(zi(k)-za(kb))/dza(kb)
  1904. tl2=tl*tl
  1905. qqd=0.5*(qpi(kb)-qmi(kb))
  1906. qql=qqd*tl2+qmi(kb)*tl
  1907. dql = qa(kb)-qql
  1908. zsum = (1.-tl)*dza(kb)
  1909. qsum = dql*dza(kb)
  1910. if( kt-kb.gt.1 ) then
  1911. do m=kb+1,kt-1
  1912. zsum = zsum + dza(m)
  1913. qsum = qsum + qa(m) * dza(m)
  1914. enddo
  1915. endif
  1916. th=(zi(k+1)-za(kt))/dza(kt)
  1917. th2=th*th
  1918. qqd=0.5*(qpi(kt)-qmi(kt))
  1919. dqh=qqd*th2+qmi(kt)*th
  1920. zsum = zsum + th*dza(kt)
  1921. qsum = qsum + dqh*dza(kt)
  1922. qn(k) = qsum/zsum
  1923. endif
  1924. cycle intp
  1925. endif
  1926. !
  1927. enddo intp
  1928. !
  1929. ! rain out
  1930. sum_precip: do k=1,km
  1931. if( za(k).lt.0.0 .and. za(k+1).lt.0.0 ) then
  1932. precip(i) = precip(i) + qa(k)*dza(k)
  1933. cycle sum_precip
  1934. else if ( za(k).lt.0.0 .and. za(k+1).ge.0.0 ) then
  1935. precip(i) = precip(i) + qa(k)*(0.0-za(k))
  1936. exit sum_precip
  1937. endif
  1938. exit sum_precip
  1939. enddo sum_precip
  1940. !
  1941. ! replace the new values
  1942. rql(i,:) = qn(:)
  1943. !
  1944. ! ----------------------------------
  1945. enddo i_loop
  1946. !
  1947. END SUBROUTINE nislfv_rain_plm
  1948. !-------------------------------------------------------------------
  1949. SUBROUTINE nislfv_rain_plm6(im,km,denl,denfacl,tkl,dzl,wwl,rql,rql2, precip1, precip2,dt,id,iter)
  1950. !-------------------------------------------------------------------
  1951. !
  1952. ! for non-iteration semi-Lagrangain forward advection for cloud
  1953. ! with mass conservation and positive definite advection
  1954. ! 2nd order interpolation with monotonic piecewise linear method
  1955. ! this routine is under assumption of decfl < 1 for semi_Lagrangian
  1956. !
  1957. ! dzl depth of model layer in meter
  1958. ! wwl terminal velocity at model layer m/s
  1959. ! rql cloud density*mixing ration
  1960. ! precip precipitation
  1961. ! dt time step
  1962. ! id kind of precip: 0 test case; 1 raindrop
  1963. ! iter how many time to guess mean terminal velocity: 0 pure forward.
  1964. ! 0 : use departure wind for advection
  1965. ! 1 : use mean wind for advection
  1966. ! > 1 : use mean wind after iter-1 iterations
  1967. !
  1968. ! author: hann-ming henry juang <henry.juang@noaa.gov>
  1969. ! implemented by song-you hong
  1970. !
  1971. implicit none
  1972. integer im,km,id
  1973. real dt
  1974. real dzl(im,km),wwl(im,km),rql(im,km),rql2(im,km),precip(im),precip1(im),precip2(im)
  1975. real denl(im,km),denfacl(im,km),tkl(im,km)
  1976. !
  1977. integer i,k,n,m,kk,kb,kt,iter,ist
  1978. real tl,tl2,qql,dql,qqd
  1979. real th,th2,qqh,dqh
  1980. real zsum,qsum,dim,dip,c1,con1,fa1,fa2
  1981. real allold, allnew, zz, dzamin, cflmax, decfl
  1982. real dz(km), ww(km), qq(km), qq2(km), wd(km), wa(km), wa2(km), was(km)
  1983. real den(km), denfac(km), tk(km)
  1984. real wi(km+1), zi(km+1), za(km+1)
  1985. real qn(km), qr(km),qr2(km),tmp(km),tmp1(km),tmp2(km),tmp3(km)
  1986. real dza(km+1), qa(km+1), qa2(km+1),qmi(km+1), qpi(km+1)
  1987. !
  1988. precip(:) = 0.0
  1989. precip1(:) = 0.0
  1990. precip2(:) = 0.0
  1991. !
  1992. i_loop : do i=1,im
  1993. ! -----------------------------------
  1994. dz(:) = dzl(i,:)
  1995. qq(:) = rql(i,:)
  1996. qq2(:) = rql2(i,:)
  1997. ww(:) = wwl(i,:)
  1998. den(:) = denl(i,:)
  1999. denfac(:) = denfacl(i,:)
  2000. tk(:) = tkl(i,:)
  2001. ! skip for no precipitation for all layers
  2002. allold = 0.0
  2003. do k=1,km
  2004. allold = allold + qq(k)
  2005. enddo
  2006. if(allold.le.0.0) then
  2007. cycle i_loop
  2008. endif
  2009. !
  2010. ! compute interface values
  2011. zi(1)=0.0
  2012. do k=1,km
  2013. zi(k+1) = zi(k)+dz(k)
  2014. enddo
  2015. !
  2016. ! save departure wind
  2017. wd(:) = ww(:)
  2018. n=1
  2019. 100 continue
  2020. ! plm is 2nd order, we can use 2nd order wi or 3rd order wi
  2021. ! 2nd order interpolation to get wi
  2022. wi(1) = ww(1)
  2023. wi(km+1) = ww(km)
  2024. do k=2,km
  2025. wi(k) = (ww(k)*dz(k-1)+ww(k-1)*dz(k))/(dz(k-1)+dz(k))
  2026. enddo
  2027. ! 3rd order interpolation to get wi
  2028. fa1 = 9./16.
  2029. fa2 = 1./16.
  2030. wi(1) = ww(1)
  2031. wi(2) = 0.5*(ww(2)+ww(1))
  2032. do k=3,km-1
  2033. wi(k) = fa1*(ww(k)+ww(k-1))-fa2*(ww(k+1)+ww(k-2))
  2034. enddo
  2035. wi(km) = 0.5*(ww(km)+ww(km-1))
  2036. wi(km+1) = ww(km)
  2037. !
  2038. ! terminate of top of raingroup
  2039. do k=2,km
  2040. if( ww(k).eq.0.0 ) wi(k)=ww(k-1)
  2041. enddo
  2042. !
  2043. ! diffusivity of wi
  2044. con1 = 0.05
  2045. do k=km,1,-1
  2046. decfl = (wi(k+1)-wi(k))*dt/dz(k)
  2047. if( decfl .gt. con1 ) then
  2048. wi(k) = wi(k+1) - con1*dz(k)/dt
  2049. endif
  2050. enddo
  2051. ! compute arrival point
  2052. do k=1,km+1
  2053. za(k) = zi(k) - wi(k)*dt
  2054. enddo
  2055. !
  2056. do k=1,km
  2057. dza(k) = za(k+1)-za(k)
  2058. enddo
  2059. dza(km+1) = zi(km+1) - za(km+1)
  2060. !
  2061. ! computer deformation at arrival point
  2062. do k=1,km
  2063. qa(k) = qq(k)*dz(k)/dza(k)
  2064. qa2(k) = qq2(k)*dz(k)/dza(k)
  2065. qr(k) = qa(k)/den(k)
  2066. qr2(k) = qa2(k)/den(k)
  2067. enddo
  2068. qa(km+1) = 0.0
  2069. qa2(km+1) = 0.0
  2070. ! call maxmin(km,1,qa,' arrival points ')
  2071. !
  2072. ! compute arrival terminal velocity, and estimate mean terminal velocity
  2073. ! then back to use mean terminal velocity
  2074. if( n.le.iter ) then
  2075. call slope_snow(qr,den,denfac,tk,tmp,tmp1,tmp2,tmp3,wa,1,1,1,km)
  2076. call slope_graup(qr2,den,denfac,tk,tmp,tmp1,tmp2,tmp3,wa2,1,1,1,km)
  2077. do k = 1, km
  2078. tmp(k) = max((qr(k)+qr2(k)), 1.E-15)
  2079. IF ( tmp(k) .gt. 1.e-15 ) THEN
  2080. wa(k) = (wa(k)*qr(k) + wa2(k)*qr2(k))/tmp(k)
  2081. ELSE
  2082. wa(k) = 0.
  2083. ENDIF
  2084. enddo
  2085. if( n.ge.2 ) wa(1:km)=0.5*(wa(1:km)+was(1:km))
  2086. do k=1,km
  2087. !#ifdef DEBUG
  2088. ! print*,' slope_wsm3 ',qr(k)*1000.,den(k),denfac(k),tk(k),tmp(k),tmp1(k),tmp2(k), &
  2089. ! ww(k),wa(k)
  2090. !#endif
  2091. ! mean wind is average of departure and new arrival winds
  2092. ww(k) = 0.5* ( wd(k)+wa(k) )
  2093. enddo
  2094. was(:) = wa(:)
  2095. n=n+1
  2096. go to 100
  2097. endif
  2098. ist_loop : do ist = 1, 2
  2099. if (ist.eq.2) then
  2100. qa(:) = qa2(:)
  2101. endif
  2102. !
  2103. precip(i) = 0.
  2104. !
  2105. ! estimate values at arrival cell interface with monotone
  2106. do k=2,km
  2107. dip=(qa(k+1)-qa(k))/(dza(k+1)+dza(k))
  2108. dim=(qa(k)-qa(k-1))/(dza(k-1)+dza(k))
  2109. if( dip*dim.le.0.0 ) then
  2110. qmi(k)=qa(k)
  2111. qpi(k)=qa(k)
  2112. else
  2113. qpi(k)=qa(k)+0.5*(dip+dim)*dza(k)
  2114. qmi(k)=2.0*qa(k)-qpi(k)
  2115. if( qpi(k).lt.0.0 .or. qmi(k).lt.0.0 ) then
  2116. qpi(k) = qa(k)
  2117. qmi(k) = qa(k)
  2118. endif
  2119. endif
  2120. enddo
  2121. qpi(1)=qa(1)
  2122. qmi(1)=qa(1)
  2123. qmi(km+1)=qa(km+1)
  2124. qpi(km+1)=qa(km+1)
  2125. !
  2126. ! interpolation to regular point
  2127. qn = 0.0
  2128. kb=1
  2129. kt=1
  2130. intp : do k=1,km
  2131. kb=max(kb-1,1)
  2132. kt=max(kt-1,1)
  2133. ! find kb and kt
  2134. if( zi(k).ge.za(km+1) ) then
  2135. exit intp
  2136. else
  2137. find_kb : do kk=kb,km
  2138. if( zi(k).le.za(kk+1) ) then
  2139. kb = kk
  2140. exit find_kb
  2141. else
  2142. cycle find_kb
  2143. endif
  2144. enddo find_kb
  2145. find_kt : do kk=kt,km
  2146. if( zi(k+1).le.za(kk) ) then
  2147. kt = kk
  2148. exit find_kt
  2149. else
  2150. cycle find_kt
  2151. endif
  2152. enddo find_kt
  2153. kt = kt - 1
  2154. ! compute q with piecewise constant method
  2155. if( kt.eq.kb ) then
  2156. tl=(zi(k)-za(kb))/dza(kb)
  2157. th=(zi(k+1)-za(kb))/dza(kb)
  2158. tl2=tl*tl
  2159. th2=th*th
  2160. qqd=0.5*(qpi(kb)-qmi(kb))
  2161. qqh=qqd*th2+qmi(kb)*th
  2162. qql=qqd*tl2+qmi(kb)*tl
  2163. qn(k) = (qqh-qql)/(th-tl)
  2164. else if( kt.gt.kb ) then
  2165. tl=(zi(k)-za(kb))/dza(kb)
  2166. tl2=tl*tl
  2167. qqd=0.5*(qpi(kb)-qmi(kb))
  2168. qql=qqd*tl2+qmi(kb)*tl
  2169. dql = qa(kb)-qql
  2170. zsum = (1.-tl)*dza(kb)
  2171. qsum = dql*dza(kb)
  2172. if( kt-kb.gt.1 ) then
  2173. do m=kb+1,kt-1
  2174. zsum = zsum + dza(m)
  2175. qsum = qsum + qa(m) * dza(m)
  2176. enddo
  2177. endif
  2178. th=(zi(k+1)-za(kt))/dza(kt)
  2179. th2=th*th
  2180. qqd=0.5*(qpi(kt)-qmi(kt))
  2181. dqh=qqd*th2+qmi(kt)*th
  2182. zsum = zsum + th*dza(kt)
  2183. qsum = qsum + dqh*dza(kt)
  2184. qn(k) = qsum/zsum
  2185. endif
  2186. cycle intp
  2187. endif
  2188. !
  2189. enddo intp
  2190. !
  2191. ! rain out
  2192. sum_precip: do k=1,km
  2193. if( za(k).lt.0.0 .and. za(k+1).lt.0.0 ) then
  2194. precip(i) = precip(i) + qa(k)*dza(k)
  2195. cycle sum_precip
  2196. else if ( za(k).lt.0.0 .and. za(k+1).ge.0.0 ) then
  2197. precip(i) = precip(i) + qa(k)*(0.0-za(k))
  2198. exit sum_precip
  2199. endif
  2200. exit sum_precip
  2201. enddo sum_precip
  2202. !
  2203. ! replace the new values
  2204. if(ist.eq.1) then
  2205. rql(i,:) = qn(:)
  2206. precip1(i) = precip(i)
  2207. else
  2208. rql2(i,:) = qn(:)
  2209. precip2(i) = precip(i)
  2210. endif
  2211. enddo ist_loop
  2212. !
  2213. ! ----------------------------------
  2214. enddo i_loop
  2215. !
  2216. END SUBROUTINE nislfv_rain_plm6
  2217. END MODULE module_mp_wsm6