PageRenderTime 42ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/wrfv2_fire/phys/module_mp_thompson.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 3629 lines | 2525 code | 368 blank | 736 comment | 188 complexity | 3d748c85f72e2afd42fc1cc9f03b6927 MD5 | raw file
Possible License(s): AGPL-1.0
  1. !+---+-----------------------------------------------------------------+
  2. !.. This subroutine computes the moisture tendencies of water vapor,
  3. !.. cloud droplets, rain, cloud ice (pristine), snow, and graupel.
  4. !.. Prior to WRFv2.2 this code was based on Reisner et al (1998), but
  5. !.. few of those pieces remain. A complete description is now found in
  6. !.. Thompson, G., P. R. Field, R. M. Rasmussen, and W. D. Hall, 2008:
  7. !.. Explicit Forecasts of winter precipitation using an improved bulk
  8. !.. microphysics scheme. Part II: Implementation of a new snow
  9. !.. parameterization. Mon. Wea. Rev., 136, 5095-5115.
  10. !.. Prior to WRFv3.1, this code was single-moment rain prediction as
  11. !.. described in the reference above, but in v3.1 and higher, the
  12. !.. scheme is two-moment rain (predicted rain number concentration).
  13. !..
  14. !.. Most importantly, users may wish to modify the prescribed number of
  15. !.. cloud droplets (Nt_c; see guidelines mentioned below). Otherwise,
  16. !.. users may alter the rain and graupel size distribution parameters
  17. !.. to use exponential (Marshal-Palmer) or generalized gamma shape.
  18. !.. The snow field assumes a combination of two gamma functions (from
  19. !.. Field et al. 2005) and would require significant modifications
  20. !.. throughout the entire code to alter its shape as well as accretion
  21. !.. rates. Users may also alter the constants used for density of rain,
  22. !.. graupel, ice, and snow, but the latter is not constant when using
  23. !.. Paul Field's snow distribution and moments methods. Other values
  24. !.. users can modify include the constants for mass and/or velocity
  25. !.. power law relations and assumed capacitances used in deposition/
  26. !.. sublimation/evaporation/melting.
  27. !.. Remaining values should probably be left alone.
  28. !..
  29. !..Author: Greg Thompson, NCAR-RAL, gthompsn@ucar.edu, 303-497-2805
  30. !..Last modified: 20 Mar 2012
  31. !+---+-----------------------------------------------------------------+
  32. !wrft:model_layer:physics
  33. !+---+-----------------------------------------------------------------+
  34. !
  35. MODULE module_mp_thompson
  36. USE module_wrf_error
  37. ! USE module_mp_radar
  38. ! USE module_utility, ONLY: WRFU_Clock, WRFU_Alarm
  39. ! USE module_domain, ONLY : HISTORY_ALARM, Is_alarm_tstep
  40. IMPLICIT NONE
  41. LOGICAL, PARAMETER, PRIVATE:: iiwarm = .false.
  42. INTEGER, PARAMETER, PRIVATE:: IFDRY = 0
  43. REAL, PARAMETER, PRIVATE:: T_0 = 273.15
  44. REAL, PARAMETER, PRIVATE:: PI = 3.1415926536
  45. !..Densities of rain, snow, graupel, and cloud ice.
  46. REAL, PARAMETER, PRIVATE:: rho_w = 1000.0
  47. REAL, PARAMETER, PRIVATE:: rho_s = 100.0
  48. REAL, PARAMETER, PRIVATE:: rho_g = 500.0
  49. REAL, PARAMETER, PRIVATE:: rho_i = 890.0
  50. !..Prescribed number of cloud droplets. Set according to known data or
  51. !.. roughly 100 per cc (100.E6 m^-3) for Maritime cases and
  52. !.. 300 per cc (300.E6 m^-3) for Continental. Gamma shape parameter,
  53. !.. mu_c, calculated based on Nt_c is important in autoconversion
  54. !.. scheme.
  55. REAL, PARAMETER, PRIVATE:: Nt_c = 100.E6
  56. !..Generalized gamma distributions for rain, graupel and cloud ice.
  57. !.. N(D) = N_0 * D**mu * exp(-lamda*D); mu=0 is exponential.
  58. REAL, PARAMETER, PRIVATE:: mu_r = 0.0
  59. REAL, PARAMETER, PRIVATE:: mu_g = 0.0
  60. REAL, PARAMETER, PRIVATE:: mu_i = 0.0
  61. REAL, PRIVATE:: mu_c
  62. !..Sum of two gamma distrib for snow (Field et al. 2005).
  63. !.. N(D) = M2**4/M3**3 * [Kap0*exp(-M2*Lam0*D/M3)
  64. !.. + Kap1*(M2/M3)**mu_s * D**mu_s * exp(-M2*Lam1*D/M3)]
  65. !.. M2 and M3 are the (bm_s)th and (bm_s+1)th moments respectively
  66. !.. calculated as function of ice water content and temperature.
  67. REAL, PARAMETER, PRIVATE:: mu_s = 0.6357
  68. REAL, PARAMETER, PRIVATE:: Kap0 = 490.6
  69. REAL, PARAMETER, PRIVATE:: Kap1 = 17.46
  70. REAL, PARAMETER, PRIVATE:: Lam0 = 20.78
  71. REAL, PARAMETER, PRIVATE:: Lam1 = 3.29
  72. !..Y-intercept parameter for graupel is not constant and depends on
  73. !.. mixing ratio. Also, when mu_g is non-zero, these become equiv
  74. !.. y-intercept for an exponential distrib and proper values are
  75. !.. computed based on same mixing ratio and total number concentration.
  76. REAL, PARAMETER, PRIVATE:: gonv_min = 2.E4
  77. REAL, PARAMETER, PRIVATE:: gonv_max = 2.E6
  78. !..Mass power law relations: mass = am*D**bm
  79. !.. Snow from Field et al. (2005), others assume spherical form.
  80. REAL, PARAMETER, PRIVATE:: am_r = PI*rho_w/6.0
  81. REAL, PARAMETER, PRIVATE:: bm_r = 3.0
  82. REAL, PARAMETER, PRIVATE:: am_s = 0.069
  83. REAL, PARAMETER, PRIVATE:: bm_s = 2.0
  84. REAL, PARAMETER, PRIVATE:: am_g = PI*rho_g/6.0
  85. REAL, PARAMETER, PRIVATE:: bm_g = 3.0
  86. REAL, PARAMETER, PRIVATE:: am_i = PI*rho_i/6.0
  87. REAL, PARAMETER, PRIVATE:: bm_i = 3.0
  88. !..Fallspeed power laws relations: v = (av*D**bv)*exp(-fv*D)
  89. !.. Rain from Ferrier (1994), ice, snow, and graupel from
  90. !.. Thompson et al (2008). Coefficient fv is zero for graupel/ice.
  91. REAL, PARAMETER, PRIVATE:: av_r = 4854.0
  92. REAL, PARAMETER, PRIVATE:: bv_r = 1.0
  93. REAL, PARAMETER, PRIVATE:: fv_r = 195.0
  94. REAL, PARAMETER, PRIVATE:: av_s = 40.0
  95. REAL, PARAMETER, PRIVATE:: bv_s = 0.55
  96. REAL, PARAMETER, PRIVATE:: fv_s = 100.0
  97. REAL, PARAMETER, PRIVATE:: av_g = 442.0
  98. REAL, PARAMETER, PRIVATE:: bv_g = 0.89
  99. REAL, PARAMETER, PRIVATE:: av_i = 1847.5
  100. REAL, PARAMETER, PRIVATE:: bv_i = 1.0
  101. !..Capacitance of sphere and plates/aggregates: D**3, D**2
  102. REAL, PARAMETER, PRIVATE:: C_cube = 0.5
  103. REAL, PARAMETER, PRIVATE:: C_sqrd = 0.3
  104. !..Collection efficiencies. Rain/snow/graupel collection of cloud
  105. !.. droplets use variables (Ef_rw, Ef_sw, Ef_gw respectively) and
  106. !.. get computed elsewhere because they are dependent on stokes
  107. !.. number.
  108. REAL, PARAMETER, PRIVATE:: Ef_si = 0.05
  109. REAL, PARAMETER, PRIVATE:: Ef_rs = 0.95
  110. REAL, PARAMETER, PRIVATE:: Ef_rg = 0.75
  111. REAL, PARAMETER, PRIVATE:: Ef_ri = 0.95
  112. !..Minimum microphys values
  113. !.. R1 value, 1.E-12, cannot be set lower because of numerical
  114. !.. problems with Paul Field's moments and should not be set larger
  115. !.. because of truncation problems in snow/ice growth.
  116. REAL, PARAMETER, PRIVATE:: R1 = 1.E-12
  117. REAL, PARAMETER, PRIVATE:: R2 = 1.E-6
  118. REAL, PARAMETER, PRIVATE:: eps = 1.E-15
  119. !..Constants in Cooper curve relation for cloud ice number.
  120. REAL, PARAMETER, PRIVATE:: TNO = 5.0
  121. REAL, PARAMETER, PRIVATE:: ATO = 0.304
  122. !..Rho_not used in fallspeed relations (rho_not/rho)**.5 adjustment.
  123. REAL, PARAMETER, PRIVATE:: rho_not = 101325.0/(287.05*298.0)
  124. !..Schmidt number
  125. REAL, PARAMETER, PRIVATE:: Sc = 0.632
  126. REAL, PRIVATE:: Sc3
  127. !..Homogeneous freezing temperature
  128. REAL, PARAMETER, PRIVATE:: HGFR = 235.16
  129. !..Water vapor and air gas constants at constant pressure
  130. REAL, PARAMETER, PRIVATE:: Rv = 461.5
  131. REAL, PARAMETER, PRIVATE:: oRv = 1./Rv
  132. REAL, PARAMETER, PRIVATE:: R = 287.04
  133. REAL, PARAMETER, PRIVATE:: Cp = 1004.0
  134. !..Enthalpy of sublimation, vaporization, and fusion at 0C.
  135. REAL, PARAMETER, PRIVATE:: lsub = 2.834E6
  136. REAL, PARAMETER, PRIVATE:: lvap0 = 2.5E6
  137. REAL, PARAMETER, PRIVATE:: lfus = lsub - lvap0
  138. REAL, PARAMETER, PRIVATE:: olfus = 1./lfus
  139. !..Ice initiates with this mass (kg), corresponding diameter calc.
  140. !..Min diameters and mass of cloud, rain, snow, and graupel (m, kg).
  141. REAL, PARAMETER, PRIVATE:: xm0i = 1.E-12
  142. REAL, PARAMETER, PRIVATE:: D0c = 1.E-6
  143. REAL, PARAMETER, PRIVATE:: D0r = 50.E-6
  144. REAL, PARAMETER, PRIVATE:: D0s = 200.E-6
  145. REAL, PARAMETER, PRIVATE:: D0g = 250.E-6
  146. REAL, PRIVATE:: D0i, xm0s, xm0g
  147. !..Lookup table dimensions
  148. INTEGER, PARAMETER, PRIVATE:: nbins = 100
  149. INTEGER, PARAMETER, PRIVATE:: nbc = nbins
  150. INTEGER, PARAMETER, PRIVATE:: nbi = nbins
  151. INTEGER, PARAMETER, PRIVATE:: nbr = nbins
  152. INTEGER, PARAMETER, PRIVATE:: nbs = nbins
  153. INTEGER, PARAMETER, PRIVATE:: nbg = nbins
  154. INTEGER, PARAMETER, PRIVATE:: ntb_c = 37
  155. INTEGER, PARAMETER, PRIVATE:: ntb_i = 64
  156. INTEGER, PARAMETER, PRIVATE:: ntb_r = 37
  157. INTEGER, PARAMETER, PRIVATE:: ntb_s = 28
  158. INTEGER, PARAMETER, PRIVATE:: ntb_g = 28
  159. INTEGER, PARAMETER, PRIVATE:: ntb_g1 = 28
  160. INTEGER, PARAMETER, PRIVATE:: ntb_r1 = 37
  161. INTEGER, PARAMETER, PRIVATE:: ntb_i1 = 55
  162. INTEGER, PARAMETER, PRIVATE:: ntb_t = 9
  163. INTEGER, PRIVATE:: nic2, nii2, nii3, nir2, nir3, nis2, nig2, nig3
  164. DOUBLE PRECISION, DIMENSION(nbins+1):: xDx
  165. DOUBLE PRECISION, DIMENSION(nbc):: Dc, dtc
  166. DOUBLE PRECISION, DIMENSION(nbi):: Di, dti
  167. DOUBLE PRECISION, DIMENSION(nbr):: Dr, dtr
  168. DOUBLE PRECISION, DIMENSION(nbs):: Ds, dts
  169. DOUBLE PRECISION, DIMENSION(nbg):: Dg, dtg
  170. !..Lookup tables for cloud water content (kg/m**3).
  171. REAL, DIMENSION(ntb_c), PARAMETER, PRIVATE:: &
  172. r_c = (/1.e-6,2.e-6,3.e-6,4.e-6,5.e-6,6.e-6,7.e-6,8.e-6,9.e-6, &
  173. 1.e-5,2.e-5,3.e-5,4.e-5,5.e-5,6.e-5,7.e-5,8.e-5,9.e-5, &
  174. 1.e-4,2.e-4,3.e-4,4.e-4,5.e-4,6.e-4,7.e-4,8.e-4,9.e-4, &
  175. 1.e-3,2.e-3,3.e-3,4.e-3,5.e-3,6.e-3,7.e-3,8.e-3,9.e-3, &
  176. 1.e-2/)
  177. !..Lookup tables for cloud ice content (kg/m**3).
  178. REAL, DIMENSION(ntb_i), PARAMETER, PRIVATE:: &
  179. r_i = (/1.e-10,2.e-10,3.e-10,4.e-10, &
  180. 5.e-10,6.e-10,7.e-10,8.e-10,9.e-10, &
  181. 1.e-9,2.e-9,3.e-9,4.e-9,5.e-9,6.e-9,7.e-9,8.e-9,9.e-9, &
  182. 1.e-8,2.e-8,3.e-8,4.e-8,5.e-8,6.e-8,7.e-8,8.e-8,9.e-8, &
  183. 1.e-7,2.e-7,3.e-7,4.e-7,5.e-7,6.e-7,7.e-7,8.e-7,9.e-7, &
  184. 1.e-6,2.e-6,3.e-6,4.e-6,5.e-6,6.e-6,7.e-6,8.e-6,9.e-6, &
  185. 1.e-5,2.e-5,3.e-5,4.e-5,5.e-5,6.e-5,7.e-5,8.e-5,9.e-5, &
  186. 1.e-4,2.e-4,3.e-4,4.e-4,5.e-4,6.e-4,7.e-4,8.e-4,9.e-4, &
  187. 1.e-3/)
  188. !..Lookup tables for rain content (kg/m**3).
  189. REAL, DIMENSION(ntb_r), PARAMETER, PRIVATE:: &
  190. r_r = (/1.e-6,2.e-6,3.e-6,4.e-6,5.e-6,6.e-6,7.e-6,8.e-6,9.e-6, &
  191. 1.e-5,2.e-5,3.e-5,4.e-5,5.e-5,6.e-5,7.e-5,8.e-5,9.e-5, &
  192. 1.e-4,2.e-4,3.e-4,4.e-4,5.e-4,6.e-4,7.e-4,8.e-4,9.e-4, &
  193. 1.e-3,2.e-3,3.e-3,4.e-3,5.e-3,6.e-3,7.e-3,8.e-3,9.e-3, &
  194. 1.e-2/)
  195. !..Lookup tables for graupel content (kg/m**3).
  196. REAL, DIMENSION(ntb_g), PARAMETER, PRIVATE:: &
  197. r_g = (/1.e-5,2.e-5,3.e-5,4.e-5,5.e-5,6.e-5,7.e-5,8.e-5,9.e-5, &
  198. 1.e-4,2.e-4,3.e-4,4.e-4,5.e-4,6.e-4,7.e-4,8.e-4,9.e-4, &
  199. 1.e-3,2.e-3,3.e-3,4.e-3,5.e-3,6.e-3,7.e-3,8.e-3,9.e-3, &
  200. 1.e-2/)
  201. !..Lookup tables for snow content (kg/m**3).
  202. REAL, DIMENSION(ntb_s), PARAMETER, PRIVATE:: &
  203. r_s = (/1.e-5,2.e-5,3.e-5,4.e-5,5.e-5,6.e-5,7.e-5,8.e-5,9.e-5, &
  204. 1.e-4,2.e-4,3.e-4,4.e-4,5.e-4,6.e-4,7.e-4,8.e-4,9.e-4, &
  205. 1.e-3,2.e-3,3.e-3,4.e-3,5.e-3,6.e-3,7.e-3,8.e-3,9.e-3, &
  206. 1.e-2/)
  207. !..Lookup tables for rain y-intercept parameter (/m**4).
  208. REAL, DIMENSION(ntb_r1), PARAMETER, PRIVATE:: &
  209. N0r_exp = (/1.e6,2.e6,3.e6,4.e6,5.e6,6.e6,7.e6,8.e6,9.e6, &
  210. 1.e7,2.e7,3.e7,4.e7,5.e7,6.e7,7.e7,8.e7,9.e7, &
  211. 1.e8,2.e8,3.e8,4.e8,5.e8,6.e8,7.e8,8.e8,9.e8, &
  212. 1.e9,2.e9,3.e9,4.e9,5.e9,6.e9,7.e9,8.e9,9.e9, &
  213. 1.e10/)
  214. !..Lookup tables for graupel y-intercept parameter (/m**4).
  215. REAL, DIMENSION(ntb_g1), PARAMETER, PRIVATE:: &
  216. N0g_exp = (/1.e4,2.e4,3.e4,4.e4,5.e4,6.e4,7.e4,8.e4,9.e4, &
  217. 1.e5,2.e5,3.e5,4.e5,5.e5,6.e5,7.e5,8.e5,9.e5, &
  218. 1.e6,2.e6,3.e6,4.e6,5.e6,6.e6,7.e6,8.e6,9.e6, &
  219. 1.e7/)
  220. !..Lookup tables for ice number concentration (/m**3).
  221. REAL, DIMENSION(ntb_i1), PARAMETER, PRIVATE:: &
  222. Nt_i = (/1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0, &
  223. 1.e1,2.e1,3.e1,4.e1,5.e1,6.e1,7.e1,8.e1,9.e1, &
  224. 1.e2,2.e2,3.e2,4.e2,5.e2,6.e2,7.e2,8.e2,9.e2, &
  225. 1.e3,2.e3,3.e3,4.e3,5.e3,6.e3,7.e3,8.e3,9.e3, &
  226. 1.e4,2.e4,3.e4,4.e4,5.e4,6.e4,7.e4,8.e4,9.e4, &
  227. 1.e5,2.e5,3.e5,4.e5,5.e5,6.e5,7.e5,8.e5,9.e5, &
  228. 1.e6/)
  229. !..For snow moments conversions (from Field et al. 2005)
  230. REAL, DIMENSION(10), PARAMETER, PRIVATE:: &
  231. sa = (/ 5.065339, -0.062659, -3.032362, 0.029469, -0.000285, &
  232. 0.31255, 0.000204, 0.003199, 0.0, -0.015952/)
  233. REAL, DIMENSION(10), PARAMETER, PRIVATE:: &
  234. sb = (/ 0.476221, -0.015896, 0.165977, 0.007468, -0.000141, &
  235. 0.060366, 0.000079, 0.000594, 0.0, -0.003577/)
  236. !..Temperatures (5 C interval 0 to -40) used in lookup tables.
  237. REAL, DIMENSION(ntb_t), PARAMETER, PRIVATE:: &
  238. Tc = (/-0.01, -5., -10., -15., -20., -25., -30., -35., -40./)
  239. !..Lookup tables for various accretion/collection terms.
  240. !.. ntb_x refers to the number of elements for rain, snow, graupel,
  241. !.. and temperature array indices. Variables beginning with t-p/c/m/n
  242. !.. represent lookup tables. Save compile-time memory by making
  243. !.. allocatable (2009Jun12, J. Michalakes).
  244. INTEGER, PARAMETER, PRIVATE:: R8SIZE = 8
  245. REAL (KIND=R8SIZE), ALLOCATABLE, DIMENSION(:,:,:,:):: &
  246. tcg_racg, tmr_racg, tcr_gacr, tmg_gacr, &
  247. tnr_racg, tnr_gacr
  248. REAL (KIND=R8SIZE), ALLOCATABLE, DIMENSION(:,:,:,:):: &
  249. tcs_racs1, tmr_racs1, tcs_racs2, tmr_racs2, &
  250. tcr_sacr1, tms_sacr1, tcr_sacr2, tms_sacr2, &
  251. tnr_racs1, tnr_racs2, tnr_sacr1, tnr_sacr2
  252. REAL (KIND=R8SIZE), ALLOCATABLE, DIMENSION(:,:):: &
  253. tpi_qcfz, tni_qcfz
  254. REAL (KIND=R8SIZE), ALLOCATABLE, DIMENSION(:,:,:):: &
  255. tpi_qrfz, tpg_qrfz, tni_qrfz, tnr_qrfz
  256. REAL (KIND=R8SIZE), ALLOCATABLE, DIMENSION(:,:):: &
  257. tps_iaus, tni_iaus, tpi_ide
  258. REAL (KIND=R8SIZE), ALLOCATABLE, DIMENSION(:,:):: t_Efrw
  259. REAL (KIND=R8SIZE), ALLOCATABLE, DIMENSION(:,:):: t_Efsw
  260. REAL (KIND=R8SIZE), ALLOCATABLE, DIMENSION(:,:,:):: tnr_rev
  261. !..Variables holding a bunch of exponents and gamma values (cloud water,
  262. !.. cloud ice, rain, snow, then graupel).
  263. REAL, DIMENSION(3), PRIVATE:: cce, ccg
  264. REAL, PRIVATE:: ocg1, ocg2
  265. REAL, DIMENSION(7), PRIVATE:: cie, cig
  266. REAL, PRIVATE:: oig1, oig2, obmi
  267. REAL, DIMENSION(13), PRIVATE:: cre, crg
  268. REAL, PRIVATE:: ore1, org1, org2, org3, obmr
  269. REAL, DIMENSION(18), PRIVATE:: cse, csg
  270. REAL, PRIVATE:: oams, obms, ocms
  271. REAL, DIMENSION(12), PRIVATE:: cge, cgg
  272. REAL, PRIVATE:: oge1, ogg1, ogg2, ogg3, oamg, obmg, ocmg
  273. !..Declaration of precomputed constants in various rate eqns.
  274. REAL:: t1_qr_qc, t1_qr_qi, t2_qr_qi, t1_qg_qc, t1_qs_qc, t1_qs_qi
  275. REAL:: t1_qr_ev, t2_qr_ev
  276. REAL:: t1_qs_sd, t2_qs_sd, t1_qg_sd, t2_qg_sd
  277. REAL:: t1_qs_me, t2_qs_me, t1_qg_me, t2_qg_me
  278. CHARACTER*256:: mp_debug
  279. !+---+
  280. !+---+-----------------------------------------------------------------+
  281. !..END DECLARATIONS
  282. !+---+-----------------------------------------------------------------+
  283. !+---+
  284. !ctrlL
  285. CONTAINS
  286. SUBROUTINE thompson_init
  287. IMPLICIT NONE
  288. INTEGER:: i, j, k, m, n
  289. LOGICAL:: micro_init
  290. !..Allocate space for lookup tables (J. Michalakes 2009Jun08).
  291. micro_init = .FALSE.
  292. if (.NOT. ALLOCATED(tcg_racg) ) then
  293. ALLOCATE(tcg_racg(ntb_g1,ntb_g,ntb_r1,ntb_r))
  294. micro_init = .TRUE.
  295. endif
  296. if (.NOT. ALLOCATED(tmr_racg)) ALLOCATE(tmr_racg(ntb_g1,ntb_g,ntb_r1,ntb_r))
  297. if (.NOT. ALLOCATED(tcr_gacr)) ALLOCATE(tcr_gacr(ntb_g1,ntb_g,ntb_r1,ntb_r))
  298. if (.NOT. ALLOCATED(tmg_gacr)) ALLOCATE(tmg_gacr(ntb_g1,ntb_g,ntb_r1,ntb_r))
  299. if (.NOT. ALLOCATED(tnr_racg)) ALLOCATE(tnr_racg(ntb_g1,ntb_g,ntb_r1,ntb_r))
  300. if (.NOT. ALLOCATED(tnr_gacr)) ALLOCATE(tnr_gacr(ntb_g1,ntb_g,ntb_r1,ntb_r))
  301. if (.NOT. ALLOCATED(tcs_racs1)) ALLOCATE(tcs_racs1(ntb_s,ntb_t,ntb_r1,ntb_r))
  302. if (.NOT. ALLOCATED(tmr_racs1)) ALLOCATE(tmr_racs1(ntb_s,ntb_t,ntb_r1,ntb_r))
  303. if (.NOT. ALLOCATED(tcs_racs2)) ALLOCATE(tcs_racs2(ntb_s,ntb_t,ntb_r1,ntb_r))
  304. if (.NOT. ALLOCATED(tmr_racs2)) ALLOCATE(tmr_racs2(ntb_s,ntb_t,ntb_r1,ntb_r))
  305. if (.NOT. ALLOCATED(tcr_sacr1)) ALLOCATE(tcr_sacr1(ntb_s,ntb_t,ntb_r1,ntb_r))
  306. if (.NOT. ALLOCATED(tms_sacr1)) ALLOCATE(tms_sacr1(ntb_s,ntb_t,ntb_r1,ntb_r))
  307. if (.NOT. ALLOCATED(tcr_sacr2)) ALLOCATE(tcr_sacr2(ntb_s,ntb_t,ntb_r1,ntb_r))
  308. if (.NOT. ALLOCATED(tms_sacr2)) ALLOCATE(tms_sacr2(ntb_s,ntb_t,ntb_r1,ntb_r))
  309. if (.NOT. ALLOCATED(tnr_racs1)) ALLOCATE(tnr_racs1(ntb_s,ntb_t,ntb_r1,ntb_r))
  310. if (.NOT. ALLOCATED(tnr_racs2)) ALLOCATE(tnr_racs2(ntb_s,ntb_t,ntb_r1,ntb_r))
  311. if (.NOT. ALLOCATED(tnr_sacr1)) ALLOCATE(tnr_sacr1(ntb_s,ntb_t,ntb_r1,ntb_r))
  312. if (.NOT. ALLOCATED(tnr_sacr2)) ALLOCATE(tnr_sacr2(ntb_s,ntb_t,ntb_r1,ntb_r))
  313. if (.NOT. ALLOCATED(tpi_qcfz)) ALLOCATE(tpi_qcfz(ntb_c,45))
  314. if (.NOT. ALLOCATED(tni_qcfz)) ALLOCATE(tni_qcfz(ntb_c,45))
  315. if (.NOT. ALLOCATED(tpi_qrfz)) ALLOCATE(tpi_qrfz(ntb_r,ntb_r1,45))
  316. if (.NOT. ALLOCATED(tpg_qrfz)) ALLOCATE(tpg_qrfz(ntb_r,ntb_r1,45))
  317. if (.NOT. ALLOCATED(tni_qrfz)) ALLOCATE(tni_qrfz(ntb_r,ntb_r1,45))
  318. if (.NOT. ALLOCATED(tnr_qrfz)) ALLOCATE(tnr_qrfz(ntb_r,ntb_r1,45))
  319. if (.NOT. ALLOCATED(tps_iaus)) ALLOCATE(tps_iaus(ntb_i,ntb_i1))
  320. if (.NOT. ALLOCATED(tni_iaus)) ALLOCATE(tni_iaus(ntb_i,ntb_i1))
  321. if (.NOT. ALLOCATED(tpi_ide)) ALLOCATE(tpi_ide(ntb_i,ntb_i1))
  322. if (.NOT. ALLOCATED(t_Efrw)) ALLOCATE(t_Efrw(nbr,nbc))
  323. if (.NOT. ALLOCATED(t_Efsw)) ALLOCATE(t_Efsw(nbs,nbc))
  324. if (.NOT. ALLOCATED(tnr_rev)) ALLOCATE(tnr_rev(nbr, ntb_r1, ntb_r))
  325. if (micro_init) then
  326. !..From Martin et al. (1994), assign gamma shape parameter mu for cloud
  327. !.. drops according to general dispersion characteristics (disp=~0.25
  328. !.. for Maritime and 0.45 for Continental).
  329. !.. disp=SQRT((mu+2)/(mu+1) - 1) so mu varies from 15 for Maritime
  330. !.. to 2 for really dirty air.
  331. mu_c = MIN(15., (1000.E6/Nt_c + 2.))
  332. !..Schmidt number to one-third used numerous times.
  333. Sc3 = Sc**(1./3.)
  334. !..Compute min ice diam from mass, min snow/graupel mass from diam.
  335. D0i = (xm0i/am_i)**(1./bm_i)
  336. xm0s = am_s * D0s**bm_s
  337. xm0g = am_g * D0g**bm_g
  338. !..These constants various exponents and gamma() assoc with cloud,
  339. !.. rain, snow, and graupel.
  340. cce(1) = mu_c + 1.
  341. cce(2) = bm_r + mu_c + 1.
  342. cce(3) = bm_r + mu_c + 4.
  343. ccg(1) = WGAMMA(cce(1))
  344. ccg(2) = WGAMMA(cce(2))
  345. ccg(3) = WGAMMA(cce(3))
  346. ocg1 = 1./ccg(1)
  347. ocg2 = 1./ccg(2)
  348. cie(1) = mu_i + 1.
  349. cie(2) = bm_i + mu_i + 1.
  350. cie(3) = bm_i + mu_i + bv_i + 1.
  351. cie(4) = mu_i + bv_i + 1.
  352. cie(5) = mu_i + 2.
  353. cie(6) = bm_i*0.5 + mu_i + bv_i + 1.
  354. cie(7) = bm_i*0.5 + mu_i + 1.
  355. cig(1) = WGAMMA(cie(1))
  356. cig(2) = WGAMMA(cie(2))
  357. cig(3) = WGAMMA(cie(3))
  358. cig(4) = WGAMMA(cie(4))
  359. cig(5) = WGAMMA(cie(5))
  360. cig(6) = WGAMMA(cie(6))
  361. cig(7) = WGAMMA(cie(7))
  362. oig1 = 1./cig(1)
  363. oig2 = 1./cig(2)
  364. obmi = 1./bm_i
  365. cre(1) = bm_r + 1.
  366. cre(2) = mu_r + 1.
  367. cre(3) = bm_r + mu_r + 1.
  368. cre(4) = bm_r*2. + mu_r + 1.
  369. cre(5) = mu_r + bv_r + 1.
  370. cre(6) = bm_r + mu_r + bv_r + 1.
  371. cre(7) = bm_r*0.5 + mu_r + bv_r + 1.
  372. cre(8) = bm_r + mu_r + bv_r + 3.
  373. cre(9) = mu_r + bv_r + 3.
  374. cre(10) = mu_r + 2.
  375. cre(11) = 0.5*(bv_r + 5. + 2.*mu_r)
  376. cre(12) = bm_r*0.5 + mu_r + 1.
  377. cre(13) = bm_r*2. + mu_r + bv_r + 1.
  378. do n = 1, 13
  379. crg(n) = WGAMMA(cre(n))
  380. enddo
  381. obmr = 1./bm_r
  382. ore1 = 1./cre(1)
  383. org1 = 1./crg(1)
  384. org2 = 1./crg(2)
  385. org3 = 1./crg(3)
  386. cse(1) = bm_s + 1.
  387. cse(2) = bm_s + 2.
  388. cse(3) = bm_s*2.
  389. cse(4) = bm_s + bv_s + 1.
  390. cse(5) = bm_s*2. + bv_s + 1.
  391. cse(6) = bm_s*2. + 1.
  392. cse(7) = bm_s + mu_s + 1.
  393. cse(8) = bm_s + mu_s + 2.
  394. cse(9) = bm_s + mu_s + 3.
  395. cse(10) = bm_s + mu_s + bv_s + 1.
  396. cse(11) = bm_s*2. + mu_s + bv_s + 1.
  397. cse(12) = bm_s*2. + mu_s + 1.
  398. cse(13) = bv_s + 2.
  399. cse(14) = bm_s + bv_s
  400. cse(15) = mu_s + 1.
  401. cse(16) = 1.0 + (1.0 + bv_s)/2.
  402. cse(17) = cse(16) + mu_s + 1.
  403. cse(18) = bv_s + mu_s + 3.
  404. do n = 1, 18
  405. csg(n) = WGAMMA(cse(n))
  406. enddo
  407. oams = 1./am_s
  408. obms = 1./bm_s
  409. ocms = oams**obms
  410. cge(1) = bm_g + 1.
  411. cge(2) = mu_g + 1.
  412. cge(3) = bm_g + mu_g + 1.
  413. cge(4) = bm_g*2. + mu_g + 1.
  414. cge(5) = bm_g*2. + mu_g + bv_g + 1.
  415. cge(6) = bm_g + mu_g + bv_g + 1.
  416. cge(7) = bm_g + mu_g + bv_g + 2.
  417. cge(8) = bm_g + mu_g + bv_g + 3.
  418. cge(9) = mu_g + bv_g + 3.
  419. cge(10) = mu_g + 2.
  420. cge(11) = 0.5*(bv_g + 5. + 2.*mu_g)
  421. cge(12) = 0.5*(bv_g + 5.) + mu_g
  422. do n = 1, 12
  423. cgg(n) = WGAMMA(cge(n))
  424. enddo
  425. oamg = 1./am_g
  426. obmg = 1./bm_g
  427. ocmg = oamg**obmg
  428. oge1 = 1./cge(1)
  429. ogg1 = 1./cgg(1)
  430. ogg2 = 1./cgg(2)
  431. ogg3 = 1./cgg(3)
  432. !+---+-----------------------------------------------------------------+
  433. !..Simplify various rate eqns the best we can now.
  434. !+---+-----------------------------------------------------------------+
  435. !..Rain collecting cloud water and cloud ice
  436. t1_qr_qc = PI*.25*av_r * crg(9)
  437. t1_qr_qi = PI*.25*av_r * crg(9)
  438. t2_qr_qi = PI*.25*am_r*av_r * crg(8)
  439. !..Graupel collecting cloud water
  440. t1_qg_qc = PI*.25*av_g * cgg(9)
  441. !..Snow collecting cloud water
  442. t1_qs_qc = PI*.25*av_s
  443. !..Snow collecting cloud ice
  444. t1_qs_qi = PI*.25*av_s
  445. !..Evaporation of rain; ignore depositional growth of rain.
  446. t1_qr_ev = 0.78 * crg(10)
  447. t2_qr_ev = 0.308*Sc3*SQRT(av_r) * crg(11)
  448. !..Sublimation/depositional growth of snow
  449. t1_qs_sd = 0.86
  450. t2_qs_sd = 0.28*Sc3*SQRT(av_s)
  451. !..Melting of snow
  452. t1_qs_me = PI*4.*C_sqrd*olfus * 0.86
  453. t2_qs_me = PI*4.*C_sqrd*olfus * 0.28*Sc3*SQRT(av_s)
  454. !..Sublimation/depositional growth of graupel
  455. t1_qg_sd = 0.86 * cgg(10)
  456. t2_qg_sd = 0.28*Sc3*SQRT(av_g) * cgg(11)
  457. !..Melting of graupel
  458. t1_qg_me = PI*4.*C_cube*olfus * 0.86 * cgg(10)
  459. t2_qg_me = PI*4.*C_cube*olfus * 0.28*Sc3*SQRT(av_g) * cgg(11)
  460. !..Constants for helping find lookup table indexes.
  461. nic2 = NINT(ALOG10(r_c(1)))
  462. nii2 = NINT(ALOG10(r_i(1)))
  463. nii3 = NINT(ALOG10(Nt_i(1)))
  464. nir2 = NINT(ALOG10(r_r(1)))
  465. nir3 = NINT(ALOG10(N0r_exp(1)))
  466. nis2 = NINT(ALOG10(r_s(1)))
  467. nig2 = NINT(ALOG10(r_g(1)))
  468. nig3 = NINT(ALOG10(N0g_exp(1)))
  469. !..Create bins of cloud water (from min diameter up to 100 microns).
  470. Dc(1) = D0c*1.0d0
  471. dtc(1) = D0c*1.0d0
  472. do n = 2, nbc
  473. Dc(n) = Dc(n-1) + 1.0D-6
  474. dtc(n) = (Dc(n) - Dc(n-1))
  475. enddo
  476. !..Create bins of cloud ice (from min diameter up to 5x min snow size).
  477. xDx(1) = D0i*1.0d0
  478. xDx(nbi+1) = 5.0d0*D0s
  479. do n = 2, nbi
  480. xDx(n) = DEXP(DFLOAT(n-1)/DFLOAT(nbi) &
  481. *DLOG(xDx(nbi+1)/xDx(1)) +DLOG(xDx(1)))
  482. enddo
  483. do n = 1, nbi
  484. Di(n) = DSQRT(xDx(n)*xDx(n+1))
  485. dti(n) = xDx(n+1) - xDx(n)
  486. enddo
  487. !..Create bins of rain (from min diameter up to 5 mm).
  488. xDx(1) = D0r*1.0d0
  489. xDx(nbr+1) = 0.005d0
  490. do n = 2, nbr
  491. xDx(n) = DEXP(DFLOAT(n-1)/DFLOAT(nbr) &
  492. *DLOG(xDx(nbr+1)/xDx(1)) +DLOG(xDx(1)))
  493. enddo
  494. do n = 1, nbr
  495. Dr(n) = DSQRT(xDx(n)*xDx(n+1))
  496. dtr(n) = xDx(n+1) - xDx(n)
  497. enddo
  498. !..Create bins of snow (from min diameter up to 2 cm).
  499. xDx(1) = D0s*1.0d0
  500. xDx(nbs+1) = 0.02d0
  501. do n = 2, nbs
  502. xDx(n) = DEXP(DFLOAT(n-1)/DFLOAT(nbs) &
  503. *DLOG(xDx(nbs+1)/xDx(1)) +DLOG(xDx(1)))
  504. enddo
  505. do n = 1, nbs
  506. Ds(n) = DSQRT(xDx(n)*xDx(n+1))
  507. dts(n) = xDx(n+1) - xDx(n)
  508. enddo
  509. !..Create bins of graupel (from min diameter up to 5 cm).
  510. xDx(1) = D0g*1.0d0
  511. xDx(nbg+1) = 0.05d0
  512. do n = 2, nbg
  513. xDx(n) = DEXP(DFLOAT(n-1)/DFLOAT(nbg) &
  514. *DLOG(xDx(nbg+1)/xDx(1)) +DLOG(xDx(1)))
  515. enddo
  516. do n = 1, nbg
  517. Dg(n) = DSQRT(xDx(n)*xDx(n+1))
  518. dtg(n) = xDx(n+1) - xDx(n)
  519. enddo
  520. !+---+-----------------------------------------------------------------+
  521. !..Create lookup tables for most costly calculations.
  522. !+---+-----------------------------------------------------------------+
  523. do m = 1, ntb_r
  524. do k = 1, ntb_r1
  525. do j = 1, ntb_g
  526. do i = 1, ntb_g1
  527. tcg_racg(i,j,k,m) = 0.0d0
  528. tmr_racg(i,j,k,m) = 0.0d0
  529. tcr_gacr(i,j,k,m) = 0.0d0
  530. tmg_gacr(i,j,k,m) = 0.0d0
  531. tnr_racg(i,j,k,m) = 0.0d0
  532. tnr_gacr(i,j,k,m) = 0.0d0
  533. enddo
  534. enddo
  535. enddo
  536. enddo
  537. do m = 1, ntb_r
  538. do k = 1, ntb_r1
  539. do j = 1, ntb_t
  540. do i = 1, ntb_s
  541. tcs_racs1(i,j,k,m) = 0.0d0
  542. tmr_racs1(i,j,k,m) = 0.0d0
  543. tcs_racs2(i,j,k,m) = 0.0d0
  544. tmr_racs2(i,j,k,m) = 0.0d0
  545. tcr_sacr1(i,j,k,m) = 0.0d0
  546. tms_sacr1(i,j,k,m) = 0.0d0
  547. tcr_sacr2(i,j,k,m) = 0.0d0
  548. tms_sacr2(i,j,k,m) = 0.0d0
  549. tnr_racs1(i,j,k,m) = 0.0d0
  550. tnr_racs2(i,j,k,m) = 0.0d0
  551. tnr_sacr1(i,j,k,m) = 0.0d0
  552. tnr_sacr2(i,j,k,m) = 0.0d0
  553. enddo
  554. enddo
  555. enddo
  556. enddo
  557. do k = 1, 45
  558. do j = 1, ntb_r1
  559. do i = 1, ntb_r
  560. tpi_qrfz(i,j,k) = 0.0d0
  561. tni_qrfz(i,j,k) = 0.0d0
  562. tpg_qrfz(i,j,k) = 0.0d0
  563. tnr_qrfz(i,j,k) = 0.0d0
  564. enddo
  565. enddo
  566. do i = 1, ntb_c
  567. tpi_qcfz(i,k) = 0.0d0
  568. tni_qcfz(i,k) = 0.0d0
  569. enddo
  570. enddo
  571. do j = 1, ntb_i1
  572. do i = 1, ntb_i
  573. tps_iaus(i,j) = 0.0d0
  574. tni_iaus(i,j) = 0.0d0
  575. tpi_ide(i,j) = 0.0d0
  576. enddo
  577. enddo
  578. do j = 1, nbc
  579. do i = 1, nbr
  580. t_Efrw(i,j) = 0.0
  581. enddo
  582. do i = 1, nbs
  583. t_Efsw(i,j) = 0.0
  584. enddo
  585. enddo
  586. do k = 1, ntb_r
  587. do j = 1, ntb_r1
  588. do i = 1, nbr
  589. tnr_rev(i,j,k) = 0.0d0
  590. enddo
  591. enddo
  592. enddo
  593. CALL wrf_debug(150, 'CREATING MICROPHYSICS LOOKUP TABLES ... ')
  594. WRITE (wrf_err_message, '(a, f5.2, a, f5.2, a, f5.2, a, f5.2)') &
  595. ' using: mu_c=',mu_c,' mu_i=',mu_i,' mu_r=',mu_r,' mu_g=',mu_g
  596. CALL wrf_debug(150, wrf_err_message)
  597. !..Collision efficiency between rain/snow and cloud water.
  598. CALL wrf_debug(200, ' creating qc collision eff tables')
  599. call table_Efrw
  600. call table_Efsw
  601. !..Drop evaporation.
  602. ! CALL wrf_debug(200, ' creating rain evap table')
  603. ! call table_dropEvap
  604. !..Initialize various constants for computing radar reflectivity.
  605. ! xam_r = am_r
  606. ! xbm_r = bm_r
  607. ! xmu_r = mu_r
  608. ! xam_s = am_s
  609. ! xbm_s = bm_s
  610. ! xmu_s = mu_s
  611. ! xam_g = am_g
  612. ! xbm_g = bm_g
  613. ! xmu_g = mu_g
  614. ! call radar_init
  615. if (.not. iiwarm) then
  616. !..Rain collecting graupel & graupel collecting rain.
  617. CALL wrf_debug(200, ' creating rain collecting graupel table')
  618. call qr_acr_qg
  619. !..Rain collecting snow & snow collecting rain.
  620. CALL wrf_debug(200, ' creating rain collecting snow table')
  621. call qr_acr_qs
  622. !..Cloud water and rain freezing (Bigg, 1953).
  623. CALL wrf_debug(200, ' creating freezing of water drops table')
  624. call freezeH2O
  625. !..Conversion of some ice mass into snow category.
  626. CALL wrf_debug(200, ' creating ice converting to snow table')
  627. call qi_aut_qs
  628. endif
  629. CALL wrf_debug(150, ' ... DONE microphysical lookup tables')
  630. endif
  631. END SUBROUTINE thompson_init
  632. !+---+-----------------------------------------------------------------+
  633. !ctrlL
  634. !+---+-----------------------------------------------------------------+
  635. !..This is a wrapper routine designed to transfer values from 3D to 1D.
  636. !+---+-----------------------------------------------------------------+
  637. SUBROUTINE mp_gt_driver(qv, qc, qr, qi, qs, qg, ni, nr, &
  638. th, pii, p, dz, dt_in, itimestep, &
  639. RAINNC, RAINNCV, &
  640. SNOWNC, SNOWNCV, &
  641. GRAUPELNC, GRAUPELNCV, SR, &
  642. #ifdef WRF_CHEM
  643. rainprod, evapprod, &
  644. #endif
  645. ! refl_10cm, grid_clock, grid_alarms, &
  646. ids,ide, jds,jde, kds,kde, & ! domain dims
  647. ims,ime, jms,jme, kms,kme, & ! memory dims
  648. its,ite, jts,jte, kts,kte) ! tile dims
  649. implicit none
  650. !..Subroutine arguments
  651. INTEGER, INTENT(IN):: ids,ide, jds,jde, kds,kde, &
  652. ims,ime, jms,jme, kms,kme, &
  653. its,ite, jts,jte, kts,kte
  654. REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT):: &
  655. qv, qc, qr, qi, qs, qg, ni, nr, th
  656. #ifdef WRF_CHEM
  657. REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT):: &
  658. rainprod, evapprod
  659. #endif
  660. REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN):: &
  661. pii, p, dz
  662. REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT):: &
  663. RAINNC, RAINNCV, SR
  664. REAL, DIMENSION(ims:ime, jms:jme), OPTIONAL, INTENT(INOUT):: &
  665. SNOWNC, SNOWNCV, GRAUPELNC, GRAUPELNCV
  666. ! REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT):: &
  667. ! refl_10cm
  668. REAL, INTENT(IN):: dt_in
  669. INTEGER, INTENT(IN):: itimestep
  670. ! TYPE (WRFU_Clock):: grid_clock
  671. ! TYPE (WRFU_Alarm), POINTER:: grid_alarms(:)
  672. !..Local variables
  673. REAL, DIMENSION(kts:kte):: &
  674. qv1d, qc1d, qi1d, qr1d, qs1d, qg1d, ni1d, &
  675. nr1d, t1d, p1d, dz1d, dBZ
  676. #ifdef WRF_CHEM
  677. REAL, DIMENSION(kts:kte):: &
  678. rainprod1d, evapprod1d
  679. #endif
  680. REAL, DIMENSION(its:ite, jts:jte):: pcp_ra, pcp_sn, pcp_gr, pcp_ic
  681. REAL:: dt, pptrain, pptsnow, pptgraul, pptice
  682. REAL:: qc_max, qr_max, qs_max, qi_max, qg_max, ni_max, nr_max
  683. INTEGER:: i, j, k
  684. INTEGER:: imax_qc,imax_qr,imax_qi,imax_qs,imax_qg,imax_ni,imax_nr
  685. INTEGER:: jmax_qc,jmax_qr,jmax_qi,jmax_qs,jmax_qg,jmax_ni,jmax_nr
  686. INTEGER:: kmax_qc,kmax_qr,kmax_qi,kmax_qs,kmax_qg,kmax_ni,kmax_nr
  687. INTEGER:: i_start, j_start, i_end, j_end
  688. LOGICAL:: dBZ_tstep
  689. !+---+
  690. dBZ_tstep = .false.
  691. ! if ( Is_alarm_tstep(grid_clock, grid_alarms(HISTORY_ALARM)) ) then
  692. ! dBZ_tstep = .true.
  693. ! endif
  694. i_start = its
  695. j_start = jts
  696. i_end = ite
  697. j_end = jte
  698. !..For idealized testing by developer.
  699. ! if ( (ide-ids+1).gt.4 .and. (jde-jds+1).lt.4 .and. &
  700. ! ids.eq.its.and.ide.eq.ite.and.jds.eq.jts.and.jde.eq.jte) then
  701. ! i_start = its + 2
  702. ! i_end = ite
  703. ! j_start = jts
  704. ! j_end = jte
  705. ! endif
  706. dt = dt_in
  707. qc_max = 0.
  708. qr_max = 0.
  709. qs_max = 0.
  710. qi_max = 0.
  711. qg_max = 0
  712. ni_max = 0.
  713. nr_max = 0.
  714. imax_qc = 0
  715. imax_qr = 0
  716. imax_qi = 0
  717. imax_qs = 0
  718. imax_qg = 0
  719. imax_ni = 0
  720. imax_nr = 0
  721. jmax_qc = 0
  722. jmax_qr = 0
  723. jmax_qi = 0
  724. jmax_qs = 0
  725. jmax_qg = 0
  726. jmax_ni = 0
  727. jmax_nr = 0
  728. kmax_qc = 0
  729. kmax_qr = 0
  730. kmax_qi = 0
  731. kmax_qs = 0
  732. kmax_qg = 0
  733. kmax_ni = 0
  734. kmax_nr = 0
  735. do i = 1, 256
  736. mp_debug(i:i) = char(0)
  737. enddo
  738. j_loop: do j = j_start, j_end
  739. i_loop: do i = i_start, i_end
  740. pptrain = 0.
  741. pptsnow = 0.
  742. pptgraul = 0.
  743. pptice = 0.
  744. RAINNCV(i,j) = 0.
  745. IF ( PRESENT (snowncv) ) THEN
  746. SNOWNCV(i,j) = 0.
  747. ENDIF
  748. IF ( PRESENT (graupelncv) ) THEN
  749. GRAUPELNCV(i,j) = 0.
  750. ENDIF
  751. SR(i,j) = 0.
  752. do k = kts, kte
  753. t1d(k) = th(i,k,j)*pii(i,k,j)
  754. p1d(k) = p(i,k,j)
  755. dz1d(k) = dz(i,k,j)
  756. qv1d(k) = qv(i,k,j)
  757. qc1d(k) = qc(i,k,j)
  758. qi1d(k) = qi(i,k,j)
  759. qr1d(k) = qr(i,k,j)
  760. qs1d(k) = qs(i,k,j)
  761. qg1d(k) = qg(i,k,j)
  762. ni1d(k) = ni(i,k,j)
  763. nr1d(k) = nr(i,k,j)
  764. enddo
  765. call mp_thompson(qv1d, qc1d, qi1d, qr1d, qs1d, qg1d, ni1d, &
  766. nr1d, t1d, p1d, dz1d, &
  767. pptrain, pptsnow, pptgraul, pptice, &
  768. #ifdef WRF_CHEM
  769. rainprod1d, evapprod1d, &
  770. #endif
  771. kts, kte, dt, i, j)
  772. pcp_ra(i,j) = pptrain
  773. pcp_sn(i,j) = pptsnow
  774. pcp_gr(i,j) = pptgraul
  775. pcp_ic(i,j) = pptice
  776. RAINNCV(i,j) = pptrain + pptsnow + pptgraul + pptice
  777. RAINNC(i,j) = RAINNC(i,j) + pptrain + pptsnow + pptgraul + pptice
  778. IF ( PRESENT(snowncv) .AND. PRESENT(snownc) ) THEN
  779. SNOWNCV(i,j) = pptsnow + pptice
  780. SNOWNC(i,j) = SNOWNC(i,j) + pptsnow + pptice
  781. ENDIF
  782. IF ( PRESENT(graupelncv) .AND. PRESENT(graupelnc) ) THEN
  783. GRAUPELNCV(i,j) = pptgraul
  784. GRAUPELNC(i,j) = GRAUPELNC(i,j) + pptgraul
  785. ENDIF
  786. SR(i,j) = (pptsnow + pptgraul + pptice)/(RAINNCV(i,j)+1.e-12)
  787. do k = kts, kte
  788. qv(i,k,j) = qv1d(k)
  789. qc(i,k,j) = qc1d(k)
  790. qi(i,k,j) = qi1d(k)
  791. qr(i,k,j) = qr1d(k)
  792. qs(i,k,j) = qs1d(k)
  793. qg(i,k,j) = qg1d(k)
  794. ni(i,k,j) = ni1d(k)
  795. nr(i,k,j) = nr1d(k)
  796. #ifdef WRF_CHEM
  797. rainprod(i,k,j) = rainprod1d(k)
  798. evapprod(i,k,j) = evapprod1d(k)
  799. #endif
  800. th(i,k,j) = t1d(k)/pii(i,k,j)
  801. if (qc1d(k) .gt. qc_max) then
  802. imax_qc = i
  803. jmax_qc = j
  804. kmax_qc = k
  805. qc_max = qc1d(k)
  806. elseif (qc1d(k) .lt. 0.0) then
  807. write(mp_debug,*) 'WARNING, negative qc ', qc1d(k), &
  808. ' at i,j,k=', i,j,k
  809. CALL wrf_debug(150, mp_debug)
  810. endif
  811. if (qr1d(k) .gt. qr_max) then
  812. imax_qr = i
  813. jmax_qr = j
  814. kmax_qr = k
  815. qr_max = qr1d(k)
  816. elseif (qr1d(k) .lt. 0.0) then
  817. write(mp_debug,*) 'WARNING, negative qr ', qr1d(k), &
  818. ' at i,j,k=', i,j,k
  819. CALL wrf_debug(150, mp_debug)
  820. endif
  821. if (nr1d(k) .gt. nr_max) then
  822. imax_nr = i
  823. jmax_nr = j
  824. kmax_nr = k
  825. nr_max = nr1d(k)
  826. elseif (nr1d(k) .lt. 0.0) then
  827. write(mp_debug,*) 'WARNING, negative nr ', nr1d(k), &
  828. ' at i,j,k=', i,j,k
  829. CALL wrf_debug(150, mp_debug)
  830. endif
  831. if (qs1d(k) .gt. qs_max) then
  832. imax_qs = i
  833. jmax_qs = j
  834. kmax_qs = k
  835. qs_max = qs1d(k)
  836. elseif (qs1d(k) .lt. 0.0) then
  837. write(mp_debug,*) 'WARNING, negative qs ', qs1d(k), &
  838. ' at i,j,k=', i,j,k
  839. CALL wrf_debug(150, mp_debug)
  840. endif
  841. if (qi1d(k) .gt. qi_max) then
  842. imax_qi = i
  843. jmax_qi = j
  844. kmax_qi = k
  845. qi_max = qi1d(k)
  846. elseif (qi1d(k) .lt. 0.0) then
  847. write(mp_debug,*) 'WARNING, negative qi ', qi1d(k), &
  848. ' at i,j,k=', i,j,k
  849. CALL wrf_debug(150, mp_debug)
  850. endif
  851. if (qg1d(k) .gt. qg_max) then
  852. imax_qg = i
  853. jmax_qg = j
  854. kmax_qg = k
  855. qg_max = qg1d(k)
  856. elseif (qg1d(k) .lt. 0.0) then
  857. write(mp_debug,*) 'WARNING, negative qg ', qg1d(k), &
  858. ' at i,j,k=', i,j,k
  859. CALL wrf_debug(150, mp_debug)
  860. endif
  861. if (ni1d(k) .gt. ni_max) then
  862. imax_ni = i
  863. jmax_ni = j
  864. kmax_ni = k
  865. ni_max = ni1d(k)
  866. elseif (ni1d(k) .lt. 0.0) then
  867. write(mp_debug,*) 'WARNING, negative ni ', ni1d(k), &
  868. ' at i,j,k=', i,j,k
  869. CALL wrf_debug(150, mp_debug)
  870. endif
  871. if (qv1d(k) .lt. 0.0) then
  872. if (k.lt.kte-2 .and. k.gt.kts+1) then
  873. qv(i,k,j) = 0.5*(qv(i,k-1,j) + qv(i,k+1,j))
  874. else
  875. qv(i,k,j) = 1.E-7
  876. endif
  877. write(mp_debug,*) 'WARNING, negative qv ', qv1d(k), &
  878. ' at i,j,k=', i,j,k
  879. CALL wrf_debug(150, mp_debug)
  880. endif
  881. enddo
  882. ! if (dBZ_tstep) then
  883. ! call calc_refl10cm (qv1d, qc1d, qr1d, nr1d, qs1d, qg1d, &
  884. ! t1d, p1d, dBZ, kts, kte, i, j)
  885. ! do k = kts, kte
  886. ! refl_10cm(i,k,j) = MAX(-35., dBZ(k))
  887. ! enddo
  888. ! endif
  889. enddo i_loop
  890. enddo j_loop
  891. ! DEBUG - GT
  892. write(mp_debug,'(a,7(a,e13.6,1x,a,i3,a,i3,a,i3,a,1x))') 'MP-GT:', &
  893. 'qc: ', qc_max, '(', imax_qc, ',', jmax_qc, ',', kmax_qc, ')', &
  894. 'qr: ', qr_max, '(', imax_qr, ',', jmax_qr, ',', kmax_qr, ')', &
  895. 'qi: ', qi_max, '(', imax_qi, ',', jmax_qi, ',', kmax_qi, ')', &
  896. 'qs: ', qs_max, '(', imax_qs, ',', jmax_qs, ',', kmax_qs, ')', &
  897. 'qg: ', qg_max, '(', imax_qg, ',', jmax_qg, ',', kmax_qg, ')', &
  898. 'ni: ', ni_max, '(', imax_ni, ',', jmax_ni, ',', kmax_ni, ')', &
  899. 'nr: ', nr_max, '(', imax_nr, ',', jmax_nr, ',', kmax_nr, ')'
  900. CALL wrf_debug(150, mp_debug)
  901. ! END DEBUG - GT
  902. do i = 1, 256
  903. mp_debug(i:i) = char(0)
  904. enddo
  905. END SUBROUTINE mp_gt_driver
  906. !+---+-----------------------------------------------------------------+
  907. !ctrlL
  908. !+---+-----------------------------------------------------------------+
  909. !+---+-----------------------------------------------------------------+
  910. !.. This subroutine computes the moisture tendencies of water vapor,
  911. !.. cloud droplets, rain, cloud ice (pristine), snow, and graupel.
  912. !.. Previously this code was based on Reisner et al (1998), but few of
  913. !.. those pieces remain. A complete description is now found in
  914. !.. Thompson et al. (2004, 2008).
  915. !+---+-----------------------------------------------------------------+
  916. !
  917. subroutine mp_thompson (qv1d, qc1d, qi1d, qr1d, qs1d, qg1d, ni1d, &
  918. nr1d, t1d, p1d, dzq, &
  919. pptrain, pptsnow, pptgraul, pptice, &
  920. #ifdef WRF_CHEM
  921. rainprod, evapprod, &
  922. #endif
  923. kts, kte, dt, ii, jj)
  924. implicit none
  925. !..Sub arguments
  926. INTEGER, INTENT(IN):: kts, kte, ii, jj
  927. REAL, DIMENSION(kts:kte), INTENT(INOUT):: &
  928. qv1d, qc1d, qi1d, qr1d, qs1d, qg1d, ni1d, &
  929. nr1d, t1d, p1d
  930. #ifdef WRF_CHEM
  931. REAL, DIMENSION(kts:kte), INTENT(INOUT):: &
  932. rainprod, evapprod
  933. #endif
  934. REAL, DIMENSION(kts:kte), INTENT(IN):: dzq
  935. REAL, INTENT(INOUT):: pptrain, pptsnow, pptgraul, pptice
  936. REAL, INTENT(IN):: dt
  937. !..Local variables
  938. REAL, DIMENSION(kts:kte):: tten, qvten, qcten, qiten, &
  939. qrten, qsten, qgten, niten, nrten
  940. DOUBLE PRECISION, DIMENSION(kts:kte):: prw_vcd
  941. DOUBLE PRECISION, DIMENSION(kts:kte):: prr_wau, prr_rcw, prr_rcs, &
  942. prr_rcg, prr_sml, prr_gml, &
  943. prr_rci, prv_rev, &
  944. pnr_wau, pnr_rcs, pnr_rcg, &
  945. pnr_rci, pnr_sml, pnr_gml, &
  946. pnr_rev, pnr_rcr, pnr_rfz
  947. DOUBLE PRECISION, DIMENSION(kts:kte):: pri_inu, pni_inu, pri_ihm, &
  948. pni_ihm, pri_wfz, pni_wfz, &
  949. pri_rfz, pni_rfz, pri_ide, &
  950. pni_ide, pri_rci, pni_rci, &
  951. pni_sci, pni_iau
  952. DOUBLE PRECISION, DIMENSION(kts:kte):: prs_iau, prs_sci, prs_rcs, &
  953. prs_scw, prs_sde, prs_ihm, &
  954. prs_ide
  955. DOUBLE PRECISION, DIMENSION(kts:kte):: prg_scw, prg_rfz, prg_gde, &
  956. prg_gcw, prg_rci, prg_rcs, &
  957. prg_rcg, prg_ihm
  958. DOUBLE PRECISION, PARAMETER:: zeroD0 = 0.0d0
  959. REAL, DIMENSION(kts:kte):: temp, pres, qv
  960. REAL, DIMENSION(kts:kte):: rc, ri, rr, rs, rg, ni, nr
  961. REAL, DIMENSION(kts:kte):: rho, rhof, rhof2
  962. REAL, DIMENSION(kts:kte):: qvs, qvsi
  963. REAL, DIMENSION(kts:kte):: satw, sati, ssatw, ssati
  964. REAL, DIMENSION(kts:kte):: diffu, visco, vsc2, &
  965. tcond, lvap, ocp, lvt2
  966. DOUBLE PRECISION, DIMENSION(kts:kte):: ilamr, ilamg, N0_r, N0_g
  967. REAL, DIMENSION(kts:kte):: mvd_r, mvd_c
  968. REAL, DIMENSION(kts:kte):: smob, smo2, smo1, smo0, &
  969. smoc, smod, smoe, smof
  970. REAL, DIMENSION(kts:kte):: sed_r, sed_s, sed_g, sed_i, sed_n
  971. REAL:: rgvm, delta_tp, orho, lfus2
  972. REAL, DIMENSION(4):: onstep
  973. DOUBLE PRECISION:: N0_exp, N0_min, lam_exp, lamc, lamr, lamg
  974. DOUBLE PRECISION:: lami, ilami
  975. REAL:: xDc, Dc_b, Dc_g, xDi, xDr, xDs, xDg, Ds_m, Dg_m
  976. DOUBLE PRECISION:: Dr_star
  977. REAL:: zeta1, zeta, taud, tau
  978. REAL:: stoke_r, stoke_s, stoke_g, stoke_i
  979. REAL:: vti, vtr, vts, vtg
  980. REAL, DIMENSION(kts:kte+1):: vtik, vtnik, vtrk, vtnrk, vtsk, vtgk
  981. REAL, DIMENSION(kts:kte):: vts_boost
  982. REAL:: Mrat, ils1, ils2, t1_vts, t2_vts, t3_vts, t4_vts, C_snow
  983. REAL:: a_, b_, loga_, A1, A2, tf
  984. REAL:: tempc, tc0, r_mvd1, r_mvd2, xkrat
  985. REAL:: xnc, xri, xni, xmi, oxmi, xrc, xrr, xnr
  986. REAL:: xsat, rate_max, sump, ratio
  987. REAL:: clap, fcd, dfcd
  988. REAL:: otemp, rvs, rvs_p, rvs_pp, gamsc, alphsc, t1_evap, t1_subl
  989. REAL:: r_frac, g_frac
  990. REAL:: Ef_rw, Ef_sw, Ef_gw, Ef_rr
  991. REAL:: dtsave, odts, odt, odzq
  992. REAL:: xslw1, ygra1, zans1
  993. INTEGER:: i, k, k2, n, nn, nstep, k_0, kbot, IT, iexfrq
  994. INTEGER, DIMENSION(4):: ksed1
  995. INTEGER:: nir, nis, nig, nii, nic
  996. INTEGER:: idx_tc, idx_t, idx_s, idx_g1, idx_g, idx_r1, idx_r, &
  997. idx_i1, idx_i, idx_c, idx, idx_d
  998. LOGICAL:: melti, no_micro
  999. LOGICAL, DIMENSION(kts:kte):: L_qc, L_qi, L_qr, L_qs, L_qg
  1000. LOGICAL:: debug_flag
  1001. !+---+
  1002. debug_flag = .false.
  1003. ! if (ii.eq.315 .and. jj.eq.2) debug_flag = .true.
  1004. no_micro = .true.
  1005. dtsave = dt
  1006. odt = 1./dt
  1007. odts = 1./dtsave
  1008. iexfrq = 1
  1009. !+---+-----------------------------------------------------------------+
  1010. !.. Source/sink terms. First 2 chars: "pr" represents source/sink of
  1011. !.. mass while "pn" represents source/sink of number. Next char is one
  1012. !.. of "v" for water vapor, "r" for rain, "i" for cloud ice, "w" for
  1013. !.. cloud water, "s" for snow, and "g" for graupel. Next chars
  1014. !.. represent processes: "de" for sublimation/deposition, "ev" for
  1015. !.. evaporation, "fz" for freezing, "ml" for melting, "au" for
  1016. !.. autoconversion, "nu" for ice nucleation, "hm" for Hallet/Mossop
  1017. !.. secondary ice production, and "c" for collection followed by the
  1018. !.. character for the species being collected. ALL of these terms are
  1019. !.. positive (except for deposition/sublimation terms which can switch
  1020. !.. signs based on super/subsaturation) and are treated as negatives
  1021. !.. where necessary in the tendency equations.
  1022. !+---+-----------------------------------------------------------------+
  1023. do k = kts, kte
  1024. tten(k) = 0.
  1025. qvten(k) = 0.
  1026. qcten(k) = 0.
  1027. qiten(k) = 0.
  1028. qrten(k) = 0.
  1029. qsten(k) = 0.
  1030. qgten(k) = 0.
  1031. niten(k) = 0.
  1032. nrten(k) = 0.
  1033. prw_vcd(k) = 0.
  1034. prv_rev(k) = 0.
  1035. prr_wau(k) = 0.
  1036. prr_rcw(k) = 0.
  1037. prr_rcs(k) = 0.
  1038. prr_rcg(k) = 0.
  1039. prr_sml(k) = 0.
  1040. prr_gml(k) = 0.
  1041. prr_rci(k) = 0.
  1042. pnr_wau(k) = 0.
  1043. pnr_rcs(k) = 0.
  1044. pnr_rcg(k) = 0.
  1045. pnr_rci(k) = 0.
  1046. pnr_sml(k) = 0.
  1047. pnr_gml(k) = 0.
  1048. pnr_rev(k) = 0.
  1049. pnr_rcr(k) = 0.
  1050. pnr_rfz(k) = 0.
  1051. pri_inu(k) = 0.
  1052. pni_inu(k) = 0.
  1053. pri_ihm(k) = 0.
  1054. pni_ihm(k) = 0.
  1055. pri_wfz(k) = 0.
  1056. pni_wfz(k) = 0.
  1057. pri_rfz(k) = 0.
  1058. pni_rfz(k) = 0.
  1059. pri_ide(k) = 0.
  1060. pni_ide(k) = 0.
  1061. pri_rci(k) = 0.
  1062. pni_rci(k) = 0.
  1063. pni_sci(k) = 0.
  1064. pni_iau(k) = 0.
  1065. prs_iau(k) = 0.
  1066. prs_sci(k) = 0.
  1067. prs_rcs(k) = 0.
  1068. prs_scw(k) = 0.
  1069. prs_sde(k) = 0.
  1070. prs_ihm(k) = 0.
  1071. prs_ide(k) = 0.
  1072. prg_scw(k) = 0.
  1073. prg_rfz(k) = 0.
  1074. prg_gde(k) = 0.
  1075. prg_gcw(k) = 0.
  1076. prg_rci(k) = 0.
  1077. prg_rcs(k) = 0.
  1078. prg_rcg(k) = 0.
  1079. prg_ihm(k) = 0.
  1080. enddo
  1081. #ifdef WRF_CHEM
  1082. do k = kts, kte
  1083. rainprod(k) = 0.
  1084. evapprod(k) = 0.
  1085. enddo
  1086. #endif
  1087. !+---+-----------------------------------------------------------------+
  1088. !..Put column of data into local arrays.
  1089. !+---+-----------------------------------------------------------------+
  1090. do k = kts, kte
  1091. temp(k) = t1d(k)
  1092. qv(k) = MAX(1.E-10, qv1d(k))
  1093. pres(k) = p1d(k)
  1094. rho(k) = 0.622*pres(k)/(R*temp(k)*(qv(k)+0.622))
  1095. if (qc1d(k) .gt. R1) then
  1096. no_micro = .false.
  1097. rc(k) = qc1d(k)*rho(k)
  1098. L_qc(k) = .true.
  1099. else
  1100. qc1d(k) = 0.0
  1101. rc(k) = R1
  1102. L_qc(k) = .false.
  1103. endif
  1104. if (qi1d(k) .gt. R1) then
  1105. no_micro = .false.
  1106. ri(k) = qi1d(k)*rho(k)
  1107. ni(k) = MAX(R2, ni1d(k)*rho(k))
  1108. L_qi(k) = .true.
  1109. lami = (am_i*cig(2)*oig1*ni(k)/ri(k))**obmi
  1110. ilami = 1./lami
  1111. xDi = (bm_i + mu_i + 1.) * ilami
  1112. if (xDi.lt. 20.E-6) then
  1113. lami = cie(2)/20.E-6
  1114. ni(k) = MIN(250.D3, cig(1)*oig2*ri(k)/am_i*lami**bm_i)
  1115. elseif (xDi.gt. 300.E-6) then
  1116. lami = cie(2)/300.E-6
  1117. ni(k) = cig(1)*oig2*ri(k)/am_i*lami**bm_i
  1118. endif
  1119. else
  1120. qi1d(k) = 0.0
  1121. ni1d(k) = 0.0
  1122. ri(k) = R1
  1123. ni(k) = R2
  1124. L_qi(k) = .false.
  1125. endif
  1126. if (qr1d(k) .gt. R1) then
  1127. no_micro = .false.
  1128. rr(k) = qr1d(k)*rho(k)
  1129. nr(k) = MAX(R2, nr1d(k)*rho(k))
  1130. L_qr(k) = .true.
  1131. lamr = (am_r*crg(3)*org2*nr(k)/rr(k))**obmr
  1132. mvd_r(k) = (3.0 + mu_r + 0.672) / lamr
  1133. if (mvd_r(k) .gt. 2.5E-3) then
  1134. mvd_r(k) = 2.5E-3
  1135. lamr = (3.0 + mu_r + 0.672) / mvd_r(k)
  1136. nr(k) = crg(2)*org3*rr(k)*lamr**bm_r / am_r
  1137. elseif (mvd_r(k) .lt. D0r*0.75) then
  1138. mvd_r(k) = D0r*0.75
  1139. lamr = (3.0 + mu_r + 0.672) / mvd_r(k)
  1140. nr(k) = crg(2)*org3*rr(k)*lamr**bm_r / am_r
  1141. endif
  1142. else
  1143. qr1d(k) = 0.0
  1144. nr1d(k) = 0.0
  1145. rr(k) = R1
  1146. nr(k) = R2
  1147. L_qr(k) = .false.
  1148. endif
  1149. if (qs1d(k) .gt. R1) then
  1150. no_micro = .false.
  1151. rs(k) = qs1d(k)*rho(k)
  1152. L_qs(k) = .true.
  1153. else
  1154. qs1d(k) = 0.0
  1155. rs(k) = R1
  1156. L_qs(k) = .false.
  1157. endif
  1158. if (qg1d(k) .gt. R1) then
  1159. no_micro = .false.
  1160. rg(k) = qg1d(k)*rho(k)
  1161. L_qg(k) = .true.
  1162. else
  1163. qg1d(k) = 0.0
  1164. rg(k) = R1
  1165. L_qg(k) = .false.
  1166. endif
  1167. enddo
  1168. !+---+-----------------------------------------------------------------+
  1169. !..Derive various thermodynamic variables frequently used.
  1170. !.. Saturation vapor pressure (mixing ratio) over liquid/ice comes from
  1171. !.. Flatau et al. 1992; enthalpy (latent heat) of vaporization from
  1172. !.. Bohren & Albrecht 1998; others from Pruppacher & Klett 1978.
  1173. !+---+-----------------------------------------------------------------+
  1174. do k = kts, kte
  1175. tempc = temp(k) - 273.15
  1176. rhof(k) = SQRT(RHO_NOT/rho(k))
  1177. rhof2(k) = SQRT(rhof(k))
  1178. qvs(k) = rslf(pres(k), temp(k))
  1179. if (tempc .le. 0.0) then
  1180. qvsi(k) = rsif(pres(k), temp(k))
  1181. else
  1182. qvsi(k) = qvs(k)
  1183. endif
  1184. satw(k) = qv(k)/qvs(k)
  1185. sati(k) = qv(k)/qvsi(k)
  1186. ssatw(k) = satw(k) - 1.
  1187. ssati(k) = sati(k) - 1.
  1188. if (abs(ssatw(k)).lt. eps) ssatw(k) = 0.0
  1189. if (abs(ssati(k)).lt. eps) ssati(k) = 0.0
  1190. if (no_micro .and. ssati(k).gt. 0.0) no_micro = .false.
  1191. diffu(k) = 2.11E-5*(temp(k)/273.15)**1.94 * (101325./pres(k))
  1192. if (tempc .ge. 0.0) then
  1193. visco(k) = (1.718+0.0049*tempc)*1.0E-5
  1194. else
  1195. visco(k) = (1.718+0.0049*tempc-1.2E-5*tempc*tempc)*1.0E-5
  1196. endif
  1197. ocp(k) = 1./(Cp*(1.+0.887*qv(k)))
  1198. vsc2(k) = SQRT(rho(k)/visco(k))
  1199. lvap(k) = lvap0 + (2106.0 - 4218.0)*tempc
  1200. tcond(k) = (5.69 + 0.0168*tempc)*1.0E-5 * 418.936
  1201. enddo
  1202. !+---+-----------------------------------------------------------------+
  1203. !..If no existing hydrometeor species and no chance to initiate ice or
  1204. !.. condense cloud water, just exit quickly!
  1205. !+---+-----------------------------------------------------------------+
  1206. if (no_micro) return
  1207. !+---+-----------------------------------------------------------------+
  1208. !..Calculate y-intercept, slope, and useful moments for snow.
  1209. !+---+-----------------------------------------------------------------+
  1210. if (.not. iiwarm) then
  1211. do k = kts, kte
  1212. if (.not. L_qs(k)) CYCLE
  1213. tc0 = MIN(-0.1, temp(k)-273.15)
  1214. smob(k) = rs(k)*oams
  1215. !..All other moments based on reference, 2nd moment. If bm_s.ne.2,
  1216. !.. then we must compute actual 2nd moment and use as reference.
  1217. if (bm_s.gt.(2.0-1.e-3) .and. bm_s.lt.(2.0+1.e-3)) then
  1218. smo2(k) = smob(k)
  1219. else
  1220. loga_ = sa(1) + sa(2)*tc0 + sa(3)*bm_s &
  1221. + sa(4)*tc0*bm_s + sa(5)*tc0*tc0 &
  1222. + sa(6)*bm_s*bm_s + sa(7)*tc0*tc0*bm_s &
  1223. + sa(8)*tc0*bm_s*bm_s + sa(9)*tc0*tc0*tc0 &
  1224. + sa(10)*bm_s*bm_s*bm_s
  1225. a_ = 10.0**loga_
  1226. b_ = sb(1) + sb(2)*tc0 + sb(3)*bm_s &
  1227. + sb(4)*tc0*bm_s + sb(5)*tc0*tc0 &
  1228. + sb(6)*bm_s*bm_s + sb(7)*tc0*tc0*bm_s &
  1229. + sb(8)*tc0*bm_s*bm_s + sb(9)*tc0*tc0*tc0 &
  1230. + sb(10)*bm_s*bm_s*bm_s
  1231. smo2(k) = (smob(k)/a_)**(1./b_)
  1232. endif
  1233. !..Calculate 0th moment. Represents snow number concentration.
  1234. loga_ = sa(1) + sa(2)*tc0 + sa(5)*tc0*tc0 + sa(9)*tc0*tc0*tc0
  1235. a_ = 10.0**loga_
  1236. b_ = sb(1) + sb(2)*tc0 + sb(5)*tc0*tc0 + sb(9)*tc0*tc0*tc0
  1237. smo0(k) = a_ * smo2(k)**b_
  1238. !..Calculate 1st moment. Useful for depositional growth and melting.
  1239. loga_ = sa(1) + sa(2)*tc0 + sa(3) &
  1240. + sa(4)*tc0 + sa(5)*tc0*tc0 &
  1241. + sa(6) + sa(7)*tc0*tc0 &
  1242. + sa(8)*tc0 + sa(9)*tc0*tc0*tc0 &
  1243. + sa(10)
  1244. a_ = 10.0**loga_
  1245. b_ = sb(1)+ sb(2)*tc0 + sb(3) + sb(4)*tc0 &
  1246. + sb(5)*tc0*tc0 + sb(6) &
  1247. + sb(7)*tc0*tc0 + sb(8)*tc0 &
  1248. + sb(9)*tc0*tc0*tc0 + sb(10)
  1249. smo1(k) = a_ * smo2(k)**b_
  1250. !..Calculate bm_s+1 (th) moment. Useful for diameter calcs.
  1251. loga_ = sa(1) + sa(2)*tc0 + sa(3)*cse(1) &
  1252. + sa(4)*tc0*cse(1) + sa(5)*tc0*tc0 &
  1253. + sa(6)*cse(1)*cse(1) + sa(7)*tc0*tc0*cse(1) &
  1254. + sa(8)*tc0*cse(1)*cse(1) + sa(9)*tc0*tc0*tc0 &
  1255. + sa(10)*cse(1)*cse(1)*cse(1)
  1256. a_ = 10.0**loga_
  1257. b_ = sb(1)+ sb(2)*tc0 + sb(3)*cse(1) + sb(4)*tc0*cse(1) &
  1258. + sb(5)*tc0*tc0 + sb(6)*cse(1)*cse(1) &
  1259. + sb(7)*tc0*tc0*cse(1) + sb(8)*tc0*cse(1)*cse(1) &
  1260. + sb(9)*tc0*tc0*tc0 + sb(10)*cse(1)*cse(1)*cse(1)
  1261. smoc(k) = a_ * smo2(k)**b_
  1262. !..Calculate bv_s+2 (th) moment. Useful for riming.
  1263. loga_ = sa(1) + sa(2)*tc0 + sa(3)*cse(13) &
  1264. + sa(4)*tc0*cse(13) + sa(5)*tc0*tc0 &
  1265. + sa(6)*cse(13)*cse(13) + sa(7)*tc0*tc0*cse(13) &
  1266. + sa(8)*tc0*cse(13)*cse(13) + sa(9)*tc0*tc0*tc0 &
  1267. + sa(10)*cse(13)*cse(13)*cse(13)
  1268. a_ = 10.0**loga_
  1269. b_ = sb(1)+ sb(2)*tc0 + sb(3)*cse(13) + sb(4)*tc0*cse(13) &
  1270. + sb(5)*tc0*tc0 + sb(6)*cse(13)*cse(13) &
  1271. + sb(7)*tc0*tc0*cse(13) + sb(8)*tc0*cse(13)*cse(13) &
  1272. + sb(9)*tc0*tc0*tc0 + sb(10)*cse(13)*cse(13)*cse(13)
  1273. smoe(k) = a_ * smo2(k)**b_
  1274. !..Calculate 1+(bv_s+1)/2 (th) moment. Useful for depositional growth.
  1275. loga_ = sa(1) + sa(2)*tc0 + sa(3)*cse(16) &
  1276. + sa(4)*tc0*cse(16) + sa(5)*tc0*tc0 &
  1277. + sa(6)*cse(16)*cse(16) + sa(7)*tc0*tc0*cse(16) &
  1278. + sa(8)*tc0*cse(16)*cse(16) + sa(9)*tc0*tc0*tc0 &
  1279. + sa(10)*cse(16)*cse(16)*cse(16)
  1280. a_ = 10.0**loga_
  1281. b_ = sb(1)+ sb(2)*tc0 + sb(3)*cse(16) + sb(4)*tc0*cse(16) &
  1282. + sb(5)*tc0*tc0 + sb(6)*cse(16)*cse(16) &
  1283. + sb(7)*tc0*tc0*cse(16) + sb(8)*tc0*cse(16)*cse(16) &
  1284. + sb(9)*tc0*tc0*tc0 + sb(10)*cse(16)*cse(16)*cse(16)
  1285. smof(k) = a_ * smo2(k)**b_
  1286. enddo
  1287. !+---+-----------------------------------------------------------------+
  1288. !..Calculate y-intercept, slope values for graupel.
  1289. !+---+-----------------------------------------------------------------+
  1290. N0_min = gonv_max
  1291. do k = kte, kts, -1
  1292. if (temp(k).lt.270.65 .and. L_qr(k) .and. mvd_r(k).gt.100.E-6) then
  1293. xslw1 = 4.01 + alog10(mvd_r(k))
  1294. else
  1295. xslw1 = 0.01
  1296. endif
  1297. ygra1 = 4.31 + alog10(max(5.E-5, rg(k)))
  1298. zans1 = 3.0 + (100./(300.*xslw1*ygra1/(10./xslw1+1.+0.25*ygra1)+30.+5.*ygra1))
  1299. N0_exp = 10.**(zans1)
  1300. N0_exp = MAX(DBLE(gonv_min), MIN(N0_exp, DBLE(gonv_max)))
  1301. N0_min = MIN(N0_exp, N0_min)
  1302. N0_exp = N0_min
  1303. lam_exp = (N0_exp*am_g*cgg(1)/rg(k))**oge1
  1304. lamg = lam_exp * (cgg(3)*ogg2*ogg1)**obmg
  1305. ilamg(k) = 1./lamg
  1306. N0_g(k) = N0_exp/(cgg(2)*lam_exp) * lamg**cge(2)
  1307. !+---+-----------------------------------------------------------------+
  1308. ! if( debug_flag .and. k.lt.42) then
  1309. ! if (k.eq.41) write(mp_debug,*) 'DEBUG-GT: K, zans1, rc, rr, rg, N0_g'
  1310. ! if (k.eq.41) CALL wrf_debug(0, mp_debug)
  1311. ! write(mp_debug, 'a, i2, 1x, f6.3, 1x, 4(1x,e13.6,1x)') &
  1312. ! ' GT ', k, zans1, rc(k), rr(k), rg(k), N0_g(k)
  1313. ! CALL wrf_debug(0, mp_debug)
  1314. ! endif
  1315. !+---+-----------------------------------------------------------------+
  1316. enddo
  1317. endif
  1318. !+---+-----------------------------------------------------------------+
  1319. !..Calculate y-intercept, slope values for rain.
  1320. !+---+-----------------------------------------------------------------+
  1321. do k = kte, kts, -1
  1322. lamr = (am_r*crg(3)*org2*nr(k)/rr(k))**obmr
  1323. ilamr(k) = 1./lamr
  1324. mvd_r(k) = (3.0 + mu_r + 0.672) / lamr
  1325. N0_r(k) = nr(k)*org2*lamr**cre(2)
  1326. enddo
  1327. !+---+-----------------------------------------------------------------+
  1328. !..Compute warm-rain process terms (except evap done later).
  1329. !+---+-----------------------------------------------------------------+
  1330. do k = kts, kte
  1331. !..Rain self-collection follows Seifert, 1994 and drop break-up
  1332. !.. follows Verlinde and Cotton, 1993. RAIN2M
  1333. if (L_qr(k) .and. mvd_r(k).gt. D0r) then
  1334. Ef_rr = 1.0
  1335. if (mvd_r(k) .gt. 1750.0E-6) then
  1336. Ef_rr = 2.0 - EXP(2300.0*(mvd_r(k)-1750.0E-6))
  1337. endif
  1338. pnr_rcr(k) = Ef_rr * 4.*nr(k)*rr(k)
  1339. endif
  1340. mvd_c(k) = D0c
  1341. if (.not. L_qc(k)) CYCLE
  1342. xDc = MAX(D0c*1.E6, ((rc(k)/(am_r*Nt_c))**obmr) * 1.E6)
  1343. lamc = (Nt_c*am_r* ccg(2) * ocg1 / rc(k))**obmr
  1344. mvd_c(k) = (3.0+mu_c+0.672) / lamc
  1345. !..Autoconversion follows Berry & Reinhardt (1974) with characteristic
  1346. !.. diameters correctly computed from gamma distrib of cloud droplets.
  1347. if (rc(k).gt. 0.01e-3) then
  1348. Dc_g = ((ccg(3)*ocg2)**obmr / lamc) * 1.E6
  1349. Dc_b = (xDc*xDc*xDc*Dc_g*Dc_g*Dc_g - xDc*xDc*xDc*xDc*xDc*xDc) &
  1350. **(1./6.)
  1351. zeta1 = 0.5*((6.25E-6*xDc*Dc_b*Dc_b*Dc_b - 0.4) &
  1352. + abs(6.25E-6*xDc*Dc_b*Dc_b*Dc_b - 0.4))
  1353. zeta = 0.027*rc(k)*zeta1
  1354. taud = 0.5*((0.5*Dc_b - 7.5) + abs(0.5*Dc_b - 7.5)) + R1
  1355. tau = 3.72/(rc(k)*taud)
  1356. prr_wau(k) = zeta/tau
  1357. prr_wau(k) = MIN(DBLE(rc(k)*odts), prr_wau(k))
  1358. pnr_wau(k) = prr_wau(k) / (am_r*mu_c*D0r*D0r*D0r) ! RAIN2M
  1359. endif
  1360. !..Rain collecting cloud water. In CE, assume Dc<<Dr and vtc=~0.
  1361. if (L_qr(k) .and. mvd_r(k).gt. D0r .and. mvd_c(k).gt. D0c) then
  1362. lamr = 1./ilamr(k)
  1363. idx = 1 + INT(nbr*DLOG(mvd_r(k)/Dr(1))/DLOG(Dr(nbr)/Dr(1)))
  1364. idx = MIN(idx, nbr)
  1365. Ef_rw = t_Efrw(idx, INT(mvd_c(k)*1.E6))
  1366. prr_rcw(k) = rhof(k)*t1_qr_qc*Ef_rw*rc(k)*N0_r(k) &
  1367. *((lamr+fv_r)**(-cre(9)))
  1368. prr_rcw(k) = MIN(DBLE(rc(k)*odts), prr_rcw(k))
  1369. endif
  1370. enddo
  1371. !+---+-----------------------------------------------------------------+
  1372. !..Compute all frozen hydrometeor species' process terms.
  1373. !+---+-----------------------------------------------------------------+
  1374. if (.not. iiwarm) then
  1375. do k = kts, kte
  1376. vts_boost(k) = 1.5
  1377. !..Temperature lookup table indexes.
  1378. tempc = temp(k) - 273.15
  1379. idx_tc = MAX(1, MIN(NINT(-tempc), 45) )
  1380. idx_t = INT( (tempc-2.5)/5. ) - 1
  1381. idx_t = MAX(1, -idx_t)
  1382. idx_t = MIN(idx_t, ntb_t)
  1383. IT = MAX(1, MIN(NINT(-tempc), 31) )
  1384. !..Cloud water lookup table index.
  1385. if (rc(k).gt. r_c(1)) then
  1386. nic = NINT(ALOG10(rc(k)))
  1387. do nn = nic-1, nic+1
  1388. n = nn
  1389. if ( (rc(k)/10.**nn).ge.1.0 .and. &
  1390. (rc(k)/10.**nn).lt.10.0) goto 141
  1391. enddo
  1392. 141 continue
  1393. idx_c = INT(rc(k)/10.**n) + 10*(n-nic2) - (n-nic2)
  1394. idx_c = MAX(1, MIN(idx_c, ntb_c))
  1395. else
  1396. idx_c = 1
  1397. endif
  1398. !..Cloud ice lookup table indexes.
  1399. if (ri(k).gt. r_i(1)) then
  1400. nii = NINT(ALOG10(ri(k)))
  1401. do nn = nii-1, nii+1
  1402. n = nn
  1403. if ( (ri(k)/10.**nn).ge.1.0 .and. &
  1404. (ri(k)/10.**nn).lt.10.0) goto 142
  1405. enddo
  1406. 142 continue
  1407. idx_i = INT(ri(k)/10.**n) + 10*(n-nii2) - (n-nii2)
  1408. idx_i = MAX(1, MIN(idx_i, ntb_i))
  1409. else
  1410. idx_i = 1
  1411. endif
  1412. if (ni(k).gt. Nt_i(1)) then
  1413. nii = NINT(ALOG10(ni(k)))
  1414. do nn = nii-1, nii+1
  1415. n = nn
  1416. if ( (ni(k)/10.**nn).ge.1.0 .and. &
  1417. (ni(k)/10.**nn).lt.10.0) goto 143
  1418. enddo
  1419. 143 continue
  1420. idx_i1 = INT(ni(k)/10.**n) + 10*(n-nii3) - (n-nii3)
  1421. idx_i1 = MAX(1, MIN(idx_i1, ntb_i1))
  1422. else
  1423. idx_i1 = 1
  1424. endif
  1425. !..Rain lookup table indexes.
  1426. if (rr(k).gt. r_r(1)) then
  1427. nir = NINT(ALOG10(rr(k)))
  1428. do nn = nir-1, nir+1
  1429. n = nn
  1430. if ( (rr(k)/10.**nn).ge.1.0 .and. &
  1431. (rr(k)/10.**nn).lt.10.0) goto 144
  1432. enddo
  1433. 144 continue
  1434. idx_r = INT(rr(k)/10.**n) + 10*(n-nir2) - (n-nir2)
  1435. idx_r = MAX(1, MIN(idx_r, ntb_r))
  1436. lamr = 1./ilamr(k)
  1437. lam_exp = lamr * (crg(3)*org2*org1)**bm_r
  1438. N0_exp = org1*rr(k)/am_r * lam_exp**cre(1)
  1439. nir = NINT(DLOG10(N0_exp))
  1440. do nn = nir-1, nir+1
  1441. n = nn
  1442. if ( (N0_exp/10.**nn).ge.1.0 .and. &
  1443. (N0_exp/10.**nn).lt.10.0) goto 145
  1444. enddo
  1445. 145 continue
  1446. idx_r1 = INT(N0_exp/10.**n) + 10*(n-nir3) - (n-nir3)
  1447. idx_r1 = MAX(1, MIN(idx_r1, ntb_r1))
  1448. else
  1449. idx_r = 1
  1450. idx_r1 = ntb_r1
  1451. endif
  1452. !..Snow lookup table index.
  1453. if (rs(k).gt. r_s(1)) then
  1454. nis = NINT(ALOG10(rs(k)))
  1455. do nn = nis-1, nis+1
  1456. n = nn
  1457. if ( (rs(k)/10.**nn).ge.1.0 .and. &
  1458. (rs(k)/10.**nn).lt.10.0) goto 146
  1459. enddo
  1460. 146 continue
  1461. idx_s = INT(rs(k)/10.**n) + 10*(n-nis2) - (n-nis2)
  1462. idx_s = MAX(1, MIN(idx_s, ntb_s))
  1463. else
  1464. idx_s = 1
  1465. endif
  1466. !..Graupel lookup table index.
  1467. if (rg(k).gt. r_g(1)) then
  1468. nig = NINT(ALOG10(rg(k)))
  1469. do nn = nig-1, nig+1
  1470. n = nn
  1471. if ( (rg(k)/10.**nn).ge.1.0 .and. &
  1472. (rg(k)/10.**nn).lt.10.0) goto 147
  1473. enddo
  1474. 147 continue
  1475. idx_g = INT(rg(k)/10.**n) + 10*(n-nig2) - (n-nig2)
  1476. idx_g = MAX(1, MIN(idx_g, ntb_g))
  1477. lamg = 1./ilamg(k)
  1478. lam_exp = lamg * (cgg(3)*ogg2*ogg1)**bm_g
  1479. N0_exp = ogg1*rg(k)/am_g * lam_exp**cge(1)
  1480. nig = NINT(DLOG10(N0_exp))
  1481. do nn = nig-1, nig+1
  1482. n = nn
  1483. if ( (N0_exp/10.**nn).ge.1.0 .and. &
  1484. (N0_exp/10.**nn).lt.10.0) goto 148
  1485. enddo
  1486. 148 continue
  1487. idx_g1 = INT(N0_exp/10.**n) + 10*(n-nig3) - (n-nig3)
  1488. idx_g1 = MAX(1, MIN(idx_g1, ntb_g1))
  1489. else
  1490. idx_g = 1
  1491. idx_g1 = ntb_g1
  1492. endif
  1493. !..Deposition/sublimation prefactor (from Srivastava & Coen 1992).
  1494. otemp = 1./temp(k)
  1495. rvs = rho(k)*qvsi(k)
  1496. rvs_p = rvs*otemp*(lsub*otemp*oRv - 1.)
  1497. rvs_pp = rvs * ( otemp*(lsub*otemp*oRv - 1.) &
  1498. *otemp*(lsub*otemp*oRv - 1.) &
  1499. + (-2.*lsub*otemp*otemp*otemp*oRv) &
  1500. + otemp*otemp)
  1501. gamsc = lsub*diffu(k)/tcond(k) * rvs_p
  1502. alphsc = 0.5*(gamsc/(1.+gamsc))*(gamsc/(1.+gamsc)) &
  1503. * rvs_pp/rvs_p * rvs/rvs_p
  1504. alphsc = MAX(1.E-9, alphsc)
  1505. xsat = ssati(k)
  1506. if (abs(xsat).lt. 1.E-9) xsat=0.
  1507. t1_subl = 4.*PI*( 1.0 - alphsc*xsat &
  1508. + 2.*alphsc*alphsc*xsat*xsat &
  1509. - 5.*alphsc*alphsc*alphsc*xsat*xsat*xsat ) &
  1510. / (1.+gamsc)
  1511. !..Snow collecting cloud water. In CE, assume Dc<<Ds and vtc=~0.
  1512. if (L_qc(k) .and. mvd_c(k).gt. D0c) then
  1513. xDs = 0.0
  1514. if (L_qs(k)) xDs = smoc(k) / smob(k)
  1515. if (xDs .gt. D0s) then
  1516. idx = 1 + INT(nbs*DLOG(xDs/Ds(1))/DLOG(Ds(nbs)/Ds(1)))
  1517. idx = MIN(idx, nbs)
  1518. Ef_sw = t_Efsw(idx, INT(mvd_c(k)*1.E6))
  1519. prs_scw(k) = rhof(k)*t1_qs_qc*Ef_sw*rc(k)*smoe(k)
  1520. endif
  1521. !..Graupel collecting cloud water. In CE, assume Dc<<Dg and vtc=~0.
  1522. if (rg(k).ge. r_g(1) .and. mvd_c(k).gt. D0c) then
  1523. xDg = (bm_g + mu_g + 1.) * ilamg(k)
  1524. vtg = rhof(k)*av_g*cgg(6)*ogg3 * ilamg(k)**bv_g
  1525. stoke_g = mvd_c(k)*mvd_c(k)*vtg*rho_w/(9.*visco(k)*xDg)
  1526. if (xDg.gt. D0g) then
  1527. if (stoke_g.ge.0.4 .and. stoke_g.le.10.) then
  1528. Ef_gw = 0.55*ALOG10(2.51*stoke_g)
  1529. elseif (stoke_g.lt.0.4) then
  1530. Ef_gw = 0.0
  1531. elseif (stoke_g.gt.10) then
  1532. Ef_gw = 0.77
  1533. endif
  1534. prg_gcw(k) = rhof(k)*t1_qg_qc*Ef_gw*rc(k)*N0_g(k) &
  1535. *ilamg(k)**cge(9)
  1536. endif
  1537. endif
  1538. endif
  1539. !..Rain collecting snow. Cannot assume Wisner (1972) approximation
  1540. !.. or Mizuno (1990) approach so we solve the CE explicitly and store
  1541. !.. results in lookup table.
  1542. if (rr(k).ge. r_r(1)) then
  1543. if (rs(k).ge. r_s(1)) then
  1544. if (temp(k).lt.T_0) then
  1545. prr_rcs(k) = -(tmr_racs2(idx_s,idx_t,idx_r1,idx_r) &
  1546. + tcr_sacr2(idx_s,idx_t,idx_r1,idx_r) &
  1547. + tmr_racs1(idx_s,idx_t,idx_r1,idx_r) &
  1548. + tcr_sacr1(idx_s,idx_t,idx_r1,idx_r))
  1549. prs_rcs(k) = tmr_racs2(idx_s,idx_t,idx_r1,idx_r) &
  1550. + tcr_sacr2(idx_s,idx_t,idx_r1,idx_r) &
  1551. - tcs_racs1(idx_s,idx_t,idx_r1,idx_r) &
  1552. - tms_sacr1(idx_s,idx_t,idx_r1,idx_r)
  1553. prg_rcs(k) = tmr_racs1(idx_s,idx_t,idx_r1,idx_r) &
  1554. + tcr_sacr1(idx_s,idx_t,idx_r1,idx_r) &
  1555. + tcs_racs1(idx_s,idx_t,idx_r1,idx_r) &
  1556. + tms_sacr1(idx_s,idx_t,idx_r1,idx_r)
  1557. prr_rcs(k) = MAX(DBLE(-rr(k)*odts), prr_rcs(k))
  1558. prs_rcs(k) = MAX(DBLE(-rs(k)*odts), prs_rcs(k))
  1559. prg_rcs(k) = MIN(DBLE((rr(k)+rs(k))*odts), prg_rcs(k))
  1560. pnr_rcs(k) = tnr_racs1(idx_s,idx_t,idx_r1,idx_r) & ! RAIN2M
  1561. + tnr_racs2(idx_s,idx_t,idx_r1,idx_r) &
  1562. + tnr_sacr1(idx_s,idx_t,idx_r1,idx_r) &
  1563. + tnr_sacr2(idx_s,idx_t,idx_r1,idx_r)
  1564. else
  1565. prs_rcs(k) = -tcs_racs1(idx_s,idx_t,idx_r1,idx_r) &
  1566. - tms_sacr1(idx_s,idx_t,idx_r1,idx_r) &
  1567. + tmr_racs2(idx_s,idx_t,idx_r1,idx_r) &
  1568. + tcr_sacr2(idx_s,idx_t,idx_r1,idx_r)
  1569. prs_rcs(k) = MAX(DBLE(-rs(k)*odts), prs_rcs(k))
  1570. prr_rcs(k) = -prs_rcs(k)
  1571. pnr_rcs(k) = tnr_racs2(idx_s,idx_t,idx_r1,idx_r) & ! RAIN2M
  1572. + tnr_sacr2(idx_s,idx_t,idx_r1,idx_r)
  1573. endif
  1574. pnr_rcs(k) = MIN(DBLE(nr(k)*odts), pnr_rcs(k))
  1575. endif
  1576. !..Rain collecting graupel. Cannot assume Wisner (1972) approximation
  1577. !.. or Mizuno (1990) approach so we solve the CE explicitly and store
  1578. !.. results in lookup table.
  1579. if (rg(k).ge. r_g(1)) then
  1580. if (temp(k).lt.T_0) then
  1581. prg_rcg(k) = tmr_racg(idx_g1,idx_g,idx_r1,idx_r) &
  1582. + tcr_gacr(idx_g1,idx_g,idx_r1,idx_r)
  1583. prg_rcg(k) = MIN(DBLE(rr(k)*odts), prg_rcg(k))
  1584. prr_rcg(k) = -prg_rcg(k)
  1585. pnr_rcg(k) = tnr_racg(idx_g1,idx_g,idx_r1,idx_r) & ! RAIN2M
  1586. + tnr_gacr(idx_g1,idx_g,idx_r1,idx_r)
  1587. pnr_rcg(k) = MIN(DBLE(nr(k)*odts), pnr_rcg(k))
  1588. else
  1589. prr_rcg(k) = tcg_racg(idx_g1,idx_g,idx_r1,idx_r)
  1590. prr_rcg(k) = MIN(DBLE(rg(k)*odts), prr_rcg(k))
  1591. prg_rcg(k) = -prr_rcg(k)
  1592. endif
  1593. endif
  1594. endif
  1595. !+---+-----------------------------------------------------------------+
  1596. !..Next IF block handles only those processes below 0C.
  1597. !+---+-----------------------------------------------------------------+
  1598. if (temp(k).lt.T_0) then
  1599. vts_boost(k) = 1.0
  1600. rate_max = (qv(k)-qvsi(k))*rho(k)*odts*0.999
  1601. !..Freezing of water drops into graupel/cloud ice (Bigg 1953).
  1602. if (rr(k).gt. r_r(1)) then
  1603. prg_rfz(k) = tpg_qrfz(idx_r,idx_r1,idx_tc)*odts
  1604. pri_rfz(k) = tpi_qrfz(idx_r,idx_r1,idx_tc)*odts
  1605. pni_rfz(k) = tni_qrfz(idx_r,idx_r1,idx_tc)*odts
  1606. pnr_rfz(k) = tnr_qrfz(idx_r,idx_r1,idx_tc)*odts ! RAIN2M
  1607. pnr_rfz(k) = MIN(DBLE(nr(k)*odts), pnr_rfz(k))
  1608. elseif (rr(k).gt. R1 .and. temp(k).lt.HGFR) then
  1609. pri_rfz(k) = rr(k)*odts
  1610. pnr_rfz(k) = nr(k)*odts ! RAIN2M
  1611. pni_rfz(k) = pnr_rfz(k)
  1612. endif
  1613. if (rc(k).gt. r_c(1)) then
  1614. pri_wfz(k) = tpi_qcfz(idx_c,idx_tc)*odts
  1615. pri_wfz(k) = MIN(DBLE(rc(k)*odts), pri_wfz(k))
  1616. pni_wfz(k) = tni_qcfz(idx_c,idx_tc)*odts
  1617. pni_wfz(k) = MIN(DBLE(Nt_c*odts), pri_wfz(k)/(2.*xm0i), &
  1618. pni_wfz(k))
  1619. endif
  1620. !..Nucleate ice from deposition & condensation freezing (Cooper 1986)
  1621. !.. but only if water sat and T<-12C or 25%+ ice supersaturated.
  1622. if ( (ssati(k).ge. 0.25) .or. (ssatw(k).gt. eps &
  1623. .and. temp(k).lt.261.15) ) then
  1624. xnc = MIN(250.E3, TNO*EXP(ATO*(T_0-temp(k))))
  1625. xni = ni(k) + (pni_rfz(k)+pni_wfz(k))*dtsave
  1626. pni_inu(k) = 0.5*(xnc-xni + abs(xnc-xni))*odts
  1627. pri_inu(k) = MIN(DBLE(rate_max), xm0i*pni_inu(k))
  1628. pni_inu(k) = pri_inu(k)/xm0i
  1629. endif
  1630. !..Deposition/sublimation of cloud ice (Srivastava & Coen 1992).
  1631. if (L_qi(k)) then
  1632. lami = (am_i*cig(2)*oig1*ni(k)/ri(k))**obmi
  1633. ilami = 1./lami
  1634. xDi = MAX(DBLE(D0i), (bm_i + mu_i + 1.) * ilami)
  1635. xmi = am_i*xDi**bm_i
  1636. oxmi = 1./xmi
  1637. pri_ide(k) = C_cube*t1_subl*diffu(k)*ssati(k)*rvs &
  1638. *oig1*cig(5)*ni(k)*ilami
  1639. if (pri_ide(k) .lt. 0.0) then
  1640. pri_ide(k) = MAX(DBLE(-ri(k)*odts), pri_ide(k), DBLE(rate_max))
  1641. pni_ide(k) = pri_ide(k)*oxmi
  1642. pni_ide(k) = MAX(DBLE(-ni(k)*odts), pni_ide(k))
  1643. else
  1644. pri_ide(k) = MIN(pri_ide(k), DBLE(rate_max))
  1645. prs_ide(k) = (1.0D0-tpi_ide(idx_i,idx_i1))*pri_ide(k)
  1646. pri_ide(k) = tpi_ide(idx_i,idx_i1)*pri_ide(k)
  1647. endif
  1648. !..Some cloud ice needs to move into the snow category. Use lookup
  1649. !.. table that resulted from explicit bin representation of distrib.
  1650. if ( (idx_i.eq. ntb_i) .or. (xDi.gt. 5.0*D0s) ) then
  1651. prs_iau(k) = ri(k)*.99*odts
  1652. pni_iau(k) = ni(k)*.95*odts
  1653. elseif (xDi.lt. 0.1*D0s) then
  1654. prs_iau(k) = 0.
  1655. pni_iau(k) = 0.
  1656. else
  1657. prs_iau(k) = tps_iaus(idx_i,idx_i1)*odts
  1658. prs_iau(k) = MIN(DBLE(ri(k)*.99*odts), prs_iau(k))
  1659. pni_iau(k) = tni_iaus(idx_i,idx_i1)*odts
  1660. pni_iau(k) = MIN(DBLE(ni(k)*.95*odts), pni_iau(k))
  1661. endif
  1662. endif
  1663. !..Deposition/sublimation of snow/graupel follows Srivastava & Coen
  1664. !.. (1992).
  1665. if (L_qs(k)) then
  1666. C_snow = C_sqrd + (tempc+15.)*(C_cube-C_sqrd)/(-30.+15.)
  1667. C_snow = MAX(C_sqrd, MIN(C_snow, C_cube))
  1668. prs_sde(k) = C_snow*t1_subl*diffu(k)*ssati(k)*rvs &
  1669. * (t1_qs_sd*smo1(k) &
  1670. + t2_qs_sd*rhof2(k)*vsc2(k)*smof(k))
  1671. if (prs_sde(k).lt. 0.) then
  1672. prs_sde(k) = MAX(DBLE(-rs(k)*odts), prs_sde(k), DBLE(rate_max))
  1673. else
  1674. prs_sde(k) = MIN(prs_sde(k), DBLE(rate_max))
  1675. endif
  1676. endif
  1677. if (L_qg(k) .and. ssati(k).lt. -eps) then
  1678. prg_gde(k) = C_cube*t1_subl*diffu(k)*ssati(k)*rvs &
  1679. * N0_g(k) * (t1_qg_sd*ilamg(k)**cge(10) &
  1680. + t2_qg_sd*vsc2(k)*rhof2(k)*ilamg(k)**cge(11))
  1681. if (prg_gde(k).lt. 0.) then
  1682. prg_gde(k) = MAX(DBLE(-rg(k)*odts), prg_gde(k), DBLE(rate_max))
  1683. else
  1684. prg_gde(k) = MIN(prg_gde(k), DBLE(rate_max))
  1685. endif
  1686. endif
  1687. !..Snow collecting cloud ice. In CE, assume Di<<Ds and vti=~0.
  1688. if (L_qi(k)) then
  1689. lami = (am_i*cig(2)*oig1*ni(k)/ri(k))**obmi
  1690. ilami = 1./lami
  1691. xDi = MAX(DBLE(D0i), (bm_i + mu_i + 1.) * ilami)
  1692. xmi = am_i*xDi**bm_i
  1693. oxmi = 1./xmi
  1694. if (rs(k).ge. r_s(1)) then
  1695. prs_sci(k) = t1_qs_qi*rhof(k)*Ef_si*ri(k)*smoe(k)
  1696. pni_sci(k) = prs_sci(k) * oxmi
  1697. endif
  1698. !..Rain collecting cloud ice. In CE, assume Di<<Dr and vti=~0.
  1699. if (rr(k).ge. r_r(1) .and. mvd_r(k).gt. 4.*xDi) then
  1700. lamr = 1./ilamr(k)
  1701. pri_rci(k) = rhof(k)*t1_qr_qi*Ef_ri*ri(k)*N0_r(k) &
  1702. *((lamr+fv_r)**(-cre(9)))
  1703. pnr_rci(k) = rhof(k)*t1_qr_qi*Ef_ri*ni(k)*N0_r(k) & ! RAIN2M
  1704. *((lamr+fv_r)**(-cre(9)))
  1705. pni_rci(k) = pri_rci(k) * oxmi
  1706. prr_rci(k) = rhof(k)*t2_qr_qi*Ef_ri*ni(k)*N0_r(k) &
  1707. *((lamr+fv_r)**(-cre(8)))
  1708. prr_rci(k) = MIN(DBLE(rr(k)*odts), prr_rci(k))
  1709. prg_rci(k) = pri_rci(k) + prr_rci(k)
  1710. endif
  1711. endif
  1712. !..Ice multiplication from rime-splinters (Hallet & Mossop 1974).
  1713. if (prg_gcw(k).gt. eps .and. tempc.gt.-8.0) then
  1714. tf = 0.
  1715. if (tempc.ge.-5.0 .and. tempc.lt.-3.0) then
  1716. tf = 0.5*(-3.0 - tempc)
  1717. elseif (tempc.gt.-8.0 .and. tempc.lt.-5.0) then
  1718. tf = 0.33333333*(8.0 + tempc)
  1719. endif
  1720. pni_ihm(k) = 3.5E8*tf*prg_gcw(k)
  1721. pri_ihm(k) = xm0i*pni_ihm(k)
  1722. prs_ihm(k) = prs_scw(k)/(prs_scw(k)+prg_gcw(k)) &
  1723. * pri_ihm(k)
  1724. prg_ihm(k) = prg_gcw(k)/(prs_scw(k)+prg_gcw(k)) &
  1725. * pri_ihm(k)
  1726. endif
  1727. !..A portion of rimed snow converts to graupel but some remains snow.
  1728. !.. Interp from 5 to 75% as riming factor increases from 5.0 to 30.0
  1729. !.. 0.028 came from (.75-.05)/(30.-5.). This remains ad-hoc and should
  1730. !.. be revisited.
  1731. if (prs_scw(k).gt.5.0*prs_sde(k) .and. &
  1732. prs_sde(k).gt.eps) then
  1733. r_frac = MIN(30.0D0, prs_scw(k)/prs_sde(k))
  1734. g_frac = MIN(0.75, 0.05 + (r_frac-5.)*.028)
  1735. vts_boost(k) = MIN(1.5, 1.1 + (r_frac-5.)*.016)
  1736. prg_scw(k) = g_frac*prs_scw(k)
  1737. prs_scw(k) = (1. - g_frac)*prs_scw(k)
  1738. endif
  1739. else
  1740. !..Melt snow and graupel and enhance from collisions with liquid.
  1741. !.. We also need to sublimate snow and graupel if subsaturated.
  1742. if (L_qs(k)) then
  1743. prr_sml(k) = tempc*tcond(k)*(t1_qs_me*smo1(k) &
  1744. + t2_qs_me*rhof2(k)*vsc2(k)*smof(k))
  1745. prr_sml(k) = prr_sml(k) + 4218.*olfus*tempc &
  1746. * (prr_rcs(k)+prs_scw(k))
  1747. prr_sml(k) = MIN(DBLE(rs(k)*odts), prr_sml(k))
  1748. pnr_sml(k) = smo0(k)/rs(k)*prr_sml(k) * 10.0**(-0.75*tempc) ! RAIN2M
  1749. pnr_sml(k) = MIN(DBLE(smo0(k)*odts), pnr_sml(k))
  1750. if (tempc.gt.3.5 .or. rs(k).lt.0.005E-3) pnr_sml(k)=0.0
  1751. if (ssati(k).lt. 0.) then
  1752. prs_sde(k) = C_cube*t1_subl*diffu(k)*ssati(k)*rvs &
  1753. * (t1_qs_sd*smo1(k) &
  1754. + t2_qs_sd*rhof2(k)*vsc2(k)*smof(k))
  1755. prs_sde(k) = MAX(DBLE(-rs(k)*odts), prs_sde(k))
  1756. endif
  1757. endif
  1758. if (L_qg(k)) then
  1759. prr_gml(k) = tempc*N0_g(k)*tcond(k) &
  1760. *(t1_qg_me*ilamg(k)**cge(10) &
  1761. + t2_qg_me*rhof2(k)*vsc2(k)*ilamg(k)**cge(11))
  1762. !-GT prr_gml(k) = prr_gml(k) + 4218.*olfus*tempc &
  1763. !-GT * (prr_rcg(k)+prg_gcw(k))
  1764. prr_gml(k) = MIN(DBLE(rg(k)*odts), prr_gml(k))
  1765. pnr_gml(k) = (N0_g(k) / (cgg(1)*am_g*N0_g(k)/rg(k))**oge1) & ! RAIN2M
  1766. / rg(k) * prr_gml(k) * 10.0**(-1.25*tempc)
  1767. if (rg(k).lt.0.005E-3) pnr_gml(k)=0.0
  1768. if (ssati(k).lt. 0.) then
  1769. prg_gde(k) = C_cube*t1_subl*diffu(k)*ssati(k)*rvs &
  1770. * N0_g(k) * (t1_qg_sd*ilamg(k)**cge(10) &
  1771. + t2_qg_sd*vsc2(k)*rhof2(k)*ilamg(k)**cge(11))
  1772. prg_gde(k) = MAX(DBLE(-rg(k)*odts), prg_gde(k))
  1773. endif
  1774. endif
  1775. !.. This change will be required if users run adaptive time step that
  1776. !.. results in delta-t that is generally too long to allow cloud water
  1777. !.. collection by snow/graupel above melting temperature.
  1778. !.. Credit to Bjorn-Egil Nygaard for discovering.
  1779. if (dt .gt. 120.) then
  1780. prr_rcw(k)=prr_rcw(k)+prs_scw(k)+prg_gcw(k)
  1781. prs_scw(k)=0.
  1782. prg_gcw(k)=0.
  1783. endif
  1784. endif
  1785. enddo
  1786. endif
  1787. !+---+-----------------------------------------------------------------+
  1788. !..Ensure we do not deplete more hydrometeor species than exists.
  1789. !+---+-----------------------------------------------------------------+
  1790. do k = kts, kte
  1791. !..If ice supersaturated, ensure sum of depos growth terms does not
  1792. !.. deplete more vapor than possibly exists. If subsaturated, limit
  1793. !.. sum of sublimation terms such that vapor does not reproduce ice
  1794. !.. supersat again.
  1795. sump = pri_inu(k) + pri_ide(k) + prs_ide(k) &
  1796. + prs_sde(k) + prg_gde(k)
  1797. rate_max = (qv(k)-qvsi(k))*odts*0.999
  1798. if ( (sump.gt. eps .and. sump.gt. rate_max) .or. &
  1799. (sump.lt. -eps .and. sump.lt. rate_max) ) then
  1800. ratio = rate_max/sump
  1801. pri_inu(k) = pri_inu(k) * ratio
  1802. pri_ide(k) = pri_ide(k) * ratio
  1803. pni_ide(k) = pni_ide(k) * ratio
  1804. prs_ide(k) = prs_ide(k) * ratio
  1805. prs_sde(k) = prs_sde(k) * ratio
  1806. prg_gde(k) = prg_gde(k) * ratio
  1807. endif
  1808. !..Cloud water conservation.
  1809. sump = -prr_wau(k) - pri_wfz(k) - prr_rcw(k) &
  1810. - prs_scw(k) - prg_scw(k) - prg_gcw(k)
  1811. rate_max = -rc(k)*odts
  1812. if (sump.lt. rate_max .and. L_qc(k)) then
  1813. ratio = rate_max/sump
  1814. prr_wau(k) = prr_wau(k) * ratio
  1815. pri_wfz(k) = pri_wfz(k) * ratio
  1816. prr_rcw(k) = prr_rcw(k) * ratio
  1817. prs_scw(k) = prs_scw(k) * ratio
  1818. prg_scw(k) = prg_scw(k) * ratio
  1819. prg_gcw(k) = prg_gcw(k) * ratio
  1820. endif
  1821. !..Cloud ice conservation.
  1822. sump = pri_ide(k) - prs_iau(k) - prs_sci(k) &
  1823. - pri_rci(k)
  1824. rate_max = -ri(k)*odts
  1825. if (sump.lt. rate_max .and. L_qi(k)) then
  1826. ratio = rate_max/sump
  1827. pri_ide(k) = pri_ide(k) * ratio
  1828. prs_iau(k) = prs_iau(k) * ratio
  1829. prs_sci(k) = prs_sci(k) * ratio
  1830. pri_rci(k) = pri_rci(k) * ratio
  1831. endif
  1832. !..Rain conservation.
  1833. sump = -prg_rfz(k) - pri_rfz(k) - prr_rci(k) &
  1834. + prr_rcs(k) + prr_rcg(k)
  1835. rate_max = -rr(k)*odts
  1836. if (sump.lt. rate_max .and. L_qr(k)) then
  1837. ratio = rate_max/sump
  1838. prg_rfz(k) = prg_rfz(k) * ratio
  1839. pri_rfz(k) = pri_rfz(k) * ratio
  1840. prr_rci(k) = prr_rci(k) * ratio
  1841. prr_rcs(k) = prr_rcs(k) * ratio
  1842. prr_rcg(k) = prr_rcg(k) * ratio
  1843. endif
  1844. !..Snow conservation.
  1845. sump = prs_sde(k) - prs_ihm(k) - prr_sml(k) &
  1846. + prs_rcs(k)
  1847. rate_max = -rs(k)*odts
  1848. if (sump.lt. rate_max .and. L_qs(k)) then
  1849. ratio = rate_max/sump
  1850. prs_sde(k) = prs_sde(k) * ratio
  1851. prs_ihm(k) = prs_ihm(k) * ratio
  1852. prr_sml(k) = prr_sml(k) * ratio
  1853. prs_rcs(k) = prs_rcs(k) * ratio
  1854. endif
  1855. !..Graupel conservation.
  1856. sump = prg_gde(k) - prg_ihm(k) - prr_gml(k) &
  1857. + prg_rcg(k)
  1858. rate_max = -rg(k)*odts
  1859. if (sump.lt. rate_max .and. L_qg(k)) then
  1860. ratio = rate_max/sump
  1861. prg_gde(k) = prg_gde(k) * ratio
  1862. prg_ihm(k) = prg_ihm(k) * ratio
  1863. prr_gml(k) = prr_gml(k) * ratio
  1864. prg_rcg(k) = prg_rcg(k) * ratio
  1865. endif
  1866. !..Re-enforce proper mass conservation for subsequent elements in case
  1867. !.. any of the above terms were altered. Thanks P. Blossey. 2009Sep28
  1868. pri_ihm(k) = prs_ihm(k) + prg_ihm(k)
  1869. ratio = MIN( ABS(prr_rcg(k)), ABS(prg_rcg(k)) )
  1870. prr_rcg(k) = ratio * SIGN(1.0, SNGL(prr_rcg(k)))
  1871. prg_rcg(k) = -prr_rcg(k)
  1872. if (temp(k).gt.T_0) then
  1873. ratio = MIN( ABS(prr_rcs(k)), ABS(prs_rcs(k)) )
  1874. prr_rcs(k) = ratio * SIGN(1.0, SNGL(prr_rcs(k)))
  1875. prs_rcs(k) = -prr_rcs(k)
  1876. endif
  1877. enddo
  1878. !+---+-----------------------------------------------------------------+
  1879. !..Calculate tendencies of all species but constrain the number of ice
  1880. !.. to reasonable values.
  1881. !+---+-----------------------------------------------------------------+
  1882. do k = kts, kte
  1883. orho = 1./rho(k)
  1884. lfus2 = lsub - lvap(k)
  1885. !..Water vapor tendency
  1886. qvten(k) = qvten(k) + (-pri_inu(k) - pri_ide(k) &
  1887. - prs_ide(k) - prs_sde(k) - prg_gde(k)) &
  1888. * orho
  1889. !..Cloud water tendency
  1890. qcten(k) = qcten(k) + (-prr_wau(k) - pri_wfz(k) &
  1891. - prr_rcw(k) - prs_scw(k) - prg_scw(k) &
  1892. - prg_gcw(k)) &
  1893. * orho
  1894. !..Cloud ice mixing ratio tendency
  1895. qiten(k) = qiten(k) + (pri_inu(k) + pri_ihm(k) &
  1896. + pri_wfz(k) + pri_rfz(k) + pri_ide(k) &
  1897. - prs_iau(k) - prs_sci(k) - pri_rci(k)) &
  1898. * orho
  1899. !..Cloud ice number tendency.
  1900. niten(k) = niten(k) + (pni_inu(k) + pni_ihm(k) &
  1901. + pni_wfz(k) + pni_rfz(k) + pni_ide(k) &
  1902. - pni_iau(k) - pni_sci(k) - pni_rci(k)) &
  1903. * orho
  1904. !..Cloud ice mass/number balance; keep mass-wt mean size between
  1905. !.. 20 and 300 microns. Also no more than 250 xtals per liter.
  1906. xri=MAX(R1,(qi1d(k) + qiten(k)*dtsave)*rho(k))
  1907. xni=MAX(R2,(ni1d(k) + niten(k)*dtsave)*rho(k))
  1908. if (xri.gt. R1) then
  1909. lami = (am_i*cig(2)*oig1*xni/xri)**obmi
  1910. ilami = 1./lami
  1911. xDi = (bm_i + mu_i + 1.) * ilami
  1912. if (xDi.lt. 20.E-6) then
  1913. lami = cie(2)/20.E-6
  1914. xni = MIN(250.D3, cig(1)*oig2*xri/am_i*lami**bm_i)
  1915. niten(k) = (xni-ni1d(k)*rho(k))*odts*orho
  1916. elseif (xDi.gt. 300.E-6) then
  1917. lami = cie(2)/300.E-6
  1918. xni = cig(1)*oig2*xri/am_i*lami**bm_i
  1919. niten(k) = (xni-ni1d(k)*rho(k))*odts*orho
  1920. endif
  1921. else
  1922. niten(k) = -ni1d(k)*odts
  1923. endif
  1924. xni=MAX(0.,(ni1d(k) + niten(k)*dtsave)*rho(k))
  1925. if (xni.gt.250.E3) &
  1926. niten(k) = (250.E3-ni1d(k)*rho(k))*odts*orho
  1927. !..Rain tendency
  1928. qrten(k) = qrten(k) + (prr_wau(k) + prr_rcw(k) &
  1929. + prr_sml(k) + prr_gml(k) + prr_rcs(k) &
  1930. + prr_rcg(k) - prg_rfz(k) &
  1931. - pri_rfz(k) - prr_rci(k)) &
  1932. * orho
  1933. !..Rain number tendency
  1934. nrten(k) = nrten(k) + (pnr_wau(k) + pnr_sml(k) + pnr_gml(k) &
  1935. - (pnr_rfz(k) + pnr_rcr(k) + pnr_rcg(k) &
  1936. + pnr_rcs(k) + pnr_rci(k)) ) &
  1937. * orho
  1938. !..Rain mass/number balance; keep median volume diameter between
  1939. !.. 37 microns (D0r*0.75) and 2.5 mm.
  1940. xrr=MAX(R1,(qr1d(k) + qrten(k)*dtsave)*rho(k))
  1941. xnr=MAX(R2,(nr1d(k) + nrten(k)*dtsave)*rho(k))
  1942. if (xrr.gt. R1) then
  1943. lamr = (am_r*crg(3)*org2*xnr/xrr)**obmr
  1944. mvd_r(k) = (3.0 + mu_r + 0.672) / lamr
  1945. if (mvd_r(k) .gt. 2.5E-3) then
  1946. mvd_r(k) = 2.5E-3
  1947. lamr = (3.0 + mu_r + 0.672) / mvd_r(k)
  1948. xnr = crg(2)*org3*xrr*lamr**bm_r / am_r
  1949. nrten(k) = (xnr-nr1d(k)*rho(k))*odts*orho
  1950. elseif (mvd_r(k) .lt. D0r*0.75) then
  1951. mvd_r(k) = D0r*0.75
  1952. lamr = (3.0 + mu_r + 0.672) / mvd_r(k)
  1953. xnr = crg(2)*org3*xrr*lamr**bm_r / am_r
  1954. nrten(k) = (xnr-nr1d(k)*rho(k))*odts*orho
  1955. endif
  1956. else
  1957. qrten(k) = -qr1d(k)*odts
  1958. nrten(k) = -nr1d(k)*odts
  1959. endif
  1960. !..Snow tendency
  1961. qsten(k) = qsten(k) + (prs_iau(k) + prs_sde(k) &
  1962. + prs_sci(k) + prs_scw(k) + prs_rcs(k) &
  1963. + prs_ide(k) - prs_ihm(k) - prr_sml(k)) &
  1964. * orho
  1965. !..Graupel tendency
  1966. qgten(k) = qgten(k) + (prg_scw(k) + prg_rfz(k) &
  1967. + prg_gde(k) + prg_rcg(k) + prg_gcw(k) &
  1968. + prg_rci(k) + prg_rcs(k) - prg_ihm(k) &
  1969. - prr_gml(k)) &
  1970. * orho
  1971. !..Temperature tendency
  1972. if (temp(k).lt.T_0) then
  1973. tten(k) = tten(k) &
  1974. + ( lsub*ocp(k)*(pri_inu(k) + pri_ide(k) &
  1975. + prs_ide(k) + prs_sde(k) &
  1976. + prg_gde(k)) &
  1977. + lfus2*ocp(k)*(pri_wfz(k) + pri_rfz(k) &
  1978. + prg_rfz(k) + prs_scw(k) &
  1979. + prg_scw(k) + prg_gcw(k) &
  1980. + prg_rcs(k) + prs_rcs(k) &
  1981. + prr_rci(k) + prg_rcg(k)) &
  1982. )*orho * (1-IFDRY)
  1983. else
  1984. tten(k) = tten(k) &
  1985. + ( lfus*ocp(k)*(-prr_sml(k) - prr_gml(k) &
  1986. - prr_rcg(k) - prr_rcs(k)) &
  1987. + lsub*ocp(k)*(prs_sde(k) + prg_gde(k)) &
  1988. )*orho * (1-IFDRY)
  1989. endif
  1990. enddo
  1991. !+---+-----------------------------------------------------------------+
  1992. !..Update variables for TAU+1 before condensation & sedimention.
  1993. !+---+-----------------------------------------------------------------+
  1994. do k = kts, kte
  1995. temp(k) = t1d(k) + DT*tten(k)
  1996. otemp = 1./temp(k)
  1997. tempc = temp(k) - 273.15
  1998. qv(k) = MAX(1.E-10, qv1d(k) + DT*qvten(k))
  1999. rho(k) = 0.622*pres(k)/(R*temp(k)*(qv(k)+0.622))
  2000. rhof(k) = SQRT(RHO_NOT/rho(k))
  2001. rhof2(k) = SQRT(rhof(k))
  2002. qvs(k) = rslf(pres(k), temp(k))
  2003. ssatw(k) = qv(k)/qvs(k) - 1.
  2004. if (abs(ssatw(k)).lt. eps) ssatw(k) = 0.0
  2005. diffu(k) = 2.11E-5*(temp(k)/273.15)**1.94 * (101325./pres(k))
  2006. if (tempc .ge. 0.0) then
  2007. visco(k) = (1.718+0.0049*tempc)*1.0E-5
  2008. else
  2009. visco(k) = (1.718+0.0049*tempc-1.2E-5*tempc*tempc)*1.0E-5
  2010. endif
  2011. vsc2(k) = SQRT(rho(k)/visco(k))
  2012. lvap(k) = lvap0 + (2106.0 - 4218.0)*tempc
  2013. tcond(k) = (5.69 + 0.0168*tempc)*1.0E-5 * 418.936
  2014. ocp(k) = 1./(Cp*(1.+0.887*qv(k)))
  2015. lvt2(k)=lvap(k)*lvap(k)*ocp(k)*oRv*otemp*otemp
  2016. if ((qc1d(k) + qcten(k)*DT) .gt. R1) then
  2017. rc(k) = (qc1d(k) + qcten(k)*DT)*rho(k)
  2018. L_qc(k) = .true.
  2019. else
  2020. rc(k) = R1
  2021. L_qc(k) = .false.
  2022. endif
  2023. if ((qi1d(k) + qiten(k)*DT) .gt. R1) then
  2024. ri(k) = (qi1d(k) + qiten(k)*DT)*rho(k)
  2025. ni(k) = MAX(R2, (ni1d(k) + niten(k)*DT)*rho(k))
  2026. L_qi(k) = .true.
  2027. else
  2028. ri(k) = R1
  2029. ni(k) = R2
  2030. L_qi(k) = .false.
  2031. endif
  2032. if ((qr1d(k) + qrten(k)*DT) .gt. R1) then
  2033. rr(k) = (qr1d(k) + qrten(k)*DT)*rho(k)
  2034. nr(k) = MAX(R2, (nr1d(k) + nrten(k)*DT)*rho(k))
  2035. L_qr(k) = .true.
  2036. else
  2037. rr(k) = R1
  2038. nr(k) = R2
  2039. L_qr(k) = .false.
  2040. endif
  2041. if ((qs1d(k) + qsten(k)*DT) .gt. R1) then
  2042. rs(k) = (qs1d(k) + qsten(k)*DT)*rho(k)
  2043. L_qs(k) = .true.
  2044. else
  2045. rs(k) = R1
  2046. L_qs(k) = .false.
  2047. endif
  2048. if ((qg1d(k) + qgten(k)*DT) .gt. R1) then
  2049. rg(k) = (qg1d(k) + qgten(k)*DT)*rho(k)
  2050. L_qg(k) = .true.
  2051. else
  2052. rg(k) = R1
  2053. L_qg(k) = .false.
  2054. endif
  2055. enddo
  2056. !+---+-----------------------------------------------------------------+
  2057. !..With tendency-updated mixing ratios, recalculate snow moments and
  2058. !.. intercepts/slopes of graupel and rain.
  2059. !+---+-----------------------------------------------------------------+
  2060. if (.not. iiwarm) then
  2061. do k = kts, kte
  2062. if (.not. L_qs(k)) CYCLE
  2063. tc0 = MIN(-0.1, temp(k)-273.15)
  2064. smob(k) = rs(k)*oams
  2065. !..All other moments based on reference, 2nd moment. If bm_s.ne.2,
  2066. !.. then we must compute actual 2nd moment and use as reference.
  2067. if (bm_s.gt.(2.0-1.e-3) .and. bm_s.lt.(2.0+1.e-3)) then
  2068. smo2(k) = smob(k)
  2069. else
  2070. loga_ = sa(1) + sa(2)*tc0 + sa(3)*bm_s &
  2071. + sa(4)*tc0*bm_s + sa(5)*tc0*tc0 &
  2072. + sa(6)*bm_s*bm_s + sa(7)*tc0*tc0*bm_s &
  2073. + sa(8)*tc0*bm_s*bm_s + sa(9)*tc0*tc0*tc0 &
  2074. + sa(10)*bm_s*bm_s*bm_s
  2075. a_ = 10.0**loga_
  2076. b_ = sb(1) + sb(2)*tc0 + sb(3)*bm_s &
  2077. + sb(4)*tc0*bm_s + sb(5)*tc0*tc0 &
  2078. + sb(6)*bm_s*bm_s + sb(7)*tc0*tc0*bm_s &
  2079. + sb(8)*tc0*bm_s*bm_s + sb(9)*tc0*tc0*tc0 &
  2080. + sb(10)*bm_s*bm_s*bm_s
  2081. smo2(k) = (smob(k)/a_)**(1./b_)
  2082. endif
  2083. !..Calculate bm_s+1 (th) moment. Useful for diameter calcs.
  2084. loga_ = sa(1) + sa(2)*tc0 + sa(3)*cse(1) &
  2085. + sa(4)*tc0*cse(1) + sa(5)*tc0*tc0 &
  2086. + sa(6)*cse(1)*cse(1) + sa(7)*tc0*tc0*cse(1) &
  2087. + sa(8)*tc0*cse(1)*cse(1) + sa(9)*tc0*tc0*tc0 &
  2088. + sa(10)*cse(1)*cse(1)*cse(1)
  2089. a_ = 10.0**loga_
  2090. b_ = sb(1)+ sb(2)*tc0 + sb(3)*cse(1) + sb(4)*tc0*cse(1) &
  2091. + sb(5)*tc0*tc0 + sb(6)*cse(1)*cse(1) &
  2092. + sb(7)*tc0*tc0*cse(1) + sb(8)*tc0*cse(1)*cse(1) &
  2093. + sb(9)*tc0*tc0*tc0 + sb(10)*cse(1)*cse(1)*cse(1)
  2094. smoc(k) = a_ * smo2(k)**b_
  2095. !..Calculate bm_s+bv_s (th) moment. Useful for sedimentation.
  2096. loga_ = sa(1) + sa(2)*tc0 + sa(3)*cse(14) &
  2097. + sa(4)*tc0*cse(14) + sa(5)*tc0*tc0 &
  2098. + sa(6)*cse(14)*cse(14) + sa(7)*tc0*tc0*cse(14) &
  2099. + sa(8)*tc0*cse(14)*cse(14) + sa(9)*tc0*tc0*tc0 &
  2100. + sa(10)*cse(14)*cse(14)*cse(14)
  2101. a_ = 10.0**loga_
  2102. b_ = sb(1)+ sb(2)*tc0 + sb(3)*cse(14) + sb(4)*tc0*cse(14) &
  2103. + sb(5)*tc0*tc0 + sb(6)*cse(14)*cse(14) &
  2104. + sb(7)*tc0*tc0*cse(14) + sb(8)*tc0*cse(14)*cse(14) &
  2105. + sb(9)*tc0*tc0*tc0 + sb(10)*cse(14)*cse(14)*cse(14)
  2106. smod(k) = a_ * smo2(k)**b_
  2107. enddo
  2108. !+---+-----------------------------------------------------------------+
  2109. !..Calculate y-intercept, slope values for graupel.
  2110. !+---+-----------------------------------------------------------------+
  2111. N0_min = gonv_max
  2112. do k = kte, kts, -1
  2113. if (temp(k).lt.270.65 .and. L_qr(k) .and. mvd_r(k).gt.100.E-6) then
  2114. xslw1 = 4.01 + alog10(mvd_r(k))
  2115. else
  2116. xslw1 = 0.01
  2117. endif
  2118. ygra1 = 4.31 + alog10(max(5.E-5, rg(k)))
  2119. zans1 = 3.0 + (100./(300.*xslw1*ygra1/(10./xslw1+1.+0.25*ygra1)+30.+5.*ygra1))
  2120. N0_exp = 10.**(zans1)
  2121. N0_exp = MAX(DBLE(gonv_min), MIN(N0_exp, DBLE(gonv_max)))
  2122. N0_min = MIN(N0_exp, N0_min)
  2123. N0_exp = N0_min
  2124. lam_exp = (N0_exp*am_g*cgg(1)/rg(k))**oge1
  2125. lamg = lam_exp * (cgg(3)*ogg2*ogg1)**obmg
  2126. ilamg(k) = 1./lamg
  2127. N0_g(k) = N0_exp/(cgg(2)*lam_exp) * lamg**cge(2)
  2128. enddo
  2129. endif
  2130. !+---+-----------------------------------------------------------------+
  2131. !..Calculate y-intercept, slope values for rain.
  2132. !+---+-----------------------------------------------------------------+
  2133. do k = kte, kts, -1
  2134. lamr = (am_r*crg(3)*org2*nr(k)/rr(k))**obmr
  2135. ilamr(k) = 1./lamr
  2136. mvd_r(k) = (3.0 + mu_r + 0.672) / lamr
  2137. N0_r(k) = nr(k)*org2*lamr**cre(2)
  2138. enddo
  2139. !+---+-----------------------------------------------------------------+
  2140. !..Cloud water condensation and evaporation. Newly formulated using
  2141. !.. Newton-Raphson iterations (3 should suffice) as provided by B. Hall.
  2142. !+---+-----------------------------------------------------------------+
  2143. do k = kts, kte
  2144. if ( (ssatw(k).gt. eps) .or. (ssatw(k).lt. -eps .and. &
  2145. L_qc(k)) ) then
  2146. clap = (qv(k)-qvs(k))/(1. + lvt2(k)*qvs(k))
  2147. do n = 1, 3
  2148. fcd = qvs(k)* EXP(lvt2(k)*clap) - qv(k) + clap
  2149. dfcd = qvs(k)*lvt2(k)* EXP(lvt2(k)*clap) + 1.
  2150. clap = clap - fcd/dfcd
  2151. enddo
  2152. xrc = rc(k) + clap
  2153. if (xrc.gt. 0.0) then
  2154. prw_vcd(k) = clap*odt
  2155. else
  2156. prw_vcd(k) = -rc(k)/rho(k)*odts
  2157. endif
  2158. qcten(k) = qcten(k) + prw_vcd(k)
  2159. qvten(k) = qvten(k) - prw_vcd(k)
  2160. tten(k) = tten(k) + lvap(k)*ocp(k)*prw_vcd(k)*(1-IFDRY)
  2161. rc(k) = MAX(R1, (qc1d(k) + DT*qcten(k))*rho(k))
  2162. qv(k) = MAX(1.E-10, qv1d(k) + DT*qvten(k))
  2163. temp(k) = t1d(k) + DT*tten(k)
  2164. rho(k) = 0.622*pres(k)/(R*temp(k)*(qv(k)+0.622))
  2165. qvs(k) = rslf(pres(k), temp(k))
  2166. ssatw(k) = qv(k)/qvs(k) - 1.
  2167. endif
  2168. enddo
  2169. !+---+-----------------------------------------------------------------+
  2170. !.. If still subsaturated, allow rain to evaporate, following
  2171. !.. Srivastava & Coen (1992).
  2172. !+---+-----------------------------------------------------------------+
  2173. do k = kts, kte
  2174. if ( (ssatw(k).lt. -eps) .and. L_qr(k) &
  2175. .and. (.not.(prw_vcd(k).gt. 0.)) ) then
  2176. tempc = temp(k) - 273.15
  2177. otemp = 1./temp(k)
  2178. rhof(k) = SQRT(RHO_NOT/rho(k))
  2179. rhof2(k) = SQRT(rhof(k))
  2180. diffu(k) = 2.11E-5*(temp(k)/273.15)**1.94 * (101325./pres(k))
  2181. if (tempc .ge. 0.0) then
  2182. visco(k) = (1.718+0.0049*tempc)*1.0E-5
  2183. else
  2184. visco(k) = (1.718+0.0049*tempc-1.2E-5*tempc*tempc)*1.0E-5
  2185. endif
  2186. vsc2(k) = SQRT(rho(k)/visco(k))
  2187. lvap(k) = lvap0 + (2106.0 - 4218.0)*tempc
  2188. tcond(k) = (5.69 + 0.0168*tempc)*1.0E-5 * 418.936
  2189. ocp(k) = 1./(Cp*(1.+0.887*qv(k)))
  2190. rvs = rho(k)*qvs(k)
  2191. rvs_p = rvs*otemp*(lvap(k)*otemp*oRv - 1.)
  2192. rvs_pp = rvs * ( otemp*(lvap(k)*otemp*oRv - 1.) &
  2193. *otemp*(lvap(k)*otemp*oRv - 1.) &
  2194. + (-2.*lvap(k)*otemp*otemp*otemp*oRv) &
  2195. + otemp*otemp)
  2196. gamsc = lvap(k)*diffu(k)/tcond(k) * rvs_p
  2197. alphsc = 0.5*(gamsc/(1.+gamsc))*(gamsc/(1.+gamsc)) &
  2198. * rvs_pp/rvs_p * rvs/rvs_p
  2199. alphsc = MAX(1.E-9, alphsc)
  2200. xsat = MIN(-1.E-9, ssatw(k))
  2201. t1_evap = 2.*PI*( 1.0 - alphsc*xsat &
  2202. + 2.*alphsc*alphsc*xsat*xsat &
  2203. - 5.*alphsc*alphsc*alphsc*xsat*xsat*xsat ) &
  2204. / (1.+gamsc)
  2205. lamr = 1./ilamr(k)
  2206. prv_rev(k) = t1_evap*diffu(k)*(-ssatw(k))*N0_r(k)*rvs &
  2207. * (t1_qr_ev*ilamr(k)**cre(10) &
  2208. + t2_qr_ev*vsc2(k)*rhof2(k)*((lamr+0.5*fv_r)**(-cre(11))))
  2209. rate_max = MIN((rr(k)/rho(k)*odts), (qvs(k)-qv(k))*odts)
  2210. prv_rev(k) = MIN(DBLE(rate_max), prv_rev(k)/rho(k))
  2211. pnr_rev(k) = MIN(DBLE(nr(k)*0.99/rho(k)*odts), & ! RAIN2M
  2212. prv_rev(k) * nr(k)/rr(k))
  2213. qrten(k) = qrten(k) - prv_rev(k)
  2214. qvten(k) = qvten(k) + prv_rev(k)
  2215. nrten(k) = nrten(k) - pnr_rev(k)
  2216. tten(k) = tten(k) - lvap(k)*ocp(k)*prv_rev(k)*(1-IFDRY)
  2217. rr(k) = MAX(R1, (qr1d(k) + DT*qrten(k))*rho(k))
  2218. qv(k) = MAX(1.E-10, qv1d(k) + DT*qvten(k))
  2219. nr(k) = MAX(R2, (nr1d(k) + DT*nrten(k))*rho(k))
  2220. temp(k) = t1d(k) + DT*tten(k)
  2221. rho(k) = 0.622*pres(k)/(R*temp(k)*(qv(k)+0.622))
  2222. endif
  2223. enddo
  2224. #ifdef WRF_CHEM
  2225. do k = kts, kte
  2226. evapprod(k) = prv_rev(k) - (min(zeroD0,prs_sde(k)) + &
  2227. min(zeroD0,prg_gde(k)))
  2228. rainprod(k) = prr_wau(k) + prr_rcw(k) + prs_scw(k) + &
  2229. prg_scw(k) + prs_iau(k) + &
  2230. prg_gcw(k) + prs_sci(k) + &
  2231. pri_rci(k)
  2232. enddo
  2233. #endif
  2234. !+---+-----------------------------------------------------------------+
  2235. !..Find max terminal fallspeed (distribution mass-weighted mean
  2236. !.. velocity) and use it to determine if we need to split the timestep
  2237. !.. (var nstep>1). Either way, only bother to do sedimentation below
  2238. !.. 1st level that contains any sedimenting particles (k=ksed1 on down).
  2239. !.. New in v3.0+ is computing separate for rain, ice, snow, and
  2240. !.. graupel species thus making code faster with credit to J. Schmidt.
  2241. !+---+-----------------------------------------------------------------+
  2242. nstep = 0
  2243. onstep(:) = 1.0
  2244. ksed1(:) = 1
  2245. do k = kte+1, kts, -1
  2246. vtrk(k) = 0.
  2247. vtnrk(k) = 0.
  2248. vtik(k) = 0.
  2249. vtnik(k) = 0.
  2250. vtsk(k) = 0.
  2251. vtgk(k) = 0.
  2252. enddo
  2253. do k = kte, kts, -1
  2254. vtr = 0.
  2255. rhof(k) = SQRT(RHO_NOT/rho(k))
  2256. if (rr(k).gt. R1) then
  2257. lamr = (am_r*crg(3)*org2*nr(k)/rr(k))**obmr
  2258. vtr = rhof(k)*av_r*crg(6)*org3 * lamr**cre(3) &
  2259. *((lamr+fv_r)**(-cre(6)))
  2260. vtrk(k) = vtr
  2261. ! First below is technically correct:
  2262. ! vtr = rhof(k)*av_r*crg(5)*org2 * lamr**cre(2) &
  2263. ! *((lamr+fv_r)**(-cre(5)))
  2264. ! Test: make number fall faster (but still slower than mass)
  2265. ! Goal: less prominent size sorting
  2266. vtr = rhof(k)*av_r*crg(7)/crg(12) * lamr**cre(12) &
  2267. *((lamr+fv_r)**(-cre(7)))
  2268. vtnrk(k) = vtr
  2269. else
  2270. vtrk(k) = vtrk(k+1)
  2271. vtnrk(k) = vtnrk(k+1)
  2272. endif
  2273. if (MAX(vtrk(k),vtnrk(k)) .gt. 1.E-3) then
  2274. ksed1(1) = MAX(ksed1(1), k)
  2275. delta_tp = dzq(k)/(MAX(vtrk(k),vtnrk(k)))
  2276. nstep = MAX(nstep, INT(DT/delta_tp + 1.))
  2277. endif
  2278. enddo
  2279. if (ksed1(1) .eq. kte) ksed1(1) = kte-1
  2280. if (nstep .gt. 0) onstep(1) = 1./REAL(nstep)
  2281. !+---+-----------------------------------------------------------------+
  2282. if (.not. iiwarm) then
  2283. nstep = 0
  2284. do k = kte, kts, -1
  2285. vti = 0.
  2286. if (ri(k).gt. R1) then
  2287. lami = (am_i*cig(2)*oig1*ni(k)/ri(k))**obmi
  2288. ilami = 1./lami
  2289. vti = rhof(k)*av_i*cig(3)*oig2 * ilami**bv_i
  2290. vtik(k) = vti
  2291. ! First below is technically correct:
  2292. ! vti = rhof(k)*av_i*cig(4)*oig1 * ilami**bv_i
  2293. ! Goal: less prominent size sorting
  2294. vti = rhof(k)*av_i*cig(6)/cig(7) * ilami**bv_i
  2295. vtnik(k) = vti
  2296. else
  2297. vtik(k) = vtik(k+1)
  2298. vtnik(k) = vtnik(k+1)
  2299. endif
  2300. if (vtik(k) .gt. 1.E-3) then
  2301. ksed1(2) = MAX(ksed1(2), k)
  2302. delta_tp = dzq(k)/vtik(k)
  2303. nstep = MAX(nstep, INT(DT/delta_tp + 1.))
  2304. endif
  2305. enddo
  2306. if (ksed1(2) .eq. kte) ksed1(2) = kte-1
  2307. if (nstep .gt. 0) onstep(2) = 1./REAL(nstep)
  2308. !+---+-----------------------------------------------------------------+
  2309. nstep = 0
  2310. do k = kte, kts, -1
  2311. vts = 0.
  2312. if (rs(k).gt. R2) then
  2313. xDs = smoc(k) / smob(k)
  2314. Mrat = 1./xDs
  2315. ils1 = 1./(Mrat*Lam0 + fv_s)
  2316. ils2 = 1./(Mrat*Lam1 + fv_s)
  2317. t1_vts = Kap0*csg(4)*ils1**cse(4)
  2318. t2_vts = Kap1*Mrat**mu_s*csg(10)*ils2**cse(10)
  2319. ils1 = 1./(Mrat*Lam0)
  2320. ils2 = 1./(Mrat*Lam1)
  2321. t3_vts = Kap0*csg(1)*ils1**cse(1)
  2322. t4_vts = Kap1*Mrat**mu_s*csg(7)*ils2**cse(7)
  2323. vts = rhof(k)*av_s * (t1_vts+t2_vts)/(t3_vts+t4_vts)
  2324. if (temp(k).gt. T_0) then
  2325. vtsk(k) = MAX(vts*vts_boost(k), vtrk(k))
  2326. else
  2327. vtsk(k) = vts*vts_boost(k)
  2328. endif
  2329. else
  2330. vtsk(k) = vtsk(k+1)
  2331. endif
  2332. if (vtsk(k) .gt. 1.E-3) then
  2333. ksed1(3) = MAX(ksed1(3), k)
  2334. delta_tp = dzq(k)/vtsk(k)
  2335. nstep = MAX(nstep, INT(DT/delta_tp + 1.))
  2336. endif
  2337. enddo
  2338. if (ksed1(3) .eq. kte) ksed1(3) = kte-1
  2339. if (nstep .gt. 0) onstep(3) = 1./REAL(nstep)
  2340. !+---+-----------------------------------------------------------------+
  2341. nstep = 0
  2342. do k = kte, kts, -1
  2343. vtg = 0.
  2344. if (rg(k).gt. R2) then
  2345. vtg = rhof(k)*av_g*cgg(6)*ogg3 * ilamg(k)**bv_g
  2346. if (temp(k).gt. T_0) then
  2347. vtgk(k) = MAX(vtg, vtrk(k))
  2348. else
  2349. vtgk(k) = vtg
  2350. endif
  2351. else
  2352. vtgk(k) = vtgk(k+1)
  2353. endif
  2354. if (vtgk(k) .gt. 1.E-3) then
  2355. ksed1(4) = MAX(ksed1(4), k)
  2356. delta_tp = dzq(k)/vtgk(k)
  2357. nstep = MAX(nstep, INT(DT/delta_tp + 1.))
  2358. endif
  2359. enddo
  2360. if (ksed1(4) .eq. kte) ksed1(4) = kte-1
  2361. if (nstep .gt. 0) onstep(4) = 1./REAL(nstep)
  2362. endif
  2363. !+---+-----------------------------------------------------------------+
  2364. !..Sedimentation of mixing ratio is the integral of v(D)*m(D)*N(D)*dD,
  2365. !.. whereas neglect m(D) term for number concentration. Therefore,
  2366. !.. cloud ice has proper differential sedimentation.
  2367. !.. New in v3.0+ is computing separate for rain, ice, snow, and
  2368. !.. graupel species thus making code faster with credit to J. Schmidt.
  2369. !+---+-----------------------------------------------------------------+
  2370. nstep = NINT(1./onstep(1))
  2371. do n = 1, nstep
  2372. do k = kte, kts, -1
  2373. sed_r(k) = vtrk(k)*rr(k)
  2374. sed_n(k) = vtnrk(k)*nr(k)
  2375. enddo
  2376. k = kte
  2377. odzq = 1./dzq(k)
  2378. orho = 1./rho(k)
  2379. qrten(k) = qrten(k) - sed_r(k)*odzq*onstep(1)*orho
  2380. nrten(k) = nrten(k) - sed_n(k)*odzq*onstep(1)*orho
  2381. rr(k) = MAX(R1, rr(k) - sed_r(k)*odzq*DT*onstep(1))
  2382. nr(k) = MAX(R2, nr(k) - sed_n(k)*odzq*DT*onstep(1))
  2383. do k = ksed1(1), kts, -1
  2384. odzq = 1./dzq(k)
  2385. orho = 1./rho(k)
  2386. qrten(k) = qrten(k) + (sed_r(k+1)-sed_r(k)) &
  2387. *odzq*onstep(1)*orho
  2388. nrten(k) = nrten(k) + (sed_n(k+1)-sed_n(k)) &
  2389. *odzq*onstep(1)*orho
  2390. rr(k) = MAX(R1, rr(k) + (sed_r(k+1)-sed_r(k)) &
  2391. *odzq*DT*onstep(1))
  2392. nr(k) = MAX(R2, nr(k) + (sed_n(k+1)-sed_n(k)) &
  2393. *odzq*DT*onstep(1))
  2394. enddo
  2395. if (rr(kts).gt.R1*10.) &
  2396. pptrain = pptrain + sed_r(kts)*DT*onstep(1)
  2397. enddo
  2398. !+---+-----------------------------------------------------------------+
  2399. nstep = NINT(1./onstep(2))
  2400. do n = 1, nstep
  2401. do k = kte, kts, -1
  2402. sed_i(k) = vtik(k)*ri(k)
  2403. sed_n(k) = vtnik(k)*ni(k)
  2404. enddo
  2405. k = kte
  2406. odzq = 1./dzq(k)
  2407. orho = 1./rho(k)
  2408. qiten(k) = qiten(k) - sed_i(k)*odzq*onstep(2)*orho
  2409. niten(k) = niten(k) - sed_n(k)*odzq*onstep(2)*orho
  2410. ri(k) = MAX(R1, ri(k) - sed_i(k)*odzq*DT*onstep(2))
  2411. ni(k) = MAX(R2, ni(k) - sed_n(k)*odzq*DT*onstep(2))
  2412. do k = ksed1(2), kts, -1
  2413. odzq = 1./dzq(k)
  2414. orho = 1./rho(k)
  2415. qiten(k) = qiten(k) + (sed_i(k+1)-sed_i(k)) &
  2416. *odzq*onstep(2)*orho
  2417. niten(k) = niten(k) + (sed_n(k+1)-sed_n(k)) &
  2418. *odzq*onstep(2)*orho
  2419. ri(k) = MAX(R1, ri(k) + (sed_i(k+1)-sed_i(k)) &
  2420. *odzq*DT*onstep(2))
  2421. ni(k) = MAX(R2, ni(k) + (sed_n(k+1)-sed_n(k)) &
  2422. *odzq*DT*onstep(2))
  2423. enddo
  2424. if (ri(kts).gt.R1*10.) &
  2425. pptice = pptice + sed_i(kts)*DT*onstep(2)
  2426. enddo
  2427. !+---+-----------------------------------------------------------------+
  2428. nstep = NINT(1./onstep(3))
  2429. do n = 1, nstep
  2430. do k = kte, kts, -1
  2431. sed_s(k) = vtsk(k)*rs(k)
  2432. enddo
  2433. k = kte
  2434. odzq = 1./dzq(k)
  2435. orho = 1./rho(k)
  2436. qsten(k) = qsten(k) - sed_s(k)*odzq*onstep(3)*orho
  2437. rs(k) = MAX(R1, rs(k) - sed_s(k)*odzq*DT*onstep(3))
  2438. do k = ksed1(3), kts, -1
  2439. odzq = 1./dzq(k)
  2440. orho = 1./rho(k)
  2441. qsten(k) = qsten(k) + (sed_s(k+1)-sed_s(k)) &
  2442. *odzq*onstep(3)*orho
  2443. rs(k) = MAX(R1, rs(k) + (sed_s(k+1)-sed_s(k)) &
  2444. *odzq*DT*onstep(3))
  2445. enddo
  2446. if (rs(kts).gt.R1*10.) &
  2447. pptsnow = pptsnow + sed_s(kts)*DT*onstep(3)
  2448. enddo
  2449. !+---+-----------------------------------------------------------------+
  2450. nstep = NINT(1./onstep(4))
  2451. do n = 1, nstep
  2452. do k = kte, kts, -1
  2453. sed_g(k) = vtgk(k)*rg(k)
  2454. enddo
  2455. k = kte
  2456. odzq = 1./dzq(k)
  2457. orho = 1./rho(k)
  2458. qgten(k) = qgten(k) - sed_g(k)*odzq*onstep(4)*orho
  2459. rg(k) = MAX(R1, rg(k) - sed_g(k)*odzq*DT*onstep(4))
  2460. do k = ksed1(4), kts, -1
  2461. odzq = 1./dzq(k)
  2462. orho = 1./rho(k)
  2463. qgten(k) = qgten(k) + (sed_g(k+1)-sed_g(k)) &
  2464. *odzq*onstep(4)*orho
  2465. rg(k) = MAX(R1, rg(k) + (sed_g(k+1)-sed_g(k)) &
  2466. *odzq*DT*onstep(4))
  2467. enddo
  2468. if (rg(kts).gt.R1*10.) &
  2469. pptgraul = pptgraul + sed_g(kts)*DT*onstep(4)
  2470. enddo
  2471. !+---+-----------------------------------------------------------------+
  2472. !.. Instantly melt any cloud ice into cloud water if above 0C and
  2473. !.. instantly freeze any cloud water found below HGFR.
  2474. !+---+-----------------------------------------------------------------+
  2475. if (.not. iiwarm) then
  2476. do k = kts, kte
  2477. xri = MAX(0.0, qi1d(k) + qiten(k)*DT)
  2478. if ( (temp(k).gt. T_0) .and. (xri.gt. 0.0) ) then
  2479. qcten(k) = qcten(k) + xri*odt
  2480. qiten(k) = qiten(k) - xri*odt
  2481. niten(k) = -ni1d(k)*odt
  2482. tten(k) = tten(k) - lfus*ocp(k)*xri*odt*(1-IFDRY)
  2483. endif
  2484. xrc = MAX(0.0, qc1d(k) + qcten(k)*DT)
  2485. if ( (temp(k).lt. HGFR) .and. (xrc.gt. 0.0) ) then
  2486. lfus2 = lsub - lvap(k)
  2487. qiten(k) = qiten(k) + xrc*odt
  2488. niten(k) = niten(k) + xrc/xm0i * odt
  2489. qcten(k) = qcten(k) - xrc*odt
  2490. tten(k) = tten(k) + lfus2*ocp(k)*xrc*odt*(1-IFDRY)
  2491. endif
  2492. enddo
  2493. endif
  2494. !+---+-----------------------------------------------------------------+
  2495. !.. All tendencies computed, apply and pass back final values to parent.
  2496. !+---+-----------------------------------------------------------------+
  2497. do k = kts, kte
  2498. t1d(k) = t1d(k) + tten(k)*DT
  2499. qv1d(k) = MAX(1.E-10, qv1d(k) + qvten(k)*DT)
  2500. qc1d(k) = qc1d(k) + qcten(k)*DT
  2501. if (qc1d(k) .le. R1) qc1d(k) = 0.0
  2502. qi1d(k) = qi1d(k) + qiten(k)*DT
  2503. ni1d(k) = MAX(R2/rho(k), ni1d(k) + niten(k)*DT)
  2504. if (qi1d(k) .le. R1) then
  2505. qi1d(k) = 0.0
  2506. ni1d(k) = 0.0
  2507. else
  2508. lami = (am_i*cig(2)*oig1*ni1d(k)/qi1d(k))**obmi
  2509. ilami = 1./lami
  2510. xDi = (bm_i + mu_i + 1.) * ilami
  2511. if (xDi.lt. 20.E-6) then
  2512. lami = cie(2)/20.E-6
  2513. elseif (xDi.gt. 300.E-6) then
  2514. lami = cie(2)/300.E-6
  2515. endif
  2516. ni1d(k) = MIN(cig(1)*oig2*qi1d(k)/am_i*lami**bm_i, &
  2517. 250.D3/rho(k))
  2518. endif
  2519. qr1d(k) = qr1d(k) + qrten(k)*DT
  2520. nr1d(k) = MAX(R2/rho(k), nr1d(k) + nrten(k)*DT)
  2521. if (qr1d(k) .le. R1) then
  2522. qr1d(k) = 0.0
  2523. nr1d(k) = 0.0
  2524. else
  2525. lamr = (am_r*crg(3)*org2*nr1d(k)/qr1d(k))**obmr
  2526. mvd_r(k) = (3.0 + mu_r + 0.672) / lamr
  2527. if (mvd_r(k) .gt. 2.5E-3) then
  2528. mvd_r(k) = 2.5E-3
  2529. elseif (mvd_r(k) .lt. D0r*0.75) then
  2530. mvd_r(k) = D0r*0.75
  2531. endif
  2532. lamr = (3.0 + mu_r + 0.672) / mvd_r(k)
  2533. nr1d(k) = crg(2)*org3*qr1d(k)*lamr**bm_r / am_r
  2534. endif
  2535. qs1d(k) = qs1d(k) + qsten(k)*DT
  2536. if (qs1d(k) .le. R1) qs1d(k) = 0.0
  2537. qg1d(k) = qg1d(k) + qgten(k)*DT
  2538. if (qg1d(k) .le. R1) qg1d(k) = 0.0
  2539. enddo
  2540. end subroutine mp_thompson
  2541. !+---+-----------------------------------------------------------------+
  2542. !ctrlL
  2543. !+---+-----------------------------------------------------------------+
  2544. !..Creation of the lookup tables and support functions found below here.
  2545. !+---+-----------------------------------------------------------------+
  2546. !..Rain collecting graupel (and inverse). Explicit CE integration.
  2547. !+---+-----------------------------------------------------------------+
  2548. subroutine qr_acr_qg
  2549. implicit none
  2550. !..Local variables
  2551. INTEGER:: i, j, k, m, n, n2
  2552. INTEGER:: km, km_s, km_e
  2553. DOUBLE PRECISION, DIMENSION(nbg):: vg, N_g
  2554. DOUBLE PRECISION, DIMENSION(nbr):: vr, N_r
  2555. DOUBLE PRECISION:: N0_r, N0_g, lam_exp, lamg, lamr
  2556. DOUBLE PRECISION:: massg, massr, dvg, dvr, t1, t2, z1, z2, y1, y2
  2557. !+---+
  2558. do n2 = 1, nbr
  2559. ! vr(n2) = av_r*Dr(n2)**bv_r * DEXP(-fv_r*Dr(n2))
  2560. vr(n2) = -0.1021 + 4.932E3*Dr(n2) - 0.9551E6*Dr(n2)*Dr(n2) &
  2561. + 0.07934E9*Dr(n2)*Dr(n2)*Dr(n2) &
  2562. - 0.002362E12*Dr(n2)*Dr(n2)*Dr(n2)*Dr(n2)
  2563. enddo
  2564. do n = 1, nbg
  2565. vg(n) = av_g*Dg(n)**bv_g
  2566. enddo
  2567. !..Note values returned from wrf_dm_decomp1d are zero-based, add 1 for
  2568. !.. fortran indices. J. Michalakes, 2009Oct30.
  2569. #if ( defined( DM_PARALLEL ) && ( ! defined( STUBMPI ) ) )
  2570. CALL wrf_dm_decomp1d ( ntb_r*ntb_r1, km_s, km_e )
  2571. #else
  2572. km_s = 0
  2573. km_e = ntb_r*ntb_r1 - 1
  2574. #endif
  2575. do km = km_s, km_e
  2576. m = km / ntb_r1 + 1
  2577. k = mod( km , ntb_r1 ) + 1
  2578. lam_exp = (N0r_exp(k)*am_r*crg(1)/r_r(m))**ore1
  2579. lamr = lam_exp * (crg(3)*org2*org1)**obmr
  2580. N0_r = N0r_exp(k)/(crg(2)*lam_exp) * lamr**cre(2)
  2581. do n2 = 1, nbr
  2582. N_r(n2) = N0_r*Dr(n2)**mu_r *DEXP(-lamr*Dr(n2))*dtr(n2)
  2583. enddo
  2584. do j = 1, ntb_g
  2585. do i = 1, ntb_g1
  2586. lam_exp = (N0g_exp(i)*am_g*cgg(1)/r_g(j))**oge1
  2587. lamg = lam_exp * (cgg(3)*ogg2*ogg1)**obmg
  2588. N0_g = N0g_exp(i)/(cgg(2)*lam_exp) * lamg**cge(2)
  2589. do n = 1, nbg
  2590. N_g(n) = N0_g*Dg(n)**mu_g * DEXP(-lamg*Dg(n))*dtg(n)
  2591. enddo
  2592. t1 = 0.0d0
  2593. t2 = 0.0d0
  2594. z1 = 0.0d0
  2595. z2 = 0.0d0
  2596. y1 = 0.0d0
  2597. y2 = 0.0d0
  2598. do n2 = 1, nbr
  2599. massr = am_r * Dr(n2)**bm_r
  2600. do n = 1, nbg
  2601. massg = am_g * Dg(n)**bm_g
  2602. dvg = 0.5d0*((vr(n2) - vg(n)) + DABS(vr(n2)-vg(n)))
  2603. dvr = 0.5d0*((vg(n) - vr(n2)) + DABS(vg(n)-vr(n2)))
  2604. t1 = t1+ PI*.25*Ef_rg*(Dg(n)+Dr(n2))*(Dg(n)+Dr(n2)) &
  2605. *dvg*massg * N_g(n)* N_r(n2)
  2606. z1 = z1+ PI*.25*Ef_rg*(Dg(n)+Dr(n2))*(Dg(n)+Dr(n2)) &
  2607. *dvg*massr * N_g(n)* N_r(n2)
  2608. y1 = y1+ PI*.25*Ef_rg*(Dg(n)+Dr(n2))*(Dg(n)+Dr(n2)) &
  2609. *dvg * N_g(n)* N_r(n2)
  2610. t2 = t2+ PI*.25*Ef_rg*(Dg(n)+Dr(n2))*(Dg(n)+Dr(n2)) &
  2611. *dvr*massr * N_g(n)* N_r(n2)
  2612. y2 = y2+ PI*.25*Ef_rg*(Dg(n)+Dr(n2))*(Dg(n)+Dr(n2)) &
  2613. *dvr * N_g(n)* N_r(n2)
  2614. z2 = z2+ PI*.25*Ef_rg*(Dg(n)+Dr(n2))*(Dg(n)+Dr(n2)) &
  2615. *dvr*massg * N_g(n)* N_r(n2)
  2616. enddo
  2617. 97 continue
  2618. enddo
  2619. tcg_racg(i,j,k,m) = t1
  2620. tmr_racg(i,j,k,m) = DMIN1(z1, r_r(m)*1.0d0)
  2621. tcr_gacr(i,j,k,m) = t2
  2622. tmg_gacr(i,j,k,m) = z2
  2623. tnr_racg(i,j,k,m) = y1
  2624. tnr_gacr(i,j,k,m) = y2
  2625. enddo
  2626. enddo
  2627. enddo
  2628. !..Note wrf_dm_gatherv expects zero-based km_s, km_e (J. Michalakes, 2009Oct30).
  2629. #if ( defined( DM_PARALLEL ) && ( ! defined( STUBMPI ) ) )
  2630. CALL wrf_dm_gatherv(tcg_racg, ntb_g*ntb_g1, km_s, km_e, R8SIZE)
  2631. CALL wrf_dm_gatherv(tmr_racg, ntb_g*ntb_g1, km_s, km_e, R8SIZE)
  2632. CALL wrf_dm_gatherv(tcr_gacr, ntb_g*ntb_g1, km_s, km_e, R8SIZE)
  2633. CALL wrf_dm_gatherv(tmg_gacr, ntb_g*ntb_g1, km_s, km_e, R8SIZE)
  2634. CALL wrf_dm_gatherv(tnr_racg, ntb_g*ntb_g1, km_s, km_e, R8SIZE)
  2635. CALL wrf_dm_gatherv(tnr_gacr, ntb_g*ntb_g1, km_s, km_e, R8SIZE)
  2636. #endif
  2637. end subroutine qr_acr_qg
  2638. !+---+-----------------------------------------------------------------+
  2639. !ctrlL
  2640. !+---+-----------------------------------------------------------------+
  2641. !..Rain collecting snow (and inverse). Explicit CE integration.
  2642. !+---+-----------------------------------------------------------------+
  2643. subroutine qr_acr_qs
  2644. implicit none
  2645. !..Local variables
  2646. INTEGER:: i, j, k, m, n, n2
  2647. INTEGER:: km, km_s, km_e
  2648. DOUBLE PRECISION, DIMENSION(nbr):: vr, D1, N_r
  2649. DOUBLE PRECISION, DIMENSION(nbs):: vs, N_s
  2650. DOUBLE PRECISION:: loga_, a_, b_, second, M0, M2, M3, Mrat, oM3
  2651. DOUBLE PRECISION:: N0_r, lam_exp, lamr, slam1, slam2
  2652. DOUBLE PRECISION:: dvs, dvr, masss, massr
  2653. DOUBLE PRECISION:: t1, t2, t3, t4, z1, z2, z3, z4
  2654. DOUBLE PRECISION:: y1, y2, y3, y4
  2655. !+---+
  2656. do n2 = 1, nbr
  2657. ! vr(n2) = av_r*Dr(n2)**bv_r * DEXP(-fv_r*Dr(n2))
  2658. vr(n2) = -0.1021 + 4.932E3*Dr(n2) - 0.9551E6*Dr(n2)*Dr(n2) &
  2659. + 0.07934E9*Dr(n2)*Dr(n2)*Dr(n2) &
  2660. - 0.002362E12*Dr(n2)*Dr(n2)*Dr(n2)*Dr(n2)
  2661. D1(n2) = (vr(n2)/av_s)**(1./bv_s)
  2662. enddo
  2663. do n = 1, nbs
  2664. vs(n) = 1.5*av_s*Ds(n)**bv_s * DEXP(-fv_s*Ds(n))
  2665. enddo
  2666. !..Note values returned from wrf_dm_decomp1d are zero-based, add 1 for
  2667. !.. fortran indices. J. Michalakes, 2009Oct30.
  2668. #if ( defined( DM_PARALLEL ) && ( ! defined( STUBMPI ) ) )
  2669. CALL wrf_dm_decomp1d ( ntb_r*ntb_r1, km_s, km_e )
  2670. #else
  2671. km_s = 0
  2672. km_e = ntb_r*ntb_r1 - 1
  2673. #endif
  2674. do km = km_s, km_e
  2675. m = km / ntb_r1 + 1
  2676. k = mod( km , ntb_r1 ) + 1
  2677. lam_exp = (N0r_exp(k)*am_r*crg(1)/r_r(m))**ore1
  2678. lamr = lam_exp * (crg(3)*org2*org1)**obmr
  2679. N0_r = N0r_exp(k)/(crg(2)*lam_exp) * lamr**cre(2)
  2680. do n2 = 1, nbr
  2681. N_r(n2) = N0_r*Dr(n2)**mu_r * DEXP(-lamr*Dr(n2))*dtr(n2)
  2682. enddo
  2683. do j = 1, ntb_t
  2684. do i = 1, ntb_s
  2685. !..From the bm_s moment, compute plus one moment. If we are not
  2686. !.. using bm_s=2, then we must transform to the pure 2nd moment
  2687. !.. (variable called "second") and then to the bm_s+1 moment.
  2688. M2 = r_s(i)*oams *1.0d0
  2689. if (bm_s.gt.2.0-1.E-3 .and. bm_s.lt.2.0+1.E-3) then
  2690. loga_ = sa(1) + sa(2)*Tc(j) + sa(3)*bm_s &
  2691. + sa(4)*Tc(j)*bm_s + sa(5)*Tc(j)*Tc(j) &
  2692. + sa(6)*bm_s*bm_s + sa(7)*Tc(j)*Tc(j)*bm_s &
  2693. + sa(8)*Tc(j)*bm_s*bm_s + sa(9)*Tc(j)*Tc(j)*Tc(j) &
  2694. + sa(10)*bm_s*bm_s*bm_s
  2695. a_ = 10.0**loga_
  2696. b_ = sb(1) + sb(2)*Tc(j) + sb(3)*bm_s &
  2697. + sb(4)*Tc(j)*bm_s + sb(5)*Tc(j)*Tc(j) &
  2698. + sb(6)*bm_s*bm_s + sb(7)*Tc(j)*Tc(j)*bm_s &
  2699. + sb(8)*Tc(j)*bm_s*bm_s + sb(9)*Tc(j)*Tc(j)*Tc(j) &
  2700. + sb(10)*bm_s*bm_s*bm_s
  2701. second = (M2/a_)**(1./b_)
  2702. else
  2703. second = M2
  2704. endif
  2705. loga_ = sa(1) + sa(2)*Tc(j) + sa(3)*cse(1) &
  2706. + sa(4)*Tc(j)*cse(1) + sa(5)*Tc(j)*Tc(j) &
  2707. + sa(6)*cse(1)*cse(1) + sa(7)*Tc(j)*Tc(j)*cse(1) &
  2708. + sa(8)*Tc(j)*cse(1)*cse(1) + sa(9)*Tc(j)*Tc(j)*Tc(j) &
  2709. + sa(10)*cse(1)*cse(1)*cse(1)
  2710. a_ = 10.0**loga_
  2711. b_ = sb(1)+sb(2)*Tc(j)+sb(3)*cse(1) + sb(4)*Tc(j)*cse(1) &
  2712. + sb(5)*Tc(j)*Tc(j) + sb(6)*cse(1)*cse(1) &
  2713. + sb(7)*Tc(j)*Tc(j)*cse(1) + sb(8)*Tc(j)*cse(1)*cse(1) &
  2714. + sb(9)*Tc(j)*Tc(j)*Tc(j)+sb(10)*cse(1)*cse(1)*cse(1)
  2715. M3 = a_ * second**b_
  2716. oM3 = 1./M3
  2717. Mrat = M2*(M2*oM3)*(M2*oM3)*(M2*oM3)
  2718. M0 = (M2*oM3)**mu_s
  2719. slam1 = M2 * oM3 * Lam0
  2720. slam2 = M2 * oM3 * Lam1
  2721. do n = 1, nbs
  2722. N_s(n) = Mrat*(Kap0*DEXP(-slam1*Ds(n)) &
  2723. + Kap1*M0*Ds(n)**mu_s * DEXP(-slam2*Ds(n)))*dts(n)
  2724. enddo
  2725. t1 = 0.0d0
  2726. t2 = 0.0d0
  2727. t3 = 0.0d0
  2728. t4 = 0.0d0
  2729. z1 = 0.0d0
  2730. z2 = 0.0d0
  2731. z3 = 0.0d0
  2732. z4 = 0.0d0
  2733. y1 = 0.0d0
  2734. y2 = 0.0d0
  2735. y3 = 0.0d0
  2736. y4 = 0.0d0
  2737. do n2 = 1, nbr
  2738. massr = am_r * Dr(n2)**bm_r
  2739. do n = 1, nbs
  2740. masss = am_s * Ds(n)**bm_s
  2741. dvs = 0.5d0*((vr(n2) - vs(n)) + DABS(vr(n2)-vs(n)))
  2742. dvr = 0.5d0*((vs(n) - vr(n2)) + DABS(vs(n)-vr(n2)))
  2743. if (massr .gt. 1.5*masss) then
  2744. t1 = t1+ PI*.25*Ef_rs*(Ds(n)+Dr(n2))*(Ds(n)+Dr(n2)) &
  2745. *dvs*masss * N_s(n)* N_r(n2)
  2746. z1 = z1+ PI*.25*Ef_rs*(Ds(n)+Dr(n2))*(Ds(n)+Dr(n2)) &
  2747. *dvs*massr * N_s(n)* N_r(n2)
  2748. y1 = y1+ PI*.25*Ef_rs*(Ds(n)+Dr(n2))*(Ds(n)+Dr(n2)) &
  2749. *dvs * N_s(n)* N_r(n2)
  2750. else
  2751. t3 = t3+ PI*.25*Ef_rs*(Ds(n)+Dr(n2))*(Ds(n)+Dr(n2)) &
  2752. *dvs*masss * N_s(n)* N_r(n2)
  2753. z3 = z3+ PI*.25*Ef_rs*(Ds(n)+Dr(n2))*(Ds(n)+Dr(n2)) &
  2754. *dvs*massr * N_s(n)* N_r(n2)
  2755. y3 = y3+ PI*.25*Ef_rs*(Ds(n)+Dr(n2))*(Ds(n)+Dr(n2)) &
  2756. *dvs * N_s(n)* N_r(n2)
  2757. endif
  2758. if (massr .gt. 1.5*masss) then
  2759. t2 = t2+ PI*.25*Ef_rs*(Ds(n)+Dr(n2))*(Ds(n)+Dr(n2)) &
  2760. *dvr*massr * N_s(n)* N_r(n2)
  2761. y2 = y2+ PI*.25*Ef_rs*(Ds(n)+Dr(n2))*(Ds(n)+Dr(n2)) &
  2762. *dvr * N_s(n)* N_r(n2)
  2763. z2 = z2+ PI*.25*Ef_rs*(Ds(n)+Dr(n2))*(Ds(n)+Dr(n2)) &
  2764. *dvr*masss * N_s(n)* N_r(n2)
  2765. else
  2766. t4 = t4+ PI*.25*Ef_rs*(Ds(n)+Dr(n2))*(Ds(n)+Dr(n2)) &
  2767. *dvr*massr * N_s(n)* N_r(n2)
  2768. y4 = y4+ PI*.25*Ef_rs*(Ds(n)+Dr(n2))*(Ds(n)+Dr(n2)) &
  2769. *dvr * N_s(n)* N_r(n2)
  2770. z4 = z4+ PI*.25*Ef_rs*(Ds(n)+Dr(n2))*(Ds(n)+Dr(n2)) &
  2771. *dvr*masss * N_s(n)* N_r(n2)
  2772. endif
  2773. enddo
  2774. enddo
  2775. tcs_racs1(i,j,k,m) = t1
  2776. tmr_racs1(i,j,k,m) = DMIN1(z1, r_r(m)*1.0d0)
  2777. tcs_racs2(i,j,k,m) = t3
  2778. tmr_racs2(i,j,k,m) = z3
  2779. tcr_sacr1(i,j,k,m) = t2
  2780. tms_sacr1(i,j,k,m) = z2
  2781. tcr_sacr2(i,j,k,m) = t4
  2782. tms_sacr2(i,j,k,m) = z4
  2783. tnr_racs1(i,j,k,m) = y1
  2784. tnr_racs2(i,j,k,m) = y3
  2785. tnr_sacr1(i,j,k,m) = y2
  2786. tnr_sacr2(i,j,k,m) = y4
  2787. enddo
  2788. enddo
  2789. enddo
  2790. !..Note wrf_dm_gatherv expects zero-based km_s, km_e (J. Michalakes, 2009Oct30).
  2791. #if ( defined( DM_PARALLEL ) && ( ! defined( STUBMPI ) ) )
  2792. CALL wrf_dm_gatherv(tcs_racs1, ntb_s*ntb_t, km_s, km_e, R8SIZE)
  2793. CALL wrf_dm_gatherv(tmr_racs1, ntb_s*ntb_t, km_s, km_e, R8SIZE)
  2794. CALL wrf_dm_gatherv(tcs_racs2, ntb_s*ntb_t, km_s, km_e, R8SIZE)
  2795. CALL wrf_dm_gatherv(tmr_racs2, ntb_s*ntb_t, km_s, km_e, R8SIZE)
  2796. CALL wrf_dm_gatherv(tcr_sacr1, ntb_s*ntb_t, km_s, km_e, R8SIZE)
  2797. CALL wrf_dm_gatherv(tms_sacr1, ntb_s*ntb_t, km_s, km_e, R8SIZE)
  2798. CALL wrf_dm_gatherv(tcr_sacr2, ntb_s*ntb_t, km_s, km_e, R8SIZE)
  2799. CALL wrf_dm_gatherv(tms_sacr2, ntb_s*ntb_t, km_s, km_e, R8SIZE)
  2800. CALL wrf_dm_gatherv(tnr_racs1, ntb_s*ntb_t, km_s, km_e, R8SIZE)
  2801. CALL wrf_dm_gatherv(tnr_racs2, ntb_s*ntb_t, km_s, km_e, R8SIZE)
  2802. CALL wrf_dm_gatherv(tnr_sacr1, ntb_s*ntb_t, km_s, km_e, R8SIZE)
  2803. CALL wrf_dm_gatherv(tnr_sacr2, ntb_s*ntb_t, km_s, km_e, R8SIZE)
  2804. #endif
  2805. end subroutine qr_acr_qs
  2806. !+---+-----------------------------------------------------------------+
  2807. !ctrlL
  2808. !+---+-----------------------------------------------------------------+
  2809. !..This is a literal adaptation of Bigg (1954) probability of drops of
  2810. !..a particular volume freezing. Given this probability, simply freeze
  2811. !..the proportion of drops summing their masses.
  2812. !+---+-----------------------------------------------------------------+
  2813. subroutine freezeH2O
  2814. implicit none
  2815. !..Local variables
  2816. INTEGER:: i, j, k, n, n2
  2817. DOUBLE PRECISION, DIMENSION(nbr):: N_r, massr
  2818. DOUBLE PRECISION, DIMENSION(nbc):: N_c, massc
  2819. DOUBLE PRECISION:: sum1, sum2, sumn1, sumn2, &
  2820. prob, vol, Texp, orho_w, &
  2821. lam_exp, lamr, N0_r, lamc, N0_c, y
  2822. !+---+
  2823. orho_w = 1./rho_w
  2824. do n2 = 1, nbr
  2825. massr(n2) = am_r*Dr(n2)**bm_r
  2826. enddo
  2827. do n = 1, nbc
  2828. massc(n) = am_r*Dc(n)**bm_r
  2829. enddo
  2830. !..Freeze water (smallest drops become cloud ice, otherwise graupel).
  2831. do k = 1, 45
  2832. ! print*, ' Freezing water for temp = ', -k
  2833. Texp = DEXP( DFLOAT(k) ) - 1.0D0
  2834. do j = 1, ntb_r1
  2835. do i = 1, ntb_r
  2836. lam_exp = (N0r_exp(j)*am_r*crg(1)/r_r(i))**ore1
  2837. lamr = lam_exp * (crg(3)*org2*org1)**obmr
  2838. N0_r = N0r_exp(j)/(crg(2)*lam_exp) * lamr**cre(2)
  2839. sum1 = 0.0d0
  2840. sum2 = 0.0d0
  2841. sumn1 = 0.0d0
  2842. sumn2 = 0.0d0
  2843. do n2 = 1, nbr
  2844. N_r(n2) = N0_r*Dr(n2)**mu_r*DEXP(-lamr*Dr(n2))*dtr(n2)
  2845. vol = massr(n2)*orho_w
  2846. prob = 1.0D0 - DEXP(-120.0D0*vol*5.2D-4 * Texp)
  2847. if (massr(n2) .lt. xm0g) then
  2848. sumn1 = sumn1 + prob*N_r(n2)
  2849. sum1 = sum1 + prob*N_r(n2)*massr(n2)
  2850. else
  2851. sumn2 = sumn2 + prob*N_r(n2)
  2852. sum2 = sum2 + prob*N_r(n2)*massr(n2)
  2853. endif
  2854. enddo
  2855. tpi_qrfz(i,j,k) = sum1
  2856. tni_qrfz(i,j,k) = sumn1
  2857. tpg_qrfz(i,j,k) = sum2
  2858. tnr_qrfz(i,j,k) = sumn2
  2859. enddo
  2860. enddo
  2861. do i = 1, ntb_c
  2862. lamc = 1.0D-6 * (Nt_c*am_r* ccg(2) * ocg1 / r_c(i))**obmr
  2863. N0_c = 1.0D-18 * Nt_c*ocg1 * lamc**cce(1)
  2864. sum1 = 0.0d0
  2865. sumn2 = 0.0d0
  2866. do n = 1, nbc
  2867. y = Dc(n)*1.0D6
  2868. vol = massc(n)*orho_w
  2869. prob = 1.0D0 - DEXP(-120.0D0*vol*5.2D-4 * Texp)
  2870. N_c(n) = N0_c* y**mu_c * EXP(-lamc*y)*dtc(n)
  2871. N_c(n) = 1.0D24 * N_c(n)
  2872. sumn2 = sumn2 + prob*N_c(n)
  2873. sum1 = sum1 + prob*N_c(n)*massc(n)
  2874. enddo
  2875. tpi_qcfz(i,k) = sum1
  2876. tni_qcfz(i,k) = sumn2
  2877. enddo
  2878. enddo
  2879. end subroutine freezeH2O
  2880. !+---+-----------------------------------------------------------------+
  2881. !ctrlL
  2882. !+---+-----------------------------------------------------------------+
  2883. !..Cloud ice converting to snow since portion greater than min snow
  2884. !.. size. Given cloud ice content (kg/m**3), number concentration
  2885. !.. (#/m**3) and gamma shape parameter, mu_i, break the distrib into
  2886. !.. bins and figure out the mass/number of ice with sizes larger than
  2887. !.. D0s. Also, compute incomplete gamma function for the integration
  2888. !.. of ice depositional growth from diameter=0 to D0s. Amount of
  2889. !.. ice depositional growth is this portion of distrib while larger
  2890. !.. diameters contribute to snow growth (as in Harrington et al. 1995).
  2891. !+---+-----------------------------------------------------------------+
  2892. subroutine qi_aut_qs
  2893. implicit none
  2894. !..Local variables
  2895. INTEGER:: i, j, n2
  2896. DOUBLE PRECISION, DIMENSION(nbi):: N_i
  2897. DOUBLE PRECISION:: N0_i, lami, Di_mean, t1, t2
  2898. REAL:: xlimit_intg
  2899. !+---+
  2900. do j = 1, ntb_i1
  2901. do i = 1, ntb_i
  2902. lami = (am_i*cig(2)*oig1*Nt_i(j)/r_i(i))**obmi
  2903. Di_mean = (bm_i + mu_i + 1.) / lami
  2904. N0_i = Nt_i(j)*oig1 * lami**cie(1)
  2905. t1 = 0.0d0
  2906. t2 = 0.0d0
  2907. if (SNGL(Di_mean) .gt. 5.*D0s) then
  2908. t1 = r_i(i)
  2909. t2 = Nt_i(j)
  2910. tpi_ide(i,j) = 0.0D0
  2911. elseif (SNGL(Di_mean) .lt. D0i) then
  2912. t1 = 0.0D0
  2913. t2 = 0.0D0
  2914. tpi_ide(i,j) = 1.0D0
  2915. else
  2916. xlimit_intg = lami*D0s
  2917. tpi_ide(i,j) = GAMMP(mu_i+2.0, xlimit_intg) * 1.0D0
  2918. do n2 = 1, nbi
  2919. N_i(n2) = N0_i*Di(n2)**mu_i * DEXP(-lami*Di(n2))*dti(n2)
  2920. if (Di(n2).ge.D0s) then
  2921. t1 = t1 + N_i(n2) * am_i*Di(n2)**bm_i
  2922. t2 = t2 + N_i(n2)
  2923. endif
  2924. enddo
  2925. endif
  2926. tps_iaus(i,j) = t1
  2927. tni_iaus(i,j) = t2
  2928. enddo
  2929. enddo
  2930. end subroutine qi_aut_qs
  2931. !ctrlL
  2932. !+---+-----------------------------------------------------------------+
  2933. !..Variable collision efficiency for rain collecting cloud water using
  2934. !.. method of Beard and Grover, 1974 if a/A less than 0.25; otherwise
  2935. !.. uses polynomials to get close match of Pruppacher & Klett Fig 14-9.
  2936. !+---+-----------------------------------------------------------------+
  2937. subroutine table_Efrw
  2938. implicit none
  2939. !..Local variables
  2940. DOUBLE PRECISION:: vtr, stokes, reynolds, Ef_rw
  2941. DOUBLE PRECISION:: p, yc0, F, G, H, z, K0, X
  2942. INTEGER:: i, j
  2943. do j = 1, nbc
  2944. do i = 1, nbr
  2945. Ef_rw = 0.0
  2946. p = Dc(j)/Dr(i)
  2947. if (Dr(i).lt.50.E-6 .or. Dc(j).lt.3.E-6) then
  2948. t_Efrw(i,j) = 0.0
  2949. elseif (p.gt.0.25) then
  2950. X = Dc(j)*1.D6
  2951. if (Dr(i) .lt. 75.e-6) then
  2952. Ef_rw = 0.026794*X - 0.20604
  2953. elseif (Dr(i) .lt. 125.e-6) then
  2954. Ef_rw = -0.00066842*X*X + 0.061542*X - 0.37089
  2955. elseif (Dr(i) .lt. 175.e-6) then
  2956. Ef_rw = 4.091e-06*X*X*X*X - 0.00030908*X*X*X &
  2957. + 0.0066237*X*X - 0.0013687*X - 0.073022
  2958. elseif (Dr(i) .lt. 250.e-6) then
  2959. Ef_rw = 9.6719e-5*X*X*X - 0.0068901*X*X + 0.17305*X &
  2960. - 0.65988
  2961. elseif (Dr(i) .lt. 350.e-6) then
  2962. Ef_rw = 9.0488e-5*X*X*X - 0.006585*X*X + 0.16606*X &
  2963. - 0.56125
  2964. else
  2965. Ef_rw = 0.00010721*X*X*X - 0.0072962*X*X + 0.1704*X &
  2966. - 0.46929
  2967. endif
  2968. else
  2969. vtr = -0.1021 + 4.932E3*Dr(i) - 0.9551E6*Dr(i)*Dr(i) &
  2970. + 0.07934E9*Dr(i)*Dr(i)*Dr(i) &
  2971. - 0.002362E12*Dr(i)*Dr(i)*Dr(i)*Dr(i)
  2972. stokes = Dc(j)*Dc(j)*vtr*rho_w/(9.*1.718E-5*Dr(i))
  2973. reynolds = 9.*stokes/(p*p*rho_w)
  2974. F = DLOG(reynolds)
  2975. G = -0.1007D0 - 0.358D0*F + 0.0261D0*F*F
  2976. K0 = DEXP(G)
  2977. z = DLOG(stokes/(K0+1.D-15))
  2978. H = 0.1465D0 + 1.302D0*z - 0.607D0*z*z + 0.293D0*z*z*z
  2979. yc0 = 2.0D0/PI * ATAN(H)
  2980. Ef_rw = (yc0+p)*(yc0+p) / ((1.+p)*(1.+p))
  2981. endif
  2982. t_Efrw(i,j) = MAX(0.0, MIN(SNGL(Ef_rw), 0.95))
  2983. enddo
  2984. enddo
  2985. end subroutine table_Efrw
  2986. !ctrlL
  2987. !+---+-----------------------------------------------------------------+
  2988. !..Variable collision efficiency for snow collecting cloud water using
  2989. !.. method of Wang and Ji, 2000 except equate melted snow diameter to
  2990. !.. their "effective collision cross-section."
  2991. !+---+-----------------------------------------------------------------+
  2992. subroutine table_Efsw
  2993. implicit none
  2994. !..Local variables
  2995. DOUBLE PRECISION:: Ds_m, vts, vtc, stokes, reynolds, Ef_sw
  2996. DOUBLE PRECISION:: p, yc0, F, G, H, z, K0
  2997. INTEGER:: i, j
  2998. do j = 1, nbc
  2999. vtc = 1.19D4 * (1.0D4*Dc(j)*Dc(j)*0.25D0)
  3000. do i = 1, nbs
  3001. vts = av_s*Ds(i)**bv_s * DEXP(-fv_s*Ds(i)) - vtc
  3002. Ds_m = (am_s*Ds(i)**bm_s / am_r)**obmr
  3003. p = Dc(j)/Ds_m
  3004. if (p.gt.0.25 .or. Ds(i).lt.D0s .or. Dc(j).lt.6.E-6 &
  3005. .or. vts.lt.1.E-3) then
  3006. t_Efsw(i,j) = 0.0
  3007. else
  3008. stokes = Dc(j)*Dc(j)*vts*rho_w/(9.*1.718E-5*Ds_m)
  3009. reynolds = 9.*stokes/(p*p*rho_w)
  3010. F = DLOG(reynolds)
  3011. G = -0.1007D0 - 0.358D0*F + 0.0261D0*F*F
  3012. K0 = DEXP(G)
  3013. z = DLOG(stokes/(K0+1.D-15))
  3014. H = 0.1465D0 + 1.302D0*z - 0.607D0*z*z + 0.293D0*z*z*z
  3015. yc0 = 2.0D0/PI * ATAN(H)
  3016. Ef_sw = (yc0+p)*(yc0+p) / ((1.+p)*(1.+p))
  3017. t_Efsw(i,j) = MAX(0.0, MIN(SNGL(Ef_sw), 0.95))
  3018. endif
  3019. enddo
  3020. enddo
  3021. end subroutine table_Efsw
  3022. !ctrlL
  3023. !+---+-----------------------------------------------------------------+
  3024. !..Integrate rain size distribution from zero to D-star to compute the
  3025. !.. number of drops smaller than D-star that evaporate in a single
  3026. !.. timestep. Drops larger than D-star dont evaporate entirely so do
  3027. !.. not affect number concentration.
  3028. !+---+-----------------------------------------------------------------+
  3029. subroutine table_dropEvap
  3030. implicit none
  3031. !..Local variables
  3032. DOUBLE PRECISION:: Nt_r, N0, lam_exp, lam
  3033. REAL:: xlimit_intg
  3034. INTEGER:: i, j, k
  3035. do k = 1, ntb_r
  3036. do j = 1, ntb_r1
  3037. lam_exp = (N0r_exp(j)*am_r*crg(1)/r_r(k))**ore1
  3038. lam = lam_exp * (crg(3)*org2*org1)**obmr
  3039. N0 = N0r_exp(j)/(crg(2)*lam_exp) * lam**cre(2)
  3040. Nt_r = N0 * crg(2) / lam**cre(2)
  3041. do i = 1, nbr
  3042. xlimit_intg = lam*Dr(i)
  3043. tnr_rev(i,j,k) = GAMMP(mu_r+1.0, xlimit_intg) * Nt_r
  3044. enddo
  3045. enddo
  3046. enddo
  3047. end subroutine table_dropEvap
  3048. ! TO APPLY TABLE ABOVE
  3049. !..Rain lookup table indexes.
  3050. ! Dr_star = DSQRT(-2.D0*DT * t1_evap/(2.*PI) &
  3051. ! * 0.78*4.*diffu(k)*xsat*rvs/rho_w)
  3052. ! idx_d = NINT(1.0 + FLOAT(nbr) * DLOG(Dr_star/D0r) &
  3053. ! / DLOG(Dr(nbr)/D0r))
  3054. ! idx_d = MAX(1, MIN(idx_d, nbr))
  3055. !
  3056. ! nir = NINT(ALOG10(rr(k)))
  3057. ! do nn = nir-1, nir+1
  3058. ! n = nn
  3059. ! if ( (rr(k)/10.**nn).ge.1.0 .and. &
  3060. ! (rr(k)/10.**nn).lt.10.0) goto 154
  3061. ! enddo
  3062. !154 continue
  3063. ! idx_r = INT(rr(k)/10.**n) + 10*(n-nir2) - (n-nir2)
  3064. ! idx_r = MAX(1, MIN(idx_r, ntb_r))
  3065. !
  3066. ! lamr = (am_r*crg(3)*org2*nr(k)/rr(k))**obmr
  3067. ! lam_exp = lamr * (crg(3)*org2*org1)**bm_r
  3068. ! N0_exp = org1*rr(k)/am_r * lam_exp**cre(1)
  3069. ! nir = NINT(DLOG10(N0_exp))
  3070. ! do nn = nir-1, nir+1
  3071. ! n = nn
  3072. ! if ( (N0_exp/10.**nn).ge.1.0 .and. &
  3073. ! (N0_exp/10.**nn).lt.10.0) goto 155
  3074. ! enddo
  3075. !155 continue
  3076. ! idx_r1 = INT(N0_exp/10.**n) + 10*(n-nir3) - (n-nir3)
  3077. ! idx_r1 = MAX(1, MIN(idx_r1, ntb_r1))
  3078. !
  3079. ! pnr_rev(k) = MIN(nr(k)*odts, SNGL(tnr_rev(idx_d,idx_r1,idx_r) & ! RAIN2M
  3080. ! * odts))
  3081. !
  3082. !ctrlL
  3083. !+---+-----------------------------------------------------------------+
  3084. !+---+-----------------------------------------------------------------+
  3085. SUBROUTINE GCF(GAMMCF,A,X,GLN)
  3086. ! --- RETURNS THE INCOMPLETE GAMMA FUNCTION Q(A,X) EVALUATED BY ITS
  3087. ! --- CONTINUED FRACTION REPRESENTATION AS GAMMCF. ALSO RETURNS
  3088. ! --- LN(GAMMA(A)) AS GLN. THE CONTINUED FRACTION IS EVALUATED BY
  3089. ! --- A MODIFIED LENTZ METHOD.
  3090. ! --- USES GAMMLN
  3091. IMPLICIT NONE
  3092. INTEGER, PARAMETER:: ITMAX=100
  3093. REAL, PARAMETER:: gEPS=3.E-7
  3094. REAL, PARAMETER:: FPMIN=1.E-30
  3095. REAL, INTENT(IN):: A, X
  3096. REAL:: GAMMCF,GLN
  3097. INTEGER:: I
  3098. REAL:: AN,B,C,D,DEL,H
  3099. GLN=GAMMLN(A)
  3100. B=X+1.-A
  3101. C=1./FPMIN
  3102. D=1./B
  3103. H=D
  3104. DO 11 I=1,ITMAX
  3105. AN=-I*(I-A)
  3106. B=B+2.
  3107. D=AN*D+B
  3108. IF(ABS(D).LT.FPMIN)D=FPMIN
  3109. C=B+AN/C
  3110. IF(ABS(C).LT.FPMIN)C=FPMIN
  3111. D=1./D
  3112. DEL=D*C
  3113. H=H*DEL
  3114. IF(ABS(DEL-1.).LT.gEPS)GOTO 1
  3115. 11 CONTINUE
  3116. PRINT *, 'A TOO LARGE, ITMAX TOO SMALL IN GCF'
  3117. 1 GAMMCF=EXP(-X+A*LOG(X)-GLN)*H
  3118. END SUBROUTINE GCF
  3119. ! (C) Copr. 1986-92 Numerical Recipes Software 2.02
  3120. !+---+-----------------------------------------------------------------+
  3121. SUBROUTINE GSER(GAMSER,A,X,GLN)
  3122. ! --- RETURNS THE INCOMPLETE GAMMA FUNCTION P(A,X) EVALUATED BY ITS
  3123. ! --- ITS SERIES REPRESENTATION AS GAMSER. ALSO RETURNS LN(GAMMA(A))
  3124. ! --- AS GLN.
  3125. ! --- USES GAMMLN
  3126. IMPLICIT NONE
  3127. INTEGER, PARAMETER:: ITMAX=100
  3128. REAL, PARAMETER:: gEPS=3.E-7
  3129. REAL, INTENT(IN):: A, X
  3130. REAL:: GAMSER,GLN
  3131. INTEGER:: N
  3132. REAL:: AP,DEL,SUM
  3133. GLN=GAMMLN(A)
  3134. IF(X.LE.0.)THEN
  3135. IF(X.LT.0.) PRINT *, 'X < 0 IN GSER'
  3136. GAMSER=0.
  3137. RETURN
  3138. ENDIF
  3139. AP=A
  3140. SUM=1./A
  3141. DEL=SUM
  3142. DO 11 N=1,ITMAX
  3143. AP=AP+1.
  3144. DEL=DEL*X/AP
  3145. SUM=SUM+DEL
  3146. IF(ABS(DEL).LT.ABS(SUM)*gEPS)GOTO 1
  3147. 11 CONTINUE
  3148. PRINT *,'A TOO LARGE, ITMAX TOO SMALL IN GSER'
  3149. 1 GAMSER=SUM*EXP(-X+A*LOG(X)-GLN)
  3150. END SUBROUTINE GSER
  3151. ! (C) Copr. 1986-92 Numerical Recipes Software 2.02
  3152. !+---+-----------------------------------------------------------------+
  3153. REAL FUNCTION GAMMLN(XX)
  3154. ! --- RETURNS THE VALUE LN(GAMMA(XX)) FOR XX > 0.
  3155. IMPLICIT NONE
  3156. REAL, INTENT(IN):: XX
  3157. DOUBLE PRECISION, PARAMETER:: STP = 2.5066282746310005D0
  3158. DOUBLE PRECISION, DIMENSION(6), PARAMETER:: &
  3159. COF = (/76.18009172947146D0, -86.50532032941677D0, &
  3160. 24.01409824083091D0, -1.231739572450155D0, &
  3161. .1208650973866179D-2, -.5395239384953D-5/)
  3162. DOUBLE PRECISION:: SER,TMP,X,Y
  3163. INTEGER:: J
  3164. X=XX
  3165. Y=X
  3166. TMP=X+5.5D0
  3167. TMP=(X+0.5D0)*LOG(TMP)-TMP
  3168. SER=1.000000000190015D0
  3169. DO 11 J=1,6
  3170. Y=Y+1.D0
  3171. SER=SER+COF(J)/Y
  3172. 11 CONTINUE
  3173. GAMMLN=TMP+LOG(STP*SER/X)
  3174. END FUNCTION GAMMLN
  3175. ! (C) Copr. 1986-92 Numerical Recipes Software 2.02
  3176. !+---+-----------------------------------------------------------------+
  3177. REAL FUNCTION GAMMP(A,X)
  3178. ! --- COMPUTES THE INCOMPLETE GAMMA FUNCTION P(A,X)
  3179. ! --- SEE ABRAMOWITZ AND STEGUN 6.5.1
  3180. ! --- USES GCF,GSER
  3181. IMPLICIT NONE
  3182. REAL, INTENT(IN):: A,X
  3183. REAL:: GAMMCF,GAMSER,GLN
  3184. GAMMP = 0.
  3185. IF((X.LT.0.) .OR. (A.LE.0.)) THEN
  3186. PRINT *, 'BAD ARGUMENTS IN GAMMP'
  3187. RETURN
  3188. ELSEIF(X.LT.A+1.)THEN
  3189. CALL GSER(GAMSER,A,X,GLN)
  3190. GAMMP=GAMSER
  3191. ELSE
  3192. CALL GCF(GAMMCF,A,X,GLN)
  3193. GAMMP=1.-GAMMCF
  3194. ENDIF
  3195. END FUNCTION GAMMP
  3196. ! (C) Copr. 1986-92 Numerical Recipes Software 2.02
  3197. !+---+-----------------------------------------------------------------+
  3198. REAL FUNCTION WGAMMA(y)
  3199. IMPLICIT NONE
  3200. REAL, INTENT(IN):: y
  3201. WGAMMA = EXP(GAMMLN(y))
  3202. END FUNCTION WGAMMA
  3203. !+---+-----------------------------------------------------------------+
  3204. ! THIS FUNCTION CALCULATES THE LIQUID SATURATION VAPOR MIXING RATIO AS
  3205. ! A FUNCTION OF TEMPERATURE AND PRESSURE
  3206. !
  3207. REAL FUNCTION RSLF(P,T)
  3208. IMPLICIT NONE
  3209. REAL, INTENT(IN):: P, T
  3210. REAL:: ESL,X
  3211. REAL, PARAMETER:: C0= .611583699E03
  3212. REAL, PARAMETER:: C1= .444606896E02
  3213. REAL, PARAMETER:: C2= .143177157E01
  3214. REAL, PARAMETER:: C3= .264224321E-1
  3215. REAL, PARAMETER:: C4= .299291081E-3
  3216. REAL, PARAMETER:: C5= .203154182E-5
  3217. REAL, PARAMETER:: C6= .702620698E-8
  3218. REAL, PARAMETER:: C7= .379534310E-11
  3219. REAL, PARAMETER:: C8=-.321582393E-13
  3220. X=MAX(-80.,T-273.16)
  3221. ! ESL=612.2*EXP(17.67*X/(T-29.65))
  3222. ESL=C0+X*(C1+X*(C2+X*(C3+X*(C4+X*(C5+X*(C6+X*(C7+X*C8)))))))
  3223. RSLF=.622*ESL/(P-ESL)
  3224. ! ALTERNATIVE
  3225. ! ; Source: Murphy and Koop, Review of the vapour pressure of ice and
  3226. ! supercooled water for atmospheric applications, Q. J. R.
  3227. ! Meteorol. Soc (2005), 131, pp. 1539-1565.
  3228. ! ESL = EXP(54.842763 - 6763.22 / T - 4.210 * ALOG(T) + 0.000367 * T
  3229. ! + TANH(0.0415 * (T - 218.8)) * (53.878 - 1331.22
  3230. ! / T - 9.44523 * ALOG(T) + 0.014025 * T))
  3231. END FUNCTION RSLF
  3232. !+---+-----------------------------------------------------------------+
  3233. ! THIS FUNCTION CALCULATES THE ICE SATURATION VAPOR MIXING RATIO AS A
  3234. ! FUNCTION OF TEMPERATURE AND PRESSURE
  3235. !
  3236. REAL FUNCTION RSIF(P,T)
  3237. IMPLICIT NONE
  3238. REAL, INTENT(IN):: P, T
  3239. REAL:: ESI,X
  3240. REAL, PARAMETER:: C0= .609868993E03
  3241. REAL, PARAMETER:: C1= .499320233E02
  3242. REAL, PARAMETER:: C2= .184672631E01
  3243. REAL, PARAMETER:: C3= .402737184E-1
  3244. REAL, PARAMETER:: C4= .565392987E-3
  3245. REAL, PARAMETER:: C5= .521693933E-5
  3246. REAL, PARAMETER:: C6= .307839583E-7
  3247. REAL, PARAMETER:: C7= .105785160E-9
  3248. REAL, PARAMETER:: C8= .161444444E-12
  3249. X=MAX(-80.,T-273.16)
  3250. ESI=C0+X*(C1+X*(C2+X*(C3+X*(C4+X*(C5+X*(C6+X*(C7+X*C8)))))))
  3251. RSIF=.622*ESI/(P-ESI)
  3252. ! ALTERNATIVE
  3253. ! ; Source: Murphy and Koop, Review of the vapour pressure of ice and
  3254. ! supercooled water for atmospheric applications, Q. J. R.
  3255. ! Meteorol. Soc (2005), 131, pp. 1539-1565.
  3256. ! ESI = EXP(9.550426 - 5723.265/T + 3.53068*ALOG(T) - 0.00728332*T)
  3257. END FUNCTION RSIF
  3258. !+---+-----------------------------------------------------------------+
  3259. !+---+-----------------------------------------------------------------+
  3260. END MODULE module_mp_thompson
  3261. !+---+-----------------------------------------------------------------+