PageRenderTime 63ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/wrfv2_fire/phys/module_mp_lin.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 2701 lines | 1365 code | 245 blank | 1091 comment | 91 complexity | 8ed673c9633037adad62d5d18307c8af 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. !
  3. MODULE module_mp_lin
  4. USE module_wrf_error
  5. !
  6. REAL , PARAMETER, PRIVATE :: RH = 1.0
  7. ! REAL , PARAMETER, PRIVATE :: episp0 = 0.622*611.21
  8. REAL , PARAMETER, PRIVATE :: xnor = 8.0e6
  9. REAL , PARAMETER, PRIVATE :: xnos = 3.0e6
  10. ! Lin
  11. ! REAL , PARAMETER, PRIVATE :: xnog = 4.0e4
  12. ! REAL , PARAMETER, PRIVATE :: rhograul = 917.
  13. ! Hobbs
  14. REAL , PARAMETER, PRIVATE :: xnog = 4.0e6
  15. REAL , PARAMETER, PRIVATE :: rhograul = 400.
  16. !
  17. REAL , PARAMETER, PRIVATE :: &
  18. qi0 = 1.0e-3, ql0 = 7.0e-4, qs0 = 6.0E-4, &
  19. xmi50 = 4.8e-10, xmi40 = 2.46e-10, &
  20. constb = 0.8, constd = 0.25, &
  21. o6 = 1./6., cdrag = 0.6, &
  22. avisc = 1.49628e-6, adiffwv = 8.7602e-5, &
  23. axka = 1.4132e3, di50 = 1.0e-4, xmi = 4.19e-13, &
  24. cw = 4.187e3, vf1s = 0.78, vf2s = 0.31, &
  25. xni0 = 1.0e-2, xmnin = 1.05e-18, bni = 0.5, &
  26. ci = 2.093e3
  27. CONTAINS
  28. !-------------------------------------------------------------------
  29. ! Lin et al., 1983, JAM, 1065-1092, and
  30. ! Rutledge and Hobbs, 1984, JAS, 2949-2972
  31. ! May 2009 - Changes and corrections from P. Blossey (U. Washington)
  32. !-------------------------------------------------------------------
  33. SUBROUTINE lin_et_al(th &
  34. ,qv, ql, qr &
  35. ,qi, qs &
  36. ,rho, pii, p &
  37. ,dt_in &
  38. ,z,ht, dz8w &
  39. ,grav, cp, Rair, rvapor &
  40. ,XLS, XLV, XLF, rhowater, rhosnow &
  41. ,EP2,SVP1,SVP2,SVP3,SVPT0 &
  42. , RAINNC, RAINNCV &
  43. , SNOWNC, SNOWNCV &
  44. , GRAUPELNC, GRAUPELNCV, SR &
  45. ,ids,ide, jds,jde, kds,kde &
  46. ,ims,ime, jms,jme, kms,kme &
  47. ,its,ite, jts,jte, kts,kte &
  48. ! Optional
  49. ,qlsink, precr, preci, precs, precg &
  50. , F_QG,F_QNDROP &
  51. , qg, qndrop &
  52. )
  53. !-------------------------------------------------------------------
  54. IMPLICIT NONE
  55. !-------------------------------------------------------------------
  56. !
  57. ! Shuhua 12/17/99
  58. !
  59. INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde , &
  60. ims,ime, jms,jme, kms,kme , &
  61. its,ite, jts,jte, kts,kte
  62. REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), &
  63. INTENT(INOUT) :: &
  64. th, &
  65. qv, &
  66. ql, &
  67. qr
  68. !
  69. REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), &
  70. INTENT(IN ) :: &
  71. rho, &
  72. pii, &
  73. p, &
  74. dz8w
  75. REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), &
  76. INTENT(IN ) :: z
  77. REAL , DIMENSION( ims:ime , jms:jme ) , INTENT(IN) :: ht
  78. REAL, INTENT(IN ) :: dt_in, &
  79. grav, &
  80. Rair, &
  81. rvapor, &
  82. cp, &
  83. XLS, &
  84. XLV, &
  85. XLF, &
  86. rhowater, &
  87. rhosnow
  88. REAL, INTENT(IN ) :: EP2,SVP1,SVP2,SVP3,SVPT0
  89. REAL, DIMENSION( ims:ime , jms:jme ), &
  90. INTENT(INOUT) :: RAINNC, &
  91. RAINNCV, &
  92. SR
  93. ! Optional
  94. REAL, DIMENSION( ims:ime , jms:jme ), &
  95. OPTIONAL, &
  96. INTENT(INOUT) :: SNOWNC, &
  97. SNOWNCV, &
  98. GRAUPELNC, &
  99. GRAUPELNCV
  100. REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), &
  101. OPTIONAL, &
  102. INTENT(INOUT) :: &
  103. qi, &
  104. qs, &
  105. qg, &
  106. qndrop
  107. REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), &
  108. OPTIONAL, INTENT(OUT ) :: &
  109. qlsink, & ! cloud water conversion to rain (/s)
  110. precr, & ! rain precipitation rate at all levels (kg/m2/s)
  111. preci, & ! ice precipitation rate at all levels (kg/m2/s)
  112. precs, & ! snow precipitation rate at all levels (kg/m2/s)
  113. precg ! graupel precipitation rate at all levels (kg/m2/s)
  114. LOGICAL, INTENT(IN), OPTIONAL :: F_QG, F_QNDROP
  115. ! LOCAL VAR
  116. INTEGER :: min_q, max_q
  117. REAL, DIMENSION( its:ite , jts:jte ) &
  118. :: rain, snow, graupel,ice
  119. REAL, DIMENSION( kts:kte ) :: qvz, qlz, qrz, &
  120. qiz, qsz, qgz, &
  121. thz, &
  122. tothz, rhoz, &
  123. orhoz, sqrhoz, &
  124. prez, zz, &
  125. precrz, preciz, precsz, precgz, &
  126. qndropz, &
  127. dzw, preclw
  128. LOGICAL :: flag_qg, flag_qndrop
  129. !
  130. REAL :: dt, pptrain, pptsnow, pptgraul, rhoe_s, &
  131. gindex, pptice
  132. real :: qndropconst
  133. INTEGER :: i,j,k
  134. !
  135. flag_qg = .false.
  136. flag_qndrop = .false.
  137. IF ( PRESENT ( f_qg ) ) flag_qg = f_qg
  138. IF ( PRESENT ( f_qndrop ) ) flag_qndrop = f_qndrop
  139. !
  140. dt=dt_in
  141. rhoe_s=1.29
  142. qndropconst=100.e6 !sg
  143. gindex=1.0
  144. IF (.not.flag_qg) gindex=0.
  145. j_loop: DO j = jts, jte
  146. i_loop: DO i = its, ite
  147. !
  148. !- write data from 3-D to 1-D
  149. !
  150. DO k = kts, kte
  151. qvz(k)=qv(i,k,j)
  152. qlz(k)=ql(i,k,j)
  153. qrz(k)=qr(i,k,j)
  154. thz(k)=th(i,k,j)
  155. !
  156. rhoz(k)=rho(i,k,j)
  157. orhoz(k)=1./rhoz(k)
  158. prez(k)=p(i,k,j)
  159. sqrhoz(k)=sqrt(rhoe_s*orhoz(k))
  160. tothz(k)=pii(i,k,j)
  161. zz(k)=z(i,k,j)
  162. dzw(k)=dz8w(i,k,j)
  163. END DO
  164. IF (flag_qndrop .AND. PRESENT( qndrop )) THEN
  165. DO k = kts, kte
  166. qndropz(k)=qndrop(i,k,j)
  167. ENDDO
  168. ELSE
  169. DO k = kts, kte
  170. qndropz(k)=qndropconst
  171. ENDDO
  172. ENDIF
  173. DO k = kts, kte
  174. qiz(k)=qi(i,k,j)
  175. qsz(k)=qs(i,k,j)
  176. ENDDO
  177. IF ( flag_qg .AND. PRESENT( qg ) ) THEN
  178. DO k = kts, kte
  179. qgz(k)=qg(i,k,j)
  180. ENDDO
  181. ELSE
  182. DO k = kts, kte
  183. qgz(k)=0.
  184. ENDDO
  185. ENDIF
  186. !
  187. pptrain=0.
  188. pptsnow=0.
  189. pptgraul=0.
  190. pptice=0.
  191. CALL clphy1d( dt, qvz, qlz, qrz, qiz, qsz, qgz, &
  192. qndropz,flag_qndrop, &
  193. thz, tothz, rhoz, orhoz, sqrhoz, &
  194. prez, zz, dzw, ht(I,J), preclw, &
  195. precrz, preciz, precsz, precgz, &
  196. pptrain, pptsnow, pptgraul, pptice, &
  197. grav, cp, Rair, rvapor, gindex, &
  198. XLS, XLV, XLF, rhowater, rhosnow, &
  199. EP2,SVP1,SVP2,SVP3,SVPT0, &
  200. kts, kte, i, j )
  201. !
  202. ! Precipitation from cloud microphysics -- only for one time step
  203. !
  204. ! unit is transferred from m to mm
  205. !
  206. rain(i,j)=pptrain
  207. snow(i,j)=pptsnow
  208. graupel(i,j)=pptgraul
  209. ice(i,j)=pptice
  210. sr(i,j)=(pptice+pptsnow+pptgraul)/(pptice+pptsnow+pptgraul+pptrain+1.e-12)
  211. !
  212. RAINNCV(i,j)= pptrain + pptsnow + pptgraul + pptice
  213. RAINNC(i,j)=RAINNC(i,j) + pptrain + pptsnow + pptgraul + pptice
  214. IF(PRESENT(SNOWNCV))SNOWNCV(i,j)= pptsnow + pptice
  215. IF(PRESENT(SNOWNC))SNOWNC(i,j)=SNOWNC(i,j) + pptsnow + pptice
  216. IF(PRESENT(GRAUPELNCV))GRAUPELNCV(i,j)= pptgraul
  217. IF(PRESENT(GRAUPELNC))GRAUPELNC(i,j)=GRAUPELNC(i,j) + pptgraul
  218. !
  219. !- update data from 1-D back to 3-D
  220. !
  221. !
  222. IF ( present(qlsink) .and. present(precr) ) THEN !sg beg
  223. DO k = kts, kte
  224. if(ql(i,k,j)>1.e-20) then
  225. qlsink(i,k,j)=-preclw(k)/ql(i,k,j)
  226. else
  227. qlsink(i,k,j)=0.
  228. endif
  229. precr(i,k,j)=precrz(k)
  230. END DO
  231. END IF !sg end
  232. DO k = kts, kte
  233. qv(i,k,j)=qvz(k)
  234. ql(i,k,j)=qlz(k)
  235. qr(i,k,j)=qrz(k)
  236. th(i,k,j)=thz(k)
  237. END DO
  238. !
  239. IF ( flag_qndrop .AND. PRESENT( qndrop ) ) THEN !sg beg
  240. DO k = kts, kte
  241. qndrop(i,k,j)=qndropz(k)
  242. ENDDO
  243. END IF !sg end
  244. DO k = kts, kte
  245. qi(i,k,j)=qiz(k)
  246. qs(i,k,j)=qsz(k)
  247. ENDDO
  248. IF ( present(preci) ) THEN !sg beg
  249. DO k = kts, kte
  250. preci(i,k,j)=preciz(k)
  251. ENDDO
  252. END IF
  253. IF ( present(precs) ) THEN
  254. DO k = kts, kte
  255. precs(i,k,j)=precsz(k)
  256. ENDDO
  257. END IF !sg end
  258. IF ( flag_qg .AND. PRESENT( qg ) ) THEN
  259. DO k = kts, kte
  260. qg(i,k,j)=qgz(k)
  261. ENDDO
  262. IF ( present(precg) ) THEN !sg beg
  263. DO k = kts, kte
  264. precg(i,k,j)=precgz(k)
  265. ENDDO !sg end
  266. END IF
  267. ELSE !sg beg
  268. IF ( present(precg) ) precg(i,:,j)=0. !sg end
  269. ENDIF
  270. !
  271. ENDDO i_loop
  272. ENDDO j_loop
  273. END SUBROUTINE lin_et_al
  274. !-----------------------------------------------------------------------
  275. SUBROUTINE clphy1d(dt, qvz, qlz, qrz, qiz, qsz, qgz, &
  276. qndropz,flag_qndrop, &
  277. thz, tothz, rho, orho, sqrho, &
  278. prez, zz, dzw, zsfc, preclw, &
  279. precrz, preciz, precsz, precgz, &
  280. pptrain, pptsnow, pptgraul, &
  281. pptice, grav, cp, Rair, rvapor, gindex, &
  282. XLS, XLV, XLF, rhowater, rhosnow, &
  283. EP2,SVP1,SVP2,SVP3,SVPT0, &
  284. kts, kte, i, j )
  285. !-----------------------------------------------------------------------
  286. IMPLICIT NONE
  287. !-----------------------------------------------------------------------
  288. ! This program handles the vertical 1-D cloud micphysics
  289. !-----------------------------------------------------------------------
  290. ! avisc: constant in empirical formular for dynamic viscosity of air
  291. ! =1.49628e-6 [kg/m/s] = 1.49628e-5 [g/cm/s]
  292. ! adiffwv: constant in empirical formular for diffusivity of water
  293. ! vapor in air
  294. ! = 8.7602e-5 [kgm/s3] = 8.7602 [gcm/s3]
  295. ! axka: constant in empirical formular for thermal conductivity of air
  296. ! = 1.4132e3 [m2/s2/K] = 1.4132e7 [cm2/s2/K]
  297. ! qi0: mixing ratio threshold for cloud ice aggregation [kg/kg]
  298. ! xmi50: mass of a 50 micron ice crystal
  299. ! = 4.8e-10 [kg] =4.8e-7 [g]
  300. ! xmi40: mass of a 40 micron ice crystal
  301. ! = 2.46e-10 [kg] = 2.46e-7 [g]
  302. ! di50: diameter of a 50 micro (radius) ice crystal
  303. ! =1.0e-4 [m]
  304. ! xmi: mass of one cloud ice crystal
  305. ! =4.19e-13 [kg] = 4.19e-10 [g]
  306. ! oxmi=1.0/xmi
  307. !
  308. ! xni0=1.0e-2 [m-3] The value given in Lin et al. is wrong.(see
  309. ! Hsie et al.(1980) and Rutledge and Hobbs(1983) )
  310. ! bni=0.5 [K-1]
  311. ! xmnin: mass of a natural ice nucleus
  312. ! = 1.05e-18 [kg] = 1.05e-15 [g] This values is suggested by
  313. ! Hsie et al. (1980)
  314. ! = 1.0e-12 [kg] suggested by Rutlegde and Hobbs (1983)
  315. ! rhowater: density of water=1.0 g/cm3=1000.0 kg/m3
  316. ! consta: constant in empirical formular for terminal
  317. ! velocity of raindrop
  318. ! =2115.0 [cm**(1-b)/s] = 2115.0*0.01**(1-b) [m**(1-b)/s]
  319. ! constb: constant in empirical formular for terminal
  320. ! velocity of raindrop
  321. ! =0.8
  322. ! xnor: intercept parameter of the raindrop size distribution
  323. ! = 0.08 cm-4 = 8.0e6 m-4
  324. ! araut: time sacle for autoconversion of cloud water to raindrops
  325. ! =1.0e-3 [s-1]
  326. ! ql0: mixing ratio threshold for cloud watercoalescence [kg/kg]
  327. ! vf1r: ventilation factors for rain =0.78
  328. ! vf2r: ventilation factors for rain =0.31
  329. ! rhosnow: density of snow=0.1 g/cm3=100.0 kg/m3
  330. ! constc: constant in empirical formular for terminal
  331. ! velocity of snow
  332. ! =152.93 [cm**(1-d)/s] = 152.93*0.01**(1-d) [m**(1-d)/s]
  333. ! constd: constant in empirical formular for terminal
  334. ! velocity of snow
  335. ! =0.25
  336. ! xnos: intercept parameter of the snowflake size distribution
  337. ! vf1s: ventilation factors for snow =0.78
  338. ! vf2s: ventilation factors for snow =0.31
  339. !
  340. !----------------------------------------------------------------------
  341. INTEGER, INTENT(IN ) :: kts, kte, i, j
  342. REAL, DIMENSION( kts:kte ), &
  343. INTENT(INOUT) :: qvz, qlz, qrz, qiz, qsz, &
  344. qndropz, &
  345. qgz, thz
  346. REAL, DIMENSION( kts:kte ), &
  347. INTENT(IN ) :: tothz, rho, orho, sqrho, &
  348. prez, zz, dzw
  349. REAL, INTENT(IN ) :: dt, grav, cp, Rair, rvapor, &
  350. XLS, XLV, XLF, rhowater, &
  351. rhosnow,EP2,SVP1,SVP2,SVP3,SVPT0
  352. REAL, DIMENSION( kts:kte ), INTENT(OUT) :: preclw, &
  353. precrz, preciz, precsz, precgz
  354. REAL, INTENT(INOUT) :: pptrain, pptsnow, pptgraul, pptice
  355. REAL, INTENT(IN ) :: zsfc
  356. logical, intent(in) :: flag_qndrop !sg
  357. ! local vars
  358. REAL :: obp4, bp3, bp5, bp6, odp4, &
  359. dp3, dp5, dp5o2
  360. ! temperary vars
  361. REAL :: tmp, tmp0, tmp1, tmp2,tmp3, &
  362. tmp4,delta2,delta3, delta4, &
  363. tmpa,tmpb,tmpc,tmpd,alpha1, &
  364. qic, abi,abr, abg, odtberg, &
  365. vti50,eiw,eri,esi,esr, esw, &
  366. erw,delrs,term0,term1,araut, &
  367. constg2, vf1r, vf2r,alpha2, &
  368. Ap, Bp, egw, egi, egs, egr, &
  369. constg, gdelta4, g1sdelt4, &
  370. factor, tmp_r, tmp_s,tmp_g, &
  371. qlpqi, rsat, a1, a2, xnin
  372. INTEGER :: k
  373. !
  374. REAL, DIMENSION( kts:kte ) :: oprez, tem, temcc, theiz, qswz, &
  375. qsiz, qvoqswz, qvoqsiz, qvzodt, &
  376. qlzodt, qizodt, qszodt, qrzodt, &
  377. qgzodt
  378. REAL, DIMENSION( kts:kte ) :: psnow, psaut, psfw, psfi, praci, &
  379. piacr, psaci, psacw, psdep, pssub, &
  380. pracs, psacr, psmlt, psmltevp, &
  381. prain, praut, pracw, prevp, pvapor, &
  382. pclw, pladj, pcli, pimlt, pihom, &
  383. pidw, piadj, pgraupel, pgaut, &
  384. pgfr, pgacw, pgaci, pgacr, pgacs, &
  385. pgacip,pgacrp,pgacsp,pgwet, pdry, &
  386. pgsub, pgdep, pgmlt, pgmltevp, &
  387. qschg, qgchg
  388. !
  389. REAL, DIMENSION( kts:kte ) :: qvsbar, rs0, viscmu, visc, diffwv, &
  390. schmidt, xka
  391. REAL, DIMENSION( kts:kte ) :: vtr, vts, vtg, &
  392. vtrold, vtsold, vtgold, vtiold, &
  393. xlambdar, xlambdas, xlambdag, &
  394. olambdar, olambdas, olambdag
  395. REAL :: episp0k, dtb, odtb, pi, pio4, &
  396. pio6, oxLf, xLvocp, xLfocp, consta, &
  397. constc, ocdrag, gambp4, gamdp4, &
  398. gam4pt5, Cpor, oxmi, gambp3, gamdp3,&
  399. gambp6, gam3pt5, gam2pt75, gambp5o2,&
  400. gamdp5o2, cwoxlf, ocp, xni50, es
  401. !
  402. REAL :: qvmin=1.e-20
  403. REAL :: gindex
  404. REAL :: temc1,save1,save2,xni50mx
  405. ! for terminal velocity flux
  406. INTEGER :: min_q, max_q
  407. REAL :: t_del_tv, del_tv, flux, fluxin, fluxout ,tmpqrz
  408. LOGICAL :: notlast
  409. !
  410. REAL :: tmp_tem, tmp_temcc !bloss
  411. !
  412. real :: liqconc, dis, beta, kappa, p0, xc, capn,rhocgs
  413. !sg: begin
  414. ! liqconc = liquid water content (g cm^-3)
  415. ! capn = droplet number concentration (# cm^-3)
  416. ! dis = relative dispersion (dimensionless) between 0.2 and 1.
  417. ! Written by Yangang Liu based on Liu et al., GRL 32, 2005.
  418. ! Autoconversion rate p = p0 * (threshold function)
  419. ! p0 = "base" autoconversion rate (g cm^-3 s^-1)
  420. ! kappa = constant in Long kernel = [kappa2 * (3/(4*pi*rhow))^3] in Liu papers
  421. ! beta = Condensation rate constant = (beta6)^6 in Liu papers
  422. ! xc = Normalized critical mass
  423. ! ***********************************************************
  424. if(flag_qndrop)then
  425. dis = 0.5 ! droplet dispersion, set to 0.5 per SG 8-Nov-2006
  426. ! Give empirical constants
  427. kappa=1.1d10
  428. ! Calculate Condensation rate constant
  429. beta = (1.0d0+3.0d0*dis**2)*(1.0d0+4.0d0*dis**2)* &
  430. (1.0d0+5.0d0*dis**2)/((1.0d0+dis**2)*(1.0d0+2.0d0*dis**2))
  431. endif
  432. !sg: end
  433. dtb=dt
  434. odtb=1./dtb
  435. pi=acos(-1.)
  436. pio4=acos(-1.)/4.
  437. pio6=acos(-1.)/6.
  438. ocp=1./cp
  439. oxLf=1./xLf
  440. xLvocp=xLv/cp
  441. xLfocp=xLf/cp
  442. consta=2115.0*0.01**(1-constb)
  443. constc=152.93*0.01**(1-constd)
  444. ocdrag=1./Cdrag
  445. ! episp0k=RH*episp0
  446. episp0k=RH*ep2*1000.*svp1
  447. !
  448. gambp4=ggamma(constb+4.)
  449. gamdp4=ggamma(constd+4.)
  450. gam4pt5=ggamma(4.5)
  451. Cpor=cp/Rair
  452. oxmi=1.0/xmi
  453. gambp3=ggamma(constb+3.)
  454. gamdp3=ggamma(constd+3.)
  455. gambp6=ggamma(constb+6)
  456. gam3pt5=ggamma(3.5)
  457. gam2pt75=ggamma(2.75)
  458. gambp5o2=ggamma((constb+5.)/2.)
  459. gamdp5o2=ggamma((constd+5.)/2.)
  460. cwoxlf=cw/xlf
  461. delta2=0.
  462. delta3=0.
  463. delta4=0.
  464. !
  465. !-----------------------------------------------------------------------
  466. ! oprez 1./prez ( prez : pressure)
  467. ! qsw saturated mixing ratio on water surface
  468. ! qsi saturated mixing ratio on ice surface
  469. ! episp0k RH*e*saturated pressure at 273.15 K
  470. ! qvoqsw qv/qsw
  471. ! qvoqsi qv/qsi
  472. ! qvzodt qv/dt
  473. ! qlzodt ql/dt
  474. ! qizodt qi/dt
  475. ! qszodt qs/dt
  476. ! qrzodt qr/dt
  477. ! qgzodt qg/dt
  478. !
  479. ! temcc temperature in dregee C
  480. !
  481. obp4=1.0/(constb+4.0)
  482. bp3=constb+3.0
  483. bp5=constb+5.0
  484. bp6=constb+6.0
  485. odp4=1.0/(constd+4.0)
  486. dp3=constd+3.0
  487. dp5=constd+5.0
  488. dp5o2=0.5*(constd+5.0)
  489. !
  490. do k=kts,kte
  491. oprez(k)=1./prez(k)
  492. enddo
  493. do k=kts,kte
  494. qlz(k)=amax1( 0.0,qlz(k) )
  495. qiz(k)=amax1( 0.0,qiz(k) )
  496. qvz(k)=amax1( qvmin,qvz(k) )
  497. qsz(k)=amax1( 0.0,qsz(k) )
  498. qrz(k)=amax1( 0.0,qrz(k) )
  499. qgz(k)=amax1( 0.0,qgz(k) )
  500. qndropz(k)=amax1( 0.0,qndropz(k) ) !sg
  501. !
  502. tem(k)=thz(k)*tothz(k)
  503. temcc(k)=tem(k)-273.15
  504. !
  505. ! qswz(k)=episp0k*oprez(k)* &
  506. ! exp( svp2*temcc(k)/(tem(k)-svp3) )
  507. es=1000.*svp1*exp( svp2*temcc(k)/(tem(k)-svp3) )
  508. qswz(k)=ep2*es/(prez(k)-es)
  509. if (tem(k) .lt. 273.15 ) then
  510. ! qsiz(k)=episp0k*oprez(k)* &
  511. ! exp( 21.8745584*(tem(k)-273.16)/(tem(k)-7.66) )
  512. es=1000.*svp1*exp( 21.8745584*(tem(k)-273.16)/(tem(k)-7.66) )
  513. qsiz(k)=ep2*es/(prez(k)-es)
  514. if (temcc(k) .lt. -40.0) qswz(k)=qsiz(k)
  515. else
  516. qsiz(k)=qswz(k)
  517. endif
  518. !
  519. qvoqswz(k)=qvz(k)/qswz(k)
  520. qvoqsiz(k)=qvz(k)/qsiz(k)
  521. theiz(k)=thz(k)+(xlvocp*qvz(k)-xlfocp*qiz(k))/tothz(k)
  522. enddo
  523. !
  524. !
  525. !-----------------------------------------------------------------------
  526. ! In this simple stable cloud parameterization scheme, only five
  527. ! forms of water substance (water vapor, cloud water, cloud ice,
  528. ! rain and snow are considered. The prognostic variables are total
  529. ! water (qp),cloud water (ql), and cloud ice (qi). Rain and snow are
  530. ! diagnosed following Nagata and Ogura, 1991, MWR, 1309-1337. Eq (A7).
  531. ! the micro physics are based on (1) Hsie et al.,1980, JAM, 950-977 ;
  532. ! (2) Lin et al., 1983, JAM, 1065-1092 ; (3) Rutledge and Hobbs, 1983,
  533. ! JAS, 1185-1206 ; (4) Rutledge and Hobbs, 1984, JAS, 2949-2972.
  534. !-----------------------------------------------------------------------
  535. !
  536. ! rhowater: density of water=1.0 g/cm3=1000.0 kg/m3
  537. ! rhosnow: density of snow=0.1 g/cm3=100.0 kg/m3
  538. ! xnor: intercept parameter of the raindrop size distribution
  539. ! = 0.08 cm-4 = 8.0e6 m-4
  540. ! xnos: intercept parameter of the snowflake size distribution
  541. ! = 0.03 cm-4 = 3.0e6 m-4
  542. ! xnog: intercept parameter of the graupel size distribution
  543. ! = 4.0e-4 cm-4 = 4.0e4 m-4
  544. ! consta: constant in empirical formular for terminal
  545. ! velocity of raindrop
  546. ! =2115.0 [cm**(1-b)/s] = 2115.0*0.01**(1-b) [m**(1-b)/s]
  547. ! constb: constant in empirical formular for terminal
  548. ! velocity of raindrop
  549. ! =0.8
  550. ! constc: constant in empirical formular for terminal
  551. ! velocity of snow
  552. ! =152.93 [cm**(1-d)/s] = 152.93*0.01**(1-d) [m**(1-d)/s]
  553. ! constd: constant in empirical formular for terminal
  554. ! velocity of snow
  555. ! =0.25
  556. ! avisc: constant in empirical formular for dynamic viscosity of air
  557. ! =1.49628e-6 [kg/m/s] = 1.49628e-5 [g/cm/s]
  558. ! adiffwv: constant in empirical formular for diffusivity of water
  559. ! vapor in air
  560. ! = 8.7602e-5 [kgm/s3] = 8.7602 [gcm/s3]
  561. ! axka: constant in empirical formular for thermal conductivity of air
  562. ! = 1.4132e3 [m2/s2/K] = 1.4132e7 [cm2/s2/K]
  563. ! qi0: mixing ratio threshold for cloud ice aggregation [kg/kg]
  564. ! = 1.0e-3 g/g = 1.0e-3 kg/gk
  565. ! ql0: mixing ratio threshold for cloud watercoalescence [kg/kg]
  566. ! = 2.0e-3 g/g = 2.0e-3 kg/gk
  567. ! qs0: mixing ratio threshold for snow aggregation
  568. ! = 6.0e-4 g/g = 6.0e-4 kg/gk
  569. ! xmi50: mass of a 50 micron ice crystal
  570. ! = 4.8e-10 [kg] =4.8e-7 [g]
  571. ! xmi40: mass of a 40 micron ice crystal
  572. ! = 2.46e-10 [kg] = 2.46e-7 [g]
  573. ! di50: diameter of a 50 micro (radius) ice crystal
  574. ! =1.0e-4 [m]
  575. ! xmi: mass of one cloud ice crystal
  576. ! =4.19e-13 [kg] = 4.19e-10 [g]
  577. ! oxmi=1.0/xmi
  578. !
  579. ! if gindex=1.0 include graupel
  580. ! if gindex=0. no graupel
  581. !
  582. !
  583. do k=kts,kte
  584. psnow(k)=0.0
  585. psaut(k)=0.0
  586. psfw(k)=0.0
  587. psfi(k)=0.0
  588. praci(k)=0.0
  589. piacr(k)=0.0
  590. psaci(k)=0.0
  591. psacw(k)=0.0
  592. psdep(k)=0.0
  593. pssub(k)=0.0
  594. pracs(k)=0.0
  595. psacr(k)=0.0
  596. psmlt(k)=0.0
  597. psmltevp(k)=0.0
  598. !
  599. prain(k)=0.0
  600. praut(k)=0.0
  601. pracw(k)=0.0
  602. prevp(k)=0.0
  603. !
  604. pvapor(k)=0.0
  605. !
  606. pclw(k)=0.0
  607. preclw(k)=0.0 !sg
  608. pladj(k)=0.0
  609. !
  610. pcli(k)=0.0
  611. pimlt(k)=0.0
  612. pihom(k)=0.0
  613. pidw(k)=0.0
  614. piadj(k)=0.0
  615. enddo
  616. !
  617. !!! graupel
  618. !
  619. do k=kts,kte
  620. pgraupel(k)=0.0
  621. pgaut(k)=0.0
  622. pgfr(k)=0.0
  623. pgacw(k)=0.0
  624. pgaci(k)=0.0
  625. pgacr(k)=0.0
  626. pgacs(k)=0.0
  627. pgacip(k)=0.0
  628. pgacrP(k)=0.0
  629. pgacsp(k)=0.0
  630. pgwet(k)=0.0
  631. pdry(k)=0.0
  632. pgsub(k)=0.0
  633. pgdep(k)=0.0
  634. pgmlt(k)=0.0
  635. pgmltevp(k)=0.0
  636. qschg(k)=0.
  637. qgchg(k)=0.
  638. enddo
  639. !
  640. !
  641. ! Set rs0=episp0*oprez(k)
  642. ! episp0=e*saturated pressure at 273.15 K
  643. ! e = 0.622
  644. !
  645. DO k=kts,kte
  646. rs0(k)=ep2*1000.*svp1/(prez(k)-1000.*svp1)
  647. END DO
  648. !
  649. !***********************************************************************
  650. ! Calculate precipitation fluxes due to terminal velocities.
  651. !***********************************************************************
  652. !
  653. !- Calculate termianl velocity (vt?) of precipitation q?z
  654. !- Find maximum vt? to determine the small delta t
  655. !
  656. !-- rain
  657. !
  658. t_del_tv=0.
  659. del_tv=dtb
  660. notlast=.true.
  661. DO while (notlast)
  662. !
  663. min_q=kte
  664. max_q=kts-1
  665. !
  666. do k=kts,kte-1
  667. if (qrz(k) .gt. 1.0e-8) then
  668. min_q=min0(min_q,k)
  669. max_q=max0(max_q,k)
  670. tmp1=sqrt(pi*rhowater*xnor/rho(k)/qrz(k))
  671. tmp1=sqrt(tmp1)
  672. vtrold(k)=o6*consta*gambp4*sqrho(k)/tmp1**constb
  673. if (k .eq. 1) then
  674. del_tv=amin1(del_tv,0.9*(zz(k)-zsfc)/vtrold(k))
  675. else
  676. del_tv=amin1(del_tv,0.9*(zz(k)-zz(k-1))/vtrold(k))
  677. endif
  678. else
  679. vtrold(k)=0.
  680. endif
  681. enddo
  682. if (max_q .ge. min_q) then
  683. !
  684. !- Check if the summation of the small delta t >= big delta t
  685. ! (t_del_tv) (del_tv) (dtb)
  686. t_del_tv=t_del_tv+del_tv
  687. !
  688. if ( t_del_tv .ge. dtb ) then
  689. notlast=.false.
  690. del_tv=dtb+del_tv-t_del_tv
  691. endif
  692. !
  693. fluxin=0.
  694. do k=max_q,min_q,-1
  695. fluxout=rho(k)*vtrold(k)*qrz(k)
  696. flux=(fluxin-fluxout)/rho(k)/dzw(k)
  697. tmpqrz=qrz(k)
  698. qrz(k)=qrz(k)+del_tv*flux
  699. fluxin=fluxout
  700. enddo
  701. if (min_q .eq. 1) then
  702. pptrain=pptrain+fluxin*del_tv
  703. else
  704. qrz(min_q-1)=qrz(min_q-1)+del_tv* &
  705. fluxin/rho(min_q-1)/dzw(min_q-1)
  706. endif
  707. !
  708. else
  709. notlast=.false.
  710. endif
  711. ENDDO
  712. !
  713. !-- snow
  714. !
  715. t_del_tv=0.
  716. del_tv=dtb
  717. notlast=.true.
  718. DO while (notlast)
  719. !
  720. min_q=kte
  721. max_q=kts-1
  722. !
  723. do k=kts,kte-1
  724. if (qsz(k) .gt. 1.0e-8) then
  725. min_q=min0(min_q,k)
  726. max_q=max0(max_q,k)
  727. tmp1=sqrt(pi*rhosnow*xnos/rho(k)/qsz(k))
  728. tmp1=sqrt(tmp1)
  729. vtsold(k)=o6*constc*gamdp4*sqrho(k)/tmp1**constd
  730. if (k .eq. 1) then
  731. del_tv=amin1(del_tv,0.9*(zz(k)-zsfc)/vtsold(k))
  732. else
  733. del_tv=amin1(del_tv,0.9*(zz(k)-zz(k-1))/vtsold(k))
  734. endif
  735. else
  736. vtsold(k)=0.
  737. endif
  738. enddo
  739. if (max_q .ge. min_q) then
  740. !
  741. !
  742. !- Check if the summation of the small delta t >= big delta t
  743. ! (t_del_tv) (del_tv) (dtb)
  744. t_del_tv=t_del_tv+del_tv
  745. if ( t_del_tv .ge. dtb ) then
  746. notlast=.false.
  747. del_tv=dtb+del_tv-t_del_tv
  748. endif
  749. !
  750. fluxin=0.
  751. do k=max_q,min_q,-1
  752. fluxout=rho(k)*vtsold(k)*qsz(k)
  753. flux=(fluxin-fluxout)/rho(k)/dzw(k)
  754. qsz(k)=qsz(k)+del_tv*flux
  755. qsz(k)=amax1(0.,qsz(k))
  756. fluxin=fluxout
  757. enddo
  758. if (min_q .eq. 1) then
  759. pptsnow=pptsnow+fluxin*del_tv
  760. else
  761. qsz(min_q-1)=qsz(min_q-1)+del_tv* &
  762. fluxin/rho(min_q-1)/dzw(min_q-1)
  763. endif
  764. !
  765. else
  766. notlast=.false.
  767. endif
  768. ENDDO
  769. !
  770. !-- grauupel
  771. !
  772. t_del_tv=0.
  773. del_tv=dtb
  774. notlast=.true.
  775. !
  776. DO while (notlast)
  777. !
  778. min_q=kte
  779. max_q=kts-1
  780. !
  781. do k=kts,kte-1
  782. if (qgz(k) .gt. 1.0e-8) then
  783. min_q=min0(min_q,k)
  784. max_q=max0(max_q,k)
  785. tmp1=sqrt(pi*rhograul*xnog/rho(k)/qgz(k))
  786. tmp1=sqrt(tmp1)
  787. term0=sqrt(4.*grav*rhograul*0.33334/rho(k)/cdrag)
  788. vtgold(k)=o6*gam4pt5*term0*sqrt(1./tmp1)
  789. if (k .eq. 1) then
  790. del_tv=amin1(del_tv,0.9*(zz(k)-zsfc)/vtgold(k))
  791. else
  792. del_tv=amin1(del_tv,0.9*(zz(k)-zz(k-1))/vtgold(k))
  793. endif
  794. else
  795. vtgold(k)=0.
  796. endif
  797. enddo
  798. if (max_q .ge. min_q) then
  799. !
  800. !
  801. !- Check if the summation of the small delta t >= big delta t
  802. ! (t_del_tv) (del_tv) (dtb)
  803. t_del_tv=t_del_tv+del_tv
  804. if ( t_del_tv .ge. dtb ) then
  805. notlast=.false.
  806. del_tv=dtb+del_tv-t_del_tv
  807. endif
  808. !
  809. fluxin=0.
  810. do k=max_q,min_q,-1
  811. fluxout=rho(k)*vtgold(k)*qgz(k)
  812. flux=(fluxin-fluxout)/rho(k)/dzw(k)
  813. qgz(k)=qgz(k)+del_tv*flux
  814. qgz(k)=amax1(0.,qgz(k))
  815. fluxin=fluxout
  816. enddo
  817. if (min_q .eq. 1) then
  818. pptgraul=pptgraul+fluxin*del_tv
  819. else
  820. qgz(min_q-1)=qgz(min_q-1)+del_tv* &
  821. fluxin/rho(min_q-1)/dzw(min_q-1)
  822. endif
  823. !
  824. else
  825. notlast=.false.
  826. endif
  827. !
  828. ENDDO
  829. !
  830. !-- cloud ice (03/21/02) follow Vaughan T.J. Phillips at GFDL
  831. !
  832. t_del_tv=0.
  833. del_tv=dtb
  834. notlast=.true.
  835. !
  836. DO while (notlast)
  837. !
  838. min_q=kte
  839. max_q=kts-1
  840. !
  841. do k=kts,kte-1
  842. if (qiz(k) .gt. 1.0e-8) then
  843. min_q=min0(min_q,k)
  844. max_q=max0(max_q,k)
  845. vtiold(k)= 3.29 * (rho(k)* qiz(k))** 0.16 ! Heymsfield and Donner
  846. if (k .eq. 1) then
  847. del_tv=amin1(del_tv,0.9*(zz(k)-zsfc)/vtiold(k))
  848. else
  849. del_tv=amin1(del_tv,0.9*(zz(k)-zz(k-1))/vtiold(k))
  850. endif
  851. else
  852. vtiold(k)=0.
  853. endif
  854. enddo
  855. if (max_q .ge. min_q) then
  856. !
  857. !
  858. !- Check if the summation of the small delta t >= big delta t
  859. ! (t_del_tv) (del_tv) (dtb)
  860. t_del_tv=t_del_tv+del_tv
  861. if ( t_del_tv .ge. dtb ) then
  862. notlast=.false.
  863. del_tv=dtb+del_tv-t_del_tv
  864. endif
  865. fluxin=0.
  866. do k=max_q,min_q,-1
  867. fluxout=rho(k)*vtiold(k)*qiz(k)
  868. flux=(fluxin-fluxout)/rho(k)/dzw(k)
  869. qiz(k)=qiz(k)+del_tv*flux
  870. qiz(k)=amax1(0.,qiz(k))
  871. fluxin=fluxout
  872. enddo
  873. if (min_q .eq. 1) then
  874. pptice=pptice+fluxin*del_tv
  875. else
  876. qiz(min_q-1)=qiz(min_q-1)+del_tv* &
  877. fluxin/rho(min_q-1)/dzw(min_q-1)
  878. endif
  879. !
  880. else
  881. notlast=.false.
  882. endif
  883. !
  884. ENDDO
  885. do k=kts,kte-1 !sg beg
  886. precrz(k)=rho(k)*vtrold(k)*qrz(k)
  887. preciz(k)=rho(k)*vtiold(k)*qiz(k)
  888. precsz(k)=rho(k)*vtsold(k)*qsz(k)
  889. precgz(k)=rho(k)*vtgold(k)*qgz(k)
  890. enddo !sg end
  891. precrz(kte)=0. !wig - top level never set for vtXold vars
  892. preciz(kte)=0. !wig
  893. precsz(kte)=0. !wig
  894. precgz(kte)=0. !wig
  895. ! Microphysics processes
  896. !
  897. DO 2000 k=kts,kte
  898. !
  899. qvzodt(k)=amax1( 0.0,odtb*qvz(k) )
  900. qlzodt(k)=amax1( 0.0,odtb*qlz(k) )
  901. qizodt(k)=amax1( 0.0,odtb*qiz(k) )
  902. qszodt(k)=amax1( 0.0,odtb*qsz(k) )
  903. qrzodt(k)=amax1( 0.0,odtb*qrz(k) )
  904. qgzodt(k)=amax1( 0.0,odtb*qgz(k) )
  905. !***********************************************************************
  906. !***** diagnose mixing ratios (qrz,qsz), terminal *****
  907. !***** velocities (vtr,vts), and slope parameters in size *****
  908. !***** distribution(xlambdar,xlambdas) of rain and snow *****
  909. !***** follows Nagata and Ogura, 1991, MWR, 1309-1337. Eq (A7) *****
  910. !***********************************************************************
  911. !
  912. !**** assuming no cloud water can exist in the top two levels due to
  913. !**** radiation consideration
  914. !
  915. !! if
  916. !! unsaturated,
  917. !! no cloud water, rain, ice, snow and graupel
  918. !! then
  919. !! skip these processes and jump to line 2000
  920. !
  921. !
  922. tmp=qiz(k)+qlz(k)+qsz(k)+qrz(k)+qgz(k)*gindex
  923. if( qvz(k)+qlz(k)+qiz(k) .lt. qsiz(k) &
  924. .and. tmp .eq. 0.0 ) go to 2000
  925. !! calculate terminal velocity of rain
  926. !
  927. if (qrz(k) .gt. 1.0e-8) then
  928. tmp1=sqrt(pi*rhowater*xnor*orho(k)/qrz(k))
  929. xlambdar(k)=sqrt(tmp1)
  930. olambdar(k)=1.0/xlambdar(k)
  931. vtrold(k)=o6*consta*gambp4*sqrho(k)*olambdar(k)**constb
  932. else
  933. vtrold(k)=0.
  934. olambdar(k)=0.
  935. endif
  936. !
  937. ! if (qrz(k) .gt. 1.0e-12) then
  938. if (qrz(k) .gt. 1.0e-8) then
  939. tmp1=sqrt(pi*rhowater*xnor*orho(k)/qrz(k))
  940. xlambdar(k)=sqrt(tmp1)
  941. olambdar(k)=1.0/xlambdar(k)
  942. vtr(k)=o6*consta*gambp4*sqrho(k)*olambdar(k)**constb
  943. else
  944. vtr(k)=0.
  945. olambdar(k)=0.
  946. endif
  947. !
  948. !! calculate terminal velocity of snow
  949. !
  950. if (qsz(k) .gt. 1.0e-8) then
  951. tmp1=sqrt(pi*rhosnow*xnos*orho(k)/qsz(k))
  952. xlambdas(k)=sqrt(tmp1)
  953. olambdas(k)=1.0/xlambdas(k)
  954. vtsold(k)=o6*constc*gamdp4*sqrho(k)*olambdas(k)**constd
  955. else
  956. vtsold(k)=0.
  957. olambdas(k)=0.
  958. endif
  959. !
  960. ! if (qsz(k) .gt. 1.0e-12) then
  961. if (qsz(k) .gt. 1.0e-8) then
  962. tmp1=sqrt(pi*rhosnow*xnos*orho(k)/qsz(k))
  963. xlambdas(k)=sqrt(tmp1)
  964. olambdas(k)=1.0/xlambdas(k)
  965. vts(k)=o6*constc*gamdp4*sqrho(k)*olambdas(k)**constd
  966. else
  967. vts(k)=0.
  968. olambdas(k)=0.
  969. endif
  970. !
  971. !! calculate terminal velocity of graupel
  972. !
  973. if (qgz(k) .gt. 1.0e-8) then
  974. tmp1=sqrt( pi*rhograul*xnog*orho(k)/qgz(k))
  975. xlambdag(k)=sqrt(tmp1)
  976. olambdag(k)=1.0/xlambdag(k)
  977. term0=sqrt(4.*grav*rhograul*0.33334*orho(k)*ocdrag)
  978. vtgold(k)=o6*gam4pt5*term0*sqrt(olambdag(k))
  979. else
  980. vtgold(k)=0.
  981. olambdag(k)=0.
  982. endif
  983. !
  984. ! if (qgz(k) .gt. 1.0e-12) then
  985. if (qgz(k) .gt. 1.0e-8) then
  986. tmp1=sqrt( pi*rhograul*xnog*orho(k)/qgz(k))
  987. xlambdag(k)=sqrt(tmp1)
  988. olambdag(k)=1.0/xlambdag(k)
  989. term0=sqrt(4.*grav*rhograul*0.33334*orho(k)*ocdrag)
  990. vtg(k)=o6*gam4pt5*term0*sqrt(olambdag(k))
  991. else
  992. vtg(k)=0.
  993. olambdag(k)=0.
  994. endif
  995. !
  996. !***********************************************************************
  997. !***** compute viscosity,difusivity,thermal conductivity, and ******
  998. !***** Schmidt number ******
  999. !***********************************************************************
  1000. !c------------------------------------------------------------------
  1001. !c viscmu: dynamic viscosity of air kg/m/s
  1002. !c visc: kinematic viscosity of air = viscmu/rho (m2/s)
  1003. !c avisc=1.49628e-6 kg/m/s=1.49628e-5 g/cm/s
  1004. !c viscmu=1.718e-5 kg/m/s in RH
  1005. !c diffwv: Diffusivity of water vapor in air
  1006. !c adiffwv = 8.7602e-5 (8.794e-5 in MM5) kgm/s3
  1007. !c = 8.7602 (8.794 in MM5) gcm/s3
  1008. !c diffwv(k)=2.26e-5 m2/s
  1009. !c schmidt: Schmidt number=visc/diffwv
  1010. !c xka: thermal conductivity of air J/m/s/K (Kgm/s3/K)
  1011. !c xka(k)=2.43e-2 J/m/s/K in RH
  1012. !c axka=1.4132e3 (1.414e3 in MM5) m2/s2/k = 1.4132e7 cm2/s2/k
  1013. !c------------------------------------------------------------------
  1014. viscmu(k)=avisc*tem(k)**1.5/(tem(k)+120.0)
  1015. visc(k)=viscmu(k)*orho(k)
  1016. diffwv(k)=adiffwv*tem(k)**1.81*oprez(k)
  1017. schmidt(k)=visc(k)/diffwv(k)
  1018. xka(k)=axka*viscmu(k)
  1019. if (tem(k) .lt. 273.15) then
  1020. !
  1021. !***********************************************************************
  1022. !********* snow production processes for T < 0 C **********
  1023. !***********************************************************************
  1024. !c
  1025. !c (1) ICE CRYSTAL AGGREGATION TO SNOW (Psaut): Lin (21)
  1026. !c! psaut=alpha1*(qi-qi0)
  1027. !c! alpha1=1.0e-3*exp(0.025*(T-T0))
  1028. !c
  1029. ! alpha1=1.0e-3*exp( 0.025*temcc(k) )
  1030. alpha1=1.0e-3*exp( 0.025*temcc(k) )
  1031. !
  1032. if(temcc(k) .lt. -20.0) then
  1033. tmp1=-7.6+4.0*exp( -0.2443e-3*(abs(temcc(k))-20)**2.455 )
  1034. qic=1.0e-3*exp(tmp1)*orho(k)
  1035. else
  1036. qic=qi0
  1037. end if
  1038. !testing
  1039. ! tmp1=amax1( 0.0,alpha1*(qiz(k)-qic) )
  1040. ! psaut(k)=amin1( tmp1,qizodt(k) )
  1041. tmp1=odtb*(qiz(k)-qic)*(1.0-exp(-alpha1*dtb))
  1042. psaut(k)=amax1( 0.0,tmp1 )
  1043. !c
  1044. !c (2) BERGERON PROCESS TRANSFER OF CLOUD WATER TO SNOW (Psfw)
  1045. !c this process only considered when -31 C < T < 0 C
  1046. !c Lin (33) and Hsie (17)
  1047. !c
  1048. !c!
  1049. !c! parama1 and parama2 functions must be user supplied
  1050. !c!
  1051. ! testing
  1052. if( qlz(k) .gt. 1.0e-10 ) then
  1053. temc1=amax1(-30.99,temcc(k))
  1054. ! print*,'temc1',temc1,qlz(k)
  1055. a1=parama1( temc1 )
  1056. a2=parama2( temc1 )
  1057. tmp1=1.0-a2
  1058. !! change unit from cgs to mks
  1059. a1=a1*0.001**tmp1
  1060. !c! dtberg is the time needed for a crystal to grow from 40 to 50 um
  1061. !c ! odtberg=1.0/dtberg
  1062. odtberg=(a1*tmp1)/(xmi50**tmp1-xmi40**tmp1)
  1063. !
  1064. !c! compute terminal velocity of a 50 micron ice cystal
  1065. !
  1066. vti50=constc*di50**constd*sqrho(k)
  1067. !
  1068. eiw=1.0
  1069. save1=a1*xmi50**a2
  1070. save2=0.25*pi*eiw*rho(k)*di50*di50*vti50
  1071. !
  1072. tmp2=( save1 + save2*qlz(k) )
  1073. !
  1074. !! maximum number of 50 micron crystals limited by the amount
  1075. !! of supercool water
  1076. !
  1077. xni50mx=qlzodt(k)/tmp2
  1078. !
  1079. !! number of 50 micron crystals produced
  1080. !
  1081. !
  1082. xni50=qiz(k)*( 1.0-exp(-dtb*odtberg) )/xmi50
  1083. xni50=amin1(xni50,xni50mx)
  1084. !
  1085. tmp3=odtb*tmp2/save2*( 1.0-exp(-save2*xni50*dtb) )
  1086. psfw(k)=amin1( tmp3,qlzodt(k) )
  1087. !testing
  1088. ! psfw(k)=0.
  1089. !0915 if( temcc(k).gt.-30.99 ) then
  1090. !0915 a1=parama1( temcc(k) )
  1091. !0915 a2=parama2( temcc(k) )
  1092. !0915 tmp1=1.0-a2
  1093. !! change unit from cgs to mks
  1094. !0915 a1=a1*0.001**tmp1
  1095. !c! dtberg is the time needed for a crystal to grow from 40 to 50 um
  1096. !c! odtberg=1.0/dtberg
  1097. !0915 odtberg=(a1*tmp1)/(xmi50**tmp1-xmi40**tmp1)
  1098. !c! number of 50 micron crystals produced
  1099. !0915 xni50=qiz(k)*dtb*odtberg/xmi50
  1100. !c! need to calculate the terminal velocity of a 50 micron
  1101. !c! ice cystal
  1102. !0915 vti50=constc*di50**constd*sqrho(k)
  1103. !0915 eiw=1.0
  1104. !0915 tmp2=xni50*( a1*xmi50**a2 + &
  1105. !0915 0.25*qlz(k)*pi*eiw*rho(k)*di50*di50*vti50 )
  1106. !0915 psfw(k)=amin1( tmp2,qlzodt(k) )
  1107. !0915 psfw(k)=0.
  1108. !c
  1109. !c (3) REDUCTION OF CLOUD ICE BY BERGERON PROCESS (Psfi): Lin (34)
  1110. !c this process only considered when -31 C < T < 0 C
  1111. !c
  1112. tmp1=xni50*xmi50-psfw(k)
  1113. psfi(k)=amin1(tmp1,qizodt(k))
  1114. ! testing
  1115. ! psfi(k)=0.
  1116. end if
  1117. !
  1118. !0915 tmp1=qiz(k)*odtberg
  1119. !0915 psfi(k)=amin1(tmp1,qizodt(k))
  1120. ! testing
  1121. !0915 psfi(k)=0.
  1122. !0915 end if
  1123. !
  1124. if(qrz(k) .le. 0.0) go to 1000
  1125. !
  1126. ! Processes (4) and (5) only need when qrz > 0.0
  1127. !
  1128. !c
  1129. !c (4) CLOUD ICE ACCRETION BY RAIN (Praci): Lin (25)
  1130. !c may produce snow or graupel
  1131. !c
  1132. eri=1.0
  1133. !0915 tmp1=qiz(k)*pio4*eri*xnor*consta*sqrho(k)
  1134. !0915 tmp2=tmp1*gambp3*olambdar(k)**bp3
  1135. !0915 praci(k)=amin1( tmp2,qizodt(k) )
  1136. save1=pio4*eri*xnor*consta*sqrho(k)
  1137. tmp1=save1*gambp3*olambdar(k)**bp3
  1138. praci(k)=qizodt(k)*( 1.0-exp(-tmp1*dtb) )
  1139. !c
  1140. !c (5) RAIN ACCRETION BY CLOUD ICE (Piacr): Lin (26)
  1141. !c
  1142. !0915 tmp2=tmp1*rho(k)*pio6*rhowater*gambp6*oxmi* &
  1143. !0915 olambdar(k)**bp6
  1144. !0915 piacr(k)=amin1( tmp2,qrzodt(k) )
  1145. tmp2=qiz(k)*save1*rho(k)*pio6*rhowater*gambp6*oxmi* &
  1146. olambdar(k)**bp6
  1147. piacr(k)=amin1( tmp2,qrzodt(k) )
  1148. !
  1149. 1000 continue
  1150. !
  1151. if(qsz(k) .le. 0.0) go to 1200
  1152. !
  1153. ! Compute the following processes only when qsz > 0.0
  1154. !
  1155. !c
  1156. !c (6) ICE CRYSTAL ACCRETION BY SNOW (Psaci): Lin (22)
  1157. !c
  1158. esi=exp( 0.025*temcc(k) )
  1159. save1=pio4*xnos*constc*gamdp3*sqrho(k)* &
  1160. olambdas(k)**dp3
  1161. tmp1=esi*save1
  1162. psaci(k)=qizodt(k)*( 1.0-exp(-tmp1*dtb) )
  1163. !0915 tmp1=pio4*xnos*constc*gamdp3*sqrho(k)* &
  1164. !0915 olambdas(k)**dp3
  1165. !0915 tmp2=qiz(k)*esi*tmp1
  1166. !0915 psaci(k)=amin1( tmp2,qizodt(k) )
  1167. !c
  1168. !c (7) CLOUD WATER ACCRETION BY SNOW (Psacw): Lin (24)
  1169. !c
  1170. esw=1.0
  1171. tmp1=esw*save1
  1172. psacw(k)=qlzodt(K)*( 1.0-exp(-tmp1*dtb) )
  1173. !0915 tmp2=qlz(k)*esw*tmp1
  1174. !0915 psacw(k)=amin1( tmp2,qlzodt(k) )
  1175. !c
  1176. !c (8) DEPOSITION/SUBLIMATION OF SNOW (Psdep/Pssub): Lin (31)
  1177. !c includes consideration of ventilation effect
  1178. !c
  1179. !c abi=2*pi*(Si-1)/rho/(A"+B")
  1180. !c
  1181. tmpa=rvapor*xka(k)*tem(k)*tem(k)
  1182. tmpb=xls*xls*rho(k)*qsiz(k)*diffwv(k)
  1183. tmpc=tmpa*qsiz(k)*diffwv(k)
  1184. abi=2.0*pi*(qvoqsiz(k)-1.0)*tmpc/(tmpa+tmpb)
  1185. !
  1186. !c vf1s,vf2s=ventilation factors for snow
  1187. !c vf1s=0.78,vf2s=0.31 in LIN
  1188. !
  1189. tmp1=constc*sqrho(k)*olambdas(k)**dp5/visc(k)
  1190. tmp2=abi*xnos*( vf1s*olambdas(k)*olambdas(k)+ &
  1191. vf2s*schmidt(k)**0.33334*gamdp5o2*sqrt(tmp1) )
  1192. tmp3=odtb*( qvz(k)-qsiz(k) )
  1193. !
  1194. !bloss: BEGIN
  1195. !the old implementation would give the wrong results if olambdas(k) ==0
  1196. !which can lead to positive pssub, i.e. tmp2=0 but tmp3> 0
  1197. ! if( tmp2 .le. 0.0) then
  1198. if( tmp3 .le. 0.0) then
  1199. tmp2=amax1( tmp2,tmp3)
  1200. pssub(k)=amin1(0.,amax1( tmp2,-qszodt(k) ))
  1201. !bloss: END
  1202. psdep(k)=0.0
  1203. else
  1204. psdep(k)=amin1( tmp2,tmp3 )
  1205. pssub(k)=0.0
  1206. end if
  1207. !0915 psdep(k)=amax1(0.0,tmp2)
  1208. !0915 pssub(k)=amin1(0.0,tmp2)
  1209. !0915 pssub(k)=amax1( pssub(k),-qszodt(k) )
  1210. !
  1211. if(qrz(k) .le. 0.0) go to 1200
  1212. !
  1213. ! Compute processes (9) and (10) only when qsz > 0.0 and qrz > 0.0
  1214. !
  1215. !c
  1216. !c (9) ACCRETION OF SNOW BY RAIN (Pracs): Lin (27)
  1217. !c
  1218. esr=1.0
  1219. tmpa=olambdar(k)*olambdar(k)
  1220. tmpb=olambdas(k)*olambdas(k)
  1221. tmpc=olambdar(k)*olambdas(k)
  1222. tmp1=pi*pi*esr*xnor*xnos*abs( vtr(k)-vts(k) )*orho(k)
  1223. tmp2=tmpb*tmpb*olambdar(k)*(5.0*tmpb+2.0*tmpc+0.5*tmpa)
  1224. tmp3=tmp1*rhosnow*tmp2
  1225. pracs(k)=amin1( tmp3,qszodt(k) )
  1226. !c
  1227. !c (10) ACCRETION OF RAIN BY SNOW (Psacr): Lin (28)
  1228. !c
  1229. tmp3=tmpa*tmpa*olambdas(k)*(5.0*tmpa+2.0*tmpc+0.5*tmpb)
  1230. tmp4=tmp1*rhowater*tmp3
  1231. psacr(k)=amin1( tmp4,qrzodt(k) )
  1232. !
  1233. 1200 continue
  1234. !
  1235. else
  1236. !
  1237. !***********************************************************************
  1238. !********* snow production processes for T > 0 C **********
  1239. !***********************************************************************
  1240. !
  1241. if (qsz(k) .le. 0.0) go to 1400
  1242. !c
  1243. !c (1) CLOUD WATER ACCRETION BY SNOW (Psacw): Lin (24)
  1244. !c
  1245. esw=1.0
  1246. tmp1=esw*pio4*xnos*constc*gamdp3*sqrho(k)* &
  1247. olambdas(k)**dp3
  1248. psacw(k)=qlzodt(k)*( 1.0-exp(-tmp1*dtb) )
  1249. !0915 tmp1=pio4*xnos*constc*gamdp3*sqrho(k)* &
  1250. !0915 olambdas(k)**dp3
  1251. !0915 tmp2=qlz(k)*esw*tmp1
  1252. !0915 psacw(k)=amin1( tmp2,qlzodt(k) )
  1253. !c
  1254. !c (2) ACCRETION OF RAIN BY SNOW (Psacr): Lin (28)
  1255. !c
  1256. esr=1.0
  1257. tmpa=olambdar(k)*olambdar(k)
  1258. tmpb=olambdas(k)*olambdas(k)
  1259. tmpc=olambdar(k)*olambdas(k)
  1260. tmp1=pi*pi*esr*xnor*xnos*abs( vtr(k)-vts(k) )*orho(k)
  1261. tmp2=tmpa*tmpa*olambdas(k)*(5.0*tmpa+2.0*tmpc+0.5*tmpb)
  1262. tmp3=tmp1*rhowater*tmp2
  1263. psacr(k)=amin1( tmp3,qrzodt(k) )
  1264. !c
  1265. !c (3) MELTING OF SNOW (Psmlt): Lin (32)
  1266. !c Psmlt is negative value
  1267. !
  1268. delrs=rs0(k)-qvz(k)
  1269. term1=2.0*pi*orho(k)*( xlv*diffwv(k)*rho(k)*delrs- &
  1270. xka(k)*temcc(k) )
  1271. tmp1=constc*sqrho(k)*olambdas(k)**dp5/visc(k)
  1272. tmp2=xnos*( vf1s*olambdas(k)*olambdas(k)+ &
  1273. vf2s*schmidt(k)**0.33334*gamdp5o2*sqrt(tmp1) )
  1274. tmp3=term1*oxlf*tmp2-cwoxlf*temcc(k)*( psacw(k)+psacr(k) )
  1275. tmp4=amin1(0.0,tmp3)
  1276. psmlt(k)=amax1( tmp4,-qszodt(k) )
  1277. !c
  1278. !c (4) EVAPORATION OF MELTING SNOW (Psmltevp): HR (A27)
  1279. !c but use Lin et al. coefficience
  1280. !c Psmltevp is a negative value
  1281. !c
  1282. tmpa=rvapor*xka(k)*tem(k)*tem(k)
  1283. tmpb=xlv*xlv*rho(k)*qswz(k)*diffwv(k)
  1284. tmpc=tmpa*qswz(k)*diffwv(k)
  1285. tmpd=amin1( 0.0,(qvoqswz(k)-0.90)*qswz(k)*odtb )
  1286. ! abr=2.0*pi*(qvoqswz(k)-1.0)*tmpc/(tmpa+tmpb)
  1287. abr=2.0*pi*(qvoqswz(k)-0.90)*tmpc/(tmpa+tmpb)
  1288. !
  1289. !**** allow evaporation to occur when RH less than 90%
  1290. !**** here not using 100% because the evaporation cooling
  1291. !**** of temperature is not taking into account yet; hence,
  1292. !**** the qsw value is a little bit larger. This will avoid
  1293. !**** evaporation can generate cloud.
  1294. !
  1295. !c vf1s,vf2s=ventilation factors for snow
  1296. !c vf1s=0.78,vf2s=0.31 in LIN
  1297. !
  1298. tmp1=constc*sqrho(k)*olambdas(k)**dp5/visc(k)
  1299. tmp2=abr*xnos*( vf1s*olambdas(k)*olambdas(k)+ &
  1300. vf2s*schmidt(k)**0.33334*gamdp5o2*sqrt(tmp1) )
  1301. tmp3=amin1(0.0,tmp2)
  1302. tmp3=amax1( tmp3,tmpd )
  1303. psmltevp(k)=amax1( tmp3,-qszodt(k) )
  1304. 1400 continue
  1305. !
  1306. end if
  1307. !***********************************************************************
  1308. !********* rain production processes **********
  1309. !***********************************************************************
  1310. !
  1311. !c
  1312. !c (1) AUTOCONVERSION OF RAIN (Praut): RH
  1313. !sg: begin
  1314. if(flag_qndrop)then
  1315. if( qndropz(k) >= 1. ) then
  1316. ! Liu et al. autoconversion scheme
  1317. rhocgs=rho(k)*1.e-3
  1318. liqconc=rhocgs*qlz(k) ! (kg/kg) to (g/cm3)
  1319. capn=1.0e-3*rhocgs*qndropz(k) ! (#/kg) to (#/cm3)
  1320. ! rate function
  1321. if(liqconc.gt.1.e-10)then
  1322. p0=(kappa*beta/capn)*(liqconc*liqconc*liqconc)
  1323. xc=9.7d-17*capn*sqrt(capn)/(liqconc*liqconc)
  1324. ! Calculate autoconversion rate (g/g/s)
  1325. if(xc.lt.10.)then
  1326. praut(k)=(p0/rhocgs) * ( 0.5d0*(xc*xc+2*xc+2.0d0)* &
  1327. (1.0d0+xc)*exp(-2.0d0*xc) )
  1328. endif
  1329. endif
  1330. endif
  1331. else
  1332. !sg: end
  1333. !c araut=afa*rho
  1334. !c afa=0.001 Rate coefficient for autoconvergence
  1335. !c
  1336. !c araut=1.0e-3
  1337. !c
  1338. araut=0.001
  1339. !testing
  1340. ! tmp1=amax1( 0.0,araut*(qlz(k)-ql0) )
  1341. ! praut(k)=amin1( tmp1,qlzodt(k) )
  1342. tmp1=odtb*(qlz(k)-ql0)*( 1.0-exp(-araut*dtb) )
  1343. praut(k)=amax1( 0.0,tmp1 )
  1344. endif !sg
  1345. !c
  1346. !c (2) ACCRETION OF CLOUD WATER BY RAIN (Pracw): Lin (51)
  1347. !c
  1348. erw=1.0
  1349. ! tmp1=qlz(k)*pio4*erw*xnor*consta*sqrho(k)
  1350. ! tmp2=tmp1*gambp3*olambdar(k)**bp3
  1351. ! pracw(k)=amin1( tmp2,qlzodt(k) )
  1352. tmp1=pio4*erw*xnor*consta*sqrho(k)* &
  1353. gambp3*olambdar(k)**bp3
  1354. pracw(k)=qlzodt(k)*( 1.0-exp(-tmp1*dtb) )
  1355. !c
  1356. !c (3) EVAPORATION OF RAIN (Prevp): Lin (52)
  1357. !c Prevp is negative value
  1358. !c
  1359. !c Sw=qvoqsw : saturation ratio
  1360. !c
  1361. tmpa=rvapor*xka(k)*tem(k)*tem(k)
  1362. tmpb=xlv*xlv*rho(k)*qswz(k)*diffwv(k)
  1363. tmpc=tmpa*qswz(k)*diffwv(k)
  1364. !bloss: BEGIN
  1365. ! tmpd=amin1(0.0,(qvoqswz(k)-0.90)*qswz(k)*odtb)
  1366. ! set max allowed evaporation to 90% of the amount that
  1367. ! would induce saturation wrt liquid in a single step.
  1368. tmpd = qswz(k)*xlv/(rvapor*tem(k)**2) ! d(qsat_liq)/dT
  1369. tmpd = min( 0., 0.9*odtb*(qvz(k) + qlz(k) - qswz(k)) &
  1370. / (1. + xlvocp * tmpd) )
  1371. abr=2.0*pi*(qvoqswz(k)-1.0)*tmpc/(tmpa+tmpb)
  1372. ! abr=2.0*pi*(qvoqswz(k)-0.90)

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