PageRenderTime 35ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/wrfv2_fire/phys/module_mp_wsm5.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 1631 lines | 1182 code | 3 blank | 446 comment | 74 complexity | 9a187b43416795ec6ea813dd8f412bc4 MD5 | raw file
Possible License(s): AGPL-1.0
  1. #ifdef _ACCEL
  2. # include "module_mp_wsm5_accel.F"
  3. #else
  4. #if ( RWORDSIZE == 4 )
  5. # define VREC vsrec
  6. # define VSQRT vssqrt
  7. #else
  8. # define VREC vrec
  9. # define VSQRT vsqrt
  10. #endif
  11. !Including inline expansion statistical function
  12. MODULE module_mp_wsm5
  13. !
  14. !
  15. REAL, PARAMETER, PRIVATE :: dtcldcr = 120. ! maximum time step for minor loops
  16. REAL, PARAMETER, PRIVATE :: n0r = 8.e6 ! intercept parameter rain
  17. REAL, PARAMETER, PRIVATE :: avtr = 841.9 ! a constant for terminal velocity of rain
  18. REAL, PARAMETER, PRIVATE :: bvtr = 0.8 ! a constant for terminal velocity of rain
  19. REAL, PARAMETER, PRIVATE :: r0 = .8e-5 ! 8 microm in contrast to 10 micro m
  20. REAL, PARAMETER, PRIVATE :: peaut = .55 ! collection efficiency
  21. REAL, PARAMETER, PRIVATE :: xncr = 3.e8 ! maritime cloud in contrast to 3.e8 in tc80
  22. REAL, PARAMETER, PRIVATE :: xmyu = 1.718e-5 ! the dynamic viscosity kgm-1s-1
  23. REAL, PARAMETER, PRIVATE :: avts = 11.72 ! a constant for terminal velocity of snow
  24. REAL, PARAMETER, PRIVATE :: bvts = .41 ! a constant for terminal velocity of snow
  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, SAVE :: &
  38. qc0, qck1,bvtr1,bvtr2,bvtr3,bvtr4,g1pbr, &
  39. g3pbr,g4pbr,g5pbro2,pvtr,eacrr,pacrr, &
  40. precr1,precr2,xmmax,roqimax,bvts1, &
  41. bvts2,bvts3,bvts4,g1pbs,g3pbs,g4pbs, &
  42. g5pbso2,pvts,pacrs,precs1,precs2,pidn0r, &
  43. pidn0s,xlv1,pacrc,pi, &
  44. rslopermax,rslopesmax,rslopegmax, &
  45. rsloperbmax,rslopesbmax,rslopegbmax, &
  46. rsloper2max,rslopes2max,rslopeg2max, &
  47. rsloper3max,rslopes3max,rslopeg3max
  48. !
  49. ! Specifies code-inlining of fpvs function in WSM52D below. JM 20040507
  50. !
  51. CONTAINS
  52. !===================================================================
  53. !
  54. SUBROUTINE wsm5(th, q, qc, qr, qi, qs &
  55. ,den, pii, p, delz &
  56. ,delt,g, cpd, cpv, rd, rv, t0c &
  57. ,ep1, ep2, qmin &
  58. ,XLS, XLV0, XLF0, den0, denr &
  59. ,cliq,cice,psat &
  60. ,rain, rainncv &
  61. ,snow, snowncv &
  62. ,sr &
  63. ,ids,ide, jds,jde, kds,kde &
  64. ,ims,ime, jms,jme, kms,kme &
  65. ,its,ite, jts,jte, kts,kte &
  66. )
  67. !-------------------------------------------------------------------
  68. IMPLICIT NONE
  69. !-------------------------------------------------------------------
  70. !
  71. INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde , &
  72. ims,ime, jms,jme, kms,kme , &
  73. its,ite, jts,jte, kts,kte
  74. REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), &
  75. INTENT(INOUT) :: &
  76. th, &
  77. q, &
  78. qc, &
  79. qi, &
  80. qr, &
  81. qs
  82. REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), &
  83. INTENT(IN ) :: &
  84. den, &
  85. pii, &
  86. p, &
  87. delz
  88. REAL, INTENT(IN ) :: delt, &
  89. g, &
  90. rd, &
  91. rv, &
  92. t0c, &
  93. den0, &
  94. cpd, &
  95. cpv, &
  96. ep1, &
  97. ep2, &
  98. qmin, &
  99. XLS, &
  100. XLV0, &
  101. XLF0, &
  102. cliq, &
  103. cice, &
  104. psat, &
  105. denr
  106. REAL, DIMENSION( ims:ime , jms:jme ), &
  107. INTENT(INOUT) :: rain, &
  108. rainncv, &
  109. sr
  110. REAL, DIMENSION( ims:ime , jms:jme ), OPTIONAL, &
  111. INTENT(INOUT) :: snow, &
  112. snowncv
  113. ! LOCAL VAR
  114. REAL, DIMENSION( its:ite , kts:kte ) :: t
  115. REAL, DIMENSION( its:ite , kts:kte, 2 ) :: qci, qrs
  116. CHARACTER*256 :: emess
  117. INTEGER :: mkx_test
  118. INTEGER :: i,j,k
  119. !-------------------------------------------------------------------
  120. #ifndef RUN_ON_GPU
  121. DO j=jts,jte
  122. DO k=kts,kte
  123. DO i=its,ite
  124. t(i,k)=th(i,k,j)*pii(i,k,j)
  125. qci(i,k,1) = qc(i,k,j)
  126. qci(i,k,2) = qi(i,k,j)
  127. qrs(i,k,1) = qr(i,k,j)
  128. qrs(i,k,2) = qs(i,k,j)
  129. ENDDO
  130. ENDDO
  131. ! Sending array starting locations of optional variables may cause
  132. ! troubles, so we explicitly change the call.
  133. CALL wsm52D(t, q(ims,kms,j), qci, qrs &
  134. ,den(ims,kms,j) &
  135. ,p(ims,kms,j), delz(ims,kms,j) &
  136. ,delt,g, cpd, cpv, rd, rv, t0c &
  137. ,ep1, ep2, qmin &
  138. ,XLS, XLV0, XLF0, den0, denr &
  139. ,cliq,cice,psat &
  140. ,j &
  141. ,rain(ims,j),rainncv(ims,j) &
  142. ,sr(ims,j) &
  143. ,ids,ide, jds,jde, kds,kde &
  144. ,ims,ime, jms,jme, kms,kme &
  145. ,its,ite, jts,jte, kts,kte &
  146. ,snow,snowncv &
  147. )
  148. DO K=kts,kte
  149. DO I=its,ite
  150. th(i,k,j)=t(i,k)/pii(i,k,j)
  151. qc(i,k,j) = qci(i,k,1)
  152. qi(i,k,j) = qci(i,k,2)
  153. qr(i,k,j) = qrs(i,k,1)
  154. qs(i,k,j) = qrs(i,k,2)
  155. ENDDO
  156. ENDDO
  157. ENDDO
  158. #else
  159. CALL get_wsm5_gpu_levels ( mkx_test )
  160. IF ( mkx_test .LT. kte ) THEN
  161. WRITE(emess,*)'Number of levels compiled for GPU WSM5 too small. ', &
  162. mkx_test,' < ',kte
  163. CALL wrf_error_fatal(emess)
  164. ENDIF
  165. CALL wsm5_host ( &
  166. th(its:ite,kts:kte,jts:jte), pii(its:ite,kts:kte,jts:jte) &
  167. ,q(its:ite,kts:kte,jts:jte), qc(its:ite,kts:kte,jts:jte) &
  168. ,qi(its:ite,kts:kte,jts:jte), qr(its:ite,kts:kte,jts:jte) &
  169. ,qs(its:ite,kts:kte,jts:jte), den(its:ite,kts:kte,jts:jte) &
  170. ,p(its:ite,kts:kte,jts:jte), delz(its:ite,kts:kte,jts:jte) &
  171. ,delt &
  172. ,rain(its:ite,jts:jte),rainncv(its:ite,jts:jte) &
  173. ,snow(its:ite,jts:jte),snowncv(its:ite,jts:jte) &
  174. ,sr(its:ite,jts:jte) &
  175. ,its, ite, jts, jte, kts, kte &
  176. ,its, ite, jts, jte, kts, kte &
  177. ,its, ite, jts, jte, kts, kte &
  178. )
  179. #endif
  180. END SUBROUTINE wsm5
  181. !===================================================================
  182. !
  183. SUBROUTINE wsm52D(t, q &
  184. ,qci, qrs, den, p, delz &
  185. ,delt,g, cpd, cpv, rd, rv, t0c &
  186. ,ep1, ep2, qmin &
  187. ,XLS, XLV0, XLF0, den0, denr &
  188. ,cliq,cice,psat &
  189. ,lat &
  190. ,rain,rainncv &
  191. ,sr &
  192. ,ids,ide, jds,jde, kds,kde &
  193. ,ims,ime, jms,jme, kms,kme &
  194. ,its,ite, jts,jte, kts,kte &
  195. ,snow,snowncv &
  196. )
  197. !-------------------------------------------------------------------
  198. IMPLICIT NONE
  199. !-------------------------------------------------------------------
  200. !
  201. ! This code is a 5-class mixed ice microphyiscs scheme (WSM5) of the
  202. ! Single-Moment MicroPhyiscs (WSMMP). The WSMMP assumes that ice nuclei
  203. ! number concentration is a function of temperature, and seperate assumption
  204. ! is developed, in which ice crystal number concentration is a function
  205. ! of ice amount. A theoretical background of the ice-microphysics and related
  206. ! processes in the WSMMPs are described in Hong et al. (2004).
  207. ! Production terms in the WSM6 scheme are described in Hong and Lim (2006).
  208. ! All units are in m.k.s. and source/sink terms in kgkg-1s-1.
  209. !
  210. ! WSM5 cloud scheme
  211. !
  212. ! Coded by Song-You Hong (Yonsei Univ.)
  213. ! Jimy Dudhia (NCAR) and Shu-Hua Chen (UC Davis)
  214. ! Summer 2002
  215. !
  216. ! Implemented by Song-You Hong (Yonsei Univ.) and Jimy Dudhia (NCAR)
  217. ! Summer 2003
  218. !
  219. ! Reference) Hong, Dudhia, Chen (HDC, 2004) Mon. Wea. Rev.
  220. ! Rutledge, Hobbs (RH83, 1983) J. Atmos. Sci.
  221. ! Hong and Lim (HL, 2006) J. Korean Meteor. Soc.
  222. !
  223. INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde , &
  224. ims,ime, jms,jme, kms,kme , &
  225. its,ite, jts,jte, kts,kte, &
  226. lat
  227. REAL, DIMENSION( its:ite , kts:kte ), &
  228. INTENT(INOUT) :: &
  229. t
  230. REAL, DIMENSION( its:ite , kts:kte, 2 ), &
  231. INTENT(INOUT) :: &
  232. qci, &
  233. qrs
  234. REAL, DIMENSION( ims:ime , kms:kme ), &
  235. INTENT(INOUT) :: &
  236. q
  237. REAL, DIMENSION( ims:ime , kms:kme ), &
  238. INTENT(IN ) :: &
  239. den, &
  240. p, &
  241. delz
  242. REAL, INTENT(IN ) :: delt, &
  243. g, &
  244. cpd, &
  245. cpv, &
  246. t0c, &
  247. den0, &
  248. rd, &
  249. rv, &
  250. ep1, &
  251. ep2, &
  252. qmin, &
  253. XLS, &
  254. XLV0, &
  255. XLF0, &
  256. cliq, &
  257. cice, &
  258. psat, &
  259. denr
  260. REAL, DIMENSION( ims:ime ), &
  261. INTENT(INOUT) :: rain, &
  262. rainncv, &
  263. sr
  264. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, &
  265. INTENT(INOUT) :: snow, &
  266. snowncv
  267. ! LOCAL VAR
  268. REAL, DIMENSION( its:ite , kts:kte , 2) :: &
  269. rh, &
  270. qs, &
  271. rslope, &
  272. rslope2, &
  273. rslope3, &
  274. rslopeb, &
  275. qrs_tmp, &
  276. falk, &
  277. fall, &
  278. work1
  279. REAL, DIMENSION( its:ite , kts:kte ) :: &
  280. falkc, &
  281. fallc, &
  282. xl, &
  283. cpm, &
  284. denfac, &
  285. xni, &
  286. denqrs1, &
  287. denqrs2, &
  288. denqci, &
  289. n0sfac, &
  290. work2, &
  291. workr, &
  292. works, &
  293. work1c, &
  294. work2c
  295. REAL, DIMENSION( its:ite , kts:kte ) :: &
  296. den_tmp, &
  297. delz_tmp
  298. REAL, DIMENSION( its:ite ) :: &
  299. delqrs1, &
  300. delqrs2, &
  301. delqi
  302. REAL, DIMENSION( its:ite , kts:kte ) :: &
  303. pigen, &
  304. pidep, &
  305. psdep, &
  306. praut, &
  307. psaut, &
  308. prevp, &
  309. psevp, &
  310. pracw, &
  311. psacw, &
  312. psaci, &
  313. pcond, &
  314. psmlt
  315. INTEGER, DIMENSION( its:ite ) :: &
  316. mstep, &
  317. numdt
  318. REAL, DIMENSION(its:ite) :: tstepsnow
  319. REAL, DIMENSION(its:ite) :: rmstep
  320. REAL dtcldden, rdelz, rdtcld
  321. LOGICAL, DIMENSION( its:ite ) :: flgcld
  322. #define WSM_NO_CONDITIONAL_IN_VECTOR
  323. #ifdef WSM_NO_CONDITIONAL_IN_VECTOR
  324. REAL, DIMENSION(its:ite) :: xal, xbl
  325. #endif
  326. REAL :: &
  327. cpmcal, xlcal, diffus, &
  328. viscos, xka, venfac, conden, diffac, &
  329. x, y, z, a, b, c, d, e, &
  330. qdt, holdrr, holdrs, supcol, supcolt, pvt, &
  331. coeres, supsat, dtcld, xmi, eacrs, satdt, &
  332. vt2i,vt2s,acrfac, &
  333. qimax, diameter, xni0, roqi0, &
  334. fallsum, fallsum_qsi, xlwork2, factor, source, &
  335. value, xlf, pfrzdtc, pfrzdtr, supice, holdc, holdci
  336. ! variables for optimization
  337. REAL, DIMENSION( its:ite ) :: tvec1
  338. REAL :: temp
  339. INTEGER :: i, j, k, mstepmax, &
  340. iprt, latd, lond, loop, loops, ifsat, n, idim, kdim
  341. ! Temporaries used for inlining fpvs function
  342. REAL :: dldti, xb, xai, tr, xbi, xa, hvap, cvap, hsub, dldt, ttp
  343. REAL :: logtr
  344. !
  345. !=================================================================
  346. ! compute internal functions
  347. !
  348. cpmcal(x) = cpd*(1.-max(x,qmin))+max(x,qmin)*cpv
  349. xlcal(x) = xlv0-xlv1*(x-t0c)
  350. !----------------------------------------------------------------
  351. ! diffus: diffusion coefficient of the water vapor
  352. ! viscos: kinematic viscosity(m2s-1)
  353. ! diffus(x,y) = 8.794e-5 * exp(log(x)*(1.81)) / y ! 8.794e-5*x**1.81/y
  354. ! viscos(x,y) = 1.496e-6 * (x*sqrt(x)) /(x+120.)/y ! 1.496e-6*x**1.5/(x+120.)/y
  355. ! xka(x,y) = 1.414e3*viscos(x,y)*y
  356. ! diffac(a,b,c,d,e) = d*a*a/(xka(c,d)*rv*c*c)+1./(e*diffus(c,b))
  357. ! venfac(a,b,c) = exp(log((viscos(b,c)/diffus(b,a)))*((.3333333))) &
  358. ! /sqrt(viscos(b,c))*sqrt(sqrt(den0/c))
  359. ! conden(a,b,c,d,e) = (max(b,qmin)-c)/(1.+d*d/(rv*e)*c/(a*a))
  360. !
  361. !----------------------------------------------------------------
  362. idim = ite-its+1
  363. kdim = kte-kts+1
  364. !
  365. !----------------------------------------------------------------
  366. ! paddint 0 for negative values generated by dynamics
  367. !
  368. do k = kts, kte
  369. do i = its, ite
  370. qci(i,k,1) = max(qci(i,k,1),0.0)
  371. qrs(i,k,1) = max(qrs(i,k,1),0.0)
  372. qci(i,k,2) = max(qci(i,k,2),0.0)
  373. qrs(i,k,2) = max(qrs(i,k,2),0.0)
  374. enddo
  375. enddo
  376. !
  377. !----------------------------------------------------------------
  378. ! latent heat for phase changes and heat capacity. neglect the
  379. ! changes during microphysical process calculation
  380. ! emanuel(1994)
  381. !
  382. do k = kts, kte
  383. do i = its, ite
  384. cpm(i,k) = cpmcal(q(i,k))
  385. xl(i,k) = xlcal(t(i,k))
  386. enddo
  387. enddo
  388. do k = kts, kte
  389. do i = its, ite
  390. delz_tmp(i,k) = delz(i,k)
  391. den_tmp(i,k) = den(i,k)
  392. enddo
  393. enddo
  394. !
  395. !----------------------------------------------------------------
  396. ! initialize the surface rain, snow
  397. !
  398. do i = its, ite
  399. rainncv(i) = 0.
  400. if(PRESENT (snowncv) .AND. PRESENT (snow)) snowncv(i,lat) = 0.
  401. sr(i) = 0.
  402. ! new local array to catch step snow
  403. tstepsnow(i) = 0.
  404. enddo
  405. !
  406. !----------------------------------------------------------------
  407. ! compute the minor time steps.
  408. !
  409. loops = max(nint(delt/dtcldcr),1)
  410. dtcld = delt/loops
  411. if(delt.le.dtcldcr) dtcld = delt
  412. !
  413. do loop = 1,loops
  414. !
  415. !----------------------------------------------------------------
  416. ! initialize the large scale variables
  417. !
  418. do i = its, ite
  419. mstep(i) = 1
  420. flgcld(i) = .true.
  421. enddo
  422. !
  423. ! do k = kts, kte
  424. ! do i = its, ite
  425. ! denfac(i,k) = sqrt(den0/den(i,k))
  426. ! enddo
  427. ! enddo
  428. do k = kts, kte
  429. CALL VREC( tvec1(its), den(its,k), ite-its+1)
  430. do i = its, ite
  431. tvec1(i) = tvec1(i)*den0
  432. enddo
  433. CALL VSQRT( denfac(its,k), tvec1(its), ite-its+1)
  434. enddo
  435. !
  436. ! Inline expansion for fpvs
  437. ! qs(i,k,1) = fpvs(t(i,k),0,rd,rv,cpv,cliq,cice,xlv0,xls,psat,t0c)
  438. ! qs(i,k,2) = fpvs(t(i,k),1,rd,rv,cpv,cliq,cice,xlv0,xls,psat,t0c)
  439. hsub = xls
  440. hvap = xlv0
  441. cvap = cpv
  442. ttp=t0c+0.01
  443. dldt=cvap-cliq
  444. xa=-dldt/rv
  445. xb=xa+hvap/(rv*ttp)
  446. dldti=cvap-cice
  447. xai=-dldti/rv
  448. xbi=xai+hsub/(rv*ttp)
  449. ! this is for compilers where the conditional inhibits vectorization
  450. #ifdef WSM_NO_CONDITIONAL_IN_VECTOR
  451. do k = kts, kte
  452. do i = its, ite
  453. if(t(i,k).lt.ttp) then
  454. xal(i) = xai
  455. xbl(i) = xbi
  456. else
  457. xal(i) = xa
  458. xbl(i) = xb
  459. endif
  460. enddo
  461. do i = its, ite
  462. tr=ttp/t(i,k)
  463. logtr=log(tr)
  464. qs(i,k,1)=psat*exp(logtr*(xa)+xb*(1.-tr))
  465. qs(i,k,1) = min(qs(i,k,1),0.99*p(i,k))
  466. qs(i,k,1) = ep2 * qs(i,k,1) / (p(i,k) - qs(i,k,1))
  467. qs(i,k,1) = max(qs(i,k,1),qmin)
  468. rh(i,k,1) = max(q(i,k) / qs(i,k,1),qmin)
  469. qs(i,k,2)=psat*exp(logtr*(xal(i))+xbl(i)*(1.-tr))
  470. qs(i,k,2) = min(qs(i,k,2),0.99*p(i,k))
  471. qs(i,k,2) = ep2 * qs(i,k,2) / (p(i,k) - qs(i,k,2))
  472. qs(i,k,2) = max(qs(i,k,2),qmin)
  473. rh(i,k,2) = max(q(i,k) / qs(i,k,2),qmin)
  474. #else
  475. do k = kts, kte
  476. do i = its, ite
  477. tr=ttp/t(i,k)
  478. logtr=log(tr)
  479. qs(i,k,1)=psat*exp(logtr*(xa)+xb*(1.-tr))
  480. qs(i,k,1) = min(qs(i,k,1),0.99*p(i,k))
  481. qs(i,k,1) = ep2 * qs(i,k,1) / (p(i,k) - qs(i,k,1))
  482. qs(i,k,1) = max(qs(i,k,1),qmin)
  483. rh(i,k,1) = max(q(i,k) / qs(i,k,1),qmin)
  484. if(t(i,k).lt.ttp) then
  485. qs(i,k,2)=psat*exp(logtr*(xai)+xbi*(1.-tr))
  486. else
  487. qs(i,k,2)=psat*exp(logtr*(xa)+xb*(1.-tr))
  488. endif
  489. qs(i,k,2) = min(qs(i,k,2),0.99*p(i,k))
  490. qs(i,k,2) = ep2 * qs(i,k,2) / (p(i,k) - qs(i,k,2))
  491. qs(i,k,2) = max(qs(i,k,2),qmin)
  492. rh(i,k,2) = max(q(i,k) / qs(i,k,2),qmin)
  493. enddo
  494. enddo
  495. #endif
  496. enddo
  497. enddo
  498. !
  499. !----------------------------------------------------------------
  500. ! initialize the variables for microphysical physics
  501. !
  502. !
  503. do k = kts, kte
  504. do i = its, ite
  505. prevp(i,k) = 0.
  506. psdep(i,k) = 0.
  507. praut(i,k) = 0.
  508. psaut(i,k) = 0.
  509. pracw(i,k) = 0.
  510. psaci(i,k) = 0.
  511. psacw(i,k) = 0.
  512. pigen(i,k) = 0.
  513. pidep(i,k) = 0.
  514. pcond(i,k) = 0.
  515. psmlt(i,k) = 0.
  516. psevp(i,k) = 0.
  517. falk(i,k,1) = 0.
  518. falk(i,k,2) = 0.
  519. fall(i,k,1) = 0.
  520. fall(i,k,2) = 0.
  521. fallc(i,k) = 0.
  522. falkc(i,k) = 0.
  523. xni(i,k) = 1.e3
  524. enddo
  525. enddo
  526. !-------------------------------------------------------------
  527. ! Ni: ice crystal number concentraiton [HDC 5c]
  528. !-------------------------------------------------------------
  529. do k = kts, kte
  530. do i = its, ite
  531. temp = (den(i,k)*max(qci(i,k,2),qmin))
  532. temp = sqrt(sqrt(temp*temp*temp))
  533. xni(i,k) = min(max(5.38e7*temp,1.e3),1.e6)
  534. enddo
  535. enddo
  536. !
  537. !----------------------------------------------------------------
  538. ! compute the fallout term:
  539. ! first, vertical terminal velosity for minor loops
  540. !----------------------------------------------------------------
  541. do k = kts, kte
  542. do i = its, ite
  543. qrs_tmp(i,k,1) = qrs(i,k,1)
  544. qrs_tmp(i,k,2) = qrs(i,k,2)
  545. enddo
  546. enddo
  547. call slope_wsm5(qrs_tmp,den_tmp,denfac,t,rslope,rslopeb,rslope2,rslope3, &
  548. work1,its,ite,kts,kte)
  549. !
  550. do k = kte, kts, -1
  551. do i = its, ite
  552. workr(i,k) = work1(i,k,1)
  553. works(i,k) = work1(i,k,2)
  554. denqrs1(i,k) = den(i,k)*qrs(i,k,1)
  555. denqrs2(i,k) = den(i,k)*qrs(i,k,2)
  556. if(qrs(i,k,1).le.0.0) workr(i,k) = 0.0
  557. if(qrs(i,k,2).le.0.0) works(i,k) = 0.0
  558. enddo
  559. enddo
  560. call nislfv_rain_plm(idim,kdim,den_tmp,denfac,t,delz_tmp,workr,denqrs1, &
  561. delqrs1,dtcld,1,1)
  562. call nislfv_rain_plm(idim,kdim,den_tmp,denfac,t,delz_tmp,works,denqrs2, &
  563. delqrs2,dtcld,2,1)
  564. do k = kts, kte
  565. do i = its, ite
  566. qrs(i,k,1) = max(denqrs1(i,k)/den(i,k),0.)
  567. qrs(i,k,2) = max(denqrs2(i,k)/den(i,k),0.)
  568. fall(i,k,1) = denqrs1(i,k)*workr(i,k)/delz(i,k)
  569. fall(i,k,2) = denqrs2(i,k)*works(i,k)/delz(i,k)
  570. enddo
  571. enddo
  572. do i = its, ite
  573. fall(i,1,1) = delqrs1(i)/delz(i,1)/dtcld
  574. fall(i,1,2) = delqrs2(i)/delz(i,1)/dtcld
  575. enddo
  576. do k = kts, kte
  577. do i = its, ite
  578. qrs_tmp(i,k,1) = qrs(i,k,1)
  579. qrs_tmp(i,k,2) = qrs(i,k,2)
  580. enddo
  581. enddo
  582. call slope_wsm5(qrs_tmp,den_tmp,denfac,t,rslope,rslopeb,rslope2,rslope3, &
  583. work1,its,ite,kts,kte)
  584. do k = kte, kts, -1
  585. do i = its, ite
  586. supcol = t0c-t(i,k)
  587. n0sfac(i,k) = max(min(exp(alpha*supcol),n0smax/n0s),1.)
  588. if(t(i,k).gt.t0c.and.qrs(i,k,2).gt.0.) then
  589. !----------------------------------------------------------------
  590. ! psmlt: melting of snow [HL A33] [RH83 A25]
  591. ! (T>T0: S->R)
  592. !----------------------------------------------------------------
  593. xlf = xlf0
  594. ! work2(i,k)= venfac(p(i,k),t(i,k),den(i,k))
  595. work2(i,k)= (exp(log(((1.496e-6*((t(i,k))*sqrt(t(i,k))) &
  596. /((t(i,k))+120.)/(den(i,k)))/(8.794e-5 &
  597. *exp(log(t(i,k))*(1.81))/p(i,k)))) &
  598. *((.3333333)))/sqrt((1.496e-6*((t(i,k)) &
  599. *sqrt(t(i,k)))/((t(i,k))+120.)/(den(i,k)))) &
  600. *sqrt(sqrt(den0/(den(i,k)))))
  601. coeres = rslope2(i,k,2)*sqrt(rslope(i,k,2)*rslopeb(i,k,2))
  602. psmlt(i,k) = (1.414e3*(1.496e-6*((t(i,k))*sqrt(t(i,k))) &
  603. /((t(i,k))+120.)/(den(i,k)) )*(den(i,k))) &
  604. /xlf*(t0c-t(i,k))*pi/2. &
  605. *n0sfac(i,k)*(precs1*rslope2(i,k,2)+precs2 &
  606. *work2(i,k)*coeres)
  607. psmlt(i,k) = min(max(psmlt(i,k)*dtcld/mstep(i), &
  608. -qrs(i,k,2)/mstep(i)),0.)
  609. qrs(i,k,2) = qrs(i,k,2) + psmlt(i,k)
  610. qrs(i,k,1) = qrs(i,k,1) - psmlt(i,k)
  611. t(i,k) = t(i,k) + xlf/cpm(i,k)*psmlt(i,k)
  612. endif
  613. enddo
  614. enddo
  615. !---------------------------------------------------------------
  616. ! Vice [ms-1] : fallout of ice crystal [HDC 5a]
  617. !---------------------------------------------------------------
  618. do k = kte, kts, -1
  619. do i = its, ite
  620. if(qci(i,k,2).le.0.) then
  621. work1c(i,k) = 0.
  622. else
  623. xmi = den(i,k)*qci(i,k,2)/xni(i,k)
  624. diameter = max(min(dicon * sqrt(xmi),dimax), 1.e-25)
  625. work1c(i,k) = 1.49e4*exp(log(diameter)*(1.31))
  626. endif
  627. enddo
  628. enddo
  629. !
  630. ! forward semi-laglangian scheme (JH), PCM (piecewise constant), (linear)
  631. !
  632. do k = kte, kts, -1
  633. do i = its, ite
  634. denqci(i,k) = den(i,k)*qci(i,k,2)
  635. enddo
  636. enddo
  637. call nislfv_rain_plm(idim,kdim,den_tmp,denfac,t,delz_tmp,work1c,denqci, &
  638. delqi,dtcld,1,0)
  639. do k = kts, kte
  640. do i = its, ite
  641. qci(i,k,2) = max(denqci(i,k)/den(i,k),0.)
  642. enddo
  643. enddo
  644. do i = its, ite
  645. fallc(i,1) = delqi(i)/delz(i,1)/dtcld
  646. enddo
  647. !
  648. !----------------------------------------------------------------
  649. ! rain (unit is mm/sec;kgm-2s-1: /1000*delt ===> m)==> mm for wrf
  650. !
  651. do i = its, ite
  652. fallsum = fall(i,1,1)+fall(i,1,2)+fallc(i,1)
  653. fallsum_qsi = fall(i,1,2)+fallc(i,1)
  654. if(fallsum.gt.0.) then
  655. rainncv(i) = fallsum*delz(i,1)/denr*dtcld*1000. + rainncv(i)
  656. rain(i) = fallsum*delz(i,1)/denr*dtcld*1000. + rain(i)
  657. endif
  658. if(fallsum_qsi.gt.0.) then
  659. tstepsnow(i) = fallsum_qsi*delz(i,kts)/denr*dtcld*1000. &
  660. +tstepsnow(i)
  661. IF ( PRESENT (snowncv) .AND. PRESENT (snow)) THEN
  662. snowncv(i,lat) = fallsum_qsi*delz(i,kts)/denr*dtcld*1000. &
  663. +snowncv(i,lat)
  664. snow(i,lat) = fallsum_qsi*delz(i,kts)/denr*dtcld*1000. + snow(i,lat)
  665. ENDIF
  666. endif
  667. ! if(fallsum.gt.0.)sr(i)=snowncv(i,lat)/(rainncv(i)+1.e-12)
  668. if(fallsum.gt.0.)sr(i)=tstepsnow(i)/(rainncv(i)+1.e-12)
  669. enddo
  670. !
  671. !---------------------------------------------------------------
  672. ! pimlt: instantaneous melting of cloud ice [HL A47] [RH83 A28]
  673. ! (T>T0: I->C)
  674. !---------------------------------------------------------------
  675. do k = kts, kte
  676. do i = its, ite
  677. supcol = t0c-t(i,k)
  678. xlf = xls-xl(i,k)
  679. if(supcol.lt.0.) xlf = xlf0
  680. if(supcol.lt.0.and.qci(i,k,2).gt.0.) then
  681. qci(i,k,1) = qci(i,k,1) + qci(i,k,2)
  682. t(i,k) = t(i,k) - xlf/cpm(i,k)*qci(i,k,2)
  683. qci(i,k,2) = 0.
  684. endif
  685. !---------------------------------------------------------------
  686. ! pihmf: homogeneous freezing of cloud water below -40c [HL A45]
  687. ! (T<-40C: C->I)
  688. !---------------------------------------------------------------
  689. if(supcol.gt.40..and.qci(i,k,1).gt.0.) then
  690. qci(i,k,2) = qci(i,k,2) + qci(i,k,1)
  691. t(i,k) = t(i,k) + xlf/cpm(i,k)*qci(i,k,1)
  692. qci(i,k,1) = 0.
  693. endif
  694. !---------------------------------------------------------------
  695. ! pihtf: heterogeneous freezing of cloud water [HL A44]
  696. ! (T0>T>-40C: C->I)
  697. !---------------------------------------------------------------
  698. if(supcol.gt.0..and.qci(i,k,1).gt.0.) then
  699. supcolt=min(supcol,50.)
  700. ! pfrzdtc = min(pfrz1*(exp(pfrz2*supcol)-1.) &
  701. ! *den(i,k)/denr/xncr*qci(i,k,1)**2*dtcld,qci(i,k,1))
  702. pfrzdtc = min(pfrz1*(exp(pfrz2*supcolt)-1.) &
  703. *den(i,k)/denr/xncr*qci(i,k,1)*qci(i,k,1)*dtcld,qci(i,k,1))
  704. qci(i,k,2) = qci(i,k,2) + pfrzdtc
  705. t(i,k) = t(i,k) + xlf/cpm(i,k)*pfrzdtc
  706. qci(i,k,1) = qci(i,k,1)-pfrzdtc
  707. endif
  708. !---------------------------------------------------------------
  709. ! psfrz: freezing of rain water [HL A20] [LFO 45]
  710. ! (T<T0, R->S)
  711. !---------------------------------------------------------------
  712. if(supcol.gt.0..and.qrs(i,k,1).gt.0.) then
  713. supcolt=min(supcol,50.)
  714. ! pfrzdtr = min(20.*pi**2*pfrz1*n0r*denr/den(i,k) &
  715. ! *(exp(pfrz2*supcol)-1.)*rslope(i,k,1)**7*dtcld, &
  716. ! qrs(i,k,1))
  717. temp = rslope(i,k,1)
  718. temp = temp*temp*temp*temp*temp*temp*temp
  719. pfrzdtr = min(20.*(pi*pi)*pfrz1*n0r*denr/den(i,k) &
  720. *(exp(pfrz2*supcolt)-1.)*temp*dtcld, &
  721. qrs(i,k,1))
  722. qrs(i,k,2) = qrs(i,k,2) + pfrzdtr
  723. t(i,k) = t(i,k) + xlf/cpm(i,k)*pfrzdtr
  724. qrs(i,k,1) = qrs(i,k,1)-pfrzdtr
  725. endif
  726. enddo
  727. enddo
  728. !
  729. !----------------------------------------------------------------
  730. ! update the slope parameters for microphysics computation
  731. !
  732. do k = kts, kte
  733. do i = its, ite
  734. qrs_tmp(i,k,1) = qrs(i,k,1)
  735. qrs_tmp(i,k,2) = qrs(i,k,2)
  736. enddo
  737. enddo
  738. call slope_wsm5(qrs_tmp,den_tmp,denfac,t,rslope,rslopeb,rslope2,rslope3, &
  739. work1,its,ite,kts,kte)
  740. !------------------------------------------------------------------
  741. ! work1: the thermodynamic term in the denominator associated with
  742. ! heat conduction and vapor diffusion
  743. ! (ry88, y93, h85)
  744. ! work2: parameter associated with the ventilation effects(y93)
  745. !
  746. do k = kts, kte
  747. do i = its, ite
  748. ! work1(i,k,1) = diffac(xl(i,k),p(i,k),t(i,k),den(i,k),qs(i,k,1))
  749. work1(i,k,1) = ((((den(i,k))*(xl(i,k))*(xl(i,k)))*((t(i,k))+120.) &
  750. *(den(i,k)))/(1.414e3*(1.496e-6*((t(i,k))*sqrt(t(i,k))))&
  751. *(den(i,k))*(rv*(t(i,k))*(t(i,k))))) &
  752. + p(i,k)/((qs(i,k,1))*(8.794e-5*exp(log(t(i,k))*(1.81))))
  753. ! work1(i,k,2) = diffac(xls,p(i,k),t(i,k),den(i,k),qs(i,k,2))
  754. work1(i,k,2) = ((((den(i,k))*(xls)*(xls))*((t(i,k))+120.)*(den(i,k)))&
  755. /(1.414e3*(1.496e-6*((t(i,k))*sqrt(t(i,k))))*(den(i,k)) &
  756. *(rv*(t(i,k))*(t(i,k)))) &
  757. + p(i,k)/(qs(i,k,2)*(8.794e-5*exp(log(t(i,k))*(1.81)))))
  758. ! work2(i,k) = venfac(p(i,k),t(i,k),den(i,k))
  759. work2(i,k) = (exp(.3333333*log(((1.496e-6 * ((t(i,k))*sqrt(t(i,k)))) &
  760. *p(i,k))/(((t(i,k))+120.)*den(i,k)*(8.794e-5 &
  761. *exp(log(t(i,k))*(1.81))))))*sqrt(sqrt(den0/(den(i,k))))) &
  762. /sqrt((1.496e-6*((t(i,k))*sqrt(t(i,k)))) &
  763. /(((t(i,k))+120.)*den(i,k)))
  764. enddo
  765. enddo
  766. !
  767. !===============================================================
  768. !
  769. ! warm rain processes
  770. !
  771. ! - follows the processes in RH83 and LFO except for autoconcersion
  772. !
  773. !===============================================================
  774. !
  775. do k = kts, kte
  776. do i = its, ite
  777. supsat = max(q(i,k),qmin)-qs(i,k,1)
  778. satdt = supsat/dtcld
  779. !---------------------------------------------------------------
  780. ! praut: auto conversion rate from cloud to rain [HDC 16]
  781. ! (C->R)
  782. !---------------------------------------------------------------
  783. if(qci(i,k,1).gt.qc0) then
  784. praut(i,k) = qck1*exp(log(qci(i,k,1))*((7./3.)))
  785. praut(i,k) = min(praut(i,k),qci(i,k,1)/dtcld)
  786. endif
  787. !---------------------------------------------------------------
  788. ! pracw: accretion of cloud water by rain [HL A40] [LFO 51]
  789. ! (C->R)
  790. !---------------------------------------------------------------
  791. if(qrs(i,k,1).gt.qcrmin.and.qci(i,k,1).gt.qmin) then
  792. pracw(i,k) = min(pacrr*rslope3(i,k,1)*rslopeb(i,k,1) &
  793. *qci(i,k,1)*denfac(i,k),qci(i,k,1)/dtcld)
  794. endif
  795. !---------------------------------------------------------------
  796. ! prevp: evaporation/condensation rate of rain [HDC 14]
  797. ! (V->R or R->V)
  798. !---------------------------------------------------------------
  799. if(qrs(i,k,1).gt.0.) then
  800. coeres = rslope2(i,k,1)*sqrt(rslope(i,k,1)*rslopeb(i,k,1))
  801. prevp(i,k) = (rh(i,k,1)-1.)*(precr1*rslope2(i,k,1) &
  802. +precr2*work2(i,k)*coeres)/work1(i,k,1)
  803. if(prevp(i,k).lt.0.) then
  804. prevp(i,k) = max(prevp(i,k),-qrs(i,k,1)/dtcld)
  805. prevp(i,k) = max(prevp(i,k),satdt/2)
  806. else
  807. prevp(i,k) = min(prevp(i,k),satdt/2)
  808. endif
  809. endif
  810. enddo
  811. enddo
  812. !
  813. !===============================================================
  814. !
  815. ! cold rain processes
  816. !
  817. ! - follows the revised ice microphysics processes in HDC
  818. ! - the processes same as in RH83 and RH84 and LFO behave
  819. ! following ice crystal hapits defined in HDC, inclduing
  820. ! intercept parameter for snow (n0s), ice crystal number
  821. ! concentration (ni), ice nuclei number concentration
  822. ! (n0i), ice diameter (d)
  823. !
  824. !===============================================================
  825. !
  826. rdtcld = 1./dtcld
  827. do k = kts, kte
  828. do i = its, ite
  829. supcol = t0c-t(i,k)
  830. n0sfac(i,k) = max(min(exp(alpha*supcol),n0smax/n0s),1.)
  831. supsat = max(q(i,k),qmin)-qs(i,k,2)
  832. satdt = supsat/dtcld
  833. ifsat = 0
  834. !-------------------------------------------------------------
  835. ! Ni: ice crystal number concentraiton [HDC 5c]
  836. !-------------------------------------------------------------
  837. ! xni(i,k) = min(max(5.38e7*(den(i,k) &
  838. ! *max(qci(i,k,2),qmin))**0.75,1.e3),1.e6)
  839. temp = (den(i,k)*max(qci(i,k,2),qmin))
  840. temp = sqrt(sqrt(temp*temp*temp))
  841. xni(i,k) = min(max(5.38e7*temp,1.e3),1.e6)
  842. eacrs = exp(0.07*(-supcol))
  843. !
  844. if(supcol.gt.0) then
  845. if(qrs(i,k,2).gt.qcrmin.and.qci(i,k,2).gt.qmin) then
  846. xmi = den(i,k)*qci(i,k,2)/xni(i,k)
  847. diameter = min(dicon * sqrt(xmi),dimax)
  848. vt2i = 1.49e4*diameter**1.31
  849. vt2s = pvts*rslopeb(i,k,2)*denfac(i,k)
  850. !-------------------------------------------------------------
  851. ! psaci: Accretion of cloud ice by rain [HDC 10]
  852. ! (T<T0: I->S)
  853. !-------------------------------------------------------------
  854. acrfac = 2.*rslope3(i,k,2)+2.*diameter*rslope2(i,k,2) &
  855. +diameter**2*rslope(i,k,2)
  856. psaci(i,k) = pi*qci(i,k,2)*eacrs*n0s*n0sfac(i,k) &
  857. *abs(vt2s-vt2i)*acrfac/4.
  858. endif
  859. endif
  860. !-------------------------------------------------------------
  861. ! psacw: Accretion of cloud water by snow [HL A7] [LFO 24]
  862. ! (T<T0: C->S, and T>=T0: C->R)
  863. !-------------------------------------------------------------
  864. if(qrs(i,k,2).gt.qcrmin.and.qci(i,k,1).gt.qmin) then
  865. psacw(i,k) = min(pacrc*n0sfac(i,k)*rslope3(i,k,2) &
  866. *rslopeb(i,k,2)*qci(i,k,1)*denfac(i,k) &
  867. ! ,qci(i,k,1)/dtcld)
  868. ,qci(i,k,1)*rdtcld)
  869. endif
  870. if(supcol .gt. 0) then
  871. !-------------------------------------------------------------
  872. ! pidep: Deposition/Sublimation rate of ice [HDC 9]
  873. ! (T<T0: V->I or I->V)
  874. !-------------------------------------------------------------
  875. if(qci(i,k,2).gt.0.and.ifsat.ne.1) then
  876. xmi = den(i,k)*qci(i,k,2)/xni(i,k)
  877. diameter = dicon * sqrt(xmi)
  878. pidep(i,k) = 4.*diameter*xni(i,k)*(rh(i,k,2)-1.)/work1(i,k,2)
  879. supice = satdt-prevp(i,k)
  880. if(pidep(i,k).lt.0.) then
  881. ! pidep(i,k) = max(max(pidep(i,k),satdt/2),supice)
  882. ! pidep(i,k) = max(pidep(i,k),-qci(i,k,2)/dtcld)
  883. pidep(i,k) = max(max(pidep(i,k),satdt*.5),supice)
  884. pidep(i,k) = max(pidep(i,k),-qci(i,k,2)*rdtcld)
  885. else
  886. ! pidep(i,k) = min(min(pidep(i,k),satdt/2),supice)
  887. pidep(i,k) = min(min(pidep(i,k),satdt*.5),supice)
  888. endif
  889. if(abs(prevp(i,k)+pidep(i,k)).ge.abs(satdt)) ifsat = 1
  890. endif
  891. !-------------------------------------------------------------
  892. ! psdep: deposition/sublimation rate of snow [HDC 14]
  893. ! (V->S or S->V)
  894. !-------------------------------------------------------------
  895. if(qrs(i,k,2).gt.0..and.ifsat.ne.1) then
  896. coeres = rslope2(i,k,2)*sqrt(rslope(i,k,2)*rslopeb(i,k,2))
  897. psdep(i,k) = (rh(i,k,2)-1.)*n0sfac(i,k) &
  898. *(precs1*rslope2(i,k,2)+precs2 &
  899. *work2(i,k)*coeres)/work1(i,k,2)
  900. supice = satdt-prevp(i,k)-pidep(i,k)
  901. if(psdep(i,k).lt.0.) then
  902. ! psdep(i,k) = max(psdep(i,k),-qrs(i,k,2)/dtcld)
  903. ! psdep(i,k) = max(max(psdep(i,k),satdt/2),supice)
  904. psdep(i,k) = max(psdep(i,k),-qrs(i,k,2)*rdtcld)
  905. psdep(i,k) = max(max(psdep(i,k),satdt*.5),supice)
  906. else
  907. ! psdep(i,k) = min(min(psdep(i,k),satdt/2),supice)
  908. psdep(i,k) = min(min(psdep(i,k),satdt*.5),supice)
  909. endif
  910. if(abs(prevp(i,k)+pidep(i,k)+psdep(i,k)).ge.abs(satdt)) &
  911. ifsat = 1
  912. endif
  913. !-------------------------------------------------------------
  914. ! pigen: generation(nucleation) of ice from vapor [HL A50] [HDC 7-8]
  915. ! (T<T0: V->I)
  916. !-------------------------------------------------------------
  917. if(supsat.gt.0.and.ifsat.ne.1) then
  918. supice = satdt-prevp(i,k)-pidep(i,k)-psdep(i,k)
  919. xni0 = 1.e3*exp(0.1*supcol)
  920. roqi0 = 4.92e-11*exp(log(xni0)*(1.33))
  921. pigen(i,k) = max(0.,(roqi0/den(i,k)-max(qci(i,k,2),0.)) &
  922. ! /dtcld)
  923. *rdtcld)
  924. pigen(i,k) = min(min(pigen(i,k),satdt),supice)
  925. endif
  926. !
  927. !-------------------------------------------------------------
  928. ! psaut: conversion(aggregation) of ice to snow [HDC 12]
  929. ! (T<T0: I->S)
  930. !-------------------------------------------------------------
  931. if(qci(i,k,2).gt.0.) then
  932. qimax = roqimax/den(i,k)
  933. ! psaut(i,k) = max(0.,(qci(i,k,2)-qimax)/dtcld)
  934. psaut(i,k) = max(0.,(qci(i,k,2)-qimax)*rdtcld)
  935. endif
  936. endif
  937. !-------------------------------------------------------------
  938. ! psevp: Evaporation of melting snow [HL A35] [RH83 A27]
  939. ! (T>T0: S->V)
  940. !-------------------------------------------------------------
  941. if(supcol.lt.0.) then
  942. if(qrs(i,k,2).gt.0..and.rh(i,k,1).lt.1.) &
  943. psevp(i,k) = psdep(i,k)*work1(i,k,2)/work1(i,k,1)
  944. ! psevp(i,k) = min(max(psevp(i,k),-qrs(i,k,2)/dtcld),0.)
  945. psevp(i,k) = min(max(psevp(i,k),-qrs(i,k,2)*rdtcld),0.)
  946. endif
  947. enddo
  948. enddo
  949. !
  950. !
  951. !----------------------------------------------------------------
  952. ! check mass conservation of generation terms and feedback to the
  953. ! large scale
  954. !
  955. do k = kts, kte
  956. do i = its, ite
  957. if(t(i,k).le.t0c) then
  958. !
  959. ! cloud water
  960. !
  961. value = max(qmin,qci(i,k,1))
  962. source = (praut(i,k)+pracw(i,k)+psacw(i,k))*dtcld
  963. if (source.gt.value) then
  964. factor = value/source
  965. praut(i,k) = praut(i,k)*factor
  966. pracw(i,k) = pracw(i,k)*factor
  967. psacw(i,k) = psacw(i,k)*factor
  968. endif
  969. !
  970. ! cloud ice
  971. !
  972. value = max(qmin,qci(i,k,2))
  973. source = (psaut(i,k)+psaci(i,k)-pigen(i,k)-pidep(i,k))*dtcld
  974. if (source.gt.value) then
  975. factor = value/source
  976. psaut(i,k) = psaut(i,k)*factor
  977. psaci(i,k) = psaci(i,k)*factor
  978. pigen(i,k) = pigen(i,k)*factor
  979. pidep(i,k) = pidep(i,k)*factor
  980. endif
  981. !
  982. ! rain
  983. !
  984. !
  985. value = max(qmin,qrs(i,k,1))
  986. source = (-praut(i,k)-pracw(i,k)-prevp(i,k))*dtcld
  987. if (source.gt.value) then
  988. factor = value/source
  989. praut(i,k) = praut(i,k)*factor
  990. pracw(i,k) = pracw(i,k)*factor
  991. prevp(i,k) = prevp(i,k)*factor
  992. endif
  993. !
  994. ! snow
  995. !
  996. value = max(qmin,qrs(i,k,2))
  997. source = (-psdep(i,k)-psaut(i,k)-psaci(i,k)-psacw(i,k))*dtcld
  998. if (source.gt.value) then
  999. factor = value/source
  1000. psdep(i,k) = psdep(i,k)*factor
  1001. psaut(i,k) = psaut(i,k)*factor
  1002. psaci(i,k) = psaci(i,k)*factor
  1003. psacw(i,k) = psacw(i,k)*factor
  1004. endif
  1005. !
  1006. work2(i,k)=-(prevp(i,k)+psdep(i,k)+pigen(i,k)+pidep(i,k))
  1007. ! update
  1008. q(i,k) = q(i,k)+work2(i,k)*dtcld
  1009. qci(i,k,1) = max(qci(i,k,1)-(praut(i,k)+pracw(i,k) &
  1010. +psacw(i,k))*dtcld,0.)
  1011. qrs(i,k,1) = max(qrs(i,k,1)+(praut(i,k)+pracw(i,k) &
  1012. +prevp(i,k))*dtcld,0.)
  1013. qci(i,k,2) = max(qci(i,k,2)-(psaut(i,k)+psaci(i,k) &
  1014. -pigen(i,k)-pidep(i,k))*dtcld,0.)
  1015. qrs(i,k,2) = max(qrs(i,k,2)+(psdep(i,k)+psaut(i,k) &
  1016. +psaci(i,k)+psacw(i,k))*dtcld,0.)
  1017. xlf = xls-xl(i,k)
  1018. xlwork2 = -xls*(psdep(i,k)+pidep(i,k)+pigen(i,k)) &
  1019. -xl(i,k)*prevp(i,k)-xlf*psacw(i,k)
  1020. t(i,k) = t(i,k)-xlwork2/cpm(i,k)*dtcld
  1021. else
  1022. !
  1023. ! cloud water
  1024. !
  1025. value = max(qmin,qci(i,k,1))
  1026. source=(praut(i,k)+pracw(i,k)+psacw(i,k))*dtcld
  1027. if (source.gt.value) then
  1028. factor = value/source
  1029. praut(i,k) = praut(i,k)*factor
  1030. pracw(i,k) = pracw(i,k)*factor
  1031. psacw(i,k) = psacw(i,k)*factor
  1032. endif
  1033. !
  1034. ! rain
  1035. !
  1036. value = max(qmin,qrs(i,k,1))
  1037. source = (-praut(i,k)-pracw(i,k)-prevp(i,k)-psacw(i,k))*dtcld
  1038. if (source.gt.value) then
  1039. factor = value/source
  1040. praut(i,k) = praut(i,k)*factor
  1041. pracw(i,k) = pracw(i,k)*factor
  1042. prevp(i,k) = prevp(i,k)*factor
  1043. psacw(i,k) = psacw(i,k)*factor
  1044. endif
  1045. !
  1046. ! snow
  1047. !
  1048. value = max(qcrmin,qrs(i,k,2))
  1049. source=(-psevp(i,k))*dtcld
  1050. if (source.gt.value) then
  1051. factor = value/source
  1052. psevp(i,k) = psevp(i,k)*factor
  1053. endif
  1054. work2(i,k)=-(prevp(i,k)+psevp(i,k))
  1055. ! update
  1056. q(i,k) = q(i,k)+work2(i,k)*dtcld
  1057. qci(i,k,1) = max(qci(i,k,1)-(praut(i,k)+pracw(i,k) &
  1058. +psacw(i,k))*dtcld,0.)
  1059. qrs(i,k,1) = max(qrs(i,k,1)+(praut(i,k)+pracw(i,k) &
  1060. +prevp(i,k) +psacw(i,k))*dtcld,0.)
  1061. qrs(i,k,2) = max(qrs(i,k,2)+psevp(i,k)*dtcld,0.)
  1062. xlf = xls-xl(i,k)
  1063. xlwork2 = -xl(i,k)*(prevp(i,k)+psevp(i,k))
  1064. t(i,k) = t(i,k)-xlwork2/cpm(i,k)*dtcld
  1065. endif
  1066. enddo
  1067. enddo
  1068. !
  1069. ! Inline expansion for fpvs
  1070. ! qs(i,k,1) = fpvs(t(i,k),0,rd,rv,cpv,cliq,cice,xlv0,xls,psat,t0c)
  1071. ! qs(i,k,2) = fpvs(t(i,k),1,rd,rv,cpv,cliq,cice,xlv0,xls,psat,t0c)
  1072. hsub = xls
  1073. hvap = xlv0
  1074. cvap = cpv
  1075. ttp=t0c+0.01
  1076. dldt=cvap-cliq
  1077. xa=-dldt/rv
  1078. xb=xa+hvap/(rv*ttp)
  1079. dldti=cvap-cice
  1080. xai=-dldti/rv
  1081. xbi=xai+hsub/(rv*ttp)
  1082. do k = kts, kte
  1083. do i = its, ite
  1084. tr=ttp/t(i,k)
  1085. logtr = log(tr)
  1086. qs(i,k,1)=psat*exp(logtr*(xa)+xb*(1.-tr))
  1087. qs(i,k,1) = min(qs(i,k,1),0.99*p(i,k))
  1088. qs(i,k,1) = ep2 * qs(i,k,1) / (p(i,k) - qs(i,k,1))
  1089. qs(i,k,1) = max(qs(i,k,1),qmin)
  1090. enddo
  1091. enddo
  1092. !
  1093. !----------------------------------------------------------------
  1094. ! pcond: condensational/evaporational rate of cloud water [HL A46] [RH83 A6]
  1095. ! if there exists additional water vapor condensated/if
  1096. ! evaporation of cloud water is not enough to remove subsaturation
  1097. !
  1098. do k = kts, kte
  1099. do i = its, ite
  1100. ! work1(i,k,1) = conden(t(i,k),q(i,k),qs(i,k,1),xl(i,k),cpm(i,k))
  1101. work1(i,k,1) = ((max(q(i,k),qmin)-(qs(i,k,1)))/(1.+(xl(i,k)) &
  1102. *(xl(i,k))/(rv*(cpm(i,k)))*(qs(i,k,1)) &
  1103. /((t(i,k))*(t(i,k)))))
  1104. work2(i,k) = qci(i,k,1)+work1(i,k,1)
  1105. pcond(i,k) = min(max(work1(i,k,1)/dtcld,0.),max(q(i,k),0.)/dtcld)
  1106. if(qci(i,k,1).gt.0..and.work1(i,k,1).lt.0.) &
  1107. pcond(i,k) = max(work1(i,k,1),-qci(i,k,1))/dtcld
  1108. q(i,k) = q(i,k)-pcond(i,k)*dtcld
  1109. qci(i,k,1) = max(qci(i,k,1)+pcond(i,k)*dtcld,0.)
  1110. t(i,k) = t(i,k)+pcond(i,k)*xl(i,k)/cpm(i,k)*dtcld
  1111. enddo
  1112. enddo
  1113. !
  1114. !
  1115. !----------------------------------------------------------------
  1116. ! padding for small values
  1117. !
  1118. do k = kts, kte
  1119. do i = its, ite
  1120. if(qci(i,k,1).le.qmin) qci(i,k,1) = 0.0
  1121. if(qci(i,k,2).le.qmin) qci(i,k,2) = 0.0
  1122. enddo
  1123. enddo
  1124. enddo ! big loops
  1125. END SUBROUTINE wsm52d
  1126. ! ...................................................................
  1127. REAL FUNCTION rgmma(x)
  1128. !-------------------------------------------------------------------
  1129. IMPLICIT NONE
  1130. !-------------------------------------------------------------------
  1131. ! rgmma function: use infinite product form
  1132. REAL :: euler
  1133. PARAMETER (euler=0.577215664901532)
  1134. REAL :: x, y
  1135. INTEGER :: i
  1136. if(x.eq.1.)then
  1137. rgmma=0.
  1138. else
  1139. rgmma=x*exp(euler*x)
  1140. do i=1,10000
  1141. y=float(i)
  1142. rgmma=rgmma*(1.000+x/y)*exp(-x/y)
  1143. enddo
  1144. rgmma=1./rgmma
  1145. endif
  1146. END FUNCTION rgmma
  1147. !
  1148. !--------------------------------------------------------------------------
  1149. REAL FUNCTION fpvs(t,ice,rd,rv,cvap,cliq,cice,hvap,hsub,psat,t0c)
  1150. !--------------------------------------------------------------------------
  1151. IMPLICIT NONE
  1152. !--------------------------------------------------------------------------
  1153. REAL t,rd,rv,cvap,cliq,cice,hvap,hsub,psat,t0c,dldt,xa,xb,dldti, &
  1154. xai,xbi,ttp,tr
  1155. INTEGER ice
  1156. ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1157. ttp=t0c+0.01
  1158. dldt=cvap-cliq
  1159. xa=-dldt/rv
  1160. xb=xa+hvap/(rv*ttp)
  1161. dldti=cvap-cice
  1162. xai=-dldti/rv
  1163. xbi=xai+hsub/(rv*ttp)
  1164. tr=ttp/t
  1165. if(t.lt.ttp.and.ice.eq.1) then
  1166. fpvs=psat*exp(log(tr)*(xai))*exp(xbi*(1.-tr))
  1167. else
  1168. fpvs=psat*exp(log(tr)*(xa))*exp(xb*(1.-tr))
  1169. endif
  1170. ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1171. END FUNCTION fpvs
  1172. !-------------------------------------------------------------------
  1173. SUBROUTINE wsm5init(den0,denr,dens,cl,cpv,allowed_to_read)
  1174. !-------------------------------------------------------------------
  1175. IMPLICIT NONE
  1176. !-------------------------------------------------------------------
  1177. !.... constants which may not be tunable
  1178. REAL, INTENT(IN) :: den0,denr,dens,cl,cpv
  1179. LOGICAL, INTENT(IN) :: allowed_to_read
  1180. !
  1181. pi = 4.*atan(1.)
  1182. xlv1 = cl-cpv
  1183. !
  1184. qc0 = 4./3.*pi*denr*r0**3*xncr/den0 ! 0.419e-3 -- .61e-3
  1185. qck1 = .104*9.8*peaut/(xncr*denr)**(1./3.)/xmyu*den0**(4./3.) ! 7.03
  1186. !
  1187. bvtr1 = 1.+bvtr
  1188. bvtr2 = 2.5+.5*bvtr
  1189. bvtr3 = 3.+bvtr
  1190. bvtr4 = 4.+bvtr
  1191. g1pbr = rgmma(bvtr1)
  1192. g3pbr = rgmma(bvtr3)
  1193. g4pbr = rgmma(bvtr4) ! 17.837825
  1194. g5pbro2 = rgmma(bvtr2) ! 1.8273
  1195. pvtr = avtr*g4pbr/6.
  1196. eacrr = 1.0
  1197. pacrr = pi*n0r*avtr*g3pbr*.25*eacrr
  1198. precr1 = 2.*pi*n0r*.78
  1199. precr2 = 2.*pi*n0r*.31*avtr**.5*g5pbro2
  1200. xmmax = (dimax/dicon)**2
  1201. roqimax = 2.08e22*dimax**8
  1202. !
  1203. bvts1 = 1.+bvts
  1204. bvts2 = 2.5+.5*bvts
  1205. bvts3 = 3.+bvts
  1206. bvts4 = 4.+bvts
  1207. g1pbs = rgmma(bvts1) !.8875
  1208. g3pbs = rgmma(bvts3)
  1209. g4pbs = rgmma(bvts4) ! 12.0786
  1210. g5pbso2 = rgmma(bvts2)
  1211. pvts = avts*g4pbs/6.
  1212. pacrs = pi*n0s*avts*g3pbs*.25
  1213. precs1 = 4.*n0s*.65
  1214. precs2 = 4.*n0s*.44*avts**.5*g5pbso2
  1215. pidn0r = pi*denr*n0r
  1216. pidn0s = pi*dens*n0s
  1217. pacrc = pi*n0s*avts*g3pbs*.25*eacrc
  1218. !
  1219. rslopermax = 1./lamdarmax
  1220. rslopesmax = 1./lamdasmax
  1221. rsloperbmax = rslopermax ** bvtr
  1222. rslopesbmax = rslopesmax ** bvts
  1223. rsloper2max = rslopermax * rslopermax
  1224. rslopes2max = rslopesmax * rslopesmax
  1225. rsloper3max = rsloper2max * rslopermax
  1226. rslopes3max = rslopes2max * rslopesmax
  1227. !
  1228. END SUBROUTINE wsm5init
  1229. !------------------------------------------------------------------------------
  1230. subroutine slope_wsm5(qrs,den,denfac,t,rslope,rslopeb,rslope2,rslope3, &
  1231. vt,its,ite,kts,kte)
  1232. IMPLICIT NONE
  1233. INTEGER :: its,ite, jts,jte, kts,kte
  1234. REAL, DIMENSION( its:ite , kts:kte,2) :: &
  1235. qrs, &
  1236. rslope, &
  1237. rslopeb, &
  1238. rslope2, &
  1239. rslope3, &
  1240. vt
  1241. REAL, DIMENSION( its:ite , kts:kte) :: &
  1242. den, &
  1243. denfac, &
  1244. t
  1245. REAL, PARAMETER :: t0c = 273.15
  1246. REAL, DIMENSION( its:ite , kts:kte ) :: &
  1247. n0sfac
  1248. REAL :: lamdar, lamdas, x, y, z, supcol
  1249. integer :: i, j, k
  1250. !----------------------------------------------------------------
  1251. ! size distributions: (x=mixing ratio, y=air density):
  1252. ! valid for mixing ratio > 1.e-9 kg/kg.
  1253. lamdar(x,y)= sqrt(sqrt(pidn0r/(x*y))) ! (pidn0r/(x*y))**.25
  1254. lamdas(x,y,z)= sqrt(sqrt(pidn0s*z/(x*y))) ! (pidn0s*z/(x*y))**.25
  1255. !
  1256. do k = kts, kte
  1257. do i = its, ite
  1258. supcol = t0c-t(i,k)
  1259. !---------------------------------------------------------------
  1260. ! n0s: Intercept parameter for snow [m-4] [HDC 6]
  1261. !---------------------------------------------------------------
  1262. n0sfac(i,k) = max(min(exp(alpha*supcol),n0smax/n0s),1.)
  1263. if(qrs(i,k,1).le.qcrmin)then
  1264. rslope(i,k,1) = rslopermax
  1265. rslopeb(i,k,1) = rsloperbmax
  1266. rslope2(i,k,1) = rsloper2max
  1267. rslope3(i,k,1) = rsloper3max
  1268. else
  1269. rslope(i,k,1) = 1./lamdar(qrs(i,k,1),den(i,k))
  1270. rslopeb(i,k,1) = exp(log(rslope(i,k,1))*(bvtr))
  1271. rslope2(i,k,1) = rslope(i,k,1)*rslope(i,k,1)
  1272. rslope3(i,k,1) = rslope2(i,k,1)*rslope(i,k,1)
  1273. endif
  1274. if(qrs(i,k,2).le.qcrmin)then
  1275. rslope(i,k,2) = rslopesmax
  1276. rslopeb(i,k,2) = rslopesbmax
  1277. rslope2(i,k,2) = rslopes2max
  1278. rslope3(i,k,2) = rslopes3max
  1279. else
  1280. rslope(i,k,2) = 1./lamdas(qrs(i,k,2),den(i,k),n0sfac(i,k))
  1281. rslopeb(i,k,2) = exp(log(rslope(i,k,2))*(bvts))
  1282. rslope2(i,k,2) = rslope(i,k,2)*rslope(i,k,2)
  1283. rslope3(i,k,2) = rslope2(i,k,2)*rslope(i,k,2)
  1284. endif
  1285. vt(i,k,1) = pvtr*rslopeb(i,k,1)*denfac(i,k)
  1286. vt(i,k,2) = pvts*rslopeb(i,k,2)*denfac(i,k)
  1287. if(qrs(i,k,1).le.0.0) vt(i,k,1) = 0.0
  1288. if(qrs(i,k,2).le.0.0) vt(i,k,2) = 0.0
  1289. enddo
  1290. enddo
  1291. END subroutine slope_wsm5
  1292. !-----------------------------------------------------------------------------
  1293. subroutine slope_rain(qrs,den,denfac,t,rslope,rslopeb,rslope2,rslope3, &
  1294. vt,its,ite,kts,kte)
  1295. IMPLICIT NONE
  1296. INTEGER :: its,ite, jts,jte, kts,kte
  1297. REAL, DIMENSION( its:ite , kts:kte) :: &
  1298. qrs, &
  1299. rslope, &
  1300. rslopeb, &
  1301. rslope2, &
  1302. rslope3, &
  1303. vt, &
  1304. den, &
  1305. denfac, &
  1306. t
  1307. REAL, PARAMETER :: t0c = 273.15
  1308. REAL, DIMENSION( its:ite , kts:kte ) :: &
  1309. n0sfac
  1310. REAL :: lamdar, x, y, z, supcol
  1311. integer :: i, j, k
  1312. !----------------------------------------------------------------
  1313. ! size distributions: (x=mixing ratio, y=air density):
  1314. ! valid for mixing ratio > 1.e-9 kg/kg.
  1315. lamdar(x,y)= sqrt(sqrt(pidn0r/(x*y))) ! (pidn0r/(x*y))**.25
  1316. !
  1317. do k = kts, kte
  1318. do i = its, ite
  1319. if(qrs(i,k).le.qcrmin)then
  1320. rslope(i,k) = rslopermax
  1321. rslopeb(i,k) = rsloperbmax
  1322. rslope2(i,k) = rsloper2max
  1323. rslope3(i,k) = rsloper3max
  1324. else
  1325. rslope(i,k) = 1./lamdar(qrs(i,k),den(i,k))
  1326. rslopeb(i,k) = rslope(i,k)**bvtr
  1327. rslope2(i,k) = rslope(i,k)*rslope(i,k)
  1328. rslope3(i,k) = rslope2(i,k)*rslope(i,k)
  1329. endif
  1330. vt(i,k) = pvtr*rslopeb(i,k)*denfac(i,k)
  1331. if(qrs(i,k).le.0.0) vt(i,k) = 0.0
  1332. enddo
  1333. enddo
  1334. END subroutine slope_rain
  1335. !------------------------------------------------------------------------------
  1336. subroutine slope_snow(qrs,den,denfac,t,rslope,rslopeb,rslope2,rslope3, &
  1337. vt,its,ite,kts,kte)
  1338. IMPLICIT NONE
  1339. INTEGER :: its,ite, jts,jte, kts,kte
  1340. REAL, DIMENSION( its:ite , kts:kte) :: &
  1341. qrs, &
  1342. rslope, &
  1343. rslopeb, &
  1344. rslope2, &
  1345. rslope3, &
  1346. vt, &
  1347. den, &
  1348. denfac, &
  1349. t
  1350. REAL, PARAMETER :: t0c = 273.15
  1351. REAL, DIMENSION( its:ite , kts:kte ) :: &
  1352. n0sfac
  1353. REAL :: lamdas, x, y, z, supcol
  1354. integer :: i, j, k
  1355. !----------------------------------------------------------------
  1356. ! size distributions: (x=mixing ratio, y=air density):
  1357. ! valid for mixing ratio > 1.e-9 kg/kg.
  1358. lamdas(x,y,z)= sqrt(sqrt(pidn0s*z/(x*y))) ! (pidn0s*z/(x*y))**.25
  1359. !
  1360. do k = kts, kte
  1361. do i = its, ite
  1362. supcol = t0c-t(i,k)
  1363. !---------------------------------------------------------------
  1364. ! n0s: Intercept parameter for snow [m-4] [HDC 6]
  1365. !---------------------------------------------------------------
  1366. n0sfac(i,k) = max(min(exp(alpha*supcol),n0smax/n0s),1.)
  1367. if(qrs(i,k).le.qcrmin)then
  1368. rslope(i,k) = rslopesmax
  1369. rslopeb(i,k) = rslopesbmax
  1370. rslope2(i,k) = rslopes2max
  1371. rslope3(i,k) = rslopes3max
  1372. else
  1373. rslope(i,k) = 1./lamdas(qrs(i,k),den(i,k),n0sfac(i,k))
  1374. rslopeb(i,k) = rslope(i,k)**bvts
  1375. rslope2(i,k) = rslope(i,k)*rslope(i,k)
  1376. rslope3(i,k) = rslope2(i,k)*rslope(i,k)
  1377. endif
  1378. vt(i,k) = pvts*rslopeb(i,k)*denfac(i,k)
  1379. if(qrs(i,k).le.0.0) vt(i,k) = 0.0
  1380. enddo
  1381. enddo
  1382. END subroutine slope_snow
  1383. !-------------------------------------------------------------------
  1384. SUBROUTINE nislfv_rain_plm(im,km,denl,denfacl,tkl,dzl,wwl,rql,precip,dt,id,iter)
  1385. !-------------------------------------------------------------------
  1386. !
  1387. ! for non-iteration semi-Lagrangain forward advection for cloud
  1388. ! with mass conservation and positive definite advection
  1389. ! 2nd order interpolation with monotonic piecewise linear method
  1390. ! this routine is under assumption of decfl < 1 for semi_Lagrangian
  1391. !
  1392. ! dzl depth of model layer in meter
  1393. ! wwl terminal velocity at model layer m/s
  1394. ! rql cloud density*mixing ration
  1395. ! precip precipitation
  1396. ! dt time step
  1397. ! id kind of precip: 0 test case; 1 raindrop 2: snow
  1398. ! iter how many time to guess mean terminal velocity: 0 pure forward.
  1399. ! 0 : use departure wind for advection
  1400. ! 1 : use mean wind for advection
  1401. ! > 1 : use mean wind after iter-1 iterations
  1402. !
  1403. ! author: hann-ming henry juang <henry.juang@noaa.gov>
  1404. ! implemented by song-you hong
  1405. !
  1406. implicit none
  1407. integer im,km,id
  1408. real dt
  1409. real dzl(im,km),wwl(im,km),rql(im,km),precip(im)
  1410. real denl(im,km),denfacl(im,km),tkl(im,km)
  1411. !
  1412. integer i,k,n,m,kk,kb,kt,iter
  1413. real tl,tl2,qql,dql,qqd
  1414. real th,th2,qqh,dqh
  1415. real zsum,qsum,dim,dip,c1,con1,fa1,fa2
  1416. real allold, allnew, zz, dzamin, cflmax, decfl
  1417. real dz(km), ww(km), qq(km), wd(km), wa(km), was(km)
  1418. real den(km), denfac(km), tk(km)
  1419. real wi(km+1), zi(km+1), za(km+1)
  1420. real qn(km), qr(km),tmp(km),tmp1(km),tmp2(km),tmp3(km)
  1421. real dza(km+1), qa(km+1), qmi(km+1), qpi(km+1)
  1422. !
  1423. precip(:) = 0.0
  1424. !
  1425. i_loop : do i=1,im
  1426. ! -----------------------------------
  1427. dz(:) = dzl(i,:)
  1428. qq(:) = rql(i,:)
  1429. ww(:) = wwl(i,:)
  1430. den(:) = denl(i,:)
  1431. denfac(:) = denfacl(i,:)
  1432. tk(:) = tkl(i,:)
  1433. ! skip for no precipitation for all layers
  1434. allold = 0.0
  1435. do k=1,km
  1436. allold = allold + qq(k)
  1437. enddo
  1438. if(allold.le.0.0) then
  1439. cycle i_loop
  1440. endif
  1441. !
  1442. ! compute interface values
  1443. zi(1)=0.0
  1444. do k=1,km
  1445. zi(k+1) = zi(k)+dz(k)
  1446. enddo
  1447. !
  1448. ! save departure wind
  1449. wd(:) = ww(:)
  1450. n=1
  1451. 100 continue
  1452. ! plm is 2nd order, we can use 2nd order wi or 3rd order wi
  1453. ! 2nd order interpolation to get wi
  1454. wi(1) = ww(1)
  1455. wi(km+1) = ww(km)
  1456. do k=2,km
  1457. wi(k) = (ww(k)*dz(k-1)+ww(k-1)*dz(k))/(dz(k-1)+dz(k))
  1458. enddo
  1459. ! 3rd order interpolation to get wi
  1460. fa1 = 9./16.
  1461. fa2 = 1./16.
  1462. wi(1) = ww(1)
  1463. wi(2) = 0.5*(ww(2)+ww(1))
  1464. do k=3,km-1
  1465. wi(k) = fa1*(ww(k)+ww(k-1))-fa2*(ww(k+1)+ww(k-2))
  1466. enddo
  1467. wi(km) = 0.5*(ww(km)+ww(km-1))
  1468. wi(km+1) = ww(km)
  1469. !
  1470. ! terminate of top of raingroup
  1471. do k=2,km
  1472. if( ww(k).eq.0.0 ) wi(k)=ww(k-1)
  1473. enddo
  1474. !
  1475. ! diffusivity of wi
  1476. con1 = 0.05
  1477. do k=km,1,-1
  1478. decfl = (wi(k+1)-wi(k))*dt/dz(k)
  1479. if( decfl .gt. con1 ) then
  1480. wi(k) = wi(k+1) - con1*dz(k)/dt
  1481. endif
  1482. enddo
  1483. ! compute arrival point
  1484. do k=1,km+1
  1485. za(k) = zi(k) - wi(k)*dt
  1486. enddo
  1487. !
  1488. do k=1,km
  1489. dza(k) = za(k+1)-za(k)
  1490. enddo
  1491. dza(km+1) = zi(km+1) - za(km+1)
  1492. !
  1493. ! computer deformation at arrival point
  1494. do k=1,km
  1495. qa(k) = qq(k)*dz(k)/dza(k)
  1496. qr(k) = qa(k)/den(k)
  1497. enddo
  1498. qa(km+1) = 0.0
  1499. ! call maxmin(km,1,qa,' arrival points ')
  1500. !
  1501. ! compute arrival terminal velocity, and estimate mean terminal velocity
  1502. ! then back to use mean terminal velocity
  1503. if( n.le.iter ) then
  1504. if (id.eq.1) then
  1505. call slope_rain(qr,den,denfac,tk,tmp,tmp1,tmp2,tmp3,wa,1,1,1,km)
  1506. else
  1507. call slope_snow(qr,den,denfac,tk,tmp,tmp1,tmp2,tmp3,wa,1,1,1,km)
  1508. endif
  1509. if( n.ge.2 ) wa(1:km)=0.5*(wa(1:km)+was(1:km))
  1510. do k=1,km
  1511. !#ifdef DEBUG
  1512. ! print*,' slope_wsm3 ',qr(k)*1000.,den(k),denfac(k),tk(k),tmp(k),tmp1(k),tmp2(k),ww(k),wa(k)
  1513. !#endif
  1514. ! mean wind is average of departure and new arrival winds
  1515. ww(k) = 0.5* ( wd(k)+wa(k) )
  1516. enddo
  1517. was(:) = wa(:)
  1518. n=n+1
  1519. go to 100
  1520. endif
  1521. !
  1522. ! estimate values at arrival cell interface with monotone
  1523. do k=2,km
  1524. dip=(qa(k+1)-qa(k))/(dza(k+1)+dza(k))
  1525. dim=(qa(k)-qa(k-1))/(dza(k-1)+dza(k))
  1526. if( dip*dim.le.0.0 ) then
  1527. qmi(k)=qa(k)
  1528. qpi(k)=qa(k)
  1529. else
  1530. qpi(k)=qa(k)+0.5*(dip+dim)*dza(k)
  1531. qmi(k)=2.0*qa(k)-qpi(k)
  1532. if( qpi(k).lt.0.0 .or. qmi(k).lt.0.0 ) then
  1533. qpi(k) = qa(k)
  1534. qmi(k) = qa(k)
  1535. endif
  1536. endif
  1537. enddo
  1538. qpi(1)=qa(1)
  1539. qmi(1)=qa(1)
  1540. qmi(km+1)=qa(km+1)
  1541. qpi(km+1)=qa(km+1)
  1542. !
  1543. ! interpolation to regular point
  1544. qn = 0.0
  1545. kb=1
  1546. kt=1
  1547. intp : do k=1,km
  1548. kb=max(kb-1,1)
  1549. kt=max(kt-1,1)
  1550. ! find kb and kt
  1551. if( zi(k).ge.za(km+1) ) then
  1552. exit intp
  1553. else
  1554. find_kb : do kk=kb,km
  1555. if( zi(k).le.za(kk+1) ) then
  1556. kb = kk
  1557. exit find_kb
  1558. else
  1559. cycle find_kb
  1560. endif
  1561. enddo find_kb
  1562. find_kt : do kk=kt,km
  1563. if( zi(k+1).le.za(kk) ) then
  1564. kt = kk
  1565. exit find_kt
  1566. else
  1567. cycle find_kt
  1568. endif
  1569. enddo find_kt
  1570. kt = kt - 1
  1571. ! compute q with piecewise constant method
  1572. if( kt.eq.kb ) then
  1573. tl=(zi(k)-za(kb))/dza(kb)
  1574. th=(zi(k+1)-za(kb))/dza(kb)
  1575. tl2=tl*tl
  1576. th2=th*th
  1577. qqd=0.5*(qpi(kb)-qmi(kb))
  1578. qqh=qqd*th2+qmi(kb)*th
  1579. qql=qqd*tl2+qmi(kb)*tl
  1580. qn(k) = (qqh-qql)/(th-tl)
  1581. else if( kt.gt.kb ) then
  1582. tl=(zi(k)-za(kb))/dza(kb)
  1583. tl2=tl*tl
  1584. qqd=0.5*(qpi(kb)-qmi(kb))
  1585. qql=qqd*tl2+qmi(kb)*tl
  1586. dql = qa(kb)-qql
  1587. zsum = (1.-tl)*dza(kb)
  1588. qsum = dql*dza(kb)
  1589. if( kt-kb.gt.1 ) then
  1590. do m=kb+1,kt-1
  1591. zsum = zsum + dza(m)
  1592. qsum = qsum + qa(m) * dza(m)
  1593. enddo
  1594. endif
  1595. th=(zi(k+1)-za(kt))/dza(kt)
  1596. th2=th*th
  1597. qqd=0.5*(qpi(kt)-qmi(kt))
  1598. dqh=qqd*th2+qmi(kt)*th
  1599. zsum = zsum + th*dza(kt)
  1600. qsum = qsum + dqh*dza(kt)
  1601. qn(k) = qsum/zsum
  1602. endif
  1603. cycle intp
  1604. endif
  1605. !
  1606. enddo intp
  1607. !
  1608. ! rain out
  1609. sum_precip: do k=1,km
  1610. if( za(k).lt.0.0 .and. za(k+1).lt.0.0 ) then
  1611. precip(i) = precip(i) + qa(k)*dza(k)
  1612. cycle sum_precip
  1613. else if ( za(k).lt.0.0 .and. za(k+1).ge.0.0 ) then
  1614. precip(i) = precip(i) + qa(k)*(0.0-za(k))
  1615. exit sum_precip
  1616. endif
  1617. exit sum_precip
  1618. enddo sum_precip
  1619. !
  1620. ! replace the new values
  1621. rql(i,:) = qn(:)
  1622. !
  1623. ! ----------------------------------
  1624. enddo i_loop
  1625. !
  1626. END SUBROUTINE nislfv_rain_plm
  1627. END MODULE module_mp_wsm5
  1628. #endif