PageRenderTime 51ms CodeModel.GetById 8ms RepoModel.GetById 0ms app.codeStats 1ms

/phys/module_mp_thompson.F

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