PageRenderTime 58ms CodeModel.GetById 18ms RepoModel.GetById 1ms app.codeStats 0ms

/wrfv2_fire/phys/module_mp_sbu_ylin.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 1745 lines | 1011 code | 202 blank | 532 comment | 70 complexity | 7245b4b8bceecc1faf23ec4757de4c6e MD5 | raw file
Possible License(s): AGPL-1.0

Large files files are truncated, but you can click here to view the full file

  1. !WRF:MODEL_LAYER:PHYSICS
  2. !--- The code is based on Lin and Colle (A New Bulk Microphysical Scheme
  3. ! that Includes Riming Intensity and Temperature Dependent Ice Characteristics, 2011, MWR)
  4. ! and Lin et al. (Parameterization of riming intensity and its impact on ice fall speed using ARM data, 2011, MWR)
  5. !--- NOTE: 1) Prognose variables are: qi,PI(precipitating ice, qs, which includes snow, partially rimed snow and graupel),qw,qr
  6. !--- 2) Sedimentation flux is based on Prudue Lin scheme
  7. !--- 2) PI has varying properties depending on riming intensity (Ri, diagnosed currently following Lin et al. (2011, MWR) and T
  8. !--- 3) Autoconverion is based on Liu and Daum (2004)
  9. !--- 4) PI size distribution assuming Gamma distribution, but mu_s=0 (Exponential) currently
  10. !--- 5) No density dependent fall speed since the V-D is derived using Best number approach, which already includes density effect
  11. !--- 6) Future work will include radar equivalent reflectivity using the new PI property (A-D, M-D, N(D)). If you use RIP for reflectivity
  12. !--- computation, please note that snow is (1-Ri)*qs and graupel is Ri*qs. Otherwise, reflectivity will be underestimated.
  13. !--- 7) The Liu and Daum autoconverion is quite sensitive on Nt_c. For mixed-phase cloud and marine environment, Nt_c of 10 or 20 is suggested.
  14. !--- default value is 10E.6. Change accordingly for your use.
  15. MODULE module_mp_sbu_ylin
  16. USE module_wrf_error
  17. !
  18. !..Parameters user might change based on their need
  19. REAL, PARAMETER, PRIVATE :: RH = 1.0
  20. REAL, PARAMETER, PRIVATE :: xnor = 8.0e6
  21. REAL, PARAMETER, PRIVATE :: Nt_c = 10.E6
  22. !..Water vapor and air gas constants at constant pressure
  23. REAL, PARAMETER, PRIVATE :: Rvapor = 461.5
  24. REAL, PARAMETER, PRIVATE :: oRv = 1./Rvapor
  25. REAL, PARAMETER, PRIVATE :: Rair = 287.04
  26. REAL, PARAMETER, PRIVATE :: Cp = 1004.0
  27. REAL, PARAMETER, PRIVATE :: grav = 9.81
  28. REAL, PARAMETER, PRIVATE :: rhowater = 1000.0
  29. REAL, PARAMETER, PRIVATE :: rhosnow = 100.0
  30. REAL, PARAMETER, PRIVATE :: SVP1=0.6112
  31. REAL, PARAMETER, PRIVATE :: SVP2=17.67
  32. REAL, PARAMETER, PRIVATE :: SVP3=29.65
  33. REAL, PARAMETER, PRIVATE :: SVPT0=273.15
  34. REAL, PARAMETER, PRIVATE :: EP1=Rvapor/Rair-1.
  35. REAL, PARAMETER, PRIVATE :: EP2=Rair/Rvapor
  36. !..Enthalpy of sublimation, vaporization, and fusion at 0C.
  37. REAL, PARAMETER, PRIVATE :: XLS = 2.834E6
  38. REAL, PARAMETER, PRIVATE :: XLV = 2.5E6
  39. REAL, PARAMETER, PRIVATE :: XLF = XLS - XLV
  40. !
  41. REAL, PARAMETER, PRIVATE :: &
  42. qi0 = 1.0e-3, & !--- ice aggregation to snow threshold
  43. xmi50 = 4.8e-10, xmi40 = 2.46e-10, &
  44. xni0 = 1.0e-2, xmnin = 1.05e-18, bni = 0.5, &
  45. di50 = 1.0e-4, xmi = 4.19e-13, & !--- parameters used in BF process
  46. bv_r = 0.8, bv_i = 0.25, &
  47. o6 = 1./6., cdrag = 0.6, &
  48. avisc = 1.49628e-6, adiffwv = 8.7602e-5, &
  49. axka = 1.4132e3, cw = 4.187e3, ci = 2.093e3
  50. CONTAINS
  51. !-------------------------------------------------------------------
  52. ! Lin et al., 1983, JAM, 1065-1092, and
  53. ! Rutledge and Hobbs, 1984, JAS, 2949-2972
  54. !-------------------------------------------------------------------
  55. SUBROUTINE sbu_ylin(th &
  56. ,qv, ql, qr &
  57. ,qi, qs, Ri3D &
  58. ,rho, pii, p &
  59. ,dt_in &
  60. ,z,ht, dz8w &
  61. ,RAINNC, RAINNCV &
  62. ,ids,ide, jds,jde, kds,kde &
  63. ,ims,ime, jms,jme, kms,kme &
  64. ,its,ite, jts,jte, kts,kte &
  65. )
  66. !-------------------------------------------------------------------
  67. IMPLICIT NONE
  68. !-------------------------------------------------------------------
  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. qv, &
  78. qi,ql, &
  79. qs,qr
  80. ! YLIN
  81. ! Adding RI3D as a variable to the interface
  82. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
  83. INTENT(INOUT) :: Ri3D
  84. !
  85. REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), &
  86. INTENT(IN ) :: &
  87. rho, &
  88. pii, &
  89. z,p, &
  90. dz8w
  91. REAL , DIMENSION( ims:ime , jms:jme ) , INTENT(IN) :: ht
  92. REAL, INTENT(IN ) :: dt_in
  93. REAL, DIMENSION( ims:ime , jms:jme ), &
  94. INTENT(INOUT) :: RAINNC, &
  95. RAINNCV
  96. ! LOCAL VAR
  97. INTEGER :: min_q, max_q
  98. REAL, DIMENSION( its:ite , jts:jte ) &
  99. :: rain, snow,ice
  100. REAL, DIMENSION( kts:kte ) :: qvz, qlz, qrz, &
  101. qiz, qsz, qgz, &
  102. thz, &
  103. tothz, rhoz, &
  104. orhoz, sqrhoz, &
  105. prez, zz, &
  106. dzw
  107. ! Added vertical profile of Ri (riz) as a variable
  108. REAL, DIMENSION( kts:kte ) :: riz
  109. !
  110. REAL :: dt, pptice, pptrain, pptsnow, pptgraul, rhoe_s
  111. INTEGER :: i,j,k
  112. dt=dt_in
  113. rhoe_s=1.29
  114. j_loop: DO j = jts, jte
  115. i_loop: DO i = its, ite
  116. !
  117. !- write data from 3-D to 1-D
  118. !
  119. DO k = kts, kte
  120. qvz(k)=qv(i,k,j)
  121. qlz(k)=ql(i,k,j)
  122. qrz(k)=qr(i,k,j)
  123. qiz(k)=qi(i,k,j)
  124. qsz(k)=qs(i,k,j)
  125. thz(k)=th(i,k,j)
  126. rhoz(k)=rho(i,k,j)
  127. orhoz(k)=1./rhoz(k)
  128. prez(k)=p(i,k,j)
  129. ! sqrhoz(k)=sqrt(rhoe_s*orhoz(k))
  130. ! no density dependence of fall speed as Note #5, you can turn it on to increase fall speed at low pressure.
  131. sqrhoz(k)=1.0
  132. tothz(k)=pii(i,k,j)
  133. zz(k)=z(i,k,j)
  134. dzw(k)=dz8w(i,k,j)
  135. END DO
  136. !
  137. pptrain=0.
  138. pptsnow=0.
  139. pptice =0.
  140. ! CALL wrf_debug ( 100 , 'microphysics_driver: calling clphy1d_ylin' )
  141. CALL clphy1d_ylin( dt, qvz, qlz, qrz, qiz, qsz, &
  142. thz, tothz, rhoz, orhoz, sqrhoz, &
  143. prez, zz, dzw, ht(I,J), &
  144. pptrain, pptsnow, pptice, &
  145. kts, kte, i, j, riz )
  146. !
  147. ! Precipitation from cloud microphysics -- only for one time step
  148. !
  149. ! unit is transferred from m to mm
  150. !
  151. rain(i,j)= pptrain
  152. snow(i,j)= pptsnow
  153. ice(i,j) = pptice
  154. !
  155. RAINNCV(i,j)= pptrain + pptsnow + pptice
  156. RAINNC(i,j) = RAINNC(i,j) + pptrain + pptsnow + pptice
  157. !
  158. !- update data from 1-D back to 3-D
  159. !
  160. DO k = kts, kte
  161. qv(i,k,j)=qvz(k)
  162. ql(i,k,j)=qlz(k)
  163. qr(i,k,j)=qrz(k)
  164. th(i,k,j)=thz(k)
  165. qi(i,k,j)=qiz(k)
  166. qs(i,k,j)=qsz(k)
  167. ri3d(i,k,j)=riz(k)
  168. END DO
  169. !
  170. ENDDO i_loop
  171. ENDDO j_loop
  172. END SUBROUTINE sbu_ylin
  173. !-----------------------------------------------------------------------
  174. SUBROUTINE clphy1d_ylin(dt, qvz, qlz, qrz, qiz, qsz, &
  175. thz, tothz, rho, orho, sqrho, &
  176. prez, zz, dzw, zsfc, pptrain, pptsnow,pptice, &
  177. kts, kte, i, j,riz )
  178. !-----------------------------------------------------------------------
  179. IMPLICIT NONE
  180. !-----------------------------------------------------------------------
  181. ! This program handles the vertical 1-D cloud micphysics
  182. !-----------------------------------------------------------------------
  183. ! avisc: constant in empirical formular for dynamic viscosity of air
  184. ! =1.49628e-6 [kg/m/s] = 1.49628e-5 [g/cm/s]
  185. ! adiffwv: constant in empirical formular for diffusivity of water
  186. ! vapor in air
  187. ! = 8.7602e-5 [kgm/s3] = 8.7602 [gcm/s3]
  188. ! axka: constant in empirical formular for thermal conductivity of air
  189. ! = 1.4132e3 [m2/s2/K] = 1.4132e7 [cm2/s2/K]
  190. ! qi0: mixing ratio threshold for cloud ice aggregation [kg/kg]
  191. ! xmi50: mass of a 50 micron ice crystal
  192. ! = 4.8e-10 [kg] =4.8e-7 [g]
  193. ! xmi40: mass of a 40 micron ice crystal
  194. ! = 2.46e-10 [kg] = 2.46e-7 [g]
  195. ! di50: diameter of a 50 micro (radius) ice crystal
  196. ! =1.0e-4 [m]
  197. ! xmi: mass of one cloud ice crystal
  198. ! =4.19e-13 [kg] = 4.19e-10 [g]
  199. ! oxmi=1.0/xmi
  200. !
  201. ! xni0=1.0e-2 [m-3] The value given in Lin et al. is wrong.(see
  202. ! Hsie et al.(1980) and Rutledge and Hobbs(1983) )
  203. ! bni=0.5 [K-1]
  204. ! xmnin: mass of a natural ice nucleus
  205. ! = 1.05e-18 [kg] = 1.05e-15 [g] This values is suggested by
  206. ! Hsie et al. (1980)
  207. ! = 1.0e-12 [kg] suggested by Rutlegde and Hobbs (1983)
  208. ! av_r: av_r in empirical formular for terminal
  209. ! velocity of raindrop
  210. ! =2115.0 [cm**(1-b)/s] = 2115.0*0.01**(1-b) [m**(1-b)/s]
  211. ! bv_r: bv_r in empirical formular for terminal
  212. ! velocity of raindrop
  213. ! =0.8
  214. ! av_i: av_i in empirical formular for terminal
  215. ! velocity of snow
  216. ! =152.93 [cm**(1-d)/s] = 152.93*0.01**(1-d) [m**(1-d)/s]
  217. ! bv_i: bv_i in empirical formular for terminal
  218. ! velocity of snow
  219. ! =0.25
  220. ! vf1r: ventilation factors for rain =0.78
  221. ! vf2r: ventilation factors for rain =0.31
  222. ! vf1s: ventilation factors for snow =0.65
  223. ! vf2s: ventilation factors for snow =0.44
  224. !
  225. !----------------------------------------------------------------------
  226. INTEGER, INTENT(IN ) :: kts, kte, i, j
  227. REAL, DIMENSION( kts:kte ), &
  228. INTENT(INOUT) :: qvz, qlz, qrz, qiz, qsz, &
  229. thz
  230. REAL, DIMENSION( kts:kte ), &
  231. INTENT(IN ) :: tothz, rho, orho, sqrho, &
  232. prez, zz, dzw
  233. REAL, INTENT(INOUT) :: pptrain, pptsnow, pptice
  234. REAL, INTENT(IN ) :: dt, zsfc
  235. ! local vars
  236. REAL :: obp4, bp3, bp5, bp6, odp4, &
  237. dp3, dp5, dp5o2
  238. ! temperary vars
  239. REAL :: tmp, tmp0, tmp1, tmp2,tmp3, &
  240. tmp4, tmpa,tmpb,tmpc,tmpd,alpha1, &
  241. qic, abi,abr, abg, odtberg, &
  242. vti50,eiw,eri,esi,esr, esw, &
  243. erw,delrs,term0,term1, &
  244. Ap, Bp, &
  245. factor, tmp_r, tmp_s,tmp_g, &
  246. qlpqi, rsat, a1, a2, xnin
  247. !
  248. REAL, DIMENSION( kts:kte ) :: oprez, tem, temcc, theiz, qswz, &
  249. qsiz, qvoqswz, qvoqsiz, qvzodt, &
  250. qlzodt, qizodt, qszodt, qrzodt
  251. !--- microphysical processes
  252. REAL, DIMENSION( kts:kte ) :: psnow, psaut, psfw, psfi, praci, &
  253. piacr, psaci, psacw, psdep, pssub, &
  254. pracs, psacr, psmlt, psmltevp, &
  255. prain, praut, pracw, prevp, pvapor, &
  256. pclw, pladj, pcli, pimlt, pihom, &
  257. pidw, piadj, pgfr, &
  258. qschg
  259. !
  260. REAL, DIMENSION( kts:kte ) :: qvsbar, rs0, viscmu, visc, diffwv, &
  261. schmidt, xka
  262. !---- new snow parameters
  263. REAL, DIMENSION( kts:kte ):: ab_s,ab_r,ab_riming,lamc
  264. REAL, DIMENSION( kts:kte ):: cap_s !---- capacitance of snow
  265. REAL, PARAMETER :: vf1s = 0.65, vf2s = 0.44, vf1r =0.78 , vf2r = 0.31
  266. REAL, PARAMETER :: am_c1=0.004, am_c2= 6e-5, am_c3=0.15
  267. REAL, PARAMETER :: bm_c1=1.85, bm_c2= 0.003, bm_c3=1.25
  268. REAL, PARAMETER :: aa_c1=1.28, aa_c2= -0.012, aa_c3=-0.6
  269. REAL, PARAMETER :: ba_c1=1.5, ba_c2= 0.0075, ba_c3=0.5
  270. REAL, PARAMETER :: best_a=1.08 , best_b = 0.499
  271. REAL, DIMENSION(kts:kte):: am_s,bm_s,av_s,bv_s,Ri,N0_s,tmp_ss,lams
  272. REAL, DIMENSION(kts:kte):: aa_s,ba_s,tmp_sa
  273. REAL, PARAMETER :: mu_s=0.,mu_i=0.,mu_r=0.
  274. REAL :: tc0, disp, Dc_liu, eta, mu_c, R6c !--- for Liu's autoconversion
  275. ! Adding variable Riz, which will duplicate Ri but be a copy passed upward
  276. REAL, DIMENSION(kts:kte) :: Riz
  277. REAL, DIMENSION( kts:kte ) :: vtr, vts, &
  278. vtrold, vtsold, vtiold, &
  279. xlambdar, xlambdas, &
  280. olambdar, olambdas
  281. REAL :: episp0k, dtb, odtb, pi, pio4, &
  282. pio6, oxLf, xLvocp, xLfocp, av_r, &
  283. av_i, ocdrag, gambp4, gamdp4, &
  284. gam4pt5, Cpor, oxmi, gambp3, gamdp3,&
  285. gambp6, gam3pt5, gam2pt75, gambp5o2,&
  286. gamdp5o2, cwoxlf, ocp, xni50, es
  287. !
  288. REAL :: qvmin=1.e-20
  289. REAL :: temc1,save1,save2,xni50mx
  290. ! for terminal velocity flux
  291. INTEGER :: min_q, max_q, max_ri_k, k
  292. REAL :: max_ri
  293. REAL :: t_del_tv, del_tv, flux, fluxin, fluxout ,tmpqrz
  294. LOGICAL :: notlast
  295. !
  296. mu_c = AMIN1(15., (1000.E6/Nt_c + 2.))
  297. R6c = 10.0E-6 !---- 10 micron, threshold radius of cloud droplet
  298. dtb=dt
  299. odtb=1./dtb
  300. pi =acos(-1.)
  301. pio4=acos(-1.)/4.
  302. pio6=acos(-1.)/6.
  303. ocp=1./cp
  304. oxLf=1./xLf
  305. xLvocp=xLv/cp
  306. xLfocp=xLf/cp
  307. Cpor=cp/Rair
  308. oxmi=1.0/xmi
  309. cwoxlf=cw/xlf
  310. av_r=2115.0*0.01**(1-bv_r)
  311. av_i=152.93*0.01**(1-bv_i)
  312. ocdrag=1./Cdrag
  313. episp0k=RH*ep2*1000.*svp1
  314. !
  315. gambp4=ggamma(bv_r+4.)
  316. gamdp4=ggamma(bv_i+4.)
  317. gambp3=ggamma(bv_r+3.)
  318. gambp6=ggamma(bv_r+6)
  319. gambp5o2=ggamma((bv_r+5.)/2.)
  320. gamdp5o2=ggamma((bv_i+5.)/2.)
  321. !
  322. ! oprez 1./prez ( prez : pressure)
  323. ! qsw saturated mixing ratio on water surface
  324. ! qsi saturated mixing ratio on ice surface
  325. ! episp0k RH*e*saturated pressure at 273.15 K = 611.2 hPa (Rogers and Yau 1989)
  326. ! qvoqsw qv/qsw
  327. ! qvoqsi qv/qsi
  328. ! qvzodt qv/dt
  329. ! qlzodt ql/dt
  330. ! qizodt qi/dt
  331. ! qszodt qs/dt
  332. ! qrzodt qr/dt
  333. ! temcc temperature in dregee C
  334. !
  335. obp4=1.0/(bv_r+4.0)
  336. bp3=bv_r+3.0
  337. bp5=bv_r+5.0
  338. bp6=bv_r+6.0
  339. odp4=1.0/(bv_i+4.0)
  340. dp3=bv_i+3.0
  341. dp5=bv_i+5.0
  342. dp5o2=0.5*(bv_i+5.0)
  343. !
  344. do k=kts,kte
  345. oprez(k)=1./prez(k)
  346. qlz(k)=amax1( 0.0,qlz(k) )
  347. qiz(k)=amax1( 0.0,qiz(k) )
  348. qvz(k)=amax1( qvmin,qvz(k) )
  349. qsz(k)=amax1( 0.0,qsz(k) )
  350. qrz(k)=amax1( 0.0,qrz(k) )
  351. tem(k)=thz(k)*tothz(k)
  352. temcc(k)=tem(k)-273.15
  353. es=1000.*svp1*exp( svp2*temcc(k)/(tem(k)-svp3) ) !--- RY89 Eq(2.17)
  354. qswz(k)=ep2*es/(prez(k)-es)
  355. if (tem(k) .lt. 273.15 ) then
  356. es=1000.*svp1*exp( 21.8745584*(tem(k)-273.16)/(tem(k)-7.66) )
  357. qsiz(k)=ep2*es/(prez(k)-es)
  358. if (temcc(k) .lt. -40.0) qswz(k)=qsiz(k)
  359. else
  360. qsiz(k)=qswz(k)
  361. endif
  362. !
  363. qvoqswz(k)=qvz(k)/qswz(k)
  364. qvoqsiz(k)=qvz(k)/qsiz(k)
  365. qvzodt(k)=amax1( 0.0,odtb*qvz(k) )
  366. qlzodt(k)=amax1( 0.0,odtb*qlz(k) )
  367. qizodt(k)=amax1( 0.0,odtb*qiz(k) )
  368. qszodt(k)=amax1( 0.0,odtb*qsz(k) )
  369. qrzodt(k)=amax1( 0.0,odtb*qrz(k) )
  370. theiz(k)=thz(k)+(xlvocp*qvz(k)-xlfocp*qiz(k))/tothz(k)
  371. enddo
  372. do k=kts,kte
  373. psnow(k)=0.0
  374. psaut(k)=0.0
  375. psfw(k)=0.0
  376. psfi(k)=0.0
  377. praci(k)=0.0
  378. piacr(k)=0.0
  379. psaci(k)=0.0
  380. psacw(k)=0.0
  381. psdep(k)=0.0
  382. pssub(k)=0.0
  383. pracs(k)=0.0
  384. psacr(k)=0.0
  385. psmlt(k)=0.0
  386. psmltevp(k)=0.0
  387. prain(k)=0.0
  388. praut(k)=0.0
  389. pracw(k)=0.0
  390. prevp(k)=0.0
  391. pgfr(k)=0.0
  392. pvapor(k)=0.0
  393. pclw(k)=0.0
  394. pladj(k)=0.0
  395. pcli(k)=0.0
  396. pimlt(k)=0.0
  397. pihom(k)=0.0
  398. pidw(k)=0.0
  399. piadj(k)=0.0
  400. qschg(k)=0.
  401. enddo
  402. !***********************************************************************
  403. !***** compute viscosity,difusivity,thermal conductivity, and ******
  404. !***** Schmidt number ******
  405. !***********************************************************************
  406. !c------------------------------------------------------------------
  407. !c viscmu: dynamic viscosity of air kg/m/s
  408. !c visc: kinematic viscosity of air = viscmu/rho (m2/s)
  409. !c avisc=1.49628e-6 kg/m/s=1.49628e-5 g/cm/s
  410. !c viscmu=1.718e-5 kg/m/s in RH
  411. !c diffwv: Diffusivity of water vapor in air
  412. !c adiffwv = 8.7602e-5 (8.794e-5 in MM5) kgm/s3
  413. !c = 8.7602 (8.794 in MM5) gcm/s3
  414. !c diffwv(k)=2.26e-5 m2/s
  415. !c schmidt: Schmidt number=visc/diffwv
  416. !c xka: thermal conductivity of air J/m/s/K (Kgm/s3/K)
  417. !c xka(k)=2.43e-2 J/m/s/K in RH
  418. !c axka=1.4132e3 (1.414e3 in MM5) m2/s2/k = 1.4132e7 cm2/s2/k
  419. !c------------------------------------------------------------------
  420. DO k=kts,kte
  421. viscmu(k)=avisc*tem(k)**1.5/(tem(k)+120.0)
  422. visc(k)=viscmu(k)*orho(k)
  423. diffwv(k)=adiffwv*tem(k)**1.81*oprez(k)
  424. schmidt(k)=visc(k)/diffwv(k)
  425. xka(k)=axka*viscmu(k)
  426. rs0(k)=ep2*1000.*svp1/(prez(k)-1000.*svp1)
  427. END DO
  428. !
  429. ! ---- YLIN, set snow variables
  430. !
  431. !---- A+B in depositional growth, the first try just take from Rogers and Yau(1989)
  432. ! ab_s(k) = lsub*lsub*orv/(tcond(k)*temp(k))+&
  433. ! rv*temp(k)/(diffu(k)*qvsi(k))
  434. do k = kts, kte
  435. tc0 = tem(k)-273.15
  436. if (rho(k)*qlz(k) .gt. 1e-5 .AND. rho(k)*qsz(k) .gt. 1e-5) then
  437. Ri(k) = 1.0/(1.0+6e-5/(rho(k)**1.170*qlz(k)*qsz(k)**0.170))
  438. else
  439. Ri(k) = 0
  440. endif
  441. enddo
  442. !
  443. !--- make sure Ri does not decrease downward in a column
  444. !
  445. max_ri_k = MAXLOC(Ri,dim=1)
  446. max_ri = MAXVAL(Ri)
  447. do k = kts, max_ri_k
  448. Ri(k) = max_ri
  449. enddo
  450. !--- YLIN, get PI properties
  451. do k = kts, kte
  452. Ri(k) = AMAX1(0.,AMIN1(Ri(k),1.0))
  453. ! Store the value of Ri(k) as Riz(k)
  454. Riz(k) = Ri(k)
  455. cap_s(k)= 0.25*(1+Ri(k))
  456. tc0 = AMIN1(-0.1, tem(k)-273.15)
  457. N0_s(k) = amin1(2.0E8, 2.0E6*exp(-0.12*tc0))
  458. am_s(k) = am_c1+am_c2*tc0+am_c3*Ri(k)*Ri(k) !--- Heymsfield 2007
  459. am_s(k) = AMAX1(0.000023,am_s(k)) !--- use the a_min in table 1 of Heymsfield
  460. bm_s(k) = bm_c1+bm_c2*tc0+bm_c3*Ri(k)
  461. bm_s(k) = AMIN1(bm_s(k),3.0) !---- capped by 3
  462. !--- converting from cgs to SI unit
  463. am_s(k) = 10**(2*bm_s(k)-3.0)*am_s(k)
  464. aa_s(k) = aa_c1 + aa_c2*tc0 + aa_c3*Ri(k)
  465. ba_s(k) = ba_c1 + ba_c2*tc0 + ba_c3*Ri(k)
  466. !--- convert to SI unit as in paper
  467. aa_s(k) = (1e-2)**(2.0-ba_s(k))*aa_s(k)
  468. !---- get v from Mitchell 1996
  469. av_s(k) = best_a*viscmu(k)*(2*grav*am_s(k)/rho(k)/aa_s(k)/(viscmu(k)**2))**best_b
  470. bv_s(k) = best_b*(bm_s(k)-ba_s(k)+2)-1
  471. tmp_ss(k)= bm_s(k)+mu_s+1
  472. tmp_sa(k)= ba_s(k)+mu_s+1
  473. enddo
  474. !
  475. !***********************************************************************
  476. ! Calculate precipitation fluxes due to terminal velocities.
  477. !***********************************************************************
  478. !
  479. !- Calculate termianl velocity (vt?) of precipitation q?z
  480. !- Find maximum vt? to determine the small delta t
  481. !
  482. !-- rain
  483. !
  484. ! CALL wrf_debug ( 100 , 'module_ylin, start precip fluxes' )
  485. t_del_tv=0.
  486. del_tv=dtb
  487. notlast=.true.
  488. DO while (notlast)
  489. !
  490. min_q=kte
  491. max_q=kts-1
  492. !
  493. do k=kts,kte-1
  494. if (qrz(k) .gt. 1.0e-8) then
  495. min_q=min0(min_q,k)
  496. max_q=max0(max_q,k)
  497. tmp1=sqrt(pi*rhowater*xnor/rho(k)/qrz(k))
  498. tmp1=sqrt(tmp1)
  499. vtrold(k)=o6*av_r*gambp4*sqrho(k)/tmp1**bv_r
  500. if (k .eq. 1) then
  501. del_tv=amin1(del_tv,0.9*(zz(k)-zsfc)/vtrold(k))
  502. else
  503. del_tv=amin1(del_tv,0.9*(zz(k)-zz(k-1))/vtrold(k))
  504. endif
  505. else
  506. vtrold(k)=0.
  507. endif
  508. enddo
  509. if (max_q .ge. min_q) then
  510. !
  511. !- Check if the summation of the small delta t >= big delta t
  512. ! (t_del_tv) (del_tv) (dtb)
  513. t_del_tv=t_del_tv+del_tv
  514. !
  515. if ( t_del_tv .ge. dtb ) then
  516. notlast=.false.
  517. del_tv=dtb+del_tv-t_del_tv
  518. endif
  519. !
  520. fluxin=0.
  521. do k=max_q,min_q,-1
  522. fluxout=rho(k)*vtrold(k)*qrz(k)
  523. flux=(fluxin-fluxout)/rho(k)/dzw(k)
  524. tmpqrz=qrz(k)
  525. qrz(k)=qrz(k)+del_tv*flux
  526. fluxin=fluxout
  527. enddo
  528. if (min_q .eq. 1) then
  529. pptrain=pptrain+fluxin*del_tv
  530. else
  531. qrz(min_q-1)=qrz(min_q-1)+del_tv* &
  532. fluxin/rho(min_q-1)/dzw(min_q-1)
  533. endif
  534. !
  535. else
  536. notlast=.false.
  537. endif
  538. ENDDO
  539. !
  540. !-- snow
  541. !
  542. t_del_tv=0.
  543. del_tv=dtb
  544. notlast=.true.
  545. DO while (notlast)
  546. !
  547. min_q=kte
  548. max_q=kts-1
  549. !
  550. do k=kts,kte-1
  551. if (qsz(k) .gt. 1.0e-8) then
  552. min_q=min0(min_q,k)
  553. max_q=max0(max_q,k)
  554. tmp1= (am_s(k)*N0_s(k)*ggamma(tmp_ss(k))*orho(k)/qsz(k))&
  555. **(1./tmp_ss(k))
  556. vtsold(k)= sqrho(k)*av_s(k)*ggamma(bv_s(k)+tmp_ss(k))/ &
  557. ggamma(tmp_ss(k))/(tmp1**bv_s(k))
  558. if (k .eq. 1) then
  559. del_tv=amin1(del_tv,0.9*(zz(k)-zsfc)/vtsold(k))
  560. else
  561. del_tv=amin1(del_tv,0.9*(zz(k)-zz(k-1))/vtsold(k))
  562. endif
  563. else
  564. vtsold(k)=0.
  565. endif
  566. enddo
  567. if (max_q .ge. min_q) then
  568. !
  569. !
  570. !- Check if the summation of the small delta t >= big delta t
  571. ! (t_del_tv) (del_tv) (dtb)
  572. t_del_tv=t_del_tv+del_tv
  573. if ( t_del_tv .ge. dtb ) then
  574. notlast=.false.
  575. del_tv=dtb+del_tv-t_del_tv
  576. endif
  577. !
  578. fluxin=0.
  579. do k=max_q,min_q,-1
  580. fluxout=rho(k)*vtsold(k)*qsz(k)
  581. flux=(fluxin-fluxout)/rho(k)/dzw(k)
  582. qsz(k)=qsz(k)+del_tv*flux
  583. qsz(k)=amax1(0.,qsz(k))
  584. fluxin=fluxout
  585. enddo
  586. if (min_q .eq. 1) then
  587. pptsnow=pptsnow+fluxin*del_tv
  588. else
  589. qsz(min_q-1)=qsz(min_q-1)+del_tv* &
  590. fluxin/rho(min_q-1)/dzw(min_q-1)
  591. endif
  592. !
  593. else
  594. notlast=.false.
  595. endif
  596. ENDDO
  597. !
  598. !-- cloud ice (03/21/02) using Heymsfield and Donner (1990) Vi=3.29*qi^0.16
  599. !
  600. t_del_tv=0.
  601. del_tv=dtb
  602. notlast=.true.
  603. !
  604. DO while (notlast)
  605. !
  606. min_q=kte
  607. max_q=kts-1
  608. !
  609. do k=kts,kte-1
  610. if (qiz(k) .gt. 1.0e-8) then
  611. min_q=min0(min_q,k)
  612. max_q=max0(max_q,k)
  613. vtiold(k)= 3.29 * (rho(k)* qiz(k))** 0.16 ! Heymsfield and Donner
  614. if (k .eq. 1) then
  615. del_tv=amin1(del_tv,0.9*(zz(k)-zsfc)/vtiold(k))
  616. else
  617. del_tv=amin1(del_tv,0.9*(zz(k)-zz(k-1))/vtiold(k))
  618. endif
  619. else
  620. vtiold(k)=0.
  621. endif
  622. enddo
  623. if (max_q .ge. min_q) then
  624. !
  625. !- Check if the summation of the small delta t >= big delta t
  626. ! (t_del_tv) (del_tv) (dtb)
  627. t_del_tv=t_del_tv+del_tv
  628. if ( t_del_tv .ge. dtb ) then
  629. notlast=.false.
  630. del_tv=dtb+del_tv-t_del_tv
  631. endif
  632. fluxin=0.
  633. do k=max_q,min_q,-1
  634. fluxout=rho(k)*vtiold(k)*qiz(k)
  635. flux=(fluxin-fluxout)/rho(k)/dzw(k)
  636. qiz(k)=qiz(k)+del_tv*flux
  637. qiz(k)=amax1(0.,qiz(k))
  638. fluxin=fluxout
  639. enddo
  640. if (min_q .eq. 1) then
  641. pptice=pptice+fluxin*del_tv
  642. else
  643. qiz(min_q-1)=qiz(min_q-1)+del_tv* &
  644. fluxin/rho(min_q-1)/dzw(min_q-1)
  645. endif
  646. !
  647. else
  648. notlast=.false.
  649. endif
  650. !
  651. ENDDO
  652. ! CALL wrf_debug ( 100 , 'module_ylin: end precip flux' )
  653. ! Microphpysics processes
  654. DO 2000 k=kts,kte
  655. !
  656. qvzodt(k)=amax1( 0.0,odtb*qvz(k) )
  657. qlzodt(k)=amax1( 0.0,odtb*qlz(k) )
  658. qizodt(k)=amax1( 0.0,odtb*qiz(k) )
  659. qszodt(k)=amax1( 0.0,odtb*qsz(k) )
  660. qrzodt(k)=amax1( 0.0,odtb*qrz(k) )
  661. !***********************************************************************
  662. !***** diagnose mixing ratios (qrz,qsz), terminal *****
  663. !***** velocities (vtr,vts), and slope parameters in size *****
  664. !***** distribution(xlambdar,xlambdas) of rain and snow *****
  665. !***** follows Nagata and Ogura, 1991, MWR, 1309-1337. Eq (A7) *****
  666. !***********************************************************************
  667. !
  668. !**** assuming no cloud water can exist in the top two levels due to
  669. !**** radiation consideration
  670. !
  671. !! if
  672. !! unsaturated,
  673. !! no cloud water, rain, ice, snow
  674. !! then
  675. !! skip these processes and jump to line 2000
  676. !
  677. !
  678. tmp=qiz(k)+qlz(k)+qsz(k)+qrz(k)
  679. if( qvz(k)+qlz(k)+qiz(k) .lt. qsiz(k) &
  680. .and. tmp .eq. 0.0 ) go to 2000
  681. !
  682. !! calculate terminal velocity of rain
  683. !
  684. if (qrz(k) .gt. 1.0e-8) then
  685. tmp1=sqrt(pi*rhowater*xnor*orho(k)/qrz(k))
  686. xlambdar(k)=sqrt(tmp1)
  687. olambdar(k)=1.0/xlambdar(k)
  688. vtrold(k)=o6*av_r*gambp4*sqrho(k)*olambdar(k)**bv_r
  689. else
  690. vtrold(k)=0.
  691. olambdar(k)=0.
  692. endif
  693. !
  694. if (qrz(k) .gt. 1.0e-8) then
  695. tmp1=sqrt(pi*rhowater*xnor*orho(k)/qrz(k))
  696. xlambdar(k)=sqrt(tmp1)
  697. olambdar(k)=1.0/xlambdar(k)
  698. vtr(k)=o6*av_r*gambp4*sqrho(k)*olambdar(k)**bv_r
  699. else
  700. vtr(k)=0.
  701. olambdar(k)=0.
  702. endif
  703. !
  704. !! calculate terminal velocity of snow
  705. !
  706. if (qsz(k) .gt. 1.0e-8) then
  707. tmp1= (am_s(k)*N0_s(k)*ggamma(tmp_ss(k))*orho(k)/qsz(k))&
  708. **(1./tmp_ss(k))
  709. olambdas(k)=1.0/tmp1
  710. vtsold(k)= sqrho(k)*av_s(k)*ggamma(bv_s(k)+tmp_ss(k))/ &
  711. ggamma(tmp_ss(k))/(tmp1**bv_s(k))
  712. else
  713. vtsold(k)=0.
  714. olambdas(k)=0.
  715. endif
  716. !
  717. if (qsz(k) .gt. 1.0e-8) then
  718. tmp1= (am_s(k)*N0_s(k)*ggamma(tmp_ss(k))*orho(k)/qsz(k))&
  719. **(1./tmp_ss(k))
  720. olambdas(k)=1.0/tmp1
  721. vts(k)= sqrho(k)*av_s(k)*ggamma(bv_s(k)+tmp_ss(k))/ &
  722. ggamma(tmp_ss(k))/(tmp1**bv_s(k))
  723. else
  724. vts(k)=0.
  725. olambdas(k)=0.
  726. endif
  727. !---------- start of snow/ice processes below freezing
  728. if (tem(k) .lt. 273.15) then
  729. !
  730. !***********************************************************************
  731. !********* snow production processes for T < 0 C **********
  732. !***********************************************************************
  733. !c
  734. !c (1) ICE CRYSTAL AGGREGATION TO SNOW (Psaut): Lin (21)
  735. !c! psaut=alpha1*(qi-qi0)
  736. !c! alpha1=1.0e-3*exp(0.025*(T-T0))
  737. !c
  738. alpha1=1.0e-3*exp( 0.025*temcc(k) )
  739. !
  740. if(temcc(k) .lt. -20.0) then
  741. tmp1=-7.6+4.0*exp( -0.2443e-3*(abs(temcc(k))-20)**2.455 )
  742. qic=1.0e-3*exp(tmp1)*orho(k)
  743. else
  744. qic=qi0
  745. end if
  746. tmp1=odtb*(qiz(k)-qic)*(1.0-exp(-alpha1*dtb))
  747. psaut(k)=amax1( 0.0,tmp1 )
  748. !c
  749. !c (2) BERGERON PROCESS TRANSFER OF CLOUD WATER TO SNOW (Psfw)
  750. !c this process only considered when -31 C < T < 0 C
  751. !c Lin (33) and Hsie (17)
  752. !c
  753. !c!
  754. !c! parama1 and parama2 functions must be user supplied
  755. !c!
  756. if( qlz(k) .gt. 1.0e-10 ) then
  757. temc1=amax1(-30.99,temcc(k))
  758. a1=parama1( temc1 )
  759. a2=parama2( temc1 )
  760. tmp1=1.0-a2
  761. !! change unit from cgs to mks
  762. a1=a1*0.001**tmp1
  763. !! dtberg is the time needed for a crystal to grow from 40 to 50 um
  764. !! odtberg=1.0/dtberg
  765. odtberg=(a1*tmp1)/(xmi50**tmp1-xmi40**tmp1)
  766. !
  767. !! compute terminal velocity of a 50 micron ice cystal
  768. !
  769. vti50=av_i*di50**bv_i*sqrho(k)
  770. !
  771. eiw=1.0
  772. save1=a1*xmi50**a2
  773. save2=0.25*pi*eiw*rho(k)*di50*di50*vti50
  774. !
  775. tmp2=( save1 + save2*qlz(k) )
  776. !
  777. !! maximum number of 50 micron crystals limited by the amount
  778. !! of supercool water
  779. !
  780. xni50mx=qlzodt(k)/tmp2
  781. !
  782. !! number of 50 micron crystals produced
  783. !
  784. xni50=qiz(k)*( 1.0-exp(-dtb*odtberg) )/xmi50
  785. xni50=amin1(xni50,xni50mx)
  786. !
  787. tmp3=odtb*tmp2/save2*( 1.0-exp(-save2*xni50*dtb) )
  788. psfw(k)=amin1( tmp3,qlzodt(k) )
  789. !c
  790. !c (3) REDUCTION OF CLOUD ICE BY BERGERON PROCESS (Psfi): Lin (34)
  791. !c this process only considered when -31 C < T < 0 C
  792. !c
  793. tmp1=xni50*xmi50-psfw(k)
  794. psfi(k)=amin1(tmp1,qizodt(k))
  795. end if
  796. !
  797. !
  798. if(qrz(k) .le. 0.0) go to 1000
  799. !
  800. ! Processes (4) and (5) only need when qrz > 0.0
  801. !
  802. !c
  803. !c (4) CLOUD ICE ACCRETION BY RAIN (Praci): Lin (25)
  804. !c produce PI
  805. !c
  806. eri=1.0
  807. save1=pio4*eri*xnor*av_r*sqrho(k)
  808. tmp1=save1*gambp3*olambdar(k)**bp3
  809. praci(k)=qizodt(k)*( 1.0-exp(-tmp1*dtb) )
  810. !c
  811. !c (5) RAIN ACCRETION BY CLOUD ICE (Piacr): Lin (26)
  812. !c
  813. tmp2=qiz(k)*save1*rho(k)*pio6*rhowater*gambp6*oxmi* &
  814. olambdar(k)**bp6
  815. piacr(k)=amin1( tmp2,qrzodt(k) )
  816. !
  817. 1000 continue
  818. !
  819. if(qsz(k) .le. 0.0) go to 1200
  820. !
  821. ! Compute the following processes only when qsz > 0.0
  822. !
  823. !c
  824. !c (6) ICE CRYSTAL ACCRETION BY SNOW (Psaci): Lin (22)
  825. !c
  826. esi=exp( 0.025*temcc(k) )
  827. save1 = aa_s(k)*sqrho(k)*N0_s(k)* &
  828. ggamma(bv_s(k)+tmp_sa(k))*olambdas(k)**(bv_s(k)+tmp_sa(k))
  829. tmp1=esi*save1
  830. psaci(k)=qizodt(k)*( 1.0-exp(-tmp1*dtb) )
  831. !c
  832. !c (7) CLOUD WATER ACCRETION BY SNOW (Psacw): Lin (24)
  833. !c
  834. esw=1.0
  835. tmp1=esw*save1
  836. psacw(k)=qlzodt(K)*( 1.0-exp(-tmp1*dtb) )
  837. !c
  838. !c (8) DEPOSITION/SUBLIMATION OF SNOW (Psdep/Pssub): Lin (31)
  839. !c includes consideration of ventilation effect
  840. !c
  841. tmpa=rvapor*xka(k)*tem(k)*tem(k)
  842. tmpb=xls*xls*rho(k)*qsiz(k)*diffwv(k)
  843. tmpc=tmpa*qsiz(k)*diffwv(k)
  844. abi=4.0*pi*cap_s(k)*(qvoqsiz(k)-1.0)*tmpc/(tmpa+tmpb)
  845. tmp1=av_s(k)*sqrho(k)*olambdas(k)**(5+bv_s(k)+2*mu_s)/visc(k)
  846. !---- YLIN, here there is some approximation assuming mu_s =1, so gamma(2)=1, etc.
  847. tmp2= abi*N0_s(k)*( vf1s*olambdas(k)*olambdas(k)+ &
  848. vf2s*schmidt(k)**0.33334* &
  849. ggamma(2.5+0.5*bv_s(k)+mu_s)*sqrt(tmp1) )
  850. tmp3=odtb*( qvz(k)-qsiz(k) )
  851. !
  852. if( tmp2 .le. 0.0) then
  853. tmp2=amax1( tmp2,tmp3)
  854. pssub(k)=amax1( tmp2,-qszodt(k) )
  855. psdep(k)=0.0
  856. else
  857. psdep(k)=amin1( tmp2,tmp3 )
  858. pssub(k)=0.0
  859. end if
  860. !
  861. if(qrz(k) .le. 0.0) go to 1200
  862. !
  863. ! Compute processes (9) and (10) only when qsz > 0.0 and qrz > 0.0
  864. ! these two terms need to be refined in the future, they should be equal
  865. !c
  866. !c (9) ACCRETION OF SNOW BY RAIN (Pracs): Lin (27)
  867. !c
  868. esr=1.0
  869. tmpa=olambdar(k)*olambdar(k)
  870. tmpb=olambdas(k)*olambdas(k)
  871. tmpc=olambdar(k)*olambdas(k)
  872. tmp1=pi*pi*esr*xnor*N0_s(k)*abs( vtr(k)-vts(k) )*orho(k)
  873. tmp2=tmpb*tmpb*olambdar(k)*(5.0*tmpb+2.0*tmpc+0.5*tmpa)
  874. tmp3=tmp1*rhosnow*tmp2
  875. pracs(k)=amin1( tmp3,qszodt(k) )
  876. pracs(k)=0.0
  877. !c
  878. !c (10) ACCRETION OF RAIN BY SNOW (Psacr): Lin (28)
  879. !c
  880. tmp3=tmpa*tmpa*olambdas(k)*(5.0*tmpa+2.0*tmpc+0.5*tmpb)
  881. tmp4=tmp1*rhowater*tmp3
  882. psacr(k)=amin1( tmp4,qrzodt(k) )
  883. !
  884. !c
  885. !c (2) FREEZING OF RAIN TO FORM GRAUPEL (pgfr): Lin (45), added to PI
  886. !c positive value
  887. !c Constant in Bigg freezing Aplume=Ap=0.66 /k
  888. !c Constant in raindrop freezing equ. Bplume=Bp=100./m/m/m/s
  889. !
  890. if (qrz(k) .gt. 1.e-8 ) then
  891. Bp=100.
  892. Ap=0.66
  893. tmp1=olambdar(k)*olambdar(k)*olambdar(k)
  894. tmp2=20.*pi*pi*Bp*xnor*rhowater*orho(k)* &
  895. (exp(-Ap*temcc(k))-1.0)*tmp1*tmp1*olambdar(k)
  896. pgfr(k)=amin1( tmp2,qrzodt(k) )
  897. else
  898. pgfr(k)=0
  899. endif
  900. 1200 continue
  901. !
  902. else
  903. !
  904. !***********************************************************************
  905. !********* snow production processes for T > 0 C **********
  906. !***********************************************************************
  907. !
  908. if (qsz(k) .le. 0.0) go to 1400
  909. !c
  910. !c (1) CLOUD WATER ACCRETION BY SNOW (Psacw): Lin (24)
  911. !c
  912. esw=1.0
  913. save1 =aa_s(k)*sqrho(k)*N0_s(k)* &
  914. ggamma(bv_s(k)+tmp_sa(k))*olambdas(k)**(bv_s(k)+tmp_sa(k))
  915. tmp1=esw*save1
  916. psacw(k)=qlzodt(k)*( 1.0-exp(-tmp1*dtb) )
  917. !c
  918. !c (2) ACCRETION OF RAIN BY SNOW (Psacr): Lin (28)
  919. !c
  920. esr=1.0
  921. tmpa=olambdar(k)*olambdar(k)
  922. tmpb=olambdas(k)*olambdas(k)
  923. tmpc=olambdar(k)*olambdas(k)
  924. tmp1=pi*pi*esr*xnor*N0_s(k)*abs( vtr(k)-vts(k) )*orho(k)
  925. tmp2=tmpa*tmpa*olambdas(k)*(5.0*tmpa+2.0*tmpc+0.5*tmpb)
  926. tmp3=tmp1*rhowater*tmp2
  927. psacr(k)=amin1( tmp3,qrzodt(k) )
  928. !c
  929. !c (3) MELTING OF SNOW (Psmlt): Lin (32)
  930. !c Psmlt is negative value
  931. !
  932. delrs=rs0(k)-qvz(k)
  933. term1=2.0*pi*orho(k)*( xlv*diffwv(k)*rho(k)*delrs- &
  934. xka(k)*temcc(k) )
  935. tmp1= av_s(k)*sqrho(k)*olambdas(k)**(5+bv_s(k)+2*mu_s)/visc(k)
  936. tmp2= N0_s(k)*( vf1s*olambdas(k)*olambdas(k)+ &
  937. vf2s*schmidt(k)**0.33334* &
  938. ggamma(2.5+0.5*bv_s(k)+mu_s)*sqrt(tmp1) )
  939. tmp3=term1*oxlf*tmp2-cwoxlf*temcc(k)*( psacw(k)+psacr(k) )
  940. tmp4=amin1(0.0,tmp3)
  941. psmlt(k)=amax1( tmp4,-qszodt(k) )
  942. !c
  943. !c (4) EVAPORATION OF MELTING SNOW (Psmltevp): HR (A27)
  944. !c but use Lin et al. coefficience
  945. !c Psmltevp is a negative value
  946. !c
  947. tmpa=rvapor*xka(k)*tem(k)*tem(k)
  948. tmpb=xlv*xlv*rho(k)*qswz(k)*diffwv(k)
  949. tmpc=tmpa*qswz(k)*diffwv(k)
  950. tmpd=amin1( 0.0,(qvoqswz(k)-0.90)*qswz(k)*odtb )
  951. abr=2.0*pi*(qvoqswz(k)-0.90)*tmpc/(tmpa+tmpb)
  952. !
  953. !**** allow evaporation to occur when RH less than 90%
  954. !**** here not using 100% because the evaporation cooling
  955. !**** of temperature is not taking into account yet; hence,
  956. !**** the qsw value is a little bit larger. This will avoid
  957. !**** evaporation can generate cloud.
  958. !
  959. tmp1=av_s(k)*sqrho(k)*olambdas(k)**(5+bv_s(k)+2*mu_s)/visc(k)
  960. tmp2= N0_s(k)*( vf1s*olambdas(k)*olambdas(k)+ &
  961. vf2s*schmidt(k)**0.33334* &
  962. ggamma(2.5+0.5*bv_s(k)+mu_s)*sqrt(tmp1) )
  963. tmp3=amin1(0.0,tmp2)
  964. tmp3=amax1( tmp3,tmpd )
  965. psmltevp(k)=amax1( tmp3,-qszodt(k) )
  966. 1400 continue
  967. !
  968. end if !---- end of snow/ice processes
  969. ! CALL wrf_debug ( 100 , 'module_ylin: finish ice/snow processes' )
  970. !***********************************************************************
  971. !********* rain production processes **********
  972. !***********************************************************************
  973. !c
  974. !c (1) AUTOCONVERSION OF RAIN (Praut): using Liu and Daum (2004)
  975. !c
  976. !---- YLIN, autoconversion use Liu and Daum (2004), unit = g cm-3 s-1, in the scheme kg/kg s-1, so
  977. if (qlz(k) .gt. 1e-6) then
  978. lamc(k) = (Nt_c*rhowater*pi*ggamma(4.+mu_c)/(6.*rho(k)*qlz(k))/ & !--- N(D) = N0*D^mu*exp(-lamc*D)
  979. ggamma(1+mu_c))**0.3333
  980. Dc_liu = (ggamma(6+1+mu_c)/ggamma(1+mu_c))**(1./6.)/lamc(k) !----- R6 in m
  981. if (Dc_liu .gt. R6c) then
  982. disp = 1./(mu_c+1.) !--- square of relative dispersion
  983. eta = (0.75/pi/(1e-3*rhowater))**2*1.9e11*((1+3*disp)*(1+4*disp)*&
  984. (1+5*disp)/(1+disp)/(1+2*disp))
  985. praut(k) = eta*(1e-3*rho(k)*qlz(k))**3/(1e-6*Nt_c) !--- g cm-3 s-1
  986. praut(k) = praut(k)/(1e-3*rho(k)) !--- kg kg-1 s-1
  987. else
  988. praut(k) = 0.0
  989. endif
  990. else
  991. praut(k) = 0.0
  992. endif
  993. !c
  994. !c (2) ACCRETION OF CLOUD WATER BY RAIN (Pracw): Lin (51)
  995. !c
  996. erw=1.0
  997. tmp1=pio4*erw*xnor*av_r*sqrho(k)* &
  998. gambp3*olambdar(k)**bp3
  999. pracw(k)=qlzodt(k)*( 1.0-exp(-tmp1*dtb) )
  1000. !c
  1001. !c (3) EVAPORATION OF RAIN (Prevp): Lin (52)
  1002. !c Prevp is negative value
  1003. !c
  1004. !c Sw=qvoqsw : saturation ratio
  1005. !c
  1006. tmpa=rvapor*xka(k)*tem(k)*tem(k)
  1007. tmpb=xlv*xlv*rho(k)*qswz(k)*diffwv(k)
  1008. tmpc=tmpa*qswz(k)*diffwv(k)
  1009. tmpd=amin1(0.0,(qvoqswz(k)-0.90)*qswz(k)*odtb)
  1010. abr=2.0*pi*(qvoqswz(k)-0.90)*tmpc/(tmpa+tmpb)
  1011. tmp1=av_r*sqrho(k)*olambdar(k)**bp5/visc(k)
  1012. tmp2=abr*xnor*( vf1r*olambdar(k)*olambdar(k)+ &
  1013. vf2r*schmidt(k)**0.33334*gambp5o2*sqrt(tmp1) )
  1014. tmp3=amin1( 0.0,tmp2 )
  1015. tmp3=amax1( tmp3,tmpd )
  1016. prevp(k)=amax1( tmp3,-qrzodt(k) )
  1017. ! CALL wrf_debug ( 100 , 'module_ylin: finish rain processes' )
  1018. !c
  1019. !c**********************************************************************
  1020. !c***** combine all processes together and avoid negative *****
  1021. !c***** water substances
  1022. !***********************************************************************
  1023. !c
  1024. if ( temcc(k) .lt. 0.0) then
  1025. !c
  1026. !c combined water vapor depletions
  1027. !c
  1028. tmp=psdep(k)
  1029. if ( tmp .gt. qvzodt(k) ) then
  1030. factor=qvzodt(k)/tmp
  1031. psdep(k)=psdep(k)*factor
  1032. end if
  1033. !c
  1034. !c combined cloud water depletions
  1035. !c
  1036. tmp=praut(k)+psacw(k)+psfw(k)+pracw(k)
  1037. if ( tmp .gt. qlzodt(k) ) then
  1038. factor=qlzodt(k)/tmp
  1039. praut(k)=praut(k)*factor
  1040. psacw(k)=psacw(k)*factor
  1041. psfw(k)=psfw(k)*factor
  1042. pracw(k)=pracw(k)*factor
  1043. end if
  1044. !c
  1045. !c combined cloud ice depletions
  1046. !c
  1047. tmp=psaut(k)+psaci(k)+praci(k)+psfi(k)
  1048. if (tmp .gt. qizodt(k) ) then
  1049. factor=qizodt(k)/tmp
  1050. psaut(k)=psaut(k)*factor
  1051. psaci(k)=psaci(k)*factor
  1052. praci(k)=praci(k)*factor
  1053. psfi(k)=psfi(k)*factor
  1054. endif
  1055. !c
  1056. !c combined all rain processes
  1057. !c
  1058. tmp_r=piacr(k)+psacr(k)-prevp(k)-praut(k)-pracw(k)+pgfr(k)
  1059. if (tmp_r .gt. qrzodt(k) ) then
  1060. factor=qrzodt(k)/tmp_r
  1061. piacr(k)=piacr(k)*factor
  1062. psacr(k)=psacr(k)*factor
  1063. prevp(k)=prevp(k)*factor
  1064. pgfr(k)=pgfr(k)*factor
  1065. endif
  1066. !c
  1067. !c combined all snow processes
  1068. !c
  1069. tmp_s=-pssub(k)-(psaut(k)+psaci(k)+psacw(k)+psfw(k)+pgfr(k)+ &
  1070. psfi(k)+praci(k)+piacr(k)+ &
  1071. psdep(k)+psacr(k)-pracs(k))
  1072. if ( tmp_s .gt. qszodt(k) ) then
  1073. factor=qszodt(k)/tmp_s
  1074. pssub(k)=pssub(k)*factor
  1075. Pracs(k)=Pracs(k)*factor
  1076. endif
  1077. !c
  1078. !c calculate new water substances, thetae, tem, and qvsbar
  1079. !c
  1080. pvapor(k)=-pssub(k)-psdep(k)-prevp(k)
  1081. qvz(k)=amax1( qvmin,qvz(k)+dtb*pvapor(k) )
  1082. pclw(k)=-praut(k)-pracw(k)-psacw(k)-psfw(k)
  1083. qlz(k)=amax1( 0.0,qlz(k)+dtb*pclw(k) )
  1084. pcli(k)=-psaut(k)-psfi(k)-psaci(k)-praci(k)
  1085. qiz(k)=amax1( 0.0,qiz(k)+dtb*pcli(k) )
  1086. tmp_r=piacr(k)+psacr(k)-prevp(k)-praut(k)-pracw(k)+pgfr(k)-pracs(k)
  1087. prain(k)=-tmp_r
  1088. qrz(k)=amax1( 0.0,qrz(k)+dtb*prain(k) )
  1089. tmp_s=-pssub(k)-(psaut(k)+psaci(k)+psacw(k)+psfw(k)+pgfr(k)+ &
  1090. psfi(k)+praci(k)+piacr(k)+ &
  1091. psdep(k)+psacr(k)-pracs(k))
  1092. psnow(k)=-tmp_s
  1093. qsz(k)=amax1( 0.0,qsz(k)+dtb*psnow(k) )
  1094. qschg(k)=qschg(k)+psnow(k)
  1095. qschg(k)=psnow(k)
  1096. tmp=ocp/tothz(k)*xLf*qschg(k)
  1097. theiz(k)=theiz(k)+dtb*tmp
  1098. thz(k)=theiz(k)-(xLvocp*qvz(k)-xLfocp*qiz(k))/tothz(k)
  1099. tem(k)=thz(k)*tothz(k)
  1100. temcc(k)=tem(k)-273.15
  1101. if( temcc(k) .lt. -40.0 ) qswz(k)=qsiz(k)
  1102. qlpqi=qlz(k)+qiz(k)
  1103. if ( qlpqi .eq. 0.0 ) then
  1104. qvsbar(k)=qsiz(k)
  1105. else
  1106. qvsbar(k)=( qiz(k)*qsiz(k)+qlz(k)*qswz(k) )/qlpqi
  1107. endif
  1108. !
  1109. else !>0 C
  1110. !c
  1111. !c combined cloud water depletions
  1112. !c
  1113. tmp=praut(k)+psacw(k)+pracw(k)
  1114. if ( tmp .gt. qlzodt(k) ) then
  1115. factor=qlzodt(k)/tmp
  1116. praut(k)=praut(k)*factor
  1117. psacw(k)=psacw(k)*factor
  1118. pracw(k)=pracw(k)*factor
  1119. end if
  1120. !c
  1121. !c combined all snow processes
  1122. !c
  1123. tmp_s=-(psmlt(k)+psmltevp(k))
  1124. if (tmp_s .gt. qszodt(k) ) then
  1125. factor=qszodt(k)/tmp_s
  1126. psmlt(k)=psmlt(k)*factor
  1127. psmltevp(k)=psmltevp(k)*factor
  1128. endif
  1129. !c
  1130. !c combined all rain processes
  1131. !c
  1132. tmp_r=-prevp(k)-(praut(k)+pracw(k)+psacw(k)-psmlt(k))
  1133. if (tmp_r .gt. qrzodt(k) ) then
  1134. factor=qrzodt(k)/tmp_r
  1135. prevp(k)=prevp(k)*factor
  1136. endif
  1137. !c
  1138. !c calculate new water substances and thetae
  1139. !c
  1140. pvapor(k)=-psmltevp(k)-prevp(k)
  1141. qvz(k)=amax1( qvmin,qvz(k)+dtb*pvapor(k))
  1142. pclw(k)=-praut(k)-pracw(k)-psacw(k)
  1143. qlz(k)=amax1( 0.0,qlz(k)+dtb*pclw(k) )
  1144. pcli(k)=0.0
  1145. qiz(k)=amax1( 0.0,qiz(k)+dtb*pcli(k) )
  1146. tmp_r=-prevp(k)-(praut(k)+pracw(k)+psacw(k)-psmlt(k))
  1147. prain(k)=-tmp_r
  1148. tmpqrz=qrz(k)
  1149. qrz(k)=amax1( 0.0,qrz(k)+dtb*prain(k) )
  1150. tmp_s=-(psmlt(k)+psmltevp(k))
  1151. psnow(k)=-tmp_s
  1152. qsz(k)=amax1( 0.0,qsz(k)+dtb*psnow(k) )
  1153. qschg(k)=psnow(k)
  1154. !
  1155. tmp=ocp/tothz(k)*xLf*qschg(k)
  1156. theiz(k)=theiz(k)+dtb*tmp
  1157. thz(k)=theiz(k)-(xLvocp*qvz(k)-xLfocp*qiz(k))/tothz(k)
  1158. tem(k)=thz(k)*tothz(k)
  1159. temcc(k)=tem(k)-273.15
  1160. es=1000.*svp1*exp( svp2*temcc(k)/(tem(k)-svp3) )
  1161. qswz(k)=ep2*es/(prez(k)-es)
  1162. qsiz(k)=qswz(k)
  1163. qvsbar(k)=qswz(k)
  1164. !
  1165. end if
  1166. ! CALL wrf_debug ( 100 , 'module_ylin: finish sum of all processes' )
  1167. !
  1168. !***********************************************************************
  1169. !********** saturation adjustment **********
  1170. !***********************************************************************
  1171. !
  1172. ! allow supersaturation exits linearly from 0% at 500 mb to 50%
  1173. ! above 300 mb
  1174. ! 5.0e-5=1.0/(500mb-300mb)
  1175. !
  1176. rsat=1.0
  1177. if( qvz(k)+qlz(k)+qiz(k) .lt. rsat*qvsbar(k) ) then
  1178. !c
  1179. !c unsaturated
  1180. !c
  1181. qvz(k)=qvz(k)+qlz(k)+qiz(k)
  1182. qlz(k)=0.0
  1183. qiz(k)=0.0
  1184. thz(k)=theiz(k)-(xLvocp*qvz(k)-xLfocp*qiz(k))/tothz(k)
  1185. tem(k)=thz(k)*tothz(k)
  1186. temcc(k)=tem(k)-273.15
  1187. go to 1800
  1188. !
  1189. else
  1190. !c
  1191. !c saturated
  1192. !c
  1193. pladj(k)=qlz(k)
  1194. piadj(k)=qiz(k)
  1195. !
  1196. CALL satadj(qvz, qlz, qiz, prez, theiz, thz, tothz, kts, kte, &
  1197. k, xLvocp, xLfocp, episp0k, EP2,SVP1,SVP2,SVP3,SVPT0)
  1198. !
  1199. pladj(k)=odtb*(qlz(k)-pladj(k))
  1200. piadj(k)=odtb*(qiz(k)-piadj(k))
  1201. !
  1202. pclw(k)=pclw(k)+pladj(k)
  1203. pcli(k)=pcli(k)+piadj(k)
  1204. pvapor(k)=pvapor(k)-( pladj(k)+piadj(k) )
  1205. !
  1206. thz(k)=theiz(k)-(xLvocp*qvz(k)-xLfocp*qiz(k))/tothz(k)
  1207. tem(k)=thz(k)*tothz(k)
  1208. temcc(k)=tem(k)-273.15
  1209. es=1000.*svp1*exp( svp2*temcc(k)/(tem(k)-svp3) )
  1210. qswz(k)=ep2*es/(prez(k)-es)
  1211. if (tem(k) .lt. 273.15 ) then
  1212. es=1000.*svp1*exp( 21.8745584*(tem(k)-273.16)/(tem(k)-7.66) )
  1213. qsiz(k)=ep2*es/(prez(k)-es)
  1214. if (temcc(k) .lt. -40.0) qswz(k)=qsiz(k)
  1215. else
  1216. qsiz(k)=qswz(k)
  1217. endif
  1218. qlpqi=qlz(k)+qiz(k)
  1219. if ( qlpqi .eq. 0.0 ) then
  1220. qvsbar(k)=qsiz(k)
  1221. else
  1222. qvsbar(k)=( qiz(k)*qsiz(k)+qlz(k)*qswz(k) )/qlpqi
  1223. endif
  1224. end if
  1225. !
  1226. !***********************************************************************
  1227. !***** melting and freezing of cloud ice and cloud water *****
  1228. !***********************************************************************
  1229. qlpqi=qlz(k)+qiz(k)
  1230. if(qlpqi .le. 0.0) go to 1800
  1231. !
  1232. !c
  1233. !c (1) HOMOGENEOUS NUCLEATION WHEN T< -40 C (Pihom)
  1234. !c
  1235. if(temcc(k) .lt. -40.0) pihom(k)=qlz(k)*odtb
  1236. !c
  1237. !c (2) MELTING OF ICE CRYSTAL WHEN T> 0 C (Pimlt)
  1238. !c
  1239. if(temcc(k) .gt. 0.0) pimlt(k)=qiz(k)*odtb
  1240. !c
  1241. !c (3) PRODUCTION OF CLOUD ICE BY BERGERON PROCESS (Pidw): Hsie (p957)
  1242. !c this process only considered when -31 C < T < 0 C
  1243. !c
  1244. if(temcc(k) .lt. 0.0 .and. temcc(k) .gt. -31.0) then
  1245. !c!
  1246. !c! parama1 and parama2 functions must be user supplied
  1247. !c!
  1248. a1=parama1( temcc(k) )
  1249. a2=parama2( temcc(k) )
  1250. !! change unit from cgs to mks
  1251. a1=a1*0.001**(1.0-a2)
  1252. xnin=xni0*exp(-bni*temcc(k))
  1253. pidw(k)=xnin*orho(k)*(a1*xmnin**a2)
  1254. end if
  1255. !
  1256. pcli(k)=pcli(k)+pihom(k)-pimlt(k)+pidw(k)
  1257. pclw(k)=pclw(k)-pihom(k)+pimlt(k)-pidw(k)
  1258. qlz(k)=amax1( 0.0,qlz(k)+dtb*(-pihom(k)+pimlt(k)-pidw(k)) )
  1259. qiz(k)=amax1( 0.0,qiz(k)+dtb*(pihom(k)-pimlt(k)+pidw(k)) )
  1260. !
  1261. CALL satadj(qvz, qlz, qiz, prez, theiz, thz, tothz, kts, kte, &
  1262. k, xLvocp, xLfocp, episp0k ,EP2,SVP1,SVP2,SVP3,SVPT0)
  1263. thz(k)=theiz(k)-(xLvocp*qvz(k)-xLfocp*qiz(k))/tothz(k)
  1264. tem(k)=thz(k)*tothz(k)
  1265. temcc(k)=tem(k)-273.15
  1266. es=1000.*svp1*exp( svp2*temcc(k)/(tem(k)-svp3) )
  1267. qswz(k)=ep2*es/(prez(k)-es)
  1268. if (tem(k) .lt. 273.15 ) then
  1269. es=1000.*svp1*exp( 21.8745584*(tem(k)-273.16)/(tem(k)-7.66) )
  1270. qsiz(k)=ep2*es/(prez(k)-es)
  1271. if (temcc(k) .lt. -40.0) qswz(k)=qsiz(k)
  1272. else
  1273. qsiz(k)=qswz(k)
  1274. endif
  1275. qlpqi=qlz(k)+qiz(k)
  1276. if ( qlpqi .eq. 0.0 ) then
  1277. qvsbar(k)=qsiz(k)
  1278. else
  1279. qvsbar(k)=( qiz(k)*qsiz(k)+qlz(k)*qswz(k) )/qlpqi
  1280. endif
  1281. 1800 continue
  1282. !
  1283. !***********************************************************************
  1284. !********** integrate the productions of rain and snow **********
  1285. !***********************************************************************
  1286. !
  1287. 2000 continue
  1288. !
  1289. !**** below if qv < qvmin then qv=qvmin, ql=0.0, and qi=0.0
  1290. !
  1291. do k=kts+1,kte
  1292. if ( qvz(k) .lt. qvmin ) then
  1293. qlz(k)=0.0
  1294. qiz(k)=0.0
  1295. qvz(k)=amax1( qvmin,qvz(k)+qlz(k)+qiz(k) )
  1296. end if
  1297. enddo
  1298. !
  1299. ! CALL wrf_debug ( 100 , 'module_ylin: finish saturation adjustment' )
  1300. END SUBROUTINE clphy1d_ylin
  1301. !---------------------------------------------------------------------
  1302. ! SATURATED ADJUSTMENT
  1303. !---------------------------------------------------------------------
  1304. SUBROUTINE satadj(qvz, qlz, qiz, prez, theiz, thz, tothz, &
  1305. kts, kte, k, xLvocp, xLfocp, episp0k, EP2,SVP1,SVP2,SVP3,SVPT0)
  1306. !---------------------------------------------------------------------
  1307. IMPLICIT NONE
  1308. !---------------------------------------------------------------------
  1309. ! This program use Newton's method for finding saturated temperature
  1310. ! and saturation mixing ratio.
  1311. !
  1312. ! In this saturation adjustment scheme we assume
  1313. ! (1) the saturation mixing ratio is the mass weighted average of
  1314. ! sat

Large files files are truncated, but you can click here to view the full file