PageRenderTime 62ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 1ms

/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
  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)*tmpc/(tmpa+tmpb)
  1373. !bloss: END
  1374. !
  1375. !c vf1r,vf2r=ventilation factors for rain
  1376. !c vf1r=0.78,vf2r=0.31 in RH, LIN and MM5
  1377. !
  1378. vf1r=0.78
  1379. vf2r=0.31
  1380. tmp1=consta*sqrho(k)*olambdar(k)**bp5/visc(k)
  1381. tmp2=abr*xnor*( vf1r*olambdar(k)*olambdar(k)+ &
  1382. vf2r*schmidt(k)**0.33334*gambp5o2*sqrt(tmp1) )
  1383. tmp3=amin1( 0.0,tmp2 )
  1384. tmp3=amax1( tmp3,tmpd )
  1385. prevp(k)=amax1( tmp3,-qrzodt(k) )
  1386. !
  1387. ! if(iout .gt. 0) write(20,*)'tmp1,tmp2,tmp3=',tmp1,tmp2,tmp3
  1388. ! if(iout .gt. 0) write(20,*)'qlz,qiz,qrz=',qlz(k),qiz(k),qrz(k)
  1389. ! if(iout .gt. 0) write(20,*)'tem,qsz,qvz=',tem(k),qsz(k),qvz(k)
  1390. ! if (gindex .eq. 0.) goto 900
  1391. !
  1392. if (tem(k) .lt. 273.15) then
  1393. !
  1394. !
  1395. !-- graupel
  1396. !***********************************************************************
  1397. !********* graupel production processes for T < 0 C **********
  1398. !***********************************************************************
  1399. !c
  1400. !c (1) AUTOCONVERSION OF SNOW TO FORM GRAUPEL (Pgaut): Lin (37)
  1401. !c pgaut=alpha2*(qsz-qs0)
  1402. !c qs0=6.0E-4
  1403. !c alpha2=1.0e-3*exp(0.09*temcc(k)) Lin (38)
  1404. !
  1405. alpha2=1.0e-3*exp(0.09*temcc(k))
  1406. !
  1407. ! testing
  1408. ! tmp1=alpha2*(qsz(k)-qs0)
  1409. ! tmp1=amax1(0.0,tmp1)
  1410. ! pgaut(k)=amin1( tmp1,qszodt(k) )
  1411. tmp1=odtb*(qsz(k)-qs0)*(1.0-exp(-alpha2*dtb))
  1412. pgaut(k)=amax1( 0.0,tmp1 )
  1413. !c
  1414. !c (2) FREEZING OF RAIN TO FORM GRAUPEL (Pgfr): Lin (45)
  1415. !c positive value
  1416. !c Constant in Bigg freezing Aplume=Ap=0.66 /k
  1417. !c Constant in raindrop freezing equ. Bplume=Bp=100./m/m/m/s
  1418. !
  1419. if (qrz(k) .gt. 1.e-8 ) then
  1420. Bp=100.
  1421. Ap=0.66
  1422. tmp1=olambdar(k)*olambdar(k)*olambdar(k)
  1423. tmp2=20.*pi*pi*Bp*xnor*rhowater*orho(k)* &
  1424. (exp(-Ap*temcc(k))-1.0)*tmp1*tmp1*olambdar(k)
  1425. Pgfr(k)=amin1( tmp2,qrzodt(k) )
  1426. else
  1427. Pgfr(k)=0
  1428. endif
  1429. !c
  1430. !c if (qgz(k) = 0.0) skip the other step below about graupel
  1431. !c
  1432. if (qgz(k) .eq. 0.0) goto 4000
  1433. !c
  1434. !c Comparing Pgwet(wet process) and Pdry(dry process),
  1435. !c we will pick up the small one.
  1436. !c
  1437. !c ---------------
  1438. !c | dry processes |
  1439. !c ---------------
  1440. !c
  1441. !c (3) ACCRETION OF CLOUD WATER BY GRAUPEL (Pgacw): Lin (40)
  1442. !c egw=1.0
  1443. !c Cdrag=0.6 drag coefficients for hairstone
  1444. !c constg=sqrt(4.*grav*rhograul*0.33334*orho(k)/Cdrag)
  1445. !c
  1446. egw=1.0
  1447. constg=sqrt(4.*grav*rhograul*0.33334*orho(k)*oCdrag)
  1448. tmp1=pio4*xnog*gam3pt5*constg*olambdag(k)**3.5
  1449. tmp2=qlz(k)*egw*tmp1
  1450. Pgacw(k)=amin1( tmp2,qlzodt(k) )
  1451. !c
  1452. !c (4) ACCRETION OF ICE CRYSTAL BY GRAUPEL (Pgaci): Lin (41)
  1453. !c egi=1. for wet growth
  1454. !c egi=0.1 for dry growth
  1455. !c
  1456. egi=0.1
  1457. tmp2=qiz(k)*egi*tmp1
  1458. pgaci(k)=amin1( tmp2,qizodt(k) )
  1459. !c
  1460. !c (5) ACCRETION OF SNOW BY GRAUPEL (Pgacs) : Lin (29)
  1461. !c Compute processes (6) only when qsz > 0.0 and qgz > 0.0
  1462. !c
  1463. egs=exp(0.09*temcc(k))
  1464. tmpa=olambdas(k)*olambdas(k)
  1465. tmpb=olambdag(k)*olambdag(k)
  1466. tmpc=olambdas(k)*olambdag(k)
  1467. tmp1=pi*pi*xnos*xnog*abs( vts(k)-vtg(k) )*orho(k)
  1468. tmp2=tmpa*tmpa*olambdag(k)*(5.0*tmpa+2.0*tmpc+0.5*tmpb)
  1469. tmp3=tmp1*egs*rhosnow*tmp2
  1470. Pgacs(k)=amin1( tmp3,qszodt(k) )
  1471. !c
  1472. !c (6) ACCRETION OF RAIN BY GRAUPEL (Pgacr): Lin (42)
  1473. !c Compute processes (6) only when qrz > 0.0 and qgz > 0.0
  1474. !c egr=1.
  1475. !c
  1476. egr=1.
  1477. tmpa=olambdar(k)*olambdar(k)
  1478. tmpb=olambdag(k)*olambdag(k)
  1479. tmpc=olambdar(k)*olambdag(k)
  1480. tmp1=pi*pi*xnor*xnog*abs( vtr(k)-vtg(k) )*orho(k)
  1481. tmp2=tmpa*tmpa*olambdag(k)*(5.0*tmpa+2.0*tmpc+0.5*tmpb)
  1482. tmp3=tmp1*egr*rhowater*tmp2
  1483. pgacr(k)=amin1( tmp3,qrzodt(k) )
  1484. !c
  1485. !c (7) Calculate total dry process effect Pdry(k)
  1486. !c
  1487. Pdry(k)=Pgacw(k)+pgaci(k)+Pgacs(k)+pgacr(k)
  1488. !c ---------------
  1489. !c | wet processes |
  1490. !c ---------------
  1491. !c
  1492. !c (3) ACCRETION OF ICE CRYSTAL BY GRAUPEL (Pgacip): Lin (41)
  1493. !c egi=1. for wet growth
  1494. !c egi=0.1 for dry growth
  1495. !c
  1496. tmp2=10.*pgaci(k)
  1497. pgacip(k)=amin1( tmp2,qizodt(k) )
  1498. !c
  1499. !c (4) ACCRETION OF SNOW BY GRAUPEL ((Pgacsp) : Lin (29)
  1500. !c Compute processes (6) only when qsz > 0.0 and qgz > 0.0
  1501. !c egs=exp(0.09*(tem(k)-273.15)) when T < 273.15 k
  1502. !c
  1503. tmp3=Pgacs(k)*1.0/egs
  1504. Pgacsp(k)=amin1( tmp3,qszodt(k) )
  1505. !c
  1506. !c (5) WET GROWTH OF GRAUPEL (Pgwet) : Lin (43)
  1507. !c may involve Pgacs or Pgaci and
  1508. !c must include PPgacw or Pgacr, or both.
  1509. !c ( The amount of Pgacw which is not able
  1510. !c to freeze is shed to rain. )
  1511. IF(temcc(k).gt.-40.)THEN
  1512. term0=constg*olambdag(k)**5.5/visc(k)
  1513. !c
  1514. !c vf1s,vf2s=ventilation factors for graupel
  1515. !c vf1s=0.78,vf2s=0.31 in LIN
  1516. !c Cdrag=0.6 drag coefficient for hairstone
  1517. !c constg2=vf1s*olambdag(k)*olambdag(k)+
  1518. !c vf2s*schmidt(k)**0.33334*gam2pt75*sqrt(term0)
  1519. delrs=rs0(k)-qvz(k)
  1520. tmp0=1./(xlf+cw*temcc(k))
  1521. tmp1=2.*pi*xnog*(rho(k)*xlv*diffwv(k)*delrs-xka(k)* &
  1522. temcc(k))*orho(k)*tmp0
  1523. constg2=vf1s*olambdag(k)*olambdag(k)+ &
  1524. vf2s*schmidt(k)**0.33334*gam2pt75*sqrt(term0)
  1525. tmp3=tmp1*constg2+(Pgacip(k)+Pgacsp(k))* &
  1526. (1-Ci*temcc(k)*tmp0)
  1527. tmp3=amax1(0.0,tmp3)
  1528. Pgwet(k)=amin1(tmp3,qlzodt(k)+qszodt(k)+qizodt(k) ) !bloss
  1529. !c
  1530. !c Comparing Pgwet(wet process) and Pdry(dry process),
  1531. !c we will apply the small one.
  1532. !c if dry processes then delta4=1.0
  1533. !c if wet processes then delta4=0.0
  1534. !
  1535. if ( Pdry(k) .lt. Pgwet(k) ) then
  1536. delta4=1.0
  1537. else
  1538. delta4=0.0
  1539. endif
  1540. ELSE
  1541. delta4=1.0
  1542. ENDIF
  1543. !c
  1544. !c
  1545. !c (6) Pgacrp(k)=Pgwet(k)-Pgacw(k)-Pgacip(k)-Pgacsp(k)
  1546. !c if Pgacrp(k) > 0. then some of the rain is frozen to hail
  1547. !c if Pgacrp(k) < 0. then some of the cloud water collected
  1548. !c by the hail is unable to freeze and is
  1549. !c shed as rain.
  1550. !c
  1551. Pgacrp(k)=Pgwet(k)-Pgacw(k)-Pgacip(k)-Pgacsp(k)
  1552. !c
  1553. !c (8) DEPOSITION/SUBLIMATION OF GRAUPEL (Pgdep/Pgsub): Lin (46)
  1554. !c includes ventilation effect
  1555. !c constg=sqrt(4.*grav*rhograul*0.33334*orho(k)/Cdrag)
  1556. !c constg2=vf1s*olambdag(k)*olambdag(k)+
  1557. !c vf2s*schmidt(k)**0.33334*gam2pt75*constg
  1558. !c
  1559. !c abg=2*pi*(Si-1)/rho/(A"+B")
  1560. !c
  1561. tmpa=rvapor*xka(k)*tem(k)*tem(k)
  1562. tmpb=xls*xls*rho(k)*qsiz(k)*diffwv(k)
  1563. tmpc=tmpa*qsiz(k)*diffwv(k)
  1564. abg=2.0*pi*(qvoqsiz(k)-1.0)*tmpc/(tmpa+tmpb)
  1565. !c
  1566. !c vf1s,vf2s=ventilation factors for graupel
  1567. !c vf1s=0.78,vf2s=0.31 in LIN
  1568. !c Cdrag=0.6 drag coefficient for hairstone
  1569. !c
  1570. term0=constg*olambdag(k)**5.5/visc(k)
  1571. constg2=vf1s*olambdag(k)*olambdag(k)+ &
  1572. vf2s*schmidt(k)**0.33334*gam2pt75*sqrt(term0)
  1573. tmp2=abg*xnog*constg2
  1574. pgdep(k)=amax1(0.0,tmp2)
  1575. pgsub(k)=amin1(0.0,tmp2)
  1576. pgsub(k)=amax1( pgsub(k),-qgzodt(k) )
  1577. 4000 continue
  1578. else
  1579. !
  1580. !***********************************************************************
  1581. !********* graupel production processes for T > 0 C **********
  1582. !***********************************************************************
  1583. !
  1584. !c
  1585. !c (1) ACCRETION OF CLOUD WATER BY GRAUPEL (Pgacw): Lin (40)
  1586. !c egw=1.0
  1587. !c Cdrag=0.6 drag coefficients for hairstone
  1588. !c constg=sqrt(4.*grav*rhograul*0.33334*orho(k)/Cdrag)
  1589. egw=1.0
  1590. constg=sqrt(4.*grav*rhograul*0.33334*orho(k)*oCdrag)
  1591. tmp1=pio4*xnog*gam3pt5*constg*olambdag(k)**3.5
  1592. tmp2=qlz(k)*egw*tmp1
  1593. Pgacw(k)=amin1( tmp2,qlzodt(k) )
  1594. !c
  1595. !c (2) ACCRETION OF RAIN BY GRAUPEL (Pgacr): Lin (42)
  1596. !c Compute processes (5) only when qrz > 0.0 and qgz > 0.0
  1597. !c egr=1.
  1598. !c
  1599. egr=1.
  1600. tmpa=olambdar(k)*olambdar(k)
  1601. tmpb=olambdag(k)*olambdag(k)
  1602. tmpc=olambdar(k)*olambdag(k)
  1603. tmp1=pi*pi*xnor*xnog*abs( vtr(k)-vtg(k) )*orho(k)
  1604. tmp2=tmpa*tmpa*olambdag(k)*(5.0*tmpa+2.0*tmpc+0.5*tmpb)
  1605. tmp3=tmp1*egr*rhowater*tmp2
  1606. pgacr(k)=amin1( tmp3,qrzodt(k) )
  1607. !c
  1608. !c (3) GRAUPEL MELTING TO FORM RAIN (Pgmlt): Lin (47)
  1609. !c Pgmlt is negative value
  1610. !c constg=sqrt(4.*grav*rhograul*0.33334*orho(k)/Cdrag)
  1611. !c constg2=vf1s*olambdag(k)*olambdag(k)+
  1612. !c vf2s*schmidt(k)**0.33334*gam2pt75*constg
  1613. !c Cdrag=0.6 drag coefficients for hairstone
  1614. !
  1615. delrs=rs0(k)-qvz(k)
  1616. term1=2.0*pi*orho(k)*( xlv*diffwv(k)*rho(k)*delrs- &
  1617. xka(k)*temcc(k) )
  1618. term0=sqrt(4.*grav*rhograul*0.33334*orho(k)*ocdrag) &
  1619. *olambdag(k)**5.5/visc(k)
  1620. constg2=vf1s*olambdag(k)*olambdag(k)+ &
  1621. vf2s*schmidt(k)**0.33334*gam2pt75*sqrt(term0)
  1622. tmp2=xnog*constg2
  1623. tmp3=term1*oxlf*tmp2-cwoxlf*temcc(k)*( pgacw(k)+pgacr(k) )
  1624. tmp4=amin1(0.0,tmp3)
  1625. pgmlt(k)=amax1( tmp4,-qgzodt(k) )
  1626. !c
  1627. !c (4) EVAPORATION OF MELTING GRAUPEL (Pgmltevp) : HR (A19)
  1628. !c but use Lin et al. coefficience
  1629. !c Pgmltevp is a negative value
  1630. !c abg=2.0*pi*(qvoqsiz(k)-1.0)*tmpc/(tmpa+tmpb)
  1631. !c
  1632. tmpa=rvapor*xka(k)*tem(k)*tem(k)
  1633. tmpb=xlv*xlv*rho(k)*qswz(k)*diffwv(k)
  1634. tmpc=tmpa*qswz(k)*diffwv(k)
  1635. tmpd=amin1( 0.0,(qvoqswz(k)-0.90)*qswz(k)*odtb )
  1636. !c
  1637. !c abg=2*pi*(Si-1)/rho/(A"+B")
  1638. !c
  1639. abg=2.0*pi*(qvoqswz(k)-0.90)*tmpc/(tmpa+tmpb)
  1640. !
  1641. !**** allow evaporation to occur when RH less than 90%
  1642. !**** here not using 100% because the evaporation cooling
  1643. !**** of temperature is not taking into account yet; hence,
  1644. !**** the qgw value is a little bit larger. This will avoid
  1645. !**** evaporation can generate cloud.
  1646. !
  1647. !c vf1s,vf2s=ventilation factors for snow
  1648. !c vf1s=0.78,vf2s=0.31 in LIN
  1649. !c constg=sqrt(4.*grav*rhograul*0.33334*orho(k)/Cdrag)
  1650. !c constg2=vf1s*olambdag(k)*olambdag(k)+
  1651. !c vf2s*schmidt(k)**0.33334*gam2pt75*constg
  1652. !
  1653. tmp2=abg*xnog*constg2
  1654. tmp3=amin1(0.0,tmp2)
  1655. tmp3=amax1( tmp3,tmpd )
  1656. pgmltevp(k)=amax1( tmp3,-qgzodt(k) )
  1657. !c
  1658. !c (5) ACCRETION OF SNOW BY GRAUPEL (Pgacs) : Lin (29)
  1659. !c Compute processes (3) only when qsz > 0.0 and qgz > 0.0
  1660. !c egs=1.0
  1661. !c
  1662. egs=1.
  1663. tmpa=olambdas(k)*olambdas(k)
  1664. tmpb=olambdag(k)*olambdag(k)
  1665. tmpc=olambdas(k)*olambdag(k)
  1666. tmp1=pi*pi*xnos*xnog*abs( vts(k)-vtg(k) )*orho(k)
  1667. tmp2=tmpa*tmpa*olambdag(k)*(5.0*tmpa+2.0*tmpc+0.5*tmpb)
  1668. tmp3=tmp1*egs*rhosnow*tmp2
  1669. Pgacs(k)=amin1( tmp3,qszodt(k) )
  1670. endif
  1671. !
  1672. 900 continue
  1673. !cc
  1674. !c
  1675. !c**********************************************************************
  1676. !c***** combine all processes together and avoid negative *****
  1677. !c***** water substances
  1678. !***********************************************************************
  1679. !c
  1680. if ( temcc(k) .lt. 0.0) then
  1681. !,delta4,1.-delta4
  1682. !c
  1683. !c gdelta4=gindex*delta4
  1684. !c g1sdelt4=gindex*(1.-delta4)
  1685. !c
  1686. gdelta4=gindex*delta4
  1687. g1sdelt4=gindex*(1.-delta4)
  1688. !c
  1689. !c combined water vapor depletions
  1690. !c
  1691. !cc graupel
  1692. tmp=psdep(k)+pgdep(k)*gindex
  1693. if ( tmp .gt. qvzodt(k) ) then
  1694. factor=qvzodt(k)/tmp
  1695. psdep(k)=psdep(k)*factor
  1696. pgdep(k)=pgdep(k)*factor*gindex
  1697. end if
  1698. !c
  1699. !c combined cloud water depletions
  1700. !c
  1701. tmp=praut(k)+psacw(k)+psfw(k)+pracw(k)+gindex*Pgacw(k)
  1702. if ( tmp .gt. qlzodt(k) ) then
  1703. factor=qlzodt(k)/tmp
  1704. praut(k)=praut(k)*factor
  1705. psacw(k)=psacw(k)*factor
  1706. psfw(k)=psfw(k)*factor
  1707. pracw(k)=pracw(k)*factor
  1708. !cc graupel
  1709. Pgacw(k)=Pgacw(k)*factor*gindex
  1710. end if
  1711. !c
  1712. !c combined cloud ice depletions
  1713. !c
  1714. tmp=psaut(k)+psaci(k)+praci(k)+psfi(k)+Pgaci(k)*gdelta4 &
  1715. +Pgacip(k)*g1sdelt4
  1716. if (tmp .gt. qizodt(k) ) then
  1717. factor=qizodt(k)/tmp
  1718. psaut(k)=psaut(k)*factor
  1719. psaci(k)=psaci(k)*factor
  1720. praci(k)=praci(k)*factor
  1721. psfi(k)=psfi(k)*factor
  1722. !cc graupel
  1723. Pgaci(k)=Pgaci(k)*factor*gdelta4
  1724. Pgacip(k)=Pgacip(k)*factor*g1sdelt4
  1725. endif
  1726. !c
  1727. !c combined all rain processes
  1728. !c
  1729. tmp_r=piacr(k)+psacr(k)-prevp(k)-praut(k)-pracw(k) &
  1730. +Pgfr(k)*gindex+Pgacr(k)*gdelta4 &
  1731. +Pgacrp(k)*g1sdelt4
  1732. if (tmp_r .gt. qrzodt(k) ) then
  1733. factor=qrzodt(k)/tmp_r
  1734. piacr(k)=piacr(k)*factor
  1735. psacr(k)=psacr(k)*factor
  1736. prevp(k)=prevp(k)*factor
  1737. !cc graupel
  1738. Pgfr(k)=Pgfr(k)*factor*gindex
  1739. Pgacr(k)=Pgacr(k)*factor*gdelta4
  1740. Pgacrp(k)=Pgacrp(k)*factor*g1sdelt4
  1741. endif
  1742. !c
  1743. !c if qrz < 1.0E-4 and qsz < 1.0E-4 then delta2=1.
  1744. !c (all Pracs and Psacr become to snow)
  1745. !c if qrz >= 1.0E-4 or qsz >= 1.0E-4 then delta2=0.
  1746. !c (all Pracs and Psacr become to graupel)
  1747. !c
  1748. if (qrz(k) .lt. 1.0E-4 .and. qsz(k) .lt. 1.0E-4) then
  1749. delta2=1.0
  1750. else
  1751. delta2=0.0
  1752. endif
  1753. !
  1754. !cc graupel
  1755. !c
  1756. !c if qrz(k) < 1.0e-4 then delta3=1. means praci(k) --> qs
  1757. !c piacr(k) --> qs
  1758. !c if qrz(k) > 1.0e-4 then delta3=0. means praci(k) --> qg
  1759. !c piacr(k) --> qg : Lin (20)
  1760. if (qrz(k) .lt. 1.0e-4) then
  1761. delta3=1.0
  1762. else
  1763. delta3=0.0
  1764. endif
  1765. !
  1766. !c
  1767. !c if gindex = 0.(no graupel) then delta2=1.0
  1768. !c delta3=1.0
  1769. !c
  1770. if (gindex .eq. 0.) then
  1771. delta2=1.0
  1772. delta3=1.0
  1773. endif
  1774. !
  1775. !c
  1776. !c combined all snow processes
  1777. !c
  1778. tmp_s=-pssub(k)-(psaut(k)+psaci(k)+psacw(k)+psfw(k)+ &
  1779. psfi(k)+praci(k)*delta3+piacr(k)*delta3+ &
  1780. psdep(k))+Pgaut(k)*gindex+Pgacs(k)*gdelta4+ &
  1781. Pgacsp(k)*g1sdelt4+Pracs(k)*(1.-delta2)- &
  1782. Psacr(k)*delta2
  1783. if ( tmp_s .gt. qszodt(k) ) then
  1784. factor=qszodt(k)/tmp_s
  1785. pssub(k)=pssub(k)*factor
  1786. Pracs(k)=Pracs(k)*factor
  1787. !cc graupel
  1788. Pgaut(k)=Pgaut(k)*factor*gindex
  1789. Pgacs(k)=Pgacs(k)*factor*gdelta4
  1790. Pgacsp(k)=Pgacsp(k)*factor*g1sdelt4
  1791. endif
  1792. !cc graupel
  1793. !
  1794. ! if (gindex .eq. 0.) goto 998
  1795. !c
  1796. !c combined all graupel processes
  1797. !c
  1798. if(delta4.lt.0.5) then
  1799. !Re-define pgwet to account for limiting of pgacrp,
  1800. ! pgacip, pgacw and pgacsp above
  1801. pgwet(k) = pgacrp(k) + pgacw(k) + pgacip(k) + pgacsp(k)
  1802. end if
  1803. tmp_g=-pgaut(k)-pgfr(k)-Pgacw(k)*delta4-Pgaci(k)*delta4 &
  1804. -Pgacr(k)*delta4-Pgacs(k)*delta4 &
  1805. -pgwet(k)*(1.-delta4)-pgsub(k)-pgdep(k) &
  1806. -psacr(k)*(1-delta2)-Pracs(k)*(1-delta2) &
  1807. -praci(k)*(1-delta3)-piacr(k)*(1-delta3)
  1808. if (tmp_g .gt. qgzodt(k)) then
  1809. factor=qgzodt(k)/tmp_g
  1810. pgsub(k)=pgsub(k)*factor
  1811. endif
  1812. 998 continue
  1813. !c
  1814. !c calculate new water substances, thetae, tem, and qvsbar
  1815. !c
  1816. !cc graupel
  1817. pvapor(k)=-pssub(k)-psdep(k)-prevp(k)-pgsub(k)*gindex &
  1818. -pgdep(k)*gindex
  1819. qvz(k)=amax1( qvmin,qvz(k)+dtb*pvapor(k) )
  1820. pclw(k)=-praut(k)-pracw(k)-psacw(k)-psfw(k)-pgacw(k)*gindex
  1821. if(flag_qndrop)then
  1822. if( qlz(k) > 1e-20 ) &
  1823. qndropz(k)=amax1( 0.0,qndropz(k)+dtb*pclw(k)*qndropz(k)/qlz(k) ) !sg
  1824. endif
  1825. qlz(k)=amax1( 0.0,qlz(k)+dtb*pclw(k) )
  1826. pcli(k)=-psaut(k)-psfi(k)-psaci(k)-praci(k)-pgaci(k)*gdelta4 &
  1827. -Pgacip(k)*g1sdelt4
  1828. qiz(k)=amax1( 0.0,qiz(k)+dtb*pcli(k) )
  1829. tmp_r=piacr(k)+psacr(k)-prevp(k)-praut(k)-pracw(k) &
  1830. +Pgfr(k)*gindex+Pgacr(k)*gdelta4 &
  1831. +Pgacrp(k)*g1sdelt4
  1832. 232 format(i2,1x,6(f9.3,1x))
  1833. prain(k)=-tmp_r
  1834. qrz(k)=amax1( 0.0,qrz(k)+dtb*prain(k) )
  1835. tmp_s=-pssub(k)-(psaut(k)+psaci(k)+psacw(k)+psfw(k)+ &
  1836. psfi(k)+praci(k)*delta3+piacr(k)*delta3+ &
  1837. psdep(k))+Pgaut(k)*gindex+Pgacs(k)*gdelta4+ &
  1838. Pgacsp(k)*g1sdelt4+Pracs(k)*(1.-delta2)- &
  1839. Psacr(k)*delta2
  1840. psnow(k)=-tmp_s
  1841. qsz(k)=amax1( 0.0,qsz(k)+dtb*psnow(k) )
  1842. qschg(k)=qschg(k)+psnow(k)
  1843. qschg(k)=psnow(k)
  1844. !cc graupel
  1845. tmp_g=-pgaut(k)-pgfr(k)-Pgacw(k)*delta4-Pgaci(k)*delta4 &
  1846. -Pgacr(k)*delta4-Pgacs(k)*delta4 &
  1847. -pgwet(k)*(1.-delta4)-pgsub(k)-pgdep(k) &
  1848. -psacr(k)*(1-delta2)-Pracs(k)*(1-delta2) &
  1849. -praci(k)*(1-delta3)-piacr(k)*(1-delta3)
  1850. 252 format(i2,1x,6(f12.9,1x))
  1851. 262 format(i2,1x,7(f12.9,1x))
  1852. pgraupel(k)=-tmp_g
  1853. pgraupel(k)=pgraupel(k)*gindex
  1854. qgz(k)=amax1( 0.0,qgz(k)+dtb*pgraupel(k))
  1855. ! qgchg(k)=qgchg(k)+pgraupel(k)
  1856. qgchg(k)=pgraupel(k)
  1857. qgz(k)=qgz(k)*gindex
  1858. tmp=ocp/tothz(k)*xLf*(qschg(k)+qgchg(k))
  1859. theiz(k)=theiz(k)+dtb*tmp
  1860. thz(k)=theiz(k)-(xLvocp*qvz(k)-xLfocp*qiz(k))/tothz(k)
  1861. tem(k)=thz(k)*tothz(k)
  1862. temcc(k)=tem(k)-273.15
  1863. !bloss: Moves computation of saturation mixing ratio below
  1864. ! if( temcc(k) .lt. -40.0 ) qswz(k)=qsiz(k)
  1865. ! qlpqi=qlz(k)+qiz(k)
  1866. ! if ( qlpqi .eq. 0.0 ) then
  1867. ! qvsbar(k)=qsiz(k)
  1868. ! else
  1869. ! qvsbar(k)=( qiz(k)*qsiz(k)+qlz(k)*qswz(k) )/qlpqi
  1870. ! endif
  1871. !
  1872. else
  1873. !c
  1874. !c combined cloud water depletions
  1875. !c
  1876. tmp=praut(k)+psacw(k)+pracw(k)+pgacw(k)*gindex
  1877. if ( tmp .gt. qlzodt(k) ) then
  1878. factor=qlzodt(k)/tmp
  1879. praut(k)=praut(k)*factor
  1880. psacw(k)=psacw(k)*factor
  1881. pracw(k)=pracw(k)*factor
  1882. !cc graupel
  1883. pgacw(k)=pgacw(k)*factor*gindex
  1884. end if
  1885. !c
  1886. !c combined all snow processes
  1887. !c
  1888. tmp_s=-(psmlt(k)+psmltevp(k))+Pgacs(k)*gindex
  1889. if (tmp_s .gt. qszodt(k) ) then
  1890. factor=qszodt(k)/tmp_s
  1891. psmlt(k)=psmlt(k)*factor
  1892. psmltevp(k)=psmltevp(k)*factor
  1893. !cc graupel
  1894. Pgacs(k)=Pgacs(k)*factor*gindex
  1895. endif
  1896. !c
  1897. !c
  1898. !cc graupel
  1899. !c
  1900. ! if (gindex .eq. 0.) goto 997
  1901. !c
  1902. !c combined all graupel processes
  1903. !c
  1904. tmp_g=-pgmlt(k)-pgacs(k)-pgmltevp(k)
  1905. if (tmp_g .gt. qgzodt(k)) then
  1906. factor=qgzodt(k)/tmp_g
  1907. pgmltevp(k)=pgmltevp(k)*factor
  1908. pgmlt(k)=pgmlt(k)*factor
  1909. endif
  1910. !c
  1911. 997 continue
  1912. !c
  1913. !c combined all rain processes
  1914. !c
  1915. tmp_r=-prevp(k)-(praut(k)+pracw(k)+psacw(k)-psmlt(k)) &
  1916. +pgmlt(k)*gindex-pgacw(k)*gindex
  1917. if (tmp_r .gt. qrzodt(k) ) then
  1918. factor=qrzodt(k)/tmp_r
  1919. prevp(k)=prevp(k)*factor
  1920. endif
  1921. !c
  1922. !c
  1923. !c calculate new water substances and thetae
  1924. !c
  1925. pvapor(k)=-psmltevp(k)-prevp(k)-pgmltevp(k)*gindex
  1926. qvz(k)=amax1( qvmin,qvz(k)+dtb*pvapor(k))
  1927. pclw(k)=-praut(k)-pracw(k)-psacw(k)-pgacw(k)*gindex
  1928. if(flag_qndrop)then
  1929. if( qlz(k) > 1e-20 ) &
  1930. qndropz(k)=amax1( 0.0,qndropz(k)+dtb*pclw(k)*qndropz(k)/qlz(k) ) !sg
  1931. endif
  1932. qlz(k)=amax1( 0.0,qlz(k)+dtb*pclw(k) )
  1933. pcli(k)=0.0
  1934. qiz(k)=amax1( 0.0,qiz(k)+dtb*pcli(k) )
  1935. tmp_r=-prevp(k)-(praut(k)+pracw(k)+psacw(k)-psmlt(k)) &
  1936. +pgmlt(k)*gindex-pgacw(k)*gindex
  1937. 242 format(i2,1x,7(f9.6,1x))
  1938. prain(k)=-tmp_r
  1939. tmpqrz=qrz(k)
  1940. qrz(k)=amax1( 0.0,qrz(k)+dtb*prain(k) )
  1941. tmp_s=-(psmlt(k)+psmltevp(k))+Pgacs(k)*gindex
  1942. psnow(k)=-tmp_s
  1943. qsz(k)=amax1( 0.0,qsz(k)+dtb*psnow(k) )
  1944. ! qschg(k)=qschg(k)+psnow(k)
  1945. qschg(k)=psnow(k)
  1946. !cc graupel
  1947. tmp_g=-pgmlt(k)-pgacs(k)-pgmltevp(k)
  1948. ! write(*,272)k,pgmlt(k),pgacs(k),pgmltevp(k),
  1949. 272 format(i2,1x,3(f12.9,1x))
  1950. pgraupel(k)=-tmp_g*gindex
  1951. qgz(k)=amax1( 0.0,qgz(k)+dtb*pgraupel(k))
  1952. ! qgchg(k)=qgchg(k)+pgraupel(k)
  1953. qgchg(k)=pgraupel(k)
  1954. qgz(k)=qgz(k)*gindex
  1955. !
  1956. tmp=ocp/tothz(k)*xLf*(qschg(k)+qgchg(k))
  1957. theiz(k)=theiz(k)+dtb*tmp
  1958. thz(k)=theiz(k)-(xLvocp*qvz(k)-xLfocp*qiz(k))/tothz(k)
  1959. tem(k)=thz(k)*tothz(k)
  1960. temcc(k)=tem(k)-273.15
  1961. ! qswz(k)=episp0k*oprez(k)* &
  1962. ! exp( svp2*temcc(k)/(tem(k)-svp3) )
  1963. !bloss: Moved computation of saturation mixing ratio below
  1964. ! es=1000.*svp1*exp( svp2*temcc(k)/(tem(k)-svp3) )
  1965. ! qswz(k)=ep2*es/(prez(k)-es)
  1966. ! qsiz(k)=qswz(k)
  1967. ! qvsbar(k)=qswz(k)
  1968. !
  1969. end if
  1970. preclw(k)=pclw(k) !sg
  1971. !
  1972. !***********************************************************************
  1973. !********** saturation adjustment **********
  1974. !***********************************************************************
  1975. !bloss: BEGIN
  1976. !
  1977. ! compute saturation specific humidity at the temperature
  1978. ! which would be experienced if all cloud liquid and ice
  1979. ! were to become vapor. This will make for a consistent
  1980. ! check of saturation. Previously, qvsbar was computed
  1981. ! without accounting for the change in temperature due to
  1982. ! evaporation/sublimation, and as a result would
  1983. ! incorrectly identify some points as subsaturated.
  1984. tmp_tem = tem(k) ! updated temperature from above.
  1985. if(qlz(k)+qiz(k).gt. 0.) then
  1986. ! account for latent heat if all qlz and qiz were converted to vapor
  1987. tmp_tem = tem(k) - xlvocp*qlz(k) - (xlvocp+xlfocp)*qiz(k)
  1988. end if
  1989. ! compute temperature in celsius
  1990. tmp_temcc = tmp_tem - 273.15
  1991. ! estimate lower bound on saturation vapor pressure
  1992. ! (ice if <0C, liquid aboce)
  1993. if (tmp_temcc .lt. 0.) then
  1994. es=1000.*svp1*exp( 21.8745584*(tmp_tem-273.16)/(tmp_tem-7.66) ) !ice
  1995. else
  1996. es=1000.*svp1*exp( svp2*tmp_temcc/(tmp_tem-svp3) ) !liquid
  1997. end if
  1998. ! compute lower bound on saturation mixing ratio.
  1999. qvsbar(k)=ep2*es/(prez(k)-es)
  2000. !
  2001. !bloss: END
  2002. !
  2003. ! allow supersaturation exits linearly from 0% at 500 mb to 50%
  2004. ! above 300 mb
  2005. ! 5.0e-5=1.0/(500mb-300mb)
  2006. !
  2007. rsat=1.0+0.5*(50000.0-prez(k))*5.0e-5
  2008. rsat=amax1(1.0,rsat)
  2009. rsat=amin1(1.5,rsat)
  2010. rsat=1.0
  2011. if( qvz(k)+qlz(k)+qiz(k) .lt. rsat*qvsbar(k) ) then
  2012. !c
  2013. !c unsaturated
  2014. !c
  2015. qvz(k)=qvz(k)+qlz(k)+qiz(k)
  2016. qlz(k)=0.0
  2017. qiz(k)=0.0
  2018. thz(k)=theiz(k)-(xLvocp*qvz(k)-xLfocp*qiz(k))/tothz(k)
  2019. tem(k)=thz(k)*tothz(k)
  2020. temcc(k)=tem(k)-273.15
  2021. go to 1800
  2022. !
  2023. else
  2024. !c
  2025. !c saturated
  2026. !c
  2027. !
  2028. pladj(k)=qlz(k)
  2029. piadj(k)=qiz(k)
  2030. !
  2031. CALL satadj(qvz, qlz, qiz, prez, theiz, thz, tothz, kts, kte, &
  2032. k, xLvocp, xLfocp, episp0k, EP2,SVP1,SVP2,SVP3,SVPT0 )
  2033. !
  2034. pladj(k)=odtb*(qlz(k)-pladj(k))
  2035. piadj(k)=odtb*(qiz(k)-piadj(k))
  2036. !
  2037. pclw(k)=pclw(k)+pladj(k)
  2038. pcli(k)=pcli(k)+piadj(k)
  2039. pvapor(k)=pvapor(k)-( pladj(k)+piadj(k) )
  2040. !
  2041. thz(k)=theiz(k)-(xLvocp*qvz(k)-xLfocp*qiz(k))/tothz(k)
  2042. tem(k)=thz(k)*tothz(k)
  2043. temcc(k)=tem(k)-273.15
  2044. ! qswz(k)=episp0k*oprez(k)* &
  2045. ! exp( svp2*temcc(k)/(tem(k)-svp3) )
  2046. es=1000.*svp1*exp( svp2*temcc(k)/(tem(k)-svp3) )
  2047. qswz(k)=ep2*es/(prez(k)-es)
  2048. if (tem(k) .lt. 273.15 ) then
  2049. ! qsiz(k)=episp0k*oprez(k)* &
  2050. ! exp( 21.8745584*(tem(k)-273.16)/(tem(k)-7.66) )
  2051. es=1000.*svp1*exp( 21.8745584*(tem(k)-273.16)/(tem(k)-7.66) )
  2052. qsiz(k)=ep2*es/(prez(k)-es)
  2053. if (temcc(k) .lt. -40.0) qswz(k)=qsiz(k)
  2054. else
  2055. qsiz(k)=qswz(k)
  2056. endif
  2057. qlpqi=qlz(k)+qiz(k)
  2058. if ( qlpqi .eq. 0.0 ) then
  2059. qvsbar(k)=qsiz(k)
  2060. else
  2061. qvsbar(k)=( qiz(k)*qsiz(k)+qlz(k)*qswz(k) )/qlpqi
  2062. endif
  2063. end if
  2064. !
  2065. !***********************************************************************
  2066. !***** melting and freezing of cloud ice and cloud water *****
  2067. !***********************************************************************
  2068. qlpqi=qlz(k)+qiz(k)
  2069. if(qlpqi .le. 0.0) go to 1800
  2070. !
  2071. !c
  2072. !c (1) HOMOGENEOUS NUCLEATION WHEN T< -40 C (Pihom)
  2073. !c
  2074. if(temcc(k) .lt. -40.0) pihom(k)=qlz(k)*odtb
  2075. !c
  2076. !c (2) MELTING OF ICE CRYSTAL WHEN T> 0 C (Pimlt)
  2077. !c
  2078. if(temcc(k) .gt. 0.0) pimlt(k)=qiz(k)*odtb
  2079. !c
  2080. !c (3) PRODUCTION OF CLOUD ICE BY BERGERON PROCESS (Pidw): Hsie (p957)
  2081. !c this process only considered when -31 C < T < 0 C
  2082. !c
  2083. if(temcc(k) .lt. 0.0 .and. temcc(k) .gt. -31.0) then
  2084. !c!
  2085. !c! parama1 and parama2 functions must be user supplied
  2086. !c!
  2087. a1=parama1( temcc(k) )
  2088. a2=parama2( temcc(k) )
  2089. !! change unit from cgs to mks
  2090. a1=a1*0.001**(1.0-a2)
  2091. xnin=xni0*exp(-bni*temcc(k))
  2092. pidw(k)=xnin*orho(k)*(a1*xmnin**a2)
  2093. end if
  2094. !
  2095. pcli(k)=pcli(k)+pihom(k)-pimlt(k)+pidw(k)
  2096. pclw(k)=pclw(k)-pihom(k)+pimlt(k)-pidw(k)
  2097. qlz(k)=amax1( 0.0,qlz(k)+dtb*(-pihom(k)+pimlt(k)-pidw(k)) )
  2098. qiz(k)=amax1( 0.0,qiz(k)+dtb*(pihom(k)-pimlt(k)+pidw(k)) )
  2099. !
  2100. CALL satadj(qvz, qlz, qiz, prez, theiz, thz, tothz, kts, kte, &
  2101. k, xLvocp, xLfocp, episp0k ,EP2,SVP1,SVP2,SVP3,SVPT0)
  2102. thz(k)=theiz(k)-(xLvocp*qvz(k)-xLfocp*qiz(k))/tothz(k)
  2103. tem(k)=thz(k)*tothz(k)
  2104. temcc(k)=tem(k)-273.15
  2105. ! qswz(k)=episp0k*oprez(k)* &
  2106. ! exp( svp2*temcc(k)/(tem(k)-svp3) )
  2107. es=1000.*svp1*exp( svp2*temcc(k)/(tem(k)-svp3) )
  2108. qswz(k)=ep2*es/(prez(k)-es)
  2109. if (tem(k) .lt. 273.15 ) then
  2110. ! qsiz(k)=episp0k*oprez(k)* &
  2111. ! exp( 21.8745584*(tem(k)-273.16)/(tem(k)-7.66) )
  2112. es=1000.*svp1*exp( 21.8745584*(tem(k)-273.16)/(tem(k)-7.66) )
  2113. qsiz(k)=ep2*es/(prez(k)-es)
  2114. if (temcc(k) .lt. -40.0) qswz(k)=qsiz(k)
  2115. else
  2116. qsiz(k)=qswz(k)
  2117. endif
  2118. qlpqi=qlz(k)+qiz(k)
  2119. if ( qlpqi .eq. 0.0 ) then
  2120. qvsbar(k)=qsiz(k)
  2121. else
  2122. qvsbar(k)=( qiz(k)*qsiz(k)+qlz(k)*qswz(k) )/qlpqi
  2123. endif
  2124. 1800 continue
  2125. !
  2126. !***********************************************************************
  2127. !********** integrate the productions of rain and snow **********
  2128. !***********************************************************************
  2129. !c
  2130. 2000 continue
  2131. !---------------------------------------------------------------------
  2132. !
  2133. !***********************************************************************
  2134. !****** Write terms in cloud physics to time series dataset *****
  2135. !***********************************************************************
  2136. !
  2137. ! open(unit=24,form='formatted',status='new',
  2138. ! & file='cloud.dat')
  2139. !9030 format(10e12.6)
  2140. ! write(24,*)'tmp'
  2141. ! write(24,9030) (tem(k),k=kts+1,kte)
  2142. ! write(24,*)'qiz'
  2143. ! write(24,9030) (qiz(k),k=kts+1,kte)
  2144. ! write(24,*)'qsz'
  2145. ! write(24,9030) (qsz(k),k=kts+1,kte)
  2146. ! write(24,*)'qrz'
  2147. ! write(24,9030) (qrz(k),k=kts+1,kte)
  2148. ! write(24,*)'qgz'
  2149. ! write(24,9030) (qgz(k),k=kts+1,kte)
  2150. ! write(24,*)'qvoqsw'
  2151. ! write(24,9030) (qvoqswz(k),k=kts+1,kte)
  2152. ! write(24,*)'qvoqsi'
  2153. ! write(24,9030) (qvoqsiz(k),k=kts+1,kte)
  2154. ! write(24,*)'vtr'
  2155. ! write(24,9030) (vtr(k),k=kts+1,kte)
  2156. ! write(24,*)'vts'
  2157. ! write(24,9030) (vts(k),k=kts+1,kte)
  2158. ! write(24,*)'vtg'
  2159. ! write(24,9030) (vtg(k),k=kts+1,kte)
  2160. ! write(24,*)'pclw'
  2161. ! write(24,9030) (pclw(k),k=kts+1,kte)
  2162. ! write(24,*)'pvapor'
  2163. ! write(24,9030) (pvapor(k),k=kts+1,kte)
  2164. ! write(24,*)'pcli'
  2165. ! write(24,9030) (pcli(k),k=kts+1,kte)
  2166. ! write(24,*)'pimlt'
  2167. ! write(24,9030) (pimlt(k),k=kts+1,kte)
  2168. ! write(24,*)'pihom'
  2169. ! write(24,9030) (pihom(k),k=kts+1,kte)
  2170. ! write(24,*)'pidw'
  2171. ! write(24,9030) (pidw(k),k=kts+1,kte)
  2172. ! write(24,*)'prain'
  2173. ! write(24,9030) (prain(k),k=kts+1,kte)
  2174. ! write(24,*)'praut'
  2175. ! write(24,9030) (praut(k),k=kts+1,kte)
  2176. ! write(24,*)'pracw'
  2177. ! write(24,9030) (pracw(k),k=kts+1,kte)
  2178. ! write(24,*)'prevp'
  2179. ! write(24,9030) (prevp(k),k=kts+1,kte)
  2180. ! write(24,*)'psnow'
  2181. ! write(24,9030) (psnow(k),k=kts+1,kte)
  2182. ! write(24,*)'psaut'
  2183. ! write(24,9030) (psaut(k),k=kts+1,kte)
  2184. ! write(24,*)'psfw'
  2185. ! write(24,9030) (psfw(k),k=kts+1,kte)
  2186. ! write(24,*)'psfi'
  2187. ! write(24,9030) (psfi(k),k=kts+1,kte)
  2188. ! write(24,*)'praci'
  2189. ! write(24,9030) (praci(k),k=kts+1,kte)
  2190. ! write(24,*)'piacr'
  2191. ! write(24,9030) (piacr(k),k=kts+1,kte)
  2192. ! write(24,*)'psaci'
  2193. ! write(24,9030) (psaci(k),k=kts+1,kte)
  2194. ! write(24,*)'psacw'
  2195. ! write(24,9030) (psacw(k),k=kts+1,kte)
  2196. ! write(24,*)'psdep'
  2197. ! write(24,9030) (psdep(k),k=kts+1,kte)
  2198. ! write(24,*)'pssub'
  2199. ! write(24,9030) (pssub(k),k=kts+1,kte)
  2200. ! write(24,*)'pracs'
  2201. ! write(24,9030) (pracs(k),k=kts+1,kte)
  2202. ! write(24,*)'psacr'
  2203. ! write(24,9030) (psacr(k),k=kts+1,kte)
  2204. ! write(24,*)'psmlt'
  2205. ! write(24,9030) (psmlt(k),k=kts+1,kte)
  2206. ! write(24,*)'psmltevp'
  2207. ! write(24,9030) (psmltevp(k),k=kts+1,kte)
  2208. ! write(24,*)'pladj'
  2209. ! write(24,9030) (pladj(k),k=kts+1,kte)
  2210. ! write(24,*)'piadj'
  2211. ! write(24,9030) (piadj(k),k=kts+1,kte)
  2212. ! write(24,*)'pgraupel'
  2213. ! write(24,9030) (pgraupel(k),k=kts+1,kte)
  2214. ! write(24,*)'pgaut'
  2215. ! write(24,9030) (pgaut(k),k=kts+1,kte)
  2216. ! write(24,*)'pgfr'
  2217. ! write(24,9030) (pgfr(k),k=kts+1,kte)
  2218. ! write(24,*)'pgacw'
  2219. ! write(24,9030) (pgacw(k),k=kts+1,kte)
  2220. ! write(24,*)'pgaci'
  2221. ! write(24,9030) (pgaci(k),k=kts+1,kte)
  2222. ! write(24,*)'pgacr'
  2223. ! write(24,9030) (pgacr(k),k=kts+1,kte)
  2224. ! write(24,*)'pgacs'
  2225. ! write(24,9030) (pgacs(k),k=kts+1,kte)
  2226. ! write(24,*)'pgacip'
  2227. ! write(24,9030) (pgacip(k),k=kts+1,kte)
  2228. ! write(24,*)'pgacrP'
  2229. ! write(24,9030) (pgacrP(k),k=kts+1,kte)
  2230. ! write(24,*)'pgacsp'
  2231. ! write(24,9030) (pgacsp(k),k=kts+1,kte)
  2232. ! write(24,*)'pgwet'
  2233. ! write(24,9030) (pgwet(k),k=kts+1,kte)
  2234. ! write(24,*)'pdry'
  2235. ! write(24,9030) (pdry(k),k=kts+1,kte)
  2236. ! write(24,*)'pgsub'
  2237. ! write(24,9030) (pgsub(k),k=kts+1,kte)
  2238. ! write(24,*)'pgdep'
  2239. ! write(24,9030) (pgdep(k),k=kts+1,kte)
  2240. ! write(24,*)'pgmlt'
  2241. ! write(24,9030) (pgmlt(k),k=kts+1,kte)
  2242. ! write(24,*)'pgmltevp'
  2243. ! write(24,9030) (pgmltevp(k),k=kts+1,kte)
  2244. !**** below if qv < qvmin then qv=qvmin, ql=0.0, and qi=0.0
  2245. !
  2246. do k=kts+1,kte
  2247. if ( qvz(k) .lt. qvmin ) then
  2248. qlz(k)=0.0
  2249. qiz(k)=0.0
  2250. qvz(k)=amax1( qvmin,qvz(k)+qlz(k)+qiz(k) )
  2251. end if
  2252. enddo
  2253. !
  2254. END SUBROUTINE clphy1d
  2255. !---------------------------------------------------------------------
  2256. ! SATURATED ADJUSTMENT
  2257. !---------------------------------------------------------------------
  2258. SUBROUTINE satadj(qvz, qlz, qiz, prez, theiz, thz, tothz, &
  2259. kts, kte, k, xLvocp, xLfocp, episp0k, EP2,SVP1,SVP2,SVP3,SVPT0)
  2260. !---------------------------------------------------------------------
  2261. IMPLICIT NONE
  2262. !---------------------------------------------------------------------
  2263. ! This program use Newton's method for finding saturated temperature
  2264. ! and saturation mixing ratio.
  2265. !
  2266. ! In this saturation adjustment scheme we assume
  2267. ! (1) the saturation mixing ratio is the mass weighted average of
  2268. ! saturation values over liquid water (qsw), and ice (qsi)
  2269. ! following Lord et al., 1984 and Tao, 1989
  2270. !
  2271. ! (2) the percentage of cloud liquid and cloud ice will
  2272. ! be fixed during the saturation calculation
  2273. !---------------------------------------------------------------------
  2274. !
  2275. INTEGER, INTENT(IN ) :: kts, kte, k
  2276. REAL, DIMENSION( kts:kte ), &
  2277. INTENT(INOUT) :: qvz, qlz, qiz
  2278. !
  2279. REAL, DIMENSION( kts:kte ), &
  2280. INTENT(IN ) :: prez, theiz, tothz
  2281. REAL, INTENT(IN ) :: xLvocp, xLfocp, episp0k
  2282. REAL, INTENT(IN ) :: EP2,SVP1,SVP2,SVP3,SVPT0
  2283. ! LOCAL VARS
  2284. INTEGER :: n
  2285. REAL, DIMENSION( kts:kte ) :: thz, tem, temcc, qsiz, &
  2286. qswz, qvsbar
  2287. REAL :: qsat, qlpqi, ratql, t0, t1, tmp1, ratqi, tsat, absft, &
  2288. denom1, denom2, dqvsbar, ftsat, dftsat, qpz, &
  2289. gindex, es
  2290. REAL :: tem_noliqice, qsat_noliqice !bloss
  2291. !
  2292. !---------------------------------------------------------------------
  2293. thz(k)=theiz(k)-(xLvocp*qvz(k)-xLfocp*qiz(k))/tothz(k)
  2294. tem(k)=tothz(k)*thz(k)
  2295. !bloss: BEGIN
  2296. tem_noliqice = tem(k) - xlvocp*qlz(k) - (xLvocp+xLfocp)*qiz(k)
  2297. if (tem_noliqice .gt. 273.15) then
  2298. es=1000.*svp1*exp( svp2*(tem_noliqice-svpt0)/(tem_noliqice-svp3) )
  2299. qsat_noliqice=ep2*es/(prez(k)-es)
  2300. else
  2301. qsat_noliqice=episp0k/prez(k)* &
  2302. exp( 21.8745584*(tem_noliqice-273.15)/(tem_noliqice-7.66) )
  2303. end if
  2304. !bloss: END
  2305. qpz=qvz(k)+qlz(k)+qiz(k)
  2306. if (qpz .lt. qsat_noliqice) then
  2307. qvz(k)=qpz
  2308. qiz(k)=0.0
  2309. qlz(k)=0.0
  2310. go to 400
  2311. end if
  2312. qlpqi=qlz(k)+qiz(k)
  2313. if( qlpqi .ge. 1.0e-5) then
  2314. ratql=qlz(k)/qlpqi
  2315. ratqi=qiz(k)/qlpqi
  2316. else
  2317. t0=273.15
  2318. ! t1=233.15
  2319. t1=248.15
  2320. tmp1=( t0-tem(k) )/(t0-t1)
  2321. tmp1=amin1(1.0,tmp1)
  2322. tmp1=amax1(0.0,tmp1)
  2323. ratqi=tmp1
  2324. ratql=1.0-tmp1
  2325. end if
  2326. !
  2327. !
  2328. !-- saturation mixing ratios over water and ice
  2329. !-- at the outset we will follow Bolton 1980 MWR for
  2330. !-- the water and Murray JAS 1967 for the ice
  2331. !
  2332. !-- dqvsbar=d(qvsbar)/dT
  2333. !-- ftsat=F(Tsat)
  2334. !-- dftsat=d(F(T))/dT
  2335. !
  2336. ! First guess of tsat
  2337. tsat=tem(k)
  2338. absft=1.0
  2339. !
  2340. do 200 n=1,20
  2341. denom1=1.0/(tsat-svp3)
  2342. denom2=1.0/(tsat-7.66)
  2343. ! qswz(k)=episp0k/prez(k)* &
  2344. ! exp( svp2*denom1*(tsat-273.15) )
  2345. es=1000.*svp1*exp( svp2*denom1*(tsat-svpt0) )
  2346. qswz(k)=ep2*es/(prez(k)-es)
  2347. if (tem(k) .lt. 273.15) then
  2348. ! qsiz(k)=episp0k/prez(k)* &
  2349. ! exp( 21.8745584*denom2*(tsat-273.15) )
  2350. es=1000.*svp1*exp( 21.8745584*denom2*(tsat-273.15) )
  2351. qsiz(k)=ep2*es/(prez(k)-es)
  2352. if (tem(k) .lt. 233.15) qswz(k)=qsiz(k)
  2353. else
  2354. qsiz(k)=qswz(k)
  2355. endif
  2356. qvsbar(k)=ratql*qswz(k)+ratqi*qsiz(k)
  2357. !
  2358. ! if( absft .lt. 0.01 .and. n .gt. 3 ) go to 300
  2359. if( absft .lt. 0.01 ) go to 300
  2360. !
  2361. dqvsbar=ratql*qswz(k)*svp2*243.5*denom1*denom1+ &
  2362. ratqi*qsiz(k)*21.8745584*265.5*denom2*denom2
  2363. ftsat=tsat+(xlvocp+ratqi*xlfocp)*qvsbar(k)- &
  2364. tothz(k)*theiz(k)-xlfocp*ratqi*(qvz(k)+qlz(k)+qiz(k))
  2365. dftsat=1.0+(xlvocp+ratqi*xlfocp)*dqvsbar
  2366. tsat=tsat-ftsat/dftsat
  2367. absft=abs(ftsat)
  2368. 200 continue
  2369. 9020 format(1x,'point can not converge, absft,n=',e12.5,i5)
  2370. !
  2371. 300 continue
  2372. if( qpz .gt. qvsbar(k) ) then
  2373. qvz(k)=qvsbar(k)
  2374. qiz(k)=ratqi*( qpz-qvz(k) )
  2375. qlz(k)=ratql*( qpz-qvz(k) )
  2376. else
  2377. qvz(k)=qpz
  2378. qiz(k)=0.0
  2379. qlz(k)=0.0
  2380. end if
  2381. 400 continue
  2382. END SUBROUTINE satadj
  2383. !----------------------------------------------------------------
  2384. REAL FUNCTION parama1(temp)
  2385. !----------------------------------------------------------------
  2386. IMPLICIT NONE
  2387. !----------------------------------------------------------------
  2388. ! This program calculate the parameter for crystal growth rate
  2389. ! in Bergeron process
  2390. !----------------------------------------------------------------
  2391. REAL, INTENT (IN ) :: temp
  2392. REAL, DIMENSION(32) :: a1
  2393. INTEGER :: i1, i1p1
  2394. REAL :: ratio
  2395. data a1/0.100e-10,0.7939e-7,0.7841e-6,0.3369e-5,0.4336e-5, &
  2396. 0.5285e-5,0.3728e-5,0.1852e-5,0.2991e-6,0.4248e-6, &
  2397. 0.7434e-6,0.1812e-5,0.4394e-5,0.9145e-5,0.1725e-4, &
  2398. 0.3348e-4,0.1725e-4,0.9175e-5,0.4412e-5,0.2252e-5, &
  2399. 0.9115e-6,0.4876e-6,0.3473e-6,0.4758e-6,0.6306e-6, &
  2400. 0.8573e-6,0.7868e-6,0.7192e-6,0.6513e-6,0.5956e-6, &
  2401. 0.5333e-6,0.4834e-6/
  2402. i1=int(-temp)+1
  2403. i1p1=i1+1
  2404. ratio=-(temp)-float(i1-1)
  2405. parama1=a1(i1)+ratio*( a1(i1p1)-a1(i1) )
  2406. END FUNCTION parama1
  2407. !----------------------------------------------------------------
  2408. REAL FUNCTION parama2(temp)
  2409. !----------------------------------------------------------------
  2410. IMPLICIT NONE
  2411. !----------------------------------------------------------------
  2412. ! This program calculate the parameter for crystal growth rate
  2413. ! in Bergeron process
  2414. !----------------------------------------------------------------
  2415. REAL, INTENT (IN ) :: temp
  2416. REAL, DIMENSION(32) :: a2
  2417. INTEGER :: i1, i1p1
  2418. REAL :: ratio
  2419. data a2/0.0100,0.4006,0.4831,0.5320,0.5307,0.5319,0.5249, &
  2420. 0.4888,0.3849,0.4047,0.4318,0.4771,0.5183,0.5463, &
  2421. 0.5651,0.5813,0.5655,0.5478,0.5203,0.4906,0.4447, &
  2422. 0.4126,0.3960,0.4149,0.4320,0.4506,0.4483,0.4460, &
  2423. 0.4433,0.4413,0.4382,0.4361/
  2424. i1=int(-temp)+1
  2425. i1p1=i1+1
  2426. ratio=-(temp)-float(i1-1)
  2427. parama2=a2(i1)+ratio*( a2(i1p1)-a2(i1) )
  2428. END FUNCTION parama2
  2429. !----------------------------------------------------------------
  2430. REAL FUNCTION ggamma(X)
  2431. !----------------------------------------------------------------
  2432. IMPLICIT NONE
  2433. !----------------------------------------------------------------
  2434. REAL, INTENT(IN ) :: x
  2435. REAL, DIMENSION(8) :: B
  2436. INTEGER ::j, K1
  2437. REAL ::PF, G1TO2 ,TEMP
  2438. DATA B/-.577191652,.988205891,-.897056937,.918206857, &
  2439. -.756704078,.482199394,-.193527818,.035868343/
  2440. PF=1.
  2441. TEMP=X
  2442. DO 10 J=1,200
  2443. IF (TEMP .LE. 2) GO TO 20
  2444. TEMP=TEMP-1.
  2445. 10 PF=PF*TEMP
  2446. 100 FORMAT(//,5X,'module_mp_lin: INPUT TO GAMMA FUNCTION TOO LARGE, X=',E12.5)
  2447. WRITE(wrf_err_message,100)X
  2448. CALL wrf_error_fatal(wrf_err_message)
  2449. 20 G1TO2=1.
  2450. TEMP=TEMP - 1.
  2451. DO 30 K1=1,8
  2452. 30 G1TO2=G1TO2 + B(K1)*TEMP**K1
  2453. ggamma=PF*G1TO2
  2454. END FUNCTION ggamma
  2455. !----------------------------------------------------------------
  2456. END MODULE module_mp_lin