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).
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.
29 !..Author: Greg Thompson, NCAR-RAL, gthompsn@ucar.edu, 303-497-2805
30 !..Last modified: 20 Mar 2012
31 !+---+-----------------------------------------------------------------+
32 !wrft:model_layer:physics
33 !+---+-----------------------------------------------------------------+
35 MODULE module_mp_thompson
39 ! USE module_utility, ONLY: WRFU_Clock, WRFU_Alarm
40 ! USE module_domain, ONLY : HISTORY_ALARM, Is_alarm_tstep
44 LOGICAL, PARAMETER, PRIVATE:: iiwarm = .false.
45 INTEGER, PARAMETER, PRIVATE:: IFDRY = 0
46 REAL, PARAMETER, PRIVATE:: T_0 = 273.15
47 REAL, PARAMETER, PRIVATE:: PI = 3.1415926536
49 !..Densities of rain, snow, graupel, and cloud ice.
50 REAL, PARAMETER, PRIVATE:: rho_w = 1000.0
51 REAL, PARAMETER, PRIVATE:: rho_s = 100.0
52 REAL, PARAMETER, PRIVATE:: rho_g = 500.0
53 REAL, PARAMETER, PRIVATE:: rho_i = 890.0
55 !..Prescribed number of cloud droplets. Set according to known data or
56 !.. roughly 100 per cc (100.E6 m^-3) for Maritime cases and
57 !.. 300 per cc (300.E6 m^-3) for Continental. Gamma shape parameter,
58 !.. mu_c, calculated based on Nt_c is important in autoconversion
60 REAL, PARAMETER, PRIVATE:: Nt_c = 100.E6
62 !..Generalized gamma distributions for rain, graupel and cloud ice.
63 !.. N(D) = N_0 * D**mu * exp(-lamda*D); mu=0 is exponential.
64 REAL, PARAMETER, PRIVATE:: mu_r = 0.0
65 REAL, PARAMETER, PRIVATE:: mu_g = 0.0
66 REAL, PARAMETER, PRIVATE:: mu_i = 0.0
69 !..Sum of two gamma distrib for snow (Field et al. 2005).
70 !.. N(D) = M2**4/M3**3 * [Kap0*exp(-M2*Lam0*D/M3)
71 !.. + Kap1*(M2/M3)**mu_s * D**mu_s * exp(-M2*Lam1*D/M3)]
72 !.. M2 and M3 are the (bm_s)th and (bm_s+1)th moments respectively
73 !.. calculated as function of ice water content and temperature.
74 REAL, PARAMETER, PRIVATE:: mu_s = 0.6357
75 REAL, PARAMETER, PRIVATE:: Kap0 = 490.6
76 REAL, PARAMETER, PRIVATE:: Kap1 = 17.46
77 REAL, PARAMETER, PRIVATE:: Lam0 = 20.78
78 REAL, PARAMETER, PRIVATE:: Lam1 = 3.29
80 !..Y-intercept parameter for graupel is not constant and depends on
81 !.. mixing ratio. Also, when mu_g is non-zero, these become equiv
82 !.. y-intercept for an exponential distrib and proper values are
83 !.. computed based on same mixing ratio and total number concentration.
84 REAL, PARAMETER, PRIVATE:: gonv_min = 2.E4
85 REAL, PARAMETER, PRIVATE:: gonv_max = 2.E6
87 !..Mass power law relations: mass = am*D**bm
88 !.. Snow from Field et al. (2005), others assume spherical form.
89 REAL, PARAMETER, PRIVATE:: am_r = PI*rho_w/6.0
90 REAL, PARAMETER, PRIVATE:: bm_r = 3.0
91 REAL, PARAMETER, PRIVATE:: am_s = 0.069
92 REAL, PARAMETER, PRIVATE:: bm_s = 2.0
93 REAL, PARAMETER, PRIVATE:: am_g = PI*rho_g/6.0
94 REAL, PARAMETER, PRIVATE:: bm_g = 3.0
95 REAL, PARAMETER, PRIVATE:: am_i = PI*rho_i/6.0
96 REAL, PARAMETER, PRIVATE:: bm_i = 3.0
98 !..Fallspeed power laws relations: v = (av*D**bv)*exp(-fv*D)
99 !.. Rain from Ferrier (1994), ice, snow, and graupel from
100 !.. Thompson et al (2008). Coefficient fv is zero for graupel/ice.
101 REAL, PARAMETER, PRIVATE:: av_r = 4854.0
102 REAL, PARAMETER, PRIVATE:: bv_r = 1.0
103 REAL, PARAMETER, PRIVATE:: fv_r = 195.0
104 REAL, PARAMETER, PRIVATE:: av_s = 40.0
105 REAL, PARAMETER, PRIVATE:: bv_s = 0.55
106 REAL, PARAMETER, PRIVATE:: fv_s = 100.0
107 REAL, PARAMETER, PRIVATE:: av_g = 442.0
108 REAL, PARAMETER, PRIVATE:: bv_g = 0.89
109 REAL, PARAMETER, PRIVATE:: av_i = 1847.5
110 REAL, PARAMETER, PRIVATE:: bv_i = 1.0
112 !..Capacitance of sphere and plates/aggregates: D**3, D**2
113 REAL, PARAMETER, PRIVATE:: C_cube = 0.5
114 REAL, PARAMETER, PRIVATE:: C_sqrd = 0.3
116 !..Collection efficiencies. Rain/snow/graupel collection of cloud
117 !.. droplets use variables (Ef_rw, Ef_sw, Ef_gw respectively) and
118 !.. get computed elsewhere because they are dependent on stokes
120 REAL, PARAMETER, PRIVATE:: Ef_si = 0.05
121 REAL, PARAMETER, PRIVATE:: Ef_rs = 0.95
122 REAL, PARAMETER, PRIVATE:: Ef_rg = 0.75
123 REAL, PARAMETER, PRIVATE:: Ef_ri = 0.95
125 !..Minimum microphys values
126 !.. R1 value, 1.E-12, cannot be set lower because of numerical
127 !.. problems with Paul Field's moments and should not be set larger
128 !.. because of truncation problems in snow/ice growth.
129 REAL, PARAMETER, PRIVATE:: R1 = 1.E-12
130 REAL, PARAMETER, PRIVATE:: R2 = 1.E-6
131 REAL, PARAMETER, PRIVATE:: eps = 1.E-15
133 !..Constants in Cooper curve relation for cloud ice number.
134 REAL, PARAMETER, PRIVATE:: TNO = 5.0
135 REAL, PARAMETER, PRIVATE:: ATO = 0.304
137 !..Rho_not used in fallspeed relations (rho_not/rho)**.5 adjustment.
138 REAL, PARAMETER, PRIVATE:: rho_not = 101325.0/(287.05*298.0)
141 REAL, PARAMETER, PRIVATE:: Sc = 0.632
144 !..Homogeneous freezing temperature
145 REAL, PARAMETER, PRIVATE:: HGFR = 235.16
147 !..Water vapor and air gas constants at constant pressure
148 REAL, PARAMETER, PRIVATE:: Rv = 461.5
149 REAL, PARAMETER, PRIVATE:: oRv = 1./Rv
150 REAL, PARAMETER, PRIVATE:: R = 287.04
151 REAL, PARAMETER, PRIVATE:: Cp = 1004.0
153 !..Enthalpy of sublimation, vaporization, and fusion at 0C.
154 REAL, PARAMETER, PRIVATE:: lsub = 2.834E6
155 REAL, PARAMETER, PRIVATE:: lvap0 = 2.5E6
156 REAL, PARAMETER, PRIVATE:: lfus = lsub - lvap0
157 REAL, PARAMETER, PRIVATE:: olfus = 1./lfus
159 !..Ice initiates with this mass (kg), corresponding diameter calc.
160 !..Min diameters and mass of cloud, rain, snow, and graupel (m, kg).
161 REAL, PARAMETER, PRIVATE:: xm0i = 1.E-12
162 REAL, PARAMETER, PRIVATE:: D0c = 1.E-6
163 REAL, PARAMETER, PRIVATE:: D0r = 50.E-6
164 REAL, PARAMETER, PRIVATE:: D0s = 200.E-6
165 REAL, PARAMETER, PRIVATE:: D0g = 250.E-6
166 REAL, PRIVATE:: D0i, xm0s, xm0g
168 !..Lookup table dimensions
169 INTEGER, PARAMETER, PRIVATE:: nbins = 100
170 INTEGER, PARAMETER, PRIVATE:: nbc = nbins
171 INTEGER, PARAMETER, PRIVATE:: nbi = nbins
172 INTEGER, PARAMETER, PRIVATE:: nbr = nbins
173 INTEGER, PARAMETER, PRIVATE:: nbs = nbins
174 INTEGER, PARAMETER, PRIVATE:: nbg = nbins
175 INTEGER, PARAMETER, PRIVATE:: ntb_c = 37
176 INTEGER, PARAMETER, PRIVATE:: ntb_i = 64
177 INTEGER, PARAMETER, PRIVATE:: ntb_r = 37
178 INTEGER, PARAMETER, PRIVATE:: ntb_s = 28
179 INTEGER, PARAMETER, PRIVATE:: ntb_g = 28
180 INTEGER, PARAMETER, PRIVATE:: ntb_g1 = 28
181 INTEGER, PARAMETER, PRIVATE:: ntb_r1 = 37
182 INTEGER, PARAMETER, PRIVATE:: ntb_i1 = 55
183 INTEGER, PARAMETER, PRIVATE:: ntb_t = 9
184 INTEGER, PRIVATE:: nic2, nii2, nii3, nir2, nir3, nis2, nig2, nig3
186 DOUBLE PRECISION, DIMENSION(nbins+1):: xDx
187 DOUBLE PRECISION, DIMENSION(nbc):: Dc, dtc
188 DOUBLE PRECISION, DIMENSION(nbi):: Di, dti
189 DOUBLE PRECISION, DIMENSION(nbr):: Dr, dtr
190 DOUBLE PRECISION, DIMENSION(nbs):: Ds, dts
191 DOUBLE PRECISION, DIMENSION(nbg):: Dg, dtg
193 !..Lookup tables for cloud water content (kg/m**3).
194 REAL, DIMENSION(ntb_c), PARAMETER, PRIVATE:: &
195 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, &
196 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, &
201 !..Lookup tables for cloud ice content (kg/m**3).
202 REAL, DIMENSION(ntb_i), PARAMETER, PRIVATE:: &
203 r_i = (/1.e-10,2.e-10,3.e-10,4.e-10, &
204 5.e-10,6.e-10,7.e-10,8.e-10,9.e-10, &
205 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, &
206 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, &
207 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, &
208 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, &
209 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, &
210 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, &
213 !..Lookup tables for rain content (kg/m**3).
214 REAL, DIMENSION(ntb_r), PARAMETER, PRIVATE:: &
215 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, &
216 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, &
217 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, &
218 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, &
221 !..Lookup tables for graupel content (kg/m**3).
222 REAL, DIMENSION(ntb_g), PARAMETER, PRIVATE:: &
223 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, &
224 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, &
225 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, &
228 !..Lookup tables for snow content (kg/m**3).
229 REAL, DIMENSION(ntb_s), PARAMETER, PRIVATE:: &
230 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, &
231 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, &
232 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, &
235 !..Lookup tables for rain y-intercept parameter (/m**4).
236 REAL, DIMENSION(ntb_r1), PARAMETER, PRIVATE:: &
237 N0r_exp = (/1.e6,2.e6,3.e6,4.e6,5.e6,6.e6,7.e6,8.e6,9.e6, &
238 1.e7,2.e7,3.e7,4.e7,5.e7,6.e7,7.e7,8.e7,9.e7, &
239 1.e8,2.e8,3.e8,4.e8,5.e8,6.e8,7.e8,8.e8,9.e8, &
240 1.e9,2.e9,3.e9,4.e9,5.e9,6.e9,7.e9,8.e9,9.e9, &
243 !..Lookup tables for graupel y-intercept parameter (/m**4).
244 REAL, DIMENSION(ntb_g1), PARAMETER, PRIVATE:: &
245 N0g_exp = (/1.e4,2.e4,3.e4,4.e4,5.e4,6.e4,7.e4,8.e4,9.e4, &
246 1.e5,2.e5,3.e5,4.e5,5.e5,6.e5,7.e5,8.e5,9.e5, &
247 1.e6,2.e6,3.e6,4.e6,5.e6,6.e6,7.e6,8.e6,9.e6, &
250 !..Lookup tables for ice number concentration (/m**3).
251 REAL, DIMENSION(ntb_i1), PARAMETER, PRIVATE:: &
252 Nt_i = (/1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0, &
253 1.e1,2.e1,3.e1,4.e1,5.e1,6.e1,7.e1,8.e1,9.e1, &
254 1.e2,2.e2,3.e2,4.e2,5.e2,6.e2,7.e2,8.e2,9.e2, &
255 1.e3,2.e3,3.e3,4.e3,5.e3,6.e3,7.e3,8.e3,9.e3, &
256 1.e4,2.e4,3.e4,4.e4,5.e4,6.e4,7.e4,8.e4,9.e4, &
257 1.e5,2.e5,3.e5,4.e5,5.e5,6.e5,7.e5,8.e5,9.e5, &
260 !..For snow moments conversions (from Field et al. 2005)
261 REAL, DIMENSION(10), PARAMETER, PRIVATE:: &
262 sa = (/ 5.065339, -0.062659, -3.032362, 0.029469, -0.000285, &
263 0.31255, 0.000204, 0.003199, 0.0, -0.015952/)
264 REAL, DIMENSION(10), PARAMETER, PRIVATE:: &
265 sb = (/ 0.476221, -0.015896, 0.165977, 0.007468, -0.000141, &
266 0.060366, 0.000079, 0.000594, 0.0, -0.003577/)
268 !..Temperatures (5 C interval 0 to -40) used in lookup tables.
269 REAL, DIMENSION(ntb_t), PARAMETER, PRIVATE:: &
270 Tc = (/-0.01, -5., -10., -15., -20., -25., -30., -35., -40./)
272 !..Lookup tables for various accretion/collection terms.
273 !.. ntb_x refers to the number of elements for rain, snow, graupel,
274 !.. and temperature array indices. Variables beginning with t-p/c/m/n
275 !.. represent lookup tables. Save compile-time memory by making
276 !.. allocatable (2009Jun12, J. Michalakes).
277 INTEGER, PARAMETER, PRIVATE:: R8SIZE = 8
278 REAL (KIND=R8SIZE), ALLOCATABLE, DIMENSION(:,:,:,:):: &
279 tcg_racg, tmr_racg, tcr_gacr, tmg_gacr, &
281 REAL (KIND=R8SIZE), ALLOCATABLE, DIMENSION(:,:,:,:):: &
282 tcs_racs1, tmr_racs1, tcs_racs2, tmr_racs2, &
283 tcr_sacr1, tms_sacr1, tcr_sacr2, tms_sacr2, &
284 tnr_racs1, tnr_racs2, tnr_sacr1, tnr_sacr2
285 REAL (KIND=R8SIZE), ALLOCATABLE, DIMENSION(:,:):: &
287 REAL (KIND=R8SIZE), ALLOCATABLE, DIMENSION(:,:,:):: &
288 tpi_qrfz, tpg_qrfz, tni_qrfz, tnr_qrfz
289 REAL (KIND=R8SIZE), ALLOCATABLE, DIMENSION(:,:):: &
290 tps_iaus, tni_iaus, tpi_ide
291 REAL (KIND=R8SIZE), ALLOCATABLE, DIMENSION(:,:):: t_Efrw
292 REAL (KIND=R8SIZE), ALLOCATABLE, DIMENSION(:,:):: t_Efsw
293 REAL (KIND=R8SIZE), ALLOCATABLE, DIMENSION(:,:,:):: tnr_rev
295 !..Variables holding a bunch of exponents and gamma values (cloud water,
296 !.. cloud ice, rain, snow, then graupel).
297 REAL, DIMENSION(3), PRIVATE:: cce, ccg
298 REAL, PRIVATE:: ocg1, ocg2
299 REAL, DIMENSION(7), PRIVATE:: cie, cig
300 REAL, PRIVATE:: oig1, oig2, obmi
301 REAL, DIMENSION(13), PRIVATE:: cre, crg
302 REAL, PRIVATE:: ore1, org1, org2, org3, obmr
303 REAL, DIMENSION(18), PRIVATE:: cse, csg
304 REAL, PRIVATE:: oams, obms, ocms
305 REAL, DIMENSION(12), PRIVATE:: cge, cgg
306 REAL, PRIVATE:: oge1, ogg1, ogg2, ogg3, oamg, obmg, ocmg
308 !..Declaration of precomputed constants in various rate eqns.
309 REAL:: t1_qr_qc, t1_qr_qi, t2_qr_qi, t1_qg_qc, t1_qs_qc, t1_qs_qi
310 REAL:: t1_qr_ev, t2_qr_ev
311 REAL:: t1_qs_sd, t2_qs_sd, t1_qg_sd, t2_qg_sd
312 REAL:: t1_qs_me, t2_qs_me, t1_qg_me, t2_qg_me
314 CHARACTER*256:: mp_debug
317 !+---+-----------------------------------------------------------------+
319 !+---+-----------------------------------------------------------------+
325 SUBROUTINE thompson_init
329 INTEGER:: i, j, k, m, n
332 !..Allocate space for lookup tables (J. Michalakes 2009Jun08).
335 if (.NOT. ALLOCATED(tcg_racg) ) then
336 ALLOCATE(tcg_racg(ntb_g1,ntb_g,ntb_r1,ntb_r))
340 if (.NOT. ALLOCATED(tmr_racg)) ALLOCATE(tmr_racg(ntb_g1,ntb_g,ntb_r1,ntb_r))
341 if (.NOT. ALLOCATED(tcr_gacr)) ALLOCATE(tcr_gacr(ntb_g1,ntb_g,ntb_r1,ntb_r))
342 if (.NOT. ALLOCATED(tmg_gacr)) ALLOCATE(tmg_gacr(ntb_g1,ntb_g,ntb_r1,ntb_r))
343 if (.NOT. ALLOCATED(tnr_racg)) ALLOCATE(tnr_racg(ntb_g1,ntb_g,ntb_r1,ntb_r))
344 if (.NOT. ALLOCATED(tnr_gacr)) ALLOCATE(tnr_gacr(ntb_g1,ntb_g,ntb_r1,ntb_r))
346 if (.NOT. ALLOCATED(tcs_racs1)) ALLOCATE(tcs_racs1(ntb_s,ntb_t,ntb_r1,ntb_r))
347 if (.NOT. ALLOCATED(tmr_racs1)) ALLOCATE(tmr_racs1(ntb_s,ntb_t,ntb_r1,ntb_r))
348 if (.NOT. ALLOCATED(tcs_racs2)) ALLOCATE(tcs_racs2(ntb_s,ntb_t,ntb_r1,ntb_r))
349 if (.NOT. ALLOCATED(tmr_racs2)) ALLOCATE(tmr_racs2(ntb_s,ntb_t,ntb_r1,ntb_r))
350 if (.NOT. ALLOCATED(tcr_sacr1)) ALLOCATE(tcr_sacr1(ntb_s,ntb_t,ntb_r1,ntb_r))
351 if (.NOT. ALLOCATED(tms_sacr1)) ALLOCATE(tms_sacr1(ntb_s,ntb_t,ntb_r1,ntb_r))
352 if (.NOT. ALLOCATED(tcr_sacr2)) ALLOCATE(tcr_sacr2(ntb_s,ntb_t,ntb_r1,ntb_r))
353 if (.NOT. ALLOCATED(tms_sacr2)) ALLOCATE(tms_sacr2(ntb_s,ntb_t,ntb_r1,ntb_r))
354 if (.NOT. ALLOCATED(tnr_racs1)) ALLOCATE(tnr_racs1(ntb_s,ntb_t,ntb_r1,ntb_r))
355 if (.NOT. ALLOCATED(tnr_racs2)) ALLOCATE(tnr_racs2(ntb_s,ntb_t,ntb_r1,ntb_r))
356 if (.NOT. ALLOCATED(tnr_sacr1)) ALLOCATE(tnr_sacr1(ntb_s,ntb_t,ntb_r1,ntb_r))
357 if (.NOT. ALLOCATED(tnr_sacr2)) ALLOCATE(tnr_sacr2(ntb_s,ntb_t,ntb_r1,ntb_r))
359 if (.NOT. ALLOCATED(tpi_qcfz)) ALLOCATE(tpi_qcfz(ntb_c,45))
360 if (.NOT. ALLOCATED(tni_qcfz)) ALLOCATE(tni_qcfz(ntb_c,45))
362 if (.NOT. ALLOCATED(tpi_qrfz)) ALLOCATE(tpi_qrfz(ntb_r,ntb_r1,45))
363 if (.NOT. ALLOCATED(tpg_qrfz)) ALLOCATE(tpg_qrfz(ntb_r,ntb_r1,45))
364 if (.NOT. ALLOCATED(tni_qrfz)) ALLOCATE(tni_qrfz(ntb_r,ntb_r1,45))
365 if (.NOT. ALLOCATED(tnr_qrfz)) ALLOCATE(tnr_qrfz(ntb_r,ntb_r1,45))
367 if (.NOT. ALLOCATED(tps_iaus)) ALLOCATE(tps_iaus(ntb_i,ntb_i1))
368 if (.NOT. ALLOCATED(tni_iaus)) ALLOCATE(tni_iaus(ntb_i,ntb_i1))
369 if (.NOT. ALLOCATED(tpi_ide)) ALLOCATE(tpi_ide(ntb_i,ntb_i1))
371 if (.NOT. ALLOCATED(t_Efrw)) ALLOCATE(t_Efrw(nbr,nbc))
372 if (.NOT. ALLOCATED(t_Efsw)) ALLOCATE(t_Efsw(nbs,nbc))
374 if (.NOT. ALLOCATED(tnr_rev)) ALLOCATE(tnr_rev(nbr, ntb_r1, ntb_r))
378 !..From Martin et al. (1994), assign gamma shape parameter mu for cloud
379 !.. drops according to general dispersion characteristics (disp=~0.25
380 !.. for Maritime and 0.45 for Continental).
381 !.. disp=SQRT((mu+2)/(mu+1) - 1) so mu varies from 15 for Maritime
382 !.. to 2 for really dirty air.
383 mu_c = MIN(15., (1000.E6/Nt_c + 2.))
385 !..Schmidt number to one-third used numerous times.
388 !..Compute min ice diam from mass, min snow/graupel mass from diam.
389 D0i = (xm0i/am_i)**(1./bm_i)
390 xm0s = am_s * D0s**bm_s
391 xm0g = am_g * D0g**bm_g
393 !..These constants various exponents and gamma() assoc with cloud,
394 !.. rain, snow, and graupel.
396 cce(2) = bm_r + mu_c + 1.
397 cce(3) = bm_r + mu_c + 4.
398 ccg(1) = WGAMMA(cce(1))
399 ccg(2) = WGAMMA(cce(2))
400 ccg(3) = WGAMMA(cce(3))
405 cie(2) = bm_i + mu_i + 1.
406 cie(3) = bm_i + mu_i + bv_i + 1.
407 cie(4) = mu_i + bv_i + 1.
409 cie(6) = bm_i*0.5 + mu_i + bv_i + 1.
410 cie(7) = bm_i*0.5 + mu_i + 1.
411 cig(1) = WGAMMA(cie(1))
412 cig(2) = WGAMMA(cie(2))
413 cig(3) = WGAMMA(cie(3))
414 cig(4) = WGAMMA(cie(4))
415 cig(5) = WGAMMA(cie(5))
416 cig(6) = WGAMMA(cie(6))
417 cig(7) = WGAMMA(cie(7))
424 cre(3) = bm_r + mu_r + 1.
425 cre(4) = bm_r*2. + mu_r + 1.
426 cre(5) = mu_r + bv_r + 1.
427 cre(6) = bm_r + mu_r + bv_r + 1.
428 cre(7) = bm_r*0.5 + mu_r + bv_r + 1.
429 cre(8) = bm_r + mu_r + bv_r + 3.
430 cre(9) = mu_r + bv_r + 3.
432 cre(11) = 0.5*(bv_r + 5. + 2.*mu_r)
433 cre(12) = bm_r*0.5 + mu_r + 1.
434 cre(13) = bm_r*2. + mu_r + bv_r + 1.
436 crg(n) = WGAMMA(cre(n))
447 cse(4) = bm_s + bv_s + 1.
448 cse(5) = bm_s*2. + bv_s + 1.
449 cse(6) = bm_s*2. + 1.
450 cse(7) = bm_s + mu_s + 1.
451 cse(8) = bm_s + mu_s + 2.
452 cse(9) = bm_s + mu_s + 3.
453 cse(10) = bm_s + mu_s + bv_s + 1.
454 cse(11) = bm_s*2. + mu_s + bv_s + 1.
455 cse(12) = bm_s*2. + mu_s + 1.
457 cse(14) = bm_s + bv_s
459 cse(16) = 1.0 + (1.0 + bv_s)/2.
460 cse(17) = cse(16) + mu_s + 1.
461 cse(18) = bv_s + mu_s + 3.
463 csg(n) = WGAMMA(cse(n))
471 cge(3) = bm_g + mu_g + 1.
472 cge(4) = bm_g*2. + mu_g + 1.
473 cge(5) = bm_g*2. + mu_g + bv_g + 1.
474 cge(6) = bm_g + mu_g + bv_g + 1.
475 cge(7) = bm_g + mu_g + bv_g + 2.
476 cge(8) = bm_g + mu_g + bv_g + 3.
477 cge(9) = mu_g + bv_g + 3.
479 cge(11) = 0.5*(bv_g + 5. + 2.*mu_g)
480 cge(12) = 0.5*(bv_g + 5.) + mu_g
482 cgg(n) = WGAMMA(cge(n))
492 !+---+-----------------------------------------------------------------+
493 !..Simplify various rate eqns the best we can now.
494 !+---+-----------------------------------------------------------------+
496 !..Rain collecting cloud water and cloud ice
497 t1_qr_qc = PI*.25*av_r * crg(9)
498 t1_qr_qi = PI*.25*av_r * crg(9)
499 t2_qr_qi = PI*.25*am_r*av_r * crg(8)
501 !..Graupel collecting cloud water
502 t1_qg_qc = PI*.25*av_g * cgg(9)
504 !..Snow collecting cloud water
505 t1_qs_qc = PI*.25*av_s
507 !..Snow collecting cloud ice
508 t1_qs_qi = PI*.25*av_s
510 !..Evaporation of rain; ignore depositional growth of rain.
511 t1_qr_ev = 0.78 * crg(10)
512 t2_qr_ev = 0.308*Sc3*SQRT(av_r) * crg(11)
514 !..Sublimation/depositional growth of snow
516 t2_qs_sd = 0.28*Sc3*SQRT(av_s)
519 t1_qs_me = PI*4.*C_sqrd*olfus * 0.86
520 t2_qs_me = PI*4.*C_sqrd*olfus * 0.28*Sc3*SQRT(av_s)
522 !..Sublimation/depositional growth of graupel
523 t1_qg_sd = 0.86 * cgg(10)
524 t2_qg_sd = 0.28*Sc3*SQRT(av_g) * cgg(11)
526 !..Melting of graupel
527 t1_qg_me = PI*4.*C_cube*olfus * 0.86 * cgg(10)
528 t2_qg_me = PI*4.*C_cube*olfus * 0.28*Sc3*SQRT(av_g) * cgg(11)
530 !..Constants for helping find lookup table indexes.
531 nic2 = NINT(ALOG10(r_c(1)))
532 nii2 = NINT(ALOG10(r_i(1)))
533 nii3 = NINT(ALOG10(Nt_i(1)))
534 nir2 = NINT(ALOG10(r_r(1)))
535 nir3 = NINT(ALOG10(N0r_exp(1)))
536 nis2 = NINT(ALOG10(r_s(1)))
537 nig2 = NINT(ALOG10(r_g(1)))
538 nig3 = NINT(ALOG10(N0g_exp(1)))
540 !..Create bins of cloud water (from min diameter up to 100 microns).
544 Dc(n) = Dc(n-1) + 1.0D-6
545 dtc(n) = (Dc(n) - Dc(n-1))
548 !..Create bins of cloud ice (from min diameter up to 5x min snow size).
550 xDx(nbi+1) = 5.0d0*D0s
552 xDx(n) = DEXP(DFLOAT(n-1)/DFLOAT(nbi) &
553 *DLOG(xDx(nbi+1)/xDx(1)) +DLOG(xDx(1)))
556 Di(n) = DSQRT(xDx(n)*xDx(n+1))
557 dti(n) = xDx(n+1) - xDx(n)
560 !..Create bins of rain (from min diameter up to 5 mm).
564 xDx(n) = DEXP(DFLOAT(n-1)/DFLOAT(nbr) &
565 *DLOG(xDx(nbr+1)/xDx(1)) +DLOG(xDx(1)))
568 Dr(n) = DSQRT(xDx(n)*xDx(n+1))
569 dtr(n) = xDx(n+1) - xDx(n)
572 !..Create bins of snow (from min diameter up to 2 cm).
576 xDx(n) = DEXP(DFLOAT(n-1)/DFLOAT(nbs) &
577 *DLOG(xDx(nbs+1)/xDx(1)) +DLOG(xDx(1)))
580 Ds(n) = DSQRT(xDx(n)*xDx(n+1))
581 dts(n) = xDx(n+1) - xDx(n)
584 !..Create bins of graupel (from min diameter up to 5 cm).
588 xDx(n) = DEXP(DFLOAT(n-1)/DFLOAT(nbg) &
589 *DLOG(xDx(nbg+1)/xDx(1)) +DLOG(xDx(1)))
592 Dg(n) = DSQRT(xDx(n)*xDx(n+1))
593 dtg(n) = xDx(n+1) - xDx(n)
596 !+---+-----------------------------------------------------------------+
597 !..Create lookup tables for most costly calculations.
598 !+---+-----------------------------------------------------------------+
604 tcg_racg(i,j,k,m) = 0.0d0
605 tmr_racg(i,j,k,m) = 0.0d0
606 tcr_gacr(i,j,k,m) = 0.0d0
607 tmg_gacr(i,j,k,m) = 0.0d0
608 tnr_racg(i,j,k,m) = 0.0d0
609 tnr_gacr(i,j,k,m) = 0.0d0
619 tcs_racs1(i,j,k,m) = 0.0d0
620 tmr_racs1(i,j,k,m) = 0.0d0
621 tcs_racs2(i,j,k,m) = 0.0d0
622 tmr_racs2(i,j,k,m) = 0.0d0
623 tcr_sacr1(i,j,k,m) = 0.0d0
624 tms_sacr1(i,j,k,m) = 0.0d0
625 tcr_sacr2(i,j,k,m) = 0.0d0
626 tms_sacr2(i,j,k,m) = 0.0d0
627 tnr_racs1(i,j,k,m) = 0.0d0
628 tnr_racs2(i,j,k,m) = 0.0d0
629 tnr_sacr1(i,j,k,m) = 0.0d0
630 tnr_sacr2(i,j,k,m) = 0.0d0
639 tpi_qrfz(i,j,k) = 0.0d0
640 tni_qrfz(i,j,k) = 0.0d0
641 tpg_qrfz(i,j,k) = 0.0d0
642 tnr_qrfz(i,j,k) = 0.0d0
646 tpi_qcfz(i,k) = 0.0d0
647 tni_qcfz(i,k) = 0.0d0
653 tps_iaus(i,j) = 0.0d0
654 tni_iaus(i,j) = 0.0d0
671 tnr_rev(i,j,k) = 0.0d0
676 CALL wrf_debug(150, 'CREATING MICROPHYSICS LOOKUP TABLES ... ')
677 WRITE (wrf_err_message, '(a, f5.2, a, f5.2, a, f5.2, a, f5.2)') &
678 ' using: mu_c=',mu_c,' mu_i=',mu_i,' mu_r=',mu_r,' mu_g=',mu_g
679 CALL wrf_debug(150, wrf_err_message)
681 !..Collision efficiency between rain/snow and cloud water.
682 CALL wrf_debug(200, ' creating qc collision eff tables')
687 ! CALL wrf_debug(200, ' creating rain evap table')
688 ! call table_dropEvap
690 !..Initialize various constants for computing radar reflectivity.
702 if (.not. iiwarm) then
704 !..Rain collecting graupel & graupel collecting rain.
705 CALL wrf_debug(200, ' creating rain collecting graupel table')
708 !..Rain collecting snow & snow collecting rain.
709 CALL wrf_debug(200, ' creating rain collecting snow table')
712 !..Cloud water and rain freezing (Bigg, 1953).
713 CALL wrf_debug(200, ' creating freezing of water drops table')
716 !..Conversion of some ice mass into snow category.
717 CALL wrf_debug(200, ' creating ice converting to snow table')
722 CALL wrf_debug(150, ' ... DONE microphysical lookup tables')
726 END SUBROUTINE thompson_init
727 !+---+-----------------------------------------------------------------+
729 !+---+-----------------------------------------------------------------+
730 !..This is a wrapper routine designed to transfer values from 3D to 1D.
731 !+---+-----------------------------------------------------------------+
732 SUBROUTINE mp_gt_driver(qv, qc, qr, qi, qs, qg, ni, nr, &
733 th, pii, p, dz, dt_in, itimestep, &
736 GRAUPELNC, GRAUPELNCV, SR, &
738 rainprod, evapprod, &
740 ! refl_10cm, grid_clock, grid_alarms, &
741 ids,ide, jds,jde, kds,kde, & ! domain dims
742 ims,ime, jms,jme, kms,kme, & ! memory dims
743 its,ite, jts,jte, kts,kte) ! tile dims
747 !..Subroutine arguments
748 INTEGER, INTENT(IN):: ids,ide, jds,jde, kds,kde, &
749 ims,ime, jms,jme, kms,kme, &
750 its,ite, jts,jte, kts,kte
751 REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT):: &
752 qv, qc, qr, qi, qs, qg, ni, nr, th
754 REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT):: &
757 REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN):: &
759 REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT):: &
761 REAL, DIMENSION(ims:ime, jms:jme), OPTIONAL, INTENT(INOUT):: &
762 SNOWNC, SNOWNCV, GRAUPELNC, GRAUPELNCV
763 ! REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(INOUT):: &
765 REAL, INTENT(IN):: dt_in
766 INTEGER, INTENT(IN):: itimestep
768 ! TYPE (WRFU_Clock):: grid_clock
769 ! TYPE (WRFU_Alarm), POINTER:: grid_alarms(:)
772 REAL, DIMENSION(kts:kte):: &
773 qv1d, qc1d, qi1d, qr1d, qs1d, qg1d, ni1d, &
774 nr1d, t1d, p1d, dz1d, dBZ
776 REAL, DIMENSION(kts:kte):: &
777 rainprod1d, evapprod1d
779 REAL, DIMENSION(its:ite, jts:jte):: pcp_ra, pcp_sn, pcp_gr, pcp_ic
780 REAL:: dt, pptrain, pptsnow, pptgraul, pptice
781 REAL:: qc_max, qr_max, qs_max, qi_max, qg_max, ni_max, nr_max
783 INTEGER:: imax_qc,imax_qr,imax_qi,imax_qs,imax_qg,imax_ni,imax_nr
784 INTEGER:: jmax_qc,jmax_qr,jmax_qi,jmax_qs,jmax_qg,jmax_ni,jmax_nr
785 INTEGER:: kmax_qc,kmax_qr,kmax_qi,kmax_qs,kmax_qg,kmax_ni,kmax_nr
786 INTEGER:: i_start, j_start, i_end, j_end
792 ! if ( Is_alarm_tstep(grid_clock, grid_alarms(HISTORY_ALARM)) ) then
801 !..For idealized testing by developer.
802 ! if ( (ide-ids+1).gt.4 .and. (jde-jds+1).lt.4 .and. &
803 ! ids.eq.its.and.ide.eq.ite.and.jds.eq.jts.and.jde.eq.jte) then
841 mp_debug(i:i) = char(0)
844 j_loop: do j = j_start, j_end
845 i_loop: do i = i_start, i_end
852 IF ( PRESENT (snowncv) ) THEN
855 IF ( PRESENT (graupelncv) ) THEN
861 t1d(k) = th(i,k,j)*pii(i,k,j)
874 call mp_thompson(qv1d, qc1d, qi1d, qr1d, qs1d, qg1d, ni1d, &
875 nr1d, t1d, p1d, dz1d, &
876 pptrain, pptsnow, pptgraul, pptice, &
878 rainprod1d, evapprod1d, &
882 pcp_ra(i,j) = pptrain
883 pcp_sn(i,j) = pptsnow
884 pcp_gr(i,j) = pptgraul
886 RAINNCV(i,j) = pptrain + pptsnow + pptgraul + pptice
887 RAINNC(i,j) = RAINNC(i,j) + pptrain + pptsnow + pptgraul + pptice
888 IF ( PRESENT(snowncv) .AND. PRESENT(snownc) ) THEN
889 SNOWNCV(i,j) = pptsnow + pptice
890 SNOWNC(i,j) = SNOWNC(i,j) + pptsnow + pptice
892 IF ( PRESENT(graupelncv) .AND. PRESENT(graupelnc) ) THEN
893 GRAUPELNCV(i,j) = pptgraul
894 GRAUPELNC(i,j) = GRAUPELNC(i,j) + pptgraul
896 SR(i,j) = (pptsnow + pptgraul + pptice)/(RAINNCV(i,j)+1.e-12)
908 rainprod(i,k,j) = rainprod1d(k)
909 evapprod(i,k,j) = evapprod1d(k)
911 th(i,k,j) = t1d(k)/pii(i,k,j)
912 if (qc1d(k) .gt. qc_max) then
917 elseif (qc1d(k) .lt. 0.0) then
918 write(mp_debug,*) 'WARNING, negative qc ', qc1d(k), &
920 CALL wrf_debug(150, mp_debug)
922 if (qr1d(k) .gt. qr_max) then
927 elseif (qr1d(k) .lt. 0.0) then
928 write(mp_debug,*) 'WARNING, negative qr ', qr1d(k), &
930 CALL wrf_debug(150, mp_debug)
932 if (nr1d(k) .gt. nr_max) then
937 elseif (nr1d(k) .lt. 0.0) then
938 write(mp_debug,*) 'WARNING, negative nr ', nr1d(k), &
940 CALL wrf_debug(150, mp_debug)
942 if (qs1d(k) .gt. qs_max) then
947 elseif (qs1d(k) .lt. 0.0) then
948 write(mp_debug,*) 'WARNING, negative qs ', qs1d(k), &
950 CALL wrf_debug(150, mp_debug)
952 if (qi1d(k) .gt. qi_max) then
957 elseif (qi1d(k) .lt. 0.0) then
958 write(mp_debug,*) 'WARNING, negative qi ', qi1d(k), &
960 CALL wrf_debug(150, mp_debug)
962 if (qg1d(k) .gt. qg_max) then
967 elseif (qg1d(k) .lt. 0.0) then
968 write(mp_debug,*) 'WARNING, negative qg ', qg1d(k), &
970 CALL wrf_debug(150, mp_debug)
972 if (ni1d(k) .gt. ni_max) then
977 elseif (ni1d(k) .lt. 0.0) then
978 write(mp_debug,*) 'WARNING, negative ni ', ni1d(k), &
980 CALL wrf_debug(150, mp_debug)
982 if (qv1d(k) .lt. 0.0) then
983 if (k.lt.kte-2 .and. k.gt.kts+1) then
984 qv(i,k,j) = 0.5*(qv(i,k-1,j) + qv(i,k+1,j))
988 write(mp_debug,*) 'WARNING, negative qv ', qv1d(k), &
990 CALL wrf_debug(150, mp_debug)
994 ! if (dBZ_tstep) then
995 ! call calc_refl10cm (qv1d, qc1d, qr1d, nr1d, qs1d, qg1d, &
996 ! t1d, p1d, dBZ, kts, kte, i, j)
998 ! refl_10cm(i,k,j) = MAX(-35., dBZ(k))
1006 write(mp_debug,'(a,7(a,e13.6,1x,a,i3,a,i3,a,i3,a,1x))') 'MP-GT:', &
1007 'qc: ', qc_max, '(', imax_qc, ',', jmax_qc, ',', kmax_qc, ')', &
1008 'qr: ', qr_max, '(', imax_qr, ',', jmax_qr, ',', kmax_qr, ')', &
1009 'qi: ', qi_max, '(', imax_qi, ',', jmax_qi, ',', kmax_qi, ')', &
1010 'qs: ', qs_max, '(', imax_qs, ',', jmax_qs, ',', kmax_qs, ')', &
1011 'qg: ', qg_max, '(', imax_qg, ',', jmax_qg, ',', kmax_qg, ')', &
1012 'ni: ', ni_max, '(', imax_ni, ',', jmax_ni, ',', kmax_ni, ')', &
1013 'nr: ', nr_max, '(', imax_nr, ',', jmax_nr, ',', kmax_nr, ')'
1014 CALL wrf_debug(150, mp_debug)
1018 mp_debug(i:i) = char(0)
1021 END SUBROUTINE mp_gt_driver
1023 !+---+-----------------------------------------------------------------+
1025 !+---+-----------------------------------------------------------------+
1026 !+---+-----------------------------------------------------------------+
1027 !.. This subroutine computes the moisture tendencies of water vapor,
1028 !.. cloud droplets, rain, cloud ice (pristine), snow, and graupel.
1029 !.. Previously this code was based on Reisner et al (1998), but few of
1030 !.. those pieces remain. A complete description is now found in
1031 !.. Thompson et al. (2004, 2008).
1032 !+---+-----------------------------------------------------------------+
1034 subroutine mp_thompson (qv1d, qc1d, qi1d, qr1d, qs1d, qg1d, ni1d, &
1035 nr1d, t1d, p1d, dzq, &
1036 pptrain, pptsnow, pptgraul, pptice, &
1038 rainprod, evapprod, &
1040 kts, kte, dt, ii, jj)
1045 INTEGER, INTENT(IN):: kts, kte, ii, jj
1046 REAL, DIMENSION(kts:kte), INTENT(INOUT):: &
1047 qv1d, qc1d, qi1d, qr1d, qs1d, qg1d, ni1d, &
1050 REAL, DIMENSION(kts:kte), INTENT(INOUT):: &
1053 REAL, DIMENSION(kts:kte), INTENT(IN):: dzq
1054 REAL, INTENT(INOUT):: pptrain, pptsnow, pptgraul, pptice
1055 REAL, INTENT(IN):: dt
1058 REAL, DIMENSION(kts:kte):: tten, qvten, qcten, qiten, &
1059 qrten, qsten, qgten, niten, nrten
1061 DOUBLE PRECISION, DIMENSION(kts:kte):: prw_vcd
1063 DOUBLE PRECISION, DIMENSION(kts:kte):: prr_wau, prr_rcw, prr_rcs, &
1064 prr_rcg, prr_sml, prr_gml, &
1066 pnr_wau, pnr_rcs, pnr_rcg, &
1067 pnr_rci, pnr_sml, pnr_gml, &
1068 pnr_rev, pnr_rcr, pnr_rfz
1070 DOUBLE PRECISION, DIMENSION(kts:kte):: pri_inu, pni_inu, pri_ihm, &
1071 pni_ihm, pri_wfz, pni_wfz, &
1072 pri_rfz, pni_rfz, pri_ide, &
1073 pni_ide, pri_rci, pni_rci, &
1076 DOUBLE PRECISION, DIMENSION(kts:kte):: prs_iau, prs_sci, prs_rcs, &
1077 prs_scw, prs_sde, prs_ihm, &
1080 DOUBLE PRECISION, DIMENSION(kts:kte):: prg_scw, prg_rfz, prg_gde, &
1081 prg_gcw, prg_rci, prg_rcs, &
1084 DOUBLE PRECISION, PARAMETER:: zeroD0 = 0.0d0
1086 REAL, DIMENSION(kts:kte):: temp, pres, qv
1087 REAL, DIMENSION(kts:kte):: rc, ri, rr, rs, rg, ni, nr
1088 REAL, DIMENSION(kts:kte):: rho, rhof, rhof2
1089 REAL, DIMENSION(kts:kte):: qvs, qvsi
1090 REAL, DIMENSION(kts:kte):: satw, sati, ssatw, ssati
1091 REAL, DIMENSION(kts:kte):: diffu, visco, vsc2, &
1092 tcond, lvap, ocp, lvt2
1094 DOUBLE PRECISION, DIMENSION(kts:kte):: ilamr, ilamg, N0_r, N0_g
1095 REAL, DIMENSION(kts:kte):: mvd_r, mvd_c
1096 REAL, DIMENSION(kts:kte):: smob, smo2, smo1, smo0, &
1097 smoc, smod, smoe, smof
1099 REAL, DIMENSION(kts:kte):: sed_r, sed_s, sed_g, sed_i, sed_n
1101 REAL:: rgvm, delta_tp, orho, lfus2
1102 REAL, DIMENSION(4):: onstep
1103 DOUBLE PRECISION:: N0_exp, N0_min, lam_exp, lamc, lamr, lamg
1104 DOUBLE PRECISION:: lami, ilami
1105 REAL:: xDc, Dc_b, Dc_g, xDi, xDr, xDs, xDg, Ds_m, Dg_m
1106 DOUBLE PRECISION:: Dr_star
1107 REAL:: zeta1, zeta, taud, tau
1108 REAL:: stoke_r, stoke_s, stoke_g, stoke_i
1109 REAL:: vti, vtr, vts, vtg
1110 REAL, DIMENSION(kts:kte+1):: vtik, vtnik, vtrk, vtnrk, vtsk, vtgk
1111 REAL, DIMENSION(kts:kte):: vts_boost
1112 REAL:: Mrat, ils1, ils2, t1_vts, t2_vts, t3_vts, t4_vts, C_snow
1113 REAL:: a_, b_, loga_, A1, A2, tf
1114 REAL:: tempc, tc0, r_mvd1, r_mvd2, xkrat
1115 REAL:: xnc, xri, xni, xmi, oxmi, xrc, xrr, xnr
1116 REAL:: xsat, rate_max, sump, ratio
1117 REAL:: clap, fcd, dfcd
1118 REAL:: otemp, rvs, rvs_p, rvs_pp, gamsc, alphsc, t1_evap, t1_subl
1119 REAL:: r_frac, g_frac
1120 REAL:: Ef_rw, Ef_sw, Ef_gw, Ef_rr
1121 REAL:: dtsave, odts, odt, odzq
1122 REAL:: xslw1, ygra1, zans1
1123 INTEGER:: i, k, k2, n, nn, nstep, k_0, kbot, IT, iexfrq
1124 INTEGER, DIMENSION(4):: ksed1
1125 INTEGER:: nir, nis, nig, nii, nic
1126 INTEGER:: idx_tc, idx_t, idx_s, idx_g1, idx_g, idx_r1, idx_r, &
1127 idx_i1, idx_i, idx_c, idx, idx_d
1128 LOGICAL:: melti, no_micro
1129 LOGICAL, DIMENSION(kts:kte):: L_qc, L_qi, L_qr, L_qs, L_qg
1130 LOGICAL:: debug_flag
1134 debug_flag = .false.
1135 ! if (ii.eq.315 .and. jj.eq.2) debug_flag = .true.
1143 !+---+-----------------------------------------------------------------+
1144 !.. Source/sink terms. First 2 chars: "pr" represents source/sink of
1145 !.. mass while "pn" represents source/sink of number. Next char is one
1146 !.. of "v" for water vapor, "r" for rain, "i" for cloud ice, "w" for
1147 !.. cloud water, "s" for snow, and "g" for graupel. Next chars
1148 !.. represent processes: "de" for sublimation/deposition, "ev" for
1149 !.. evaporation, "fz" for freezing, "ml" for melting, "au" for
1150 !.. autoconversion, "nu" for ice nucleation, "hm" for Hallet/Mossop
1151 !.. secondary ice production, and "c" for collection followed by the
1152 !.. character for the species being collected. ALL of these terms are
1153 !.. positive (except for deposition/sublimation terms which can switch
1154 !.. signs based on super/subsaturation) and are treated as negatives
1155 !.. where necessary in the tendency equations.
1156 !+---+-----------------------------------------------------------------+
1228 !+---+-----------------------------------------------------------------+
1229 !..Put column of data into local arrays.
1230 !+---+-----------------------------------------------------------------+
1233 qv(k) = MAX(1.E-10, qv1d(k))
1235 rho(k) = 0.622*pres(k)/(R*temp(k)*(qv(k)+0.622))
1236 if (qc1d(k) .gt. R1) then
1238 rc(k) = qc1d(k)*rho(k)
1245 if (qi1d(k) .gt. R1) then
1247 ri(k) = qi1d(k)*rho(k)
1248 ni(k) = MAX(R2, ni1d(k)*rho(k))
1250 lami = (am_i*cig(2)*oig1*ni(k)/ri(k))**obmi
1252 xDi = (bm_i + mu_i + 1.) * ilami
1253 if (xDi.lt. 20.E-6) then
1254 lami = cie(2)/20.E-6
1255 ni(k) = MIN(250.D3, cig(1)*oig2*ri(k)/am_i*lami**bm_i)
1256 elseif (xDi.gt. 300.E-6) then
1257 lami = cie(2)/300.E-6
1258 ni(k) = cig(1)*oig2*ri(k)/am_i*lami**bm_i
1268 if (qr1d(k) .gt. R1) then
1270 rr(k) = qr1d(k)*rho(k)
1271 nr(k) = MAX(R2, nr1d(k)*rho(k))
1273 lamr = (am_r*crg(3)*org2*nr(k)/rr(k))**obmr
1274 mvd_r(k) = (3.0 + mu_r + 0.672) / lamr
1275 if (mvd_r(k) .gt. 2.5E-3) then
1277 lamr = (3.0 + mu_r + 0.672) / mvd_r(k)
1278 nr(k) = crg(2)*org3*rr(k)*lamr**bm_r / am_r
1279 elseif (mvd_r(k) .lt. D0r*0.75) then
1281 lamr = (3.0 + mu_r + 0.672) / mvd_r(k)
1282 nr(k) = crg(2)*org3*rr(k)*lamr**bm_r / am_r
1291 if (qs1d(k) .gt. R1) then
1293 rs(k) = qs1d(k)*rho(k)
1300 if (qg1d(k) .gt. R1) then
1302 rg(k) = qg1d(k)*rho(k)
1312 !+---+-----------------------------------------------------------------+
1313 !..Derive various thermodynamic variables frequently used.
1314 !.. Saturation vapor pressure (mixing ratio) over liquid/ice comes from
1315 !.. Flatau et al. 1992; enthalpy (latent heat) of vaporization from
1316 !.. Bohren & Albrecht 1998; others from Pruppacher & Klett 1978.
1317 !+---+-----------------------------------------------------------------+
1319 tempc = temp(k) - 273.15
1320 rhof(k) = SQRT(RHO_NOT/rho(k))
1321 rhof2(k) = SQRT(rhof(k))
1322 qvs(k) = rslf(pres(k), temp(k))
1323 if (tempc .le. 0.0) then
1324 qvsi(k) = rsif(pres(k), temp(k))
1328 satw(k) = qv(k)/qvs(k)
1329 sati(k) = qv(k)/qvsi(k)
1330 ssatw(k) = satw(k) - 1.
1331 ssati(k) = sati(k) - 1.
1332 if (abs(ssatw(k)).lt. eps) ssatw(k) = 0.0
1333 if (abs(ssati(k)).lt. eps) ssati(k) = 0.0
1334 if (no_micro .and. ssati(k).gt. 0.0) no_micro = .false.
1335 diffu(k) = 2.11E-5*(temp(k)/273.15)**1.94 * (101325./pres(k))
1336 if (tempc .ge. 0.0) then
1337 visco(k) = (1.718+0.0049*tempc)*1.0E-5
1339 visco(k) = (1.718+0.0049*tempc-1.2E-5*tempc*tempc)*1.0E-5
1341 ocp(k) = 1./(Cp*(1.+0.887*qv(k)))
1342 vsc2(k) = SQRT(rho(k)/visco(k))
1343 lvap(k) = lvap0 + (2106.0 - 4218.0)*tempc
1344 tcond(k) = (5.69 + 0.0168*tempc)*1.0E-5 * 418.936
1347 !+---+-----------------------------------------------------------------+
1348 !..If no existing hydrometeor species and no chance to initiate ice or
1349 !.. condense cloud water, just exit quickly!
1350 !+---+-----------------------------------------------------------------+
1352 if (no_micro) return
1354 !+---+-----------------------------------------------------------------+
1355 !..Calculate y-intercept, slope, and useful moments for snow.
1356 !+---+-----------------------------------------------------------------+
1357 if (.not. iiwarm) then
1359 if (.not. L_qs(k)) CYCLE
1360 tc0 = MIN(-0.1, temp(k)-273.15)
1361 smob(k) = rs(k)*oams
1363 !..All other moments based on reference, 2nd moment. If bm_s.ne.2,
1364 !.. then we must compute actual 2nd moment and use as reference.
1365 if (bm_s.gt.(2.0-1.e-3) .and. bm_s.lt.(2.0+1.e-3)) then
1368 loga_ = sa(1) + sa(2)*tc0 + sa(3)*bm_s &
1369 + sa(4)*tc0*bm_s + sa(5)*tc0*tc0 &
1370 + sa(6)*bm_s*bm_s + sa(7)*tc0*tc0*bm_s &
1371 + sa(8)*tc0*bm_s*bm_s + sa(9)*tc0*tc0*tc0 &
1372 + sa(10)*bm_s*bm_s*bm_s
1374 b_ = sb(1) + sb(2)*tc0 + sb(3)*bm_s &
1375 + sb(4)*tc0*bm_s + sb(5)*tc0*tc0 &
1376 + sb(6)*bm_s*bm_s + sb(7)*tc0*tc0*bm_s &
1377 + sb(8)*tc0*bm_s*bm_s + sb(9)*tc0*tc0*tc0 &
1378 + sb(10)*bm_s*bm_s*bm_s
1379 smo2(k) = (smob(k)/a_)**(1./b_)
1382 !..Calculate 0th moment. Represents snow number concentration.
1383 loga_ = sa(1) + sa(2)*tc0 + sa(5)*tc0*tc0 + sa(9)*tc0*tc0*tc0
1385 b_ = sb(1) + sb(2)*tc0 + sb(5)*tc0*tc0 + sb(9)*tc0*tc0*tc0
1386 smo0(k) = a_ * smo2(k)**b_
1388 !..Calculate 1st moment. Useful for depositional growth and melting.
1389 loga_ = sa(1) + sa(2)*tc0 + sa(3) &
1390 + sa(4)*tc0 + sa(5)*tc0*tc0 &
1391 + sa(6) + sa(7)*tc0*tc0 &
1392 + sa(8)*tc0 + sa(9)*tc0*tc0*tc0 &
1395 b_ = sb(1)+ sb(2)*tc0 + sb(3) + sb(4)*tc0 &
1396 + sb(5)*tc0*tc0 + sb(6) &
1397 + sb(7)*tc0*tc0 + sb(8)*tc0 &
1398 + sb(9)*tc0*tc0*tc0 + sb(10)
1399 smo1(k) = a_ * smo2(k)**b_
1401 !..Calculate bm_s+1 (th) moment. Useful for diameter calcs.
1402 loga_ = sa(1) + sa(2)*tc0 + sa(3)*cse(1) &
1403 + sa(4)*tc0*cse(1) + sa(5)*tc0*tc0 &
1404 + sa(6)*cse(1)*cse(1) + sa(7)*tc0*tc0*cse(1) &
1405 + sa(8)*tc0*cse(1)*cse(1) + sa(9)*tc0*tc0*tc0 &
1406 + sa(10)*cse(1)*cse(1)*cse(1)
1408 b_ = sb(1)+ sb(2)*tc0 + sb(3)*cse(1) + sb(4)*tc0*cse(1) &
1409 + sb(5)*tc0*tc0 + sb(6)*cse(1)*cse(1) &
1410 + sb(7)*tc0*tc0*cse(1) + sb(8)*tc0*cse(1)*cse(1) &
1411 + sb(9)*tc0*tc0*tc0 + sb(10)*cse(1)*cse(1)*cse(1)
1412 smoc(k) = a_ * smo2(k)**b_
1414 !..Calculate bv_s+2 (th) moment. Useful for riming.
1415 loga_ = sa(1) + sa(2)*tc0 + sa(3)*cse(13) &
1416 + sa(4)*tc0*cse(13) + sa(5)*tc0*tc0 &
1417 + sa(6)*cse(13)*cse(13) + sa(7)*tc0*tc0*cse(13) &
1418 + sa(8)*tc0*cse(13)*cse(13) + sa(9)*tc0*tc0*tc0 &
1419 + sa(10)*cse(13)*cse(13)*cse(13)
1421 b_ = sb(1)+ sb(2)*tc0 + sb(3)*cse(13) + sb(4)*tc0*cse(13) &
1422 + sb(5)*tc0*tc0 + sb(6)*cse(13)*cse(13) &
1423 + sb(7)*tc0*tc0*cse(13) + sb(8)*tc0*cse(13)*cse(13) &
1424 + sb(9)*tc0*tc0*tc0 + sb(10)*cse(13)*cse(13)*cse(13)
1425 smoe(k) = a_ * smo2(k)**b_
1427 !..Calculate 1+(bv_s+1)/2 (th) moment. Useful for depositional growth.
1428 loga_ = sa(1) + sa(2)*tc0 + sa(3)*cse(16) &
1429 + sa(4)*tc0*cse(16) + sa(5)*tc0*tc0 &
1430 + sa(6)*cse(16)*cse(16) + sa(7)*tc0*tc0*cse(16) &
1431 + sa(8)*tc0*cse(16)*cse(16) + sa(9)*tc0*tc0*tc0 &
1432 + sa(10)*cse(16)*cse(16)*cse(16)
1434 b_ = sb(1)+ sb(2)*tc0 + sb(3)*cse(16) + sb(4)*tc0*cse(16) &
1435 + sb(5)*tc0*tc0 + sb(6)*cse(16)*cse(16) &
1436 + sb(7)*tc0*tc0*cse(16) + sb(8)*tc0*cse(16)*cse(16) &
1437 + sb(9)*tc0*tc0*tc0 + sb(10)*cse(16)*cse(16)*cse(16)
1438 smof(k) = a_ * smo2(k)**b_
1442 !+---+-----------------------------------------------------------------+
1443 !..Calculate y-intercept, slope values for graupel.
1444 !+---+-----------------------------------------------------------------+
1447 if (temp(k).lt.270.65 .and. L_qr(k) .and. mvd_r(k).gt.100.E-6) then
1448 xslw1 = 4.01 + alog10(mvd_r(k))
1452 ygra1 = 4.31 + alog10(max(5.E-5, rg(k)))
1453 zans1 = 3.0 + (100./(300.*xslw1*ygra1/(10./xslw1+1.+0.25*ygra1)+30.+5.*ygra1))
1454 N0_exp = 10.**(zans1)
1455 N0_exp = MAX(DBLE(gonv_min), MIN(N0_exp, DBLE(gonv_max)))
1456 N0_min = MIN(N0_exp, N0_min)
1458 lam_exp = (N0_exp*am_g*cgg(1)/rg(k))**oge1
1459 lamg = lam_exp * (cgg(3)*ogg2*ogg1)**obmg
1461 N0_g(k) = N0_exp/(cgg(2)*lam_exp) * lamg**cge(2)
1462 !+---+-----------------------------------------------------------------+
1463 ! if( debug_flag .and. k.lt.42) then
1464 ! if (k.eq.41) write(mp_debug,*) 'DEBUG-GT: K, zans1, rc, rr, rg, N0_g'
1465 ! if (k.eq.41) CALL wrf_debug(0, mp_debug)
1466 ! write(mp_debug, 'a, i2, 1x, f6.3, 1x, 4(1x,e13.6,1x)') &
1467 ! ' GT ', k, zans1, rc(k), rr(k), rg(k), N0_g(k)
1468 ! CALL wrf_debug(0, mp_debug)
1470 !+---+-----------------------------------------------------------------+
1475 !+---+-----------------------------------------------------------------+
1476 !..Calculate y-intercept, slope values for rain.
1477 !+---+-----------------------------------------------------------------+
1479 lamr = (am_r*crg(3)*org2*nr(k)/rr(k))**obmr
1481 mvd_r(k) = (3.0 + mu_r + 0.672) / lamr
1482 N0_r(k) = nr(k)*org2*lamr**cre(2)
1485 !+---+-----------------------------------------------------------------+
1486 !..Compute warm-rain process terms (except evap done later).
1487 !+---+-----------------------------------------------------------------+
1491 !..Rain self-collection follows Seifert, 1994 and drop break-up
1492 !.. follows Verlinde and Cotton, 1993. RAIN2M
1493 if (L_qr(k) .and. mvd_r(k).gt. D0r) then
1495 if (mvd_r(k) .gt. 1750.0E-6) then
1496 Ef_rr = 2.0 - EXP(2300.0*(mvd_r(k)-1750.0E-6))
1498 pnr_rcr(k) = Ef_rr * 4.*nr(k)*rr(k)
1502 if (.not. L_qc(k)) CYCLE
1503 xDc = MAX(D0c*1.E6, ((rc(k)/(am_r*Nt_c))**obmr) * 1.E6)
1504 lamc = (Nt_c*am_r* ccg(2) * ocg1 / rc(k))**obmr
1505 mvd_c(k) = (3.0+mu_c+0.672) / lamc
1507 !..Autoconversion follows Berry & Reinhardt (1974) with characteristic
1508 !.. diameters correctly computed from gamma distrib of cloud droplets.
1509 if (rc(k).gt. 0.01e-3) then
1510 Dc_g = ((ccg(3)*ocg2)**obmr / lamc) * 1.E6
1511 Dc_b = (xDc*xDc*xDc*Dc_g*Dc_g*Dc_g - xDc*xDc*xDc*xDc*xDc*xDc) &
1513 zeta1 = 0.5*((6.25E-6*xDc*Dc_b*Dc_b*Dc_b - 0.4) &
1514 + abs(6.25E-6*xDc*Dc_b*Dc_b*Dc_b - 0.4))
1515 zeta = 0.027*rc(k)*zeta1
1516 taud = 0.5*((0.5*Dc_b - 7.5) + abs(0.5*Dc_b - 7.5)) + R1
1517 tau = 3.72/(rc(k)*taud)
1518 prr_wau(k) = zeta/tau
1519 prr_wau(k) = MIN(DBLE(rc(k)*odts), prr_wau(k))
1520 pnr_wau(k) = prr_wau(k) / (am_r*mu_c*D0r*D0r*D0r) ! RAIN2M
1523 !..Rain collecting cloud water. In CE, assume Dc<<Dr and vtc=~0.
1524 if (L_qr(k) .and. mvd_r(k).gt. D0r .and. mvd_c(k).gt. D0c) then
1526 idx = 1 + INT(nbr*DLOG(mvd_r(k)/Dr(1))/DLOG(Dr(nbr)/Dr(1)))
1528 Ef_rw = t_Efrw(idx, INT(mvd_c(k)*1.E6))
1529 prr_rcw(k) = rhof(k)*t1_qr_qc*Ef_rw*rc(k)*N0_r(k) &
1530 *((lamr+fv_r)**(-cre(9)))
1531 prr_rcw(k) = MIN(DBLE(rc(k)*odts), prr_rcw(k))
1535 !+---+-----------------------------------------------------------------+
1536 !..Compute all frozen hydrometeor species' process terms.
1537 !+---+-----------------------------------------------------------------+
1538 if (.not. iiwarm) then
1542 !..Temperature lookup table indexes.
1543 tempc = temp(k) - 273.15
1544 idx_tc = MAX(1, MIN(NINT(-tempc), 45) )
1545 idx_t = INT( (tempc-2.5)/5. ) - 1
1546 idx_t = MAX(1, -idx_t)
1547 idx_t = MIN(idx_t, ntb_t)
1548 IT = MAX(1, MIN(NINT(-tempc), 31) )
1550 !..Cloud water lookup table index.
1551 if (rc(k).gt. r_c(1)) then
1552 nic = NINT(ALOG10(rc(k)))
1553 do nn = nic-1, nic+1
1555 if ( (rc(k)/10.**nn).ge.1.0 .and. &
1556 (rc(k)/10.**nn).lt.10.0) goto 141
1559 idx_c = INT(rc(k)/10.**n) + 10*(n-nic2) - (n-nic2)
1560 idx_c = MAX(1, MIN(idx_c, ntb_c))
1565 !..Cloud ice lookup table indexes.
1566 if (ri(k).gt. r_i(1)) then
1567 nii = NINT(ALOG10(ri(k)))
1568 do nn = nii-1, nii+1
1570 if ( (ri(k)/10.**nn).ge.1.0 .and. &
1571 (ri(k)/10.**nn).lt.10.0) goto 142
1574 idx_i = INT(ri(k)/10.**n) + 10*(n-nii2) - (n-nii2)
1575 idx_i = MAX(1, MIN(idx_i, ntb_i))
1580 if (ni(k).gt. Nt_i(1)) then
1581 nii = NINT(ALOG10(ni(k)))
1582 do nn = nii-1, nii+1
1584 if ( (ni(k)/10.**nn).ge.1.0 .and. &
1585 (ni(k)/10.**nn).lt.10.0) goto 143
1588 idx_i1 = INT(ni(k)/10.**n) + 10*(n-nii3) - (n-nii3)
1589 idx_i1 = MAX(1, MIN(idx_i1, ntb_i1))
1594 !..Rain lookup table indexes.
1595 if (rr(k).gt. r_r(1)) then
1596 nir = NINT(ALOG10(rr(k)))
1597 do nn = nir-1, nir+1
1599 if ( (rr(k)/10.**nn).ge.1.0 .and. &
1600 (rr(k)/10.**nn).lt.10.0) goto 144
1603 idx_r = INT(rr(k)/10.**n) + 10*(n-nir2) - (n-nir2)
1604 idx_r = MAX(1, MIN(idx_r, ntb_r))
1607 lam_exp = lamr * (crg(3)*org2*org1)**bm_r
1608 N0_exp = org1*rr(k)/am_r * lam_exp**cre(1)
1609 nir = NINT(DLOG10(N0_exp))
1610 do nn = nir-1, nir+1
1612 if ( (N0_exp/10.**nn).ge.1.0 .and. &
1613 (N0_exp/10.**nn).lt.10.0) goto 145
1616 idx_r1 = INT(N0_exp/10.**n) + 10*(n-nir3) - (n-nir3)
1617 idx_r1 = MAX(1, MIN(idx_r1, ntb_r1))
1623 !..Snow lookup table index.
1624 if (rs(k).gt. r_s(1)) then
1625 nis = NINT(ALOG10(rs(k)))
1626 do nn = nis-1, nis+1
1628 if ( (rs(k)/10.**nn).ge.1.0 .and. &
1629 (rs(k)/10.**nn).lt.10.0) goto 146
1632 idx_s = INT(rs(k)/10.**n) + 10*(n-nis2) - (n-nis2)
1633 idx_s = MAX(1, MIN(idx_s, ntb_s))
1638 !..Graupel lookup table index.
1639 if (rg(k).gt. r_g(1)) then
1640 nig = NINT(ALOG10(rg(k)))
1641 do nn = nig-1, nig+1
1643 if ( (rg(k)/10.**nn).ge.1.0 .and. &
1644 (rg(k)/10.**nn).lt.10.0) goto 147
1647 idx_g = INT(rg(k)/10.**n) + 10*(n-nig2) - (n-nig2)
1648 idx_g = MAX(1, MIN(idx_g, ntb_g))
1651 lam_exp = lamg * (cgg(3)*ogg2*ogg1)**bm_g
1652 N0_exp = ogg1*rg(k)/am_g * lam_exp**cge(1)
1653 nig = NINT(DLOG10(N0_exp))
1654 do nn = nig-1, nig+1
1656 if ( (N0_exp/10.**nn).ge.1.0 .and. &
1657 (N0_exp/10.**nn).lt.10.0) goto 148
1660 idx_g1 = INT(N0_exp/10.**n) + 10*(n-nig3) - (n-nig3)
1661 idx_g1 = MAX(1, MIN(idx_g1, ntb_g1))
1667 !..Deposition/sublimation prefactor (from Srivastava & Coen 1992).
1669 rvs = rho(k)*qvsi(k)
1670 rvs_p = rvs*otemp*(lsub*otemp*oRv - 1.)
1671 rvs_pp = rvs * ( otemp*(lsub*otemp*oRv - 1.) &
1672 *otemp*(lsub*otemp*oRv - 1.) &
1673 + (-2.*lsub*otemp*otemp*otemp*oRv) &
1675 gamsc = lsub*diffu(k)/tcond(k) * rvs_p
1676 alphsc = 0.5*(gamsc/(1.+gamsc))*(gamsc/(1.+gamsc)) &
1677 * rvs_pp/rvs_p * rvs/rvs_p
1678 alphsc = MAX(1.E-9, alphsc)
1680 if (abs(xsat).lt. 1.E-9) xsat=0.
1681 t1_subl = 4.*PI*( 1.0 - alphsc*xsat &
1682 + 2.*alphsc*alphsc*xsat*xsat &
1683 - 5.*alphsc*alphsc*alphsc*xsat*xsat*xsat ) &
1686 !..Snow collecting cloud water. In CE, assume Dc<<Ds and vtc=~0.
1687 if (L_qc(k) .and. mvd_c(k).gt. D0c) then
1689 if (L_qs(k)) xDs = smoc(k) / smob(k)
1690 if (xDs .gt. D0s) then
1691 idx = 1 + INT(nbs*DLOG(xDs/Ds(1))/DLOG(Ds(nbs)/Ds(1)))
1693 Ef_sw = t_Efsw(idx, INT(mvd_c(k)*1.E6))
1694 prs_scw(k) = rhof(k)*t1_qs_qc*Ef_sw*rc(k)*smoe(k)
1697 !..Graupel collecting cloud water. In CE, assume Dc<<Dg and vtc=~0.
1698 if (rg(k).ge. r_g(1) .and. mvd_c(k).gt. D0c) then
1699 xDg = (bm_g + mu_g + 1.) * ilamg(k)
1700 vtg = rhof(k)*av_g*cgg(6)*ogg3 * ilamg(k)**bv_g
1701 stoke_g = mvd_c(k)*mvd_c(k)*vtg*rho_w/(9.*visco(k)*xDg)
1702 if (xDg.gt. D0g) then
1703 if (stoke_g.ge.0.4 .and. stoke_g.le.10.) then
1704 Ef_gw = 0.55*ALOG10(2.51*stoke_g)
1705 elseif (stoke_g.lt.0.4) then
1707 elseif (stoke_g.gt.10) then
1710 prg_gcw(k) = rhof(k)*t1_qg_qc*Ef_gw*rc(k)*N0_g(k) &
1716 !..Rain collecting snow. Cannot assume Wisner (1972) approximation
1717 !.. or Mizuno (1990) approach so we solve the CE explicitly and store
1718 !.. results in lookup table.
1719 if (rr(k).ge. r_r(1)) then
1720 if (rs(k).ge. r_s(1)) then
1721 if (temp(k).lt.T_0) then
1722 prr_rcs(k) = -(tmr_racs2(idx_s,idx_t,idx_r1,idx_r) &
1723 + tcr_sacr2(idx_s,idx_t,idx_r1,idx_r) &
1724 + tmr_racs1(idx_s,idx_t,idx_r1,idx_r) &
1725 + tcr_sacr1(idx_s,idx_t,idx_r1,idx_r))
1726 prs_rcs(k) = tmr_racs2(idx_s,idx_t,idx_r1,idx_r) &
1727 + tcr_sacr2(idx_s,idx_t,idx_r1,idx_r) &
1728 - tcs_racs1(idx_s,idx_t,idx_r1,idx_r) &
1729 - tms_sacr1(idx_s,idx_t,idx_r1,idx_r)
1730 prg_rcs(k) = tmr_racs1(idx_s,idx_t,idx_r1,idx_r) &
1731 + tcr_sacr1(idx_s,idx_t,idx_r1,idx_r) &
1732 + tcs_racs1(idx_s,idx_t,idx_r1,idx_r) &
1733 + tms_sacr1(idx_s,idx_t,idx_r1,idx_r)
1734 prr_rcs(k) = MAX(DBLE(-rr(k)*odts), prr_rcs(k))
1735 prs_rcs(k) = MAX(DBLE(-rs(k)*odts), prs_rcs(k))
1736 prg_rcs(k) = MIN(DBLE((rr(k)+rs(k))*odts), prg_rcs(k))
1737 pnr_rcs(k) = tnr_racs1(idx_s,idx_t,idx_r1,idx_r) & ! RAIN2M
1738 + tnr_racs2(idx_s,idx_t,idx_r1,idx_r) &
1739 + tnr_sacr1(idx_s,idx_t,idx_r1,idx_r) &
1740 + tnr_sacr2(idx_s,idx_t,idx_r1,idx_r)
1742 prs_rcs(k) = -tcs_racs1(idx_s,idx_t,idx_r1,idx_r) &
1743 - tms_sacr1(idx_s,idx_t,idx_r1,idx_r) &
1744 + tmr_racs2(idx_s,idx_t,idx_r1,idx_r) &
1745 + tcr_sacr2(idx_s,idx_t,idx_r1,idx_r)
1746 prs_rcs(k) = MAX(DBLE(-rs(k)*odts), prs_rcs(k))
1747 prr_rcs(k) = -prs_rcs(k)
1748 pnr_rcs(k) = tnr_racs2(idx_s,idx_t,idx_r1,idx_r) & ! RAIN2M
1749 + tnr_sacr2(idx_s,idx_t,idx_r1,idx_r)
1751 pnr_rcs(k) = MIN(DBLE(nr(k)*odts), pnr_rcs(k))
1754 !..Rain collecting graupel. Cannot assume Wisner (1972) approximation
1755 !.. or Mizuno (1990) approach so we solve the CE explicitly and store
1756 !.. results in lookup table.
1757 if (rg(k).ge. r_g(1)) then
1758 if (temp(k).lt.T_0) then
1759 prg_rcg(k) = tmr_racg(idx_g1,idx_g,idx_r1,idx_r) &
1760 + tcr_gacr(idx_g1,idx_g,idx_r1,idx_r)
1761 prg_rcg(k) = MIN(DBLE(rr(k)*odts), prg_rcg(k))
1762 prr_rcg(k) = -prg_rcg(k)
1763 pnr_rcg(k) = tnr_racg(idx_g1,idx_g,idx_r1,idx_r) & ! RAIN2M
1764 + tnr_gacr(idx_g1,idx_g,idx_r1,idx_r)
1765 pnr_rcg(k) = MIN(DBLE(nr(k)*odts), pnr_rcg(k))
1767 prr_rcg(k) = tcg_racg(idx_g1,idx_g,idx_r1,idx_r)
1768 prr_rcg(k) = MIN(DBLE(rg(k)*odts), prr_rcg(k))
1769 prg_rcg(k) = -prr_rcg(k)
1774 !+---+-----------------------------------------------------------------+
1775 !..Next IF block handles only those processes below 0C.
1776 !+---+-----------------------------------------------------------------+
1778 if (temp(k).lt.T_0) then
1781 rate_max = (qv(k)-qvsi(k))*rho(k)*odts*0.999
1783 !..Freezing of water drops into graupel/cloud ice (Bigg 1953).
1784 if (rr(k).gt. r_r(1)) then
1785 prg_rfz(k) = tpg_qrfz(idx_r,idx_r1,idx_tc)*odts
1786 pri_rfz(k) = tpi_qrfz(idx_r,idx_r1,idx_tc)*odts
1787 pni_rfz(k) = tni_qrfz(idx_r,idx_r1,idx_tc)*odts
1788 pnr_rfz(k) = tnr_qrfz(idx_r,idx_r1,idx_tc)*odts ! RAIN2M
1789 pnr_rfz(k) = MIN(DBLE(nr(k)*odts), pnr_rfz(k))
1790 elseif (rr(k).gt. R1 .and. temp(k).lt.HGFR) then
1791 pri_rfz(k) = rr(k)*odts
1792 pnr_rfz(k) = nr(k)*odts ! RAIN2M
1793 pni_rfz(k) = pnr_rfz(k)
1795 if (rc(k).gt. r_c(1)) then
1796 pri_wfz(k) = tpi_qcfz(idx_c,idx_tc)*odts
1797 pri_wfz(k) = MIN(DBLE(rc(k)*odts), pri_wfz(k))
1798 pni_wfz(k) = tni_qcfz(idx_c,idx_tc)*odts
1799 pni_wfz(k) = MIN(DBLE(Nt_c*odts), pri_wfz(k)/(2.*xm0i), &
1803 !..Nucleate ice from deposition & condensation freezing (Cooper 1986)
1804 !.. but only if water sat and T<-12C or 25%+ ice supersaturated.
1805 if ( (ssati(k).ge. 0.25) .or. (ssatw(k).gt. eps &
1806 .and. temp(k).lt.261.15) ) then
1807 xnc = MIN(250.E3, TNO*EXP(ATO*(T_0-temp(k))))
1808 xni = ni(k) + (pni_rfz(k)+pni_wfz(k))*dtsave
1809 pni_inu(k) = 0.5*(xnc-xni + abs(xnc-xni))*odts
1810 pri_inu(k) = MIN(DBLE(rate_max), xm0i*pni_inu(k))
1811 pni_inu(k) = pri_inu(k)/xm0i
1814 !..Deposition/sublimation of cloud ice (Srivastava & Coen 1992).
1816 lami = (am_i*cig(2)*oig1*ni(k)/ri(k))**obmi
1818 xDi = MAX(DBLE(D0i), (bm_i + mu_i + 1.) * ilami)
1819 xmi = am_i*xDi**bm_i
1821 pri_ide(k) = C_cube*t1_subl*diffu(k)*ssati(k)*rvs &
1822 *oig1*cig(5)*ni(k)*ilami
1824 if (pri_ide(k) .lt. 0.0) then
1825 pri_ide(k) = MAX(DBLE(-ri(k)*odts), pri_ide(k), DBLE(rate_max))
1826 pni_ide(k) = pri_ide(k)*oxmi
1827 pni_ide(k) = MAX(DBLE(-ni(k)*odts), pni_ide(k))
1829 pri_ide(k) = MIN(pri_ide(k), DBLE(rate_max))
1830 prs_ide(k) = (1.0D0-tpi_ide(idx_i,idx_i1))*pri_ide(k)
1831 pri_ide(k) = tpi_ide(idx_i,idx_i1)*pri_ide(k)
1834 !..Some cloud ice needs to move into the snow category. Use lookup
1835 !.. table that resulted from explicit bin representation of distrib.
1836 if ( (idx_i.eq. ntb_i) .or. (xDi.gt. 5.0*D0s) ) then
1837 prs_iau(k) = ri(k)*.99*odts
1838 pni_iau(k) = ni(k)*.95*odts
1839 elseif (xDi.lt. 0.1*D0s) then
1843 prs_iau(k) = tps_iaus(idx_i,idx_i1)*odts
1844 prs_iau(k) = MIN(DBLE(ri(k)*.99*odts), prs_iau(k))
1845 pni_iau(k) = tni_iaus(idx_i,idx_i1)*odts
1846 pni_iau(k) = MIN(DBLE(ni(k)*.95*odts), pni_iau(k))
1850 !..Deposition/sublimation of snow/graupel follows Srivastava & Coen
1853 C_snow = C_sqrd + (tempc+15.)*(C_cube-C_sqrd)/(-30.+15.)
1854 C_snow = MAX(C_sqrd, MIN(C_snow, C_cube))
1855 prs_sde(k) = C_snow*t1_subl*diffu(k)*ssati(k)*rvs &
1856 * (t1_qs_sd*smo1(k) &
1857 + t2_qs_sd*rhof2(k)*vsc2(k)*smof(k))
1858 if (prs_sde(k).lt. 0.) then
1859 prs_sde(k) = MAX(DBLE(-rs(k)*odts), prs_sde(k), DBLE(rate_max))
1861 prs_sde(k) = MIN(prs_sde(k), DBLE(rate_max))
1865 if (L_qg(k) .and. ssati(k).lt. -eps) then
1866 prg_gde(k) = C_cube*t1_subl*diffu(k)*ssati(k)*rvs &
1867 * N0_g(k) * (t1_qg_sd*ilamg(k)**cge(10) &
1868 + t2_qg_sd*vsc2(k)*rhof2(k)*ilamg(k)**cge(11))
1869 if (prg_gde(k).lt. 0.) then
1870 prg_gde(k) = MAX(DBLE(-rg(k)*odts), prg_gde(k), DBLE(rate_max))
1872 prg_gde(k) = MIN(prg_gde(k), DBLE(rate_max))
1876 !..Snow collecting cloud ice. In CE, assume Di<<Ds and vti=~0.
1878 lami = (am_i*cig(2)*oig1*ni(k)/ri(k))**obmi
1880 xDi = MAX(DBLE(D0i), (bm_i + mu_i + 1.) * ilami)
1881 xmi = am_i*xDi**bm_i
1883 if (rs(k).ge. r_s(1)) then
1884 prs_sci(k) = t1_qs_qi*rhof(k)*Ef_si*ri(k)*smoe(k)
1885 pni_sci(k) = prs_sci(k) * oxmi
1888 !..Rain collecting cloud ice. In CE, assume Di<<Dr and vti=~0.
1889 if (rr(k).ge. r_r(1) .and. mvd_r(k).gt. 4.*xDi) then
1891 pri_rci(k) = rhof(k)*t1_qr_qi*Ef_ri*ri(k)*N0_r(k) &
1892 *((lamr+fv_r)**(-cre(9)))
1893 pnr_rci(k) = rhof(k)*t1_qr_qi*Ef_ri*ni(k)*N0_r(k) & ! RAIN2M
1894 *((lamr+fv_r)**(-cre(9)))
1895 pni_rci(k) = pri_rci(k) * oxmi
1896 prr_rci(k) = rhof(k)*t2_qr_qi*Ef_ri*ni(k)*N0_r(k) &
1897 *((lamr+fv_r)**(-cre(8)))
1898 prr_rci(k) = MIN(DBLE(rr(k)*odts), prr_rci(k))
1899 prg_rci(k) = pri_rci(k) + prr_rci(k)
1903 !..Ice multiplication from rime-splinters (Hallet & Mossop 1974).
1904 if (prg_gcw(k).gt. eps .and. tempc.gt.-8.0) then
1906 if (tempc.ge.-5.0 .and. tempc.lt.-3.0) then
1907 tf = 0.5*(-3.0 - tempc)
1908 elseif (tempc.gt.-8.0 .and. tempc.lt.-5.0) then
1909 tf = 0.33333333*(8.0 + tempc)
1911 pni_ihm(k) = 3.5E8*tf*prg_gcw(k)
1912 pri_ihm(k) = xm0i*pni_ihm(k)
1913 prs_ihm(k) = prs_scw(k)/(prs_scw(k)+prg_gcw(k)) &
1915 prg_ihm(k) = prg_gcw(k)/(prs_scw(k)+prg_gcw(k)) &
1919 !..A portion of rimed snow converts to graupel but some remains snow.
1920 !.. Interp from 5 to 75% as riming factor increases from 5.0 to 30.0
1921 !.. 0.028 came from (.75-.05)/(30.-5.). This remains ad-hoc and should
1923 if (prs_scw(k).gt.5.0*prs_sde(k) .and. &
1924 prs_sde(k).gt.eps) then
1925 r_frac = MIN(30.0D0, prs_scw(k)/prs_sde(k))
1926 g_frac = MIN(0.75, 0.05 + (r_frac-5.)*.028)
1927 vts_boost(k) = MIN(1.5, 1.1 + (r_frac-5.)*.016)
1928 prg_scw(k) = g_frac*prs_scw(k)
1929 prs_scw(k) = (1. - g_frac)*prs_scw(k)
1934 !..Melt snow and graupel and enhance from collisions with liquid.
1935 !.. We also need to sublimate snow and graupel if subsaturated.
1937 prr_sml(k) = tempc*tcond(k)*(t1_qs_me*smo1(k) &
1938 + t2_qs_me*rhof2(k)*vsc2(k)*smof(k))
1939 prr_sml(k) = prr_sml(k) + 4218.*olfus*tempc &
1940 * (prr_rcs(k)+prs_scw(k))
1941 prr_sml(k) = MIN(DBLE(rs(k)*odts), prr_sml(k))
1942 pnr_sml(k) = smo0(k)/rs(k)*prr_sml(k) * 10.0**(-0.75*tempc) ! RAIN2M
1943 pnr_sml(k) = MIN(DBLE(smo0(k)*odts), pnr_sml(k))
1944 if (tempc.gt.3.5 .or. rs(k).lt.0.005E-3) pnr_sml(k)=0.0
1946 if (ssati(k).lt. 0.) then
1947 prs_sde(k) = C_cube*t1_subl*diffu(k)*ssati(k)*rvs &
1948 * (t1_qs_sd*smo1(k) &
1949 + t2_qs_sd*rhof2(k)*vsc2(k)*smof(k))
1950 prs_sde(k) = MAX(DBLE(-rs(k)*odts), prs_sde(k))
1955 prr_gml(k) = tempc*N0_g(k)*tcond(k) &
1956 *(t1_qg_me*ilamg(k)**cge(10) &
1957 + t2_qg_me*rhof2(k)*vsc2(k)*ilamg(k)**cge(11))
1958 !-GT prr_gml(k) = prr_gml(k) + 4218.*olfus*tempc &
1959 !-GT * (prr_rcg(k)+prg_gcw(k))
1960 prr_gml(k) = MIN(DBLE(rg(k)*odts), prr_gml(k))
1961 pnr_gml(k) = (N0_g(k) / (cgg(1)*am_g*N0_g(k)/rg(k))**oge1) & ! RAIN2M
1962 / rg(k) * prr_gml(k) * 10.0**(-1.25*tempc)
1963 if (rg(k).lt.0.005E-3) pnr_gml(k)=0.0
1965 if (ssati(k).lt. 0.) then
1966 prg_gde(k) = C_cube*t1_subl*diffu(k)*ssati(k)*rvs &
1967 * N0_g(k) * (t1_qg_sd*ilamg(k)**cge(10) &
1968 + t2_qg_sd*vsc2(k)*rhof2(k)*ilamg(k)**cge(11))
1969 prg_gde(k) = MAX(DBLE(-rg(k)*odts), prg_gde(k))
1973 !.. This change will be required if users run adaptive time step that
1974 !.. results in delta-t that is generally too long to allow cloud water
1975 !.. collection by snow/graupel above melting temperature.
1976 !.. Credit to Bjorn-Egil Nygaard for discovering.
1977 if (dt .gt. 120.) then
1978 prr_rcw(k)=prr_rcw(k)+prs_scw(k)+prg_gcw(k)
1988 !+---+-----------------------------------------------------------------+
1989 !..Ensure we do not deplete more hydrometeor species than exists.
1990 !+---+-----------------------------------------------------------------+
1993 !..If ice supersaturated, ensure sum of depos growth terms does not
1994 !.. deplete more vapor than possibly exists. If subsaturated, limit
1995 !.. sum of sublimation terms such that vapor does not reproduce ice
1997 sump = pri_inu(k) + pri_ide(k) + prs_ide(k) &
1998 + prs_sde(k) + prg_gde(k)
1999 rate_max = (qv(k)-qvsi(k))*odts*0.999
2000 if ( (sump.gt. eps .and. sump.gt. rate_max) .or. &
2001 (sump.lt. -eps .and. sump.lt. rate_max) ) then
2002 ratio = rate_max/sump
2003 pri_inu(k) = pri_inu(k) * ratio
2004 pri_ide(k) = pri_ide(k) * ratio
2005 pni_ide(k) = pni_ide(k) * ratio
2006 prs_ide(k) = prs_ide(k) * ratio
2007 prs_sde(k) = prs_sde(k) * ratio
2008 prg_gde(k) = prg_gde(k) * ratio
2011 !..Cloud water conservation.
2012 sump = -prr_wau(k) - pri_wfz(k) - prr_rcw(k) &
2013 - prs_scw(k) - prg_scw(k) - prg_gcw(k)
2014 rate_max = -rc(k)*odts
2015 if (sump.lt. rate_max .and. L_qc(k)) then
2016 ratio = rate_max/sump
2017 prr_wau(k) = prr_wau(k) * ratio
2018 pri_wfz(k) = pri_wfz(k) * ratio
2019 prr_rcw(k) = prr_rcw(k) * ratio
2020 prs_scw(k) = prs_scw(k) * ratio
2021 prg_scw(k) = prg_scw(k) * ratio
2022 prg_gcw(k) = prg_gcw(k) * ratio
2025 !..Cloud ice conservation.
2026 sump = pri_ide(k) - prs_iau(k) - prs_sci(k) &
2028 rate_max = -ri(k)*odts
2029 if (sump.lt. rate_max .and. L_qi(k)) then
2030 ratio = rate_max/sump
2031 pri_ide(k) = pri_ide(k) * ratio
2032 prs_iau(k) = prs_iau(k) * ratio
2033 prs_sci(k) = prs_sci(k) * ratio
2034 pri_rci(k) = pri_rci(k) * ratio
2037 !..Rain conservation.
2038 sump = -prg_rfz(k) - pri_rfz(k) - prr_rci(k) &
2039 + prr_rcs(k) + prr_rcg(k)
2040 rate_max = -rr(k)*odts
2041 if (sump.lt. rate_max .and. L_qr(k)) then
2042 ratio = rate_max/sump
2043 prg_rfz(k) = prg_rfz(k) * ratio
2044 pri_rfz(k) = pri_rfz(k) * ratio
2045 prr_rci(k) = prr_rci(k) * ratio
2046 prr_rcs(k) = prr_rcs(k) * ratio
2047 prr_rcg(k) = prr_rcg(k) * ratio
2050 !..Snow conservation.
2051 sump = prs_sde(k) - prs_ihm(k) - prr_sml(k) &
2053 rate_max = -rs(k)*odts
2054 if (sump.lt. rate_max .and. L_qs(k)) then
2055 ratio = rate_max/sump
2056 prs_sde(k) = prs_sde(k) * ratio
2057 prs_ihm(k) = prs_ihm(k) * ratio
2058 prr_sml(k) = prr_sml(k) * ratio
2059 prs_rcs(k) = prs_rcs(k) * ratio
2062 !..Graupel conservation.
2063 sump = prg_gde(k) - prg_ihm(k) - prr_gml(k) &
2065 rate_max = -rg(k)*odts
2066 if (sump.lt. rate_max .and. L_qg(k)) then
2067 ratio = rate_max/sump
2068 prg_gde(k) = prg_gde(k) * ratio
2069 prg_ihm(k) = prg_ihm(k) * ratio
2070 prr_gml(k) = prr_gml(k) * ratio
2071 prg_rcg(k) = prg_rcg(k) * ratio
2074 !..Re-enforce proper mass conservation for subsequent elements in case
2075 !.. any of the above terms were altered. Thanks P. Blossey. 2009Sep28
2076 pri_ihm(k) = prs_ihm(k) + prg_ihm(k)
2077 ratio = MIN( ABS(prr_rcg(k)), ABS(prg_rcg(k)) )
2078 prr_rcg(k) = ratio * SIGN(1.0, SNGL(prr_rcg(k)))
2079 prg_rcg(k) = -prr_rcg(k)
2080 if (temp(k).gt.T_0) then
2081 ratio = MIN( ABS(prr_rcs(k)), ABS(prs_rcs(k)) )
2082 prr_rcs(k) = ratio * SIGN(1.0, SNGL(prr_rcs(k)))
2083 prs_rcs(k) = -prr_rcs(k)
2088 !+---+-----------------------------------------------------------------+
2089 !..Calculate tendencies of all species but constrain the number of ice
2090 !.. to reasonable values.
2091 !+---+-----------------------------------------------------------------+
2094 lfus2 = lsub - lvap(k)
2096 !..Water vapor tendency
2097 qvten(k) = qvten(k) + (-pri_inu(k) - pri_ide(k) &
2098 - prs_ide(k) - prs_sde(k) - prg_gde(k)) &
2101 !..Cloud water tendency
2102 qcten(k) = qcten(k) + (-prr_wau(k) - pri_wfz(k) &
2103 - prr_rcw(k) - prs_scw(k) - prg_scw(k) &
2107 !..Cloud ice mixing ratio tendency
2108 qiten(k) = qiten(k) + (pri_inu(k) + pri_ihm(k) &
2109 + pri_wfz(k) + pri_rfz(k) + pri_ide(k) &
2110 - prs_iau(k) - prs_sci(k) - pri_rci(k)) &
2113 !..Cloud ice number tendency.
2114 niten(k) = niten(k) + (pni_inu(k) + pni_ihm(k) &
2115 + pni_wfz(k) + pni_rfz(k) + pni_ide(k) &
2116 - pni_iau(k) - pni_sci(k) - pni_rci(k)) &
2119 !..Cloud ice mass/number balance; keep mass-wt mean size between
2120 !.. 20 and 300 microns. Also no more than 250 xtals per liter.
2121 xri=MAX(R1,(qi1d(k) + qiten(k)*dtsave)*rho(k))
2122 xni=MAX(R2,(ni1d(k) + niten(k)*dtsave)*rho(k))
2123 if (xri.gt. R1) then
2124 lami = (am_i*cig(2)*oig1*xni/xri)**obmi
2126 xDi = (bm_i + mu_i + 1.) * ilami
2127 if (xDi.lt. 20.E-6) then
2128 lami = cie(2)/20.E-6
2129 xni = MIN(250.D3, cig(1)*oig2*xri/am_i*lami**bm_i)
2130 niten(k) = (xni-ni1d(k)*rho(k))*odts*orho
2131 elseif (xDi.gt. 300.E-6) then
2132 lami = cie(2)/300.E-6
2133 xni = cig(1)*oig2*xri/am_i*lami**bm_i
2134 niten(k) = (xni-ni1d(k)*rho(k))*odts*orho
2137 niten(k) = -ni1d(k)*odts
2139 xni=MAX(0.,(ni1d(k) + niten(k)*dtsave)*rho(k))
2140 if (xni.gt.250.E3) &
2141 niten(k) = (250.E3-ni1d(k)*rho(k))*odts*orho
2144 qrten(k) = qrten(k) + (prr_wau(k) + prr_rcw(k) &
2145 + prr_sml(k) + prr_gml(k) + prr_rcs(k) &
2146 + prr_rcg(k) - prg_rfz(k) &
2147 - pri_rfz(k) - prr_rci(k)) &
2150 !..Rain number tendency
2151 nrten(k) = nrten(k) + (pnr_wau(k) + pnr_sml(k) + pnr_gml(k) &
2152 - (pnr_rfz(k) + pnr_rcr(k) + pnr_rcg(k) &
2153 + pnr_rcs(k) + pnr_rci(k)) ) &
2156 !..Rain mass/number balance; keep median volume diameter between
2157 !.. 37 microns (D0r*0.75) and 2.5 mm.
2158 xrr=MAX(R1,(qr1d(k) + qrten(k)*dtsave)*rho(k))
2159 xnr=MAX(R2,(nr1d(k) + nrten(k)*dtsave)*rho(k))
2160 if (xrr.gt. R1) then
2161 lamr = (am_r*crg(3)*org2*xnr/xrr)**obmr
2162 mvd_r(k) = (3.0 + mu_r + 0.672) / lamr
2163 if (mvd_r(k) .gt. 2.5E-3) then
2165 lamr = (3.0 + mu_r + 0.672) / mvd_r(k)
2166 xnr = crg(2)*org3*xrr*lamr**bm_r / am_r
2167 nrten(k) = (xnr-nr1d(k)*rho(k))*odts*orho
2168 elseif (mvd_r(k) .lt. D0r*0.75) then
2170 lamr = (3.0 + mu_r + 0.672) / mvd_r(k)
2171 xnr = crg(2)*org3*xrr*lamr**bm_r / am_r
2172 nrten(k) = (xnr-nr1d(k)*rho(k))*odts*orho
2175 qrten(k) = -qr1d(k)*odts
2176 nrten(k) = -nr1d(k)*odts
2180 qsten(k) = qsten(k) + (prs_iau(k) + prs_sde(k) &
2181 + prs_sci(k) + prs_scw(k) + prs_rcs(k) &
2182 + prs_ide(k) - prs_ihm(k) - prr_sml(k)) &
2186 qgten(k) = qgten(k) + (prg_scw(k) + prg_rfz(k) &
2187 + prg_gde(k) + prg_rcg(k) + prg_gcw(k) &
2188 + prg_rci(k) + prg_rcs(k) - prg_ihm(k) &
2192 !..Temperature tendency
2193 if (temp(k).lt.T_0) then
2195 + ( lsub*ocp(k)*(pri_inu(k) + pri_ide(k) &
2196 + prs_ide(k) + prs_sde(k) &
2198 + lfus2*ocp(k)*(pri_wfz(k) + pri_rfz(k) &
2199 + prg_rfz(k) + prs_scw(k) &
2200 + prg_scw(k) + prg_gcw(k) &
2201 + prg_rcs(k) + prs_rcs(k) &
2202 + prr_rci(k) + prg_rcg(k)) &
2206 + ( lfus*ocp(k)*(-prr_sml(k) - prr_gml(k) &
2207 - prr_rcg(k) - prr_rcs(k)) &
2208 + lsub*ocp(k)*(prs_sde(k) + prg_gde(k)) &
2214 !+---+-----------------------------------------------------------------+
2215 !..Update variables for TAU+1 before condensation & sedimention.
2216 !+---+-----------------------------------------------------------------+
2218 temp(k) = t1d(k) + DT*tten(k)
2220 tempc = temp(k) - 273.15
2221 qv(k) = MAX(1.E-10, qv1d(k) + DT*qvten(k))
2222 rho(k) = 0.622*pres(k)/(R*temp(k)*(qv(k)+0.622))
2223 rhof(k) = SQRT(RHO_NOT/rho(k))
2224 rhof2(k) = SQRT(rhof(k))
2225 qvs(k) = rslf(pres(k), temp(k))
2226 ssatw(k) = qv(k)/qvs(k) - 1.
2227 if (abs(ssatw(k)).lt. eps) ssatw(k) = 0.0
2228 diffu(k) = 2.11E-5*(temp(k)/273.15)**1.94 * (101325./pres(k))
2229 if (tempc .ge. 0.0) then
2230 visco(k) = (1.718+0.0049*tempc)*1.0E-5
2232 visco(k) = (1.718+0.0049*tempc-1.2E-5*tempc*tempc)*1.0E-5
2234 vsc2(k) = SQRT(rho(k)/visco(k))
2235 lvap(k) = lvap0 + (2106.0 - 4218.0)*tempc
2236 tcond(k) = (5.69 + 0.0168*tempc)*1.0E-5 * 418.936
2237 ocp(k) = 1./(Cp*(1.+0.887*qv(k)))
2238 lvt2(k)=lvap(k)*lvap(k)*ocp(k)*oRv*otemp*otemp
2240 if ((qc1d(k) + qcten(k)*DT) .gt. R1) then
2241 rc(k) = (qc1d(k) + qcten(k)*DT)*rho(k)
2248 if ((qi1d(k) + qiten(k)*DT) .gt. R1) then
2249 ri(k) = (qi1d(k) + qiten(k)*DT)*rho(k)
2250 ni(k) = MAX(R2, (ni1d(k) + niten(k)*DT)*rho(k))
2258 if ((qr1d(k) + qrten(k)*DT) .gt. R1) then
2259 rr(k) = (qr1d(k) + qrten(k)*DT)*rho(k)
2260 nr(k) = MAX(R2, (nr1d(k) + nrten(k)*DT)*rho(k))
2268 if ((qs1d(k) + qsten(k)*DT) .gt. R1) then
2269 rs(k) = (qs1d(k) + qsten(k)*DT)*rho(k)
2276 if ((qg1d(k) + qgten(k)*DT) .gt. R1) then
2277 rg(k) = (qg1d(k) + qgten(k)*DT)*rho(k)
2285 !+---+-----------------------------------------------------------------+
2286 !..With tendency-updated mixing ratios, recalculate snow moments and
2287 !.. intercepts/slopes of graupel and rain.
2288 !+---+-----------------------------------------------------------------+
2289 if (.not. iiwarm) then
2291 if (.not. L_qs(k)) CYCLE
2292 tc0 = MIN(-0.1, temp(k)-273.15)
2293 smob(k) = rs(k)*oams
2295 !..All other moments based on reference, 2nd moment. If bm_s.ne.2,
2296 !.. then we must compute actual 2nd moment and use as reference.
2297 if (bm_s.gt.(2.0-1.e-3) .and. bm_s.lt.(2.0+1.e-3)) then
2300 loga_ = sa(1) + sa(2)*tc0 + sa(3)*bm_s &
2301 + sa(4)*tc0*bm_s + sa(5)*tc0*tc0 &
2302 + sa(6)*bm_s*bm_s + sa(7)*tc0*tc0*bm_s &
2303 + sa(8)*tc0*bm_s*bm_s + sa(9)*tc0*tc0*tc0 &
2304 + sa(10)*bm_s*bm_s*bm_s
2306 b_ = sb(1) + sb(2)*tc0 + sb(3)*bm_s &
2307 + sb(4)*tc0*bm_s + sb(5)*tc0*tc0 &
2308 + sb(6)*bm_s*bm_s + sb(7)*tc0*tc0*bm_s &
2309 + sb(8)*tc0*bm_s*bm_s + sb(9)*tc0*tc0*tc0 &
2310 + sb(10)*bm_s*bm_s*bm_s
2311 smo2(k) = (smob(k)/a_)**(1./b_)
2314 !..Calculate bm_s+1 (th) moment. Useful for diameter calcs.
2315 loga_ = sa(1) + sa(2)*tc0 + sa(3)*cse(1) &
2316 + sa(4)*tc0*cse(1) + sa(5)*tc0*tc0 &
2317 + sa(6)*cse(1)*cse(1) + sa(7)*tc0*tc0*cse(1) &
2318 + sa(8)*tc0*cse(1)*cse(1) + sa(9)*tc0*tc0*tc0 &
2319 + sa(10)*cse(1)*cse(1)*cse(1)
2321 b_ = sb(1)+ sb(2)*tc0 + sb(3)*cse(1) + sb(4)*tc0*cse(1) &
2322 + sb(5)*tc0*tc0 + sb(6)*cse(1)*cse(1) &
2323 + sb(7)*tc0*tc0*cse(1) + sb(8)*tc0*cse(1)*cse(1) &
2324 + sb(9)*tc0*tc0*tc0 + sb(10)*cse(1)*cse(1)*cse(1)
2325 smoc(k) = a_ * smo2(k)**b_
2327 !..Calculate bm_s+bv_s (th) moment. Useful for sedimentation.
2328 loga_ = sa(1) + sa(2)*tc0 + sa(3)*cse(14) &
2329 + sa(4)*tc0*cse(14) + sa(5)*tc0*tc0 &
2330 + sa(6)*cse(14)*cse(14) + sa(7)*tc0*tc0*cse(14) &
2331 + sa(8)*tc0*cse(14)*cse(14) + sa(9)*tc0*tc0*tc0 &
2332 + sa(10)*cse(14)*cse(14)*cse(14)
2334 b_ = sb(1)+ sb(2)*tc0 + sb(3)*cse(14) + sb(4)*tc0*cse(14) &
2335 + sb(5)*tc0*tc0 + sb(6)*cse(14)*cse(14) &
2336 + sb(7)*tc0*tc0*cse(14) + sb(8)*tc0*cse(14)*cse(14) &
2337 + sb(9)*tc0*tc0*tc0 + sb(10)*cse(14)*cse(14)*cse(14)
2338 smod(k) = a_ * smo2(k)**b_
2341 !+---+-----------------------------------------------------------------+
2342 !..Calculate y-intercept, slope values for graupel.
2343 !+---+-----------------------------------------------------------------+
2346 if (temp(k).lt.270.65 .and. L_qr(k) .and. mvd_r(k).gt.100.E-6) then
2347 xslw1 = 4.01 + alog10(mvd_r(k))
2351 ygra1 = 4.31 + alog10(max(5.E-5, rg(k)))
2352 zans1 = 3.0 + (100./(300.*xslw1*ygra1/(10./xslw1+1.+0.25*ygra1)+30.+5.*ygra1))
2353 N0_exp = 10.**(zans1)
2354 N0_exp = MAX(DBLE(gonv_min), MIN(N0_exp, DBLE(gonv_max)))
2355 N0_min = MIN(N0_exp, N0_min)
2357 lam_exp = (N0_exp*am_g*cgg(1)/rg(k))**oge1
2358 lamg = lam_exp * (cgg(3)*ogg2*ogg1)**obmg
2360 N0_g(k) = N0_exp/(cgg(2)*lam_exp) * lamg**cge(2)
2365 !+---+-----------------------------------------------------------------+
2366 !..Calculate y-intercept, slope values for rain.
2367 !+---+-----------------------------------------------------------------+
2369 lamr = (am_r*crg(3)*org2*nr(k)/rr(k))**obmr
2371 mvd_r(k) = (3.0 + mu_r + 0.672) / lamr
2372 N0_r(k) = nr(k)*org2*lamr**cre(2)
2375 !+---+-----------------------------------------------------------------+
2376 !..Cloud water condensation and evaporation. Newly formulated using
2377 !.. Newton-Raphson iterations (3 should suffice) as provided by B. Hall.
2378 !+---+-----------------------------------------------------------------+
2380 if ( (ssatw(k).gt. eps) .or. (ssatw(k).lt. -eps .and. &
2382 clap = (qv(k)-qvs(k))/(1. + lvt2(k)*qvs(k))
2384 fcd = qvs(k)* EXP(lvt2(k)*clap) - qv(k) + clap
2385 dfcd = qvs(k)*lvt2(k)* EXP(lvt2(k)*clap) + 1.
2386 clap = clap - fcd/dfcd
2389 if (xrc.gt. 0.0) then
2390 prw_vcd(k) = clap*odt
2392 prw_vcd(k) = -rc(k)/rho(k)*odts
2395 qcten(k) = qcten(k) + prw_vcd(k)
2396 qvten(k) = qvten(k) - prw_vcd(k)
2397 tten(k) = tten(k) + lvap(k)*ocp(k)*prw_vcd(k)*(1-IFDRY)
2398 rc(k) = MAX(R1, (qc1d(k) + DT*qcten(k))*rho(k))
2399 qv(k) = MAX(1.E-10, qv1d(k) + DT*qvten(k))
2400 temp(k) = t1d(k) + DT*tten(k)
2401 rho(k) = 0.622*pres(k)/(R*temp(k)*(qv(k)+0.622))
2402 qvs(k) = rslf(pres(k), temp(k))
2403 ssatw(k) = qv(k)/qvs(k) - 1.
2407 !+---+-----------------------------------------------------------------+
2408 !.. If still subsaturated, allow rain to evaporate, following
2409 !.. Srivastava & Coen (1992).
2410 !+---+-----------------------------------------------------------------+
2412 if ( (ssatw(k).lt. -eps) .and. L_qr(k) &
2413 .and. (.not.(prw_vcd(k).gt. 0.)) ) then
2414 tempc = temp(k) - 273.15
2416 rhof(k) = SQRT(RHO_NOT/rho(k))
2417 rhof2(k) = SQRT(rhof(k))
2418 diffu(k) = 2.11E-5*(temp(k)/273.15)**1.94 * (101325./pres(k))
2419 if (tempc .ge. 0.0) then
2420 visco(k) = (1.718+0.0049*tempc)*1.0E-5
2422 visco(k) = (1.718+0.0049*tempc-1.2E-5*tempc*tempc)*1.0E-5
2424 vsc2(k) = SQRT(rho(k)/visco(k))
2425 lvap(k) = lvap0 + (2106.0 - 4218.0)*tempc
2426 tcond(k) = (5.69 + 0.0168*tempc)*1.0E-5 * 418.936
2427 ocp(k) = 1./(Cp*(1.+0.887*qv(k)))
2430 rvs_p = rvs*otemp*(lvap(k)*otemp*oRv - 1.)
2431 rvs_pp = rvs * ( otemp*(lvap(k)*otemp*oRv - 1.) &
2432 *otemp*(lvap(k)*otemp*oRv - 1.) &
2433 + (-2.*lvap(k)*otemp*otemp*otemp*oRv) &
2435 gamsc = lvap(k)*diffu(k)/tcond(k) * rvs_p
2436 alphsc = 0.5*(gamsc/(1.+gamsc))*(gamsc/(1.+gamsc)) &
2437 * rvs_pp/rvs_p * rvs/rvs_p
2438 alphsc = MAX(1.E-9, alphsc)
2439 xsat = MIN(-1.E-9, ssatw(k))
2440 t1_evap = 2.*PI*( 1.0 - alphsc*xsat &
2441 + 2.*alphsc*alphsc*xsat*xsat &
2442 - 5.*alphsc*alphsc*alphsc*xsat*xsat*xsat ) &
2446 prv_rev(k) = t1_evap*diffu(k)*(-ssatw(k))*N0_r(k)*rvs &
2447 * (t1_qr_ev*ilamr(k)**cre(10) &
2448 + t2_qr_ev*vsc2(k)*rhof2(k)*((lamr+0.5*fv_r)**(-cre(11))))
2449 rate_max = MIN((rr(k)/rho(k)*odts), (qvs(k)-qv(k))*odts)
2450 prv_rev(k) = MIN(DBLE(rate_max), prv_rev(k)/rho(k))
2451 pnr_rev(k) = MIN(DBLE(nr(k)*0.99/rho(k)*odts), & ! RAIN2M
2452 prv_rev(k) * nr(k)/rr(k))
2454 qrten(k) = qrten(k) - prv_rev(k)
2455 qvten(k) = qvten(k) + prv_rev(k)
2456 nrten(k) = nrten(k) - pnr_rev(k)
2457 tten(k) = tten(k) - lvap(k)*ocp(k)*prv_rev(k)*(1-IFDRY)
2459 rr(k) = MAX(R1, (qr1d(k) + DT*qrten(k))*rho(k))
2460 qv(k) = MAX(1.E-10, qv1d(k) + DT*qvten(k))
2461 nr(k) = MAX(R2, (nr1d(k) + DT*nrten(k))*rho(k))
2462 temp(k) = t1d(k) + DT*tten(k)
2463 rho(k) = 0.622*pres(k)/(R*temp(k)*(qv(k)+0.622))
2468 evapprod(k) = prv_rev(k) - (min(zeroD0,prs_sde(k)) + &
2469 min(zeroD0,prg_gde(k)))
2470 rainprod(k) = prr_wau(k) + prr_rcw(k) + prs_scw(k) + &
2471 prg_scw(k) + prs_iau(k) + &
2472 prg_gcw(k) + prs_sci(k) + &
2477 !+---+-----------------------------------------------------------------+
2478 !..Find max terminal fallspeed (distribution mass-weighted mean
2479 !.. velocity) and use it to determine if we need to split the timestep
2480 !.. (var nstep>1). Either way, only bother to do sedimentation below
2481 !.. 1st level that contains any sedimenting particles (k=ksed1 on down).
2482 !.. New in v3.0+ is computing separate for rain, ice, snow, and
2483 !.. graupel species thus making code faster with credit to J. Schmidt.
2484 !+---+-----------------------------------------------------------------+
2488 do k = kte+1, kts, -1
2498 rhof(k) = SQRT(RHO_NOT/rho(k))
2500 if (rr(k).gt. R1) then
2501 lamr = (am_r*crg(3)*org2*nr(k)/rr(k))**obmr
2502 vtr = rhof(k)*av_r*crg(6)*org3 * lamr**cre(3) &
2503 *((lamr+fv_r)**(-cre(6)))
2505 ! First below is technically correct:
2506 ! vtr = rhof(k)*av_r*crg(5)*org2 * lamr**cre(2) &
2507 ! *((lamr+fv_r)**(-cre(5)))
2508 ! Test: make number fall faster (but still slower than mass)
2509 ! Goal: less prominent size sorting
2510 vtr = rhof(k)*av_r*crg(7)/crg(12) * lamr**cre(12) &
2511 *((lamr+fv_r)**(-cre(7)))
2515 vtnrk(k) = vtnrk(k+1)
2518 if (MAX(vtrk(k),vtnrk(k)) .gt. 1.E-3) then
2519 ksed1(1) = MAX(ksed1(1), k)
2520 delta_tp = dzq(k)/(MAX(vtrk(k),vtnrk(k)))
2521 nstep = MAX(nstep, INT(DT/delta_tp + 1.))
2524 if (ksed1(1) .eq. kte) ksed1(1) = kte-1
2525 if (nstep .gt. 0) onstep(1) = 1./REAL(nstep)
2527 !+---+-----------------------------------------------------------------+
2529 if (.not. iiwarm) then
2535 if (ri(k).gt. R1) then
2536 lami = (am_i*cig(2)*oig1*ni(k)/ri(k))**obmi
2538 vti = rhof(k)*av_i*cig(3)*oig2 * ilami**bv_i
2540 ! First below is technically correct:
2541 ! vti = rhof(k)*av_i*cig(4)*oig1 * ilami**bv_i
2542 ! Goal: less prominent size sorting
2543 vti = rhof(k)*av_i*cig(6)/cig(7) * ilami**bv_i
2547 vtnik(k) = vtnik(k+1)
2550 if (vtik(k) .gt. 1.E-3) then
2551 ksed1(2) = MAX(ksed1(2), k)
2552 delta_tp = dzq(k)/vtik(k)
2553 nstep = MAX(nstep, INT(DT/delta_tp + 1.))
2556 if (ksed1(2) .eq. kte) ksed1(2) = kte-1
2557 if (nstep .gt. 0) onstep(2) = 1./REAL(nstep)
2559 !+---+-----------------------------------------------------------------+
2565 if (rs(k).gt. R2) then
2566 xDs = smoc(k) / smob(k)
2568 ils1 = 1./(Mrat*Lam0 + fv_s)
2569 ils2 = 1./(Mrat*Lam1 + fv_s)
2570 t1_vts = Kap0*csg(4)*ils1**cse(4)
2571 t2_vts = Kap1*Mrat**mu_s*csg(10)*ils2**cse(10)
2572 ils1 = 1./(Mrat*Lam0)
2573 ils2 = 1./(Mrat*Lam1)
2574 t3_vts = Kap0*csg(1)*ils1**cse(1)
2575 t4_vts = Kap1*Mrat**mu_s*csg(7)*ils2**cse(7)
2576 vts = rhof(k)*av_s * (t1_vts+t2_vts)/(t3_vts+t4_vts)
2577 if (temp(k).gt. T_0) then
2578 vtsk(k) = MAX(vts*vts_boost(k), vtrk(k))
2580 vtsk(k) = vts*vts_boost(k)
2586 if (vtsk(k) .gt. 1.E-3) then
2587 ksed1(3) = MAX(ksed1(3), k)
2588 delta_tp = dzq(k)/vtsk(k)
2589 nstep = MAX(nstep, INT(DT/delta_tp + 1.))
2592 if (ksed1(3) .eq. kte) ksed1(3) = kte-1
2593 if (nstep .gt. 0) onstep(3) = 1./REAL(nstep)
2595 !+---+-----------------------------------------------------------------+
2601 if (rg(k).gt. R2) then
2602 vtg = rhof(k)*av_g*cgg(6)*ogg3 * ilamg(k)**bv_g
2603 if (temp(k).gt. T_0) then
2604 vtgk(k) = MAX(vtg, vtrk(k))
2612 if (vtgk(k) .gt. 1.E-3) then
2613 ksed1(4) = MAX(ksed1(4), k)
2614 delta_tp = dzq(k)/vtgk(k)
2615 nstep = MAX(nstep, INT(DT/delta_tp + 1.))
2618 if (ksed1(4) .eq. kte) ksed1(4) = kte-1
2619 if (nstep .gt. 0) onstep(4) = 1./REAL(nstep)
2622 !+---+-----------------------------------------------------------------+
2623 !..Sedimentation of mixing ratio is the integral of v(D)*m(D)*N(D)*dD,
2624 !.. whereas neglect m(D) term for number concentration. Therefore,
2625 !.. cloud ice has proper differential sedimentation.
2626 !.. New in v3.0+ is computing separate for rain, ice, snow, and
2627 !.. graupel species thus making code faster with credit to J. Schmidt.
2628 !+---+-----------------------------------------------------------------+
2630 nstep = NINT(1./onstep(1))
2633 sed_r(k) = vtrk(k)*rr(k)
2634 sed_n(k) = vtnrk(k)*nr(k)
2639 qrten(k) = qrten(k) - sed_r(k)*odzq*onstep(1)*orho
2640 nrten(k) = nrten(k) - sed_n(k)*odzq*onstep(1)*orho
2641 rr(k) = MAX(R1, rr(k) - sed_r(k)*odzq*DT*onstep(1))
2642 nr(k) = MAX(R2, nr(k) - sed_n(k)*odzq*DT*onstep(1))
2643 do k = ksed1(1), kts, -1
2646 qrten(k) = qrten(k) + (sed_r(k+1)-sed_r(k)) &
2647 *odzq*onstep(1)*orho
2648 nrten(k) = nrten(k) + (sed_n(k+1)-sed_n(k)) &
2649 *odzq*onstep(1)*orho
2650 rr(k) = MAX(R1, rr(k) + (sed_r(k+1)-sed_r(k)) &
2652 nr(k) = MAX(R2, nr(k) + (sed_n(k+1)-sed_n(k)) &
2656 if (rr(kts).gt.R1*10.) &
2657 pptrain = pptrain + sed_r(kts)*DT*onstep(1)
2660 !+---+-----------------------------------------------------------------+
2662 nstep = NINT(1./onstep(2))
2665 sed_i(k) = vtik(k)*ri(k)
2666 sed_n(k) = vtnik(k)*ni(k)
2671 qiten(k) = qiten(k) - sed_i(k)*odzq*onstep(2)*orho
2672 niten(k) = niten(k) - sed_n(k)*odzq*onstep(2)*orho
2673 ri(k) = MAX(R1, ri(k) - sed_i(k)*odzq*DT*onstep(2))
2674 ni(k) = MAX(R2, ni(k) - sed_n(k)*odzq*DT*onstep(2))
2675 do k = ksed1(2), kts, -1
2678 qiten(k) = qiten(k) + (sed_i(k+1)-sed_i(k)) &
2679 *odzq*onstep(2)*orho
2680 niten(k) = niten(k) + (sed_n(k+1)-sed_n(k)) &
2681 *odzq*onstep(2)*orho
2682 ri(k) = MAX(R1, ri(k) + (sed_i(k+1)-sed_i(k)) &
2684 ni(k) = MAX(R2, ni(k) + (sed_n(k+1)-sed_n(k)) &
2688 if (ri(kts).gt.R1*10.) &
2689 pptice = pptice + sed_i(kts)*DT*onstep(2)
2692 !+---+-----------------------------------------------------------------+
2694 nstep = NINT(1./onstep(3))
2697 sed_s(k) = vtsk(k)*rs(k)
2702 qsten(k) = qsten(k) - sed_s(k)*odzq*onstep(3)*orho
2703 rs(k) = MAX(R1, rs(k) - sed_s(k)*odzq*DT*onstep(3))
2704 do k = ksed1(3), kts, -1
2707 qsten(k) = qsten(k) + (sed_s(k+1)-sed_s(k)) &
2708 *odzq*onstep(3)*orho
2709 rs(k) = MAX(R1, rs(k) + (sed_s(k+1)-sed_s(k)) &
2713 if (rs(kts).gt.R1*10.) &
2714 pptsnow = pptsnow + sed_s(kts)*DT*onstep(3)
2717 !+---+-----------------------------------------------------------------+
2719 nstep = NINT(1./onstep(4))
2722 sed_g(k) = vtgk(k)*rg(k)
2727 qgten(k) = qgten(k) - sed_g(k)*odzq*onstep(4)*orho
2728 rg(k) = MAX(R1, rg(k) - sed_g(k)*odzq*DT*onstep(4))
2729 do k = ksed1(4), kts, -1
2732 qgten(k) = qgten(k) + (sed_g(k+1)-sed_g(k)) &
2733 *odzq*onstep(4)*orho
2734 rg(k) = MAX(R1, rg(k) + (sed_g(k+1)-sed_g(k)) &
2738 if (rg(kts).gt.R1*10.) &
2739 pptgraul = pptgraul + sed_g(kts)*DT*onstep(4)
2742 !+---+-----------------------------------------------------------------+
2743 !.. Instantly melt any cloud ice into cloud water if above 0C and
2744 !.. instantly freeze any cloud water found below HGFR.
2745 !+---+-----------------------------------------------------------------+
2746 if (.not. iiwarm) then
2748 xri = MAX(0.0, qi1d(k) + qiten(k)*DT)
2749 if ( (temp(k).gt. T_0) .and. (xri.gt. 0.0) ) then
2750 qcten(k) = qcten(k) + xri*odt
2751 qiten(k) = qiten(k) - xri*odt
2752 niten(k) = -ni1d(k)*odt
2753 tten(k) = tten(k) - lfus*ocp(k)*xri*odt*(1-IFDRY)
2756 xrc = MAX(0.0, qc1d(k) + qcten(k)*DT)
2757 if ( (temp(k).lt. HGFR) .and. (xrc.gt. 0.0) ) then
2758 lfus2 = lsub - lvap(k)
2759 qiten(k) = qiten(k) + xrc*odt
2760 niten(k) = niten(k) + xrc/xm0i * odt
2761 qcten(k) = qcten(k) - xrc*odt
2762 tten(k) = tten(k) + lfus2*ocp(k)*xrc*odt*(1-IFDRY)
2767 !+---+-----------------------------------------------------------------+
2768 !.. All tendencies computed, apply and pass back final values to parent.
2769 !+---+-----------------------------------------------------------------+
2771 t1d(k) = t1d(k) + tten(k)*DT
2772 qv1d(k) = MAX(1.E-10, qv1d(k) + qvten(k)*DT)
2773 qc1d(k) = qc1d(k) + qcten(k)*DT
2774 if (qc1d(k) .le. R1) qc1d(k) = 0.0
2775 qi1d(k) = qi1d(k) + qiten(k)*DT
2776 ni1d(k) = MAX(R2/rho(k), ni1d(k) + niten(k)*DT)
2777 if (qi1d(k) .le. R1) then
2781 lami = (am_i*cig(2)*oig1*ni1d(k)/qi1d(k))**obmi
2783 xDi = (bm_i + mu_i + 1.) * ilami
2784 if (xDi.lt. 20.E-6) then
2785 lami = cie(2)/20.E-6
2786 elseif (xDi.gt. 300.E-6) then
2787 lami = cie(2)/300.E-6
2789 ni1d(k) = MIN(cig(1)*oig2*qi1d(k)/am_i*lami**bm_i, &
2792 qr1d(k) = qr1d(k) + qrten(k)*DT
2793 nr1d(k) = MAX(R2/rho(k), nr1d(k) + nrten(k)*DT)
2794 if (qr1d(k) .le. R1) then
2798 lamr = (am_r*crg(3)*org2*nr1d(k)/qr1d(k))**obmr
2799 mvd_r(k) = (3.0 + mu_r + 0.672) / lamr
2800 if (mvd_r(k) .gt. 2.5E-3) then
2802 elseif (mvd_r(k) .lt. D0r*0.75) then
2805 lamr = (3.0 + mu_r + 0.672) / mvd_r(k)
2806 nr1d(k) = crg(2)*org3*qr1d(k)*lamr**bm_r / am_r
2808 qs1d(k) = qs1d(k) + qsten(k)*DT
2809 if (qs1d(k) .le. R1) qs1d(k) = 0.0
2810 qg1d(k) = qg1d(k) + qgten(k)*DT
2811 if (qg1d(k) .le. R1) qg1d(k) = 0.0
2814 end subroutine mp_thompson
2815 !+---+-----------------------------------------------------------------+
2817 !+---+-----------------------------------------------------------------+
2818 !..Creation of the lookup tables and support functions found below here.
2819 !+---+-----------------------------------------------------------------+
2820 !..Rain collecting graupel (and inverse). Explicit CE integration.
2821 !+---+-----------------------------------------------------------------+
2823 subroutine qr_acr_qg
2828 INTEGER:: i, j, k, m, n, n2
2829 INTEGER:: km, km_s, km_e
2830 DOUBLE PRECISION, DIMENSION(nbg):: vg, N_g
2831 DOUBLE PRECISION, DIMENSION(nbr):: vr, N_r
2832 DOUBLE PRECISION:: N0_r, N0_g, lam_exp, lamg, lamr
2833 DOUBLE PRECISION:: massg, massr, dvg, dvr, t1, t2, z1, z2, y1, y2
2838 ! vr(n2) = av_r*Dr(n2)**bv_r * DEXP(-fv_r*Dr(n2))
2839 vr(n2) = -0.1021 + 4.932E3*Dr(n2) - 0.9551E6*Dr(n2)*Dr(n2) &
2840 + 0.07934E9*Dr(n2)*Dr(n2)*Dr(n2) &
2841 - 0.002362E12*Dr(n2)*Dr(n2)*Dr(n2)*Dr(n2)
2844 vg(n) = av_g*Dg(n)**bv_g
2847 !..Note values returned from wrf_dm_decomp1d are zero-based, add 1 for
2848 !.. fortran indices. J. Michalakes, 2009Oct30.
2850 #if ( defined( DM_PARALLEL ) && ( ! defined( STUBMPI ) ) )
2851 CALL wrf_dm_decomp1d ( ntb_r*ntb_r1, km_s, km_e )
2854 km_e = ntb_r*ntb_r1 - 1
2859 k = mod( km , ntb_r1 ) + 1
2861 lam_exp = (N0r_exp(k)*am_r*crg(1)/r_r(m))**ore1
2862 lamr = lam_exp * (crg(3)*org2*org1)**obmr
2863 N0_r = N0r_exp(k)/(crg(2)*lam_exp) * lamr**cre(2)
2865 N_r(n2) = N0_r*Dr(n2)**mu_r *DEXP(-lamr*Dr(n2))*dtr(n2)
2870 lam_exp = (N0g_exp(i)*am_g*cgg(1)/r_g(j))**oge1
2871 lamg = lam_exp * (cgg(3)*ogg2*ogg1)**obmg
2872 N0_g = N0g_exp(i)/(cgg(2)*lam_exp) * lamg**cge(2)
2874 N_g(n) = N0_g*Dg(n)**mu_g * DEXP(-lamg*Dg(n))*dtg(n)
2884 massr = am_r * Dr(n2)**bm_r
2886 massg = am_g * Dg(n)**bm_g
2888 dvg = 0.5d0*((vr(n2) - vg(n)) + DABS(vr(n2)-vg(n)))
2889 dvr = 0.5d0*((vg(n) - vr(n2)) + DABS(vg(n)-vr(n2)))
2891 t1 = t1+ PI*.25*Ef_rg*(Dg(n)+Dr(n2))*(Dg(n)+Dr(n2)) &
2892 *dvg*massg * N_g(n)* N_r(n2)
2893 z1 = z1+ PI*.25*Ef_rg*(Dg(n)+Dr(n2))*(Dg(n)+Dr(n2)) &
2894 *dvg*massr * N_g(n)* N_r(n2)
2895 y1 = y1+ PI*.25*Ef_rg*(Dg(n)+Dr(n2))*(Dg(n)+Dr(n2)) &
2896 *dvg * N_g(n)* N_r(n2)
2898 t2 = t2+ PI*.25*Ef_rg*(Dg(n)+Dr(n2))*(Dg(n)+Dr(n2)) &
2899 *dvr*massr * N_g(n)* N_r(n2)
2900 y2 = y2+ PI*.25*Ef_rg*(Dg(n)+Dr(n2))*(Dg(n)+Dr(n2)) &
2901 *dvr * N_g(n)* N_r(n2)
2902 z2 = z2+ PI*.25*Ef_rg*(Dg(n)+Dr(n2))*(Dg(n)+Dr(n2)) &
2903 *dvr*massg * N_g(n)* N_r(n2)
2907 tcg_racg(i,j,k,m) = t1
2908 tmr_racg(i,j,k,m) = DMIN1(z1, r_r(m)*1.0d0)
2909 tcr_gacr(i,j,k,m) = t2
2910 tmg_gacr(i,j,k,m) = z2
2911 tnr_racg(i,j,k,m) = y1
2912 tnr_gacr(i,j,k,m) = y2
2917 !..Note wrf_dm_gatherv expects zero-based km_s, km_e (J. Michalakes, 2009Oct30).
2919 #if ( defined( DM_PARALLEL ) && ( ! defined( STUBMPI ) ) )
2920 CALL wrf_dm_gatherv(tcg_racg, ntb_g*ntb_g1, km_s, km_e, R8SIZE)
2921 CALL wrf_dm_gatherv(tmr_racg, ntb_g*ntb_g1, km_s, km_e, R8SIZE)
2922 CALL wrf_dm_gatherv(tcr_gacr, ntb_g*ntb_g1, km_s, km_e, R8SIZE)
2923 CALL wrf_dm_gatherv(tmg_gacr, ntb_g*ntb_g1, km_s, km_e, R8SIZE)
2924 CALL wrf_dm_gatherv(tnr_racg, ntb_g*ntb_g1, km_s, km_e, R8SIZE)
2925 CALL wrf_dm_gatherv(tnr_gacr, ntb_g*ntb_g1, km_s, km_e, R8SIZE)
2929 end subroutine qr_acr_qg
2930 !+---+-----------------------------------------------------------------+
2932 !+---+-----------------------------------------------------------------+
2933 !..Rain collecting snow (and inverse). Explicit CE integration.
2934 !+---+-----------------------------------------------------------------+
2936 subroutine qr_acr_qs
2941 INTEGER:: i, j, k, m, n, n2
2942 INTEGER:: km, km_s, km_e
2943 DOUBLE PRECISION, DIMENSION(nbr):: vr, D1, N_r
2944 DOUBLE PRECISION, DIMENSION(nbs):: vs, N_s
2945 DOUBLE PRECISION:: loga_, a_, b_, second, M0, M2, M3, Mrat, oM3
2946 DOUBLE PRECISION:: N0_r, lam_exp, lamr, slam1, slam2
2947 DOUBLE PRECISION:: dvs, dvr, masss, massr
2948 DOUBLE PRECISION:: t1, t2, t3, t4, z1, z2, z3, z4
2949 DOUBLE PRECISION:: y1, y2, y3, y4
2954 ! vr(n2) = av_r*Dr(n2)**bv_r * DEXP(-fv_r*Dr(n2))
2955 vr(n2) = -0.1021 + 4.932E3*Dr(n2) - 0.9551E6*Dr(n2)*Dr(n2) &
2956 + 0.07934E9*Dr(n2)*Dr(n2)*Dr(n2) &
2957 - 0.002362E12*Dr(n2)*Dr(n2)*Dr(n2)*Dr(n2)
2958 D1(n2) = (vr(n2)/av_s)**(1./bv_s)
2961 vs(n) = 1.5*av_s*Ds(n)**bv_s * DEXP(-fv_s*Ds(n))
2964 !..Note values returned from wrf_dm_decomp1d are zero-based, add 1 for
2965 !.. fortran indices. J. Michalakes, 2009Oct30.
2967 #if ( defined( DM_PARALLEL ) && ( ! defined( STUBMPI ) ) )
2968 CALL wrf_dm_decomp1d ( ntb_r*ntb_r1, km_s, km_e )
2971 km_e = ntb_r*ntb_r1 - 1
2976 k = mod( km , ntb_r1 ) + 1
2978 lam_exp = (N0r_exp(k)*am_r*crg(1)/r_r(m))**ore1
2979 lamr = lam_exp * (crg(3)*org2*org1)**obmr
2980 N0_r = N0r_exp(k)/(crg(2)*lam_exp) * lamr**cre(2)
2982 N_r(n2) = N0_r*Dr(n2)**mu_r * DEXP(-lamr*Dr(n2))*dtr(n2)
2988 !..From the bm_s moment, compute plus one moment. If we are not
2989 !.. using bm_s=2, then we must transform to the pure 2nd moment
2990 !.. (variable called "second") and then to the bm_s+1 moment.
2992 M2 = r_s(i)*oams *1.0d0
2993 if (bm_s.gt.2.0-1.E-3 .and. bm_s.lt.2.0+1.E-3) then
2994 loga_ = sa(1) + sa(2)*Tc(j) + sa(3)*bm_s &
2995 + sa(4)*Tc(j)*bm_s + sa(5)*Tc(j)*Tc(j) &
2996 + sa(6)*bm_s*bm_s + sa(7)*Tc(j)*Tc(j)*bm_s &
2997 + sa(8)*Tc(j)*bm_s*bm_s + sa(9)*Tc(j)*Tc(j)*Tc(j) &
2998 + sa(10)*bm_s*bm_s*bm_s
3000 b_ = sb(1) + sb(2)*Tc(j) + sb(3)*bm_s &
3001 + sb(4)*Tc(j)*bm_s + sb(5)*Tc(j)*Tc(j) &
3002 + sb(6)*bm_s*bm_s + sb(7)*Tc(j)*Tc(j)*bm_s &
3003 + sb(8)*Tc(j)*bm_s*bm_s + sb(9)*Tc(j)*Tc(j)*Tc(j) &
3004 + sb(10)*bm_s*bm_s*bm_s
3005 second = (M2/a_)**(1./b_)
3010 loga_ = sa(1) + sa(2)*Tc(j) + sa(3)*cse(1) &
3011 + sa(4)*Tc(j)*cse(1) + sa(5)*Tc(j)*Tc(j) &
3012 + sa(6)*cse(1)*cse(1) + sa(7)*Tc(j)*Tc(j)*cse(1) &
3013 + sa(8)*Tc(j)*cse(1)*cse(1) + sa(9)*Tc(j)*Tc(j)*Tc(j) &
3014 + sa(10)*cse(1)*cse(1)*cse(1)
3016 b_ = sb(1)+sb(2)*Tc(j)+sb(3)*cse(1) + sb(4)*Tc(j)*cse(1) &
3017 + sb(5)*Tc(j)*Tc(j) + sb(6)*cse(1)*cse(1) &
3018 + sb(7)*Tc(j)*Tc(j)*cse(1) + sb(8)*Tc(j)*cse(1)*cse(1) &
3019 + sb(9)*Tc(j)*Tc(j)*Tc(j)+sb(10)*cse(1)*cse(1)*cse(1)
3020 M3 = a_ * second**b_
3023 Mrat = M2*(M2*oM3)*(M2*oM3)*(M2*oM3)
3025 slam1 = M2 * oM3 * Lam0
3026 slam2 = M2 * oM3 * Lam1
3029 N_s(n) = Mrat*(Kap0*DEXP(-slam1*Ds(n)) &
3030 + Kap1*M0*Ds(n)**mu_s * DEXP(-slam2*Ds(n)))*dts(n)
3046 massr = am_r * Dr(n2)**bm_r
3048 masss = am_s * Ds(n)**bm_s
3050 dvs = 0.5d0*((vr(n2) - vs(n)) + DABS(vr(n2)-vs(n)))
3051 dvr = 0.5d0*((vs(n) - vr(n2)) + DABS(vs(n)-vr(n2)))
3053 if (massr .gt. 1.5*masss) then
3054 t1 = t1+ PI*.25*Ef_rs*(Ds(n)+Dr(n2))*(Ds(n)+Dr(n2)) &
3055 *dvs*masss * N_s(n)* N_r(n2)
3056 z1 = z1+ PI*.25*Ef_rs*(Ds(n)+Dr(n2))*(Ds(n)+Dr(n2)) &
3057 *dvs*massr * N_s(n)* N_r(n2)
3058 y1 = y1+ PI*.25*Ef_rs*(Ds(n)+Dr(n2))*(Ds(n)+Dr(n2)) &
3059 *dvs * N_s(n)* N_r(n2)
3061 t3 = t3+ PI*.25*Ef_rs*(Ds(n)+Dr(n2))*(Ds(n)+Dr(n2)) &
3062 *dvs*masss * N_s(n)* N_r(n2)
3063 z3 = z3+ PI*.25*Ef_rs*(Ds(n)+Dr(n2))*(Ds(n)+Dr(n2)) &
3064 *dvs*massr * N_s(n)* N_r(n2)
3065 y3 = y3+ PI*.25*Ef_rs*(Ds(n)+Dr(n2))*(Ds(n)+Dr(n2)) &
3066 *dvs * N_s(n)* N_r(n2)
3069 if (massr .gt. 1.5*masss) then
3070 t2 = t2+ PI*.25*Ef_rs*(Ds(n)+Dr(n2))*(Ds(n)+Dr(n2)) &
3071 *dvr*massr * N_s(n)* N_r(n2)
3072 y2 = y2+ PI*.25*Ef_rs*(Ds(n)+Dr(n2))*(Ds(n)+Dr(n2)) &
3073 *dvr * N_s(n)* N_r(n2)
3074 z2 = z2+ PI*.25*Ef_rs*(Ds(n)+Dr(n2))*(Ds(n)+Dr(n2)) &
3075 *dvr*masss * N_s(n)* N_r(n2)
3077 t4 = t4+ PI*.25*Ef_rs*(Ds(n)+Dr(n2))*(Ds(n)+Dr(n2)) &
3078 *dvr*massr * N_s(n)* N_r(n2)
3079 y4 = y4+ PI*.25*Ef_rs*(Ds(n)+Dr(n2))*(Ds(n)+Dr(n2)) &
3080 *dvr * N_s(n)* N_r(n2)
3081 z4 = z4+ PI*.25*Ef_rs*(Ds(n)+Dr(n2))*(Ds(n)+Dr(n2)) &
3082 *dvr*masss * N_s(n)* N_r(n2)
3087 tcs_racs1(i,j,k,m) = t1
3088 tmr_racs1(i,j,k,m) = DMIN1(z1, r_r(m)*1.0d0)
3089 tcs_racs2(i,j,k,m) = t3
3090 tmr_racs2(i,j,k,m) = z3
3091 tcr_sacr1(i,j,k,m) = t2
3092 tms_sacr1(i,j,k,m) = z2
3093 tcr_sacr2(i,j,k,m) = t4
3094 tms_sacr2(i,j,k,m) = z4
3095 tnr_racs1(i,j,k,m) = y1
3096 tnr_racs2(i,j,k,m) = y3
3097 tnr_sacr1(i,j,k,m) = y2
3098 tnr_sacr2(i,j,k,m) = y4
3103 !..Note wrf_dm_gatherv expects zero-based km_s, km_e (J. Michalakes, 2009Oct30).
3105 #if ( defined( DM_PARALLEL ) && ( ! defined( STUBMPI ) ) )
3106 CALL wrf_dm_gatherv(tcs_racs1, ntb_s*ntb_t, km_s, km_e, R8SIZE)
3107 CALL wrf_dm_gatherv(tmr_racs1, ntb_s*ntb_t, km_s, km_e, R8SIZE)
3108 CALL wrf_dm_gatherv(tcs_racs2, ntb_s*ntb_t, km_s, km_e, R8SIZE)
3109 CALL wrf_dm_gatherv(tmr_racs2, ntb_s*ntb_t, km_s, km_e, R8SIZE)
3110 CALL wrf_dm_gatherv(tcr_sacr1, ntb_s*ntb_t, km_s, km_e, R8SIZE)
3111 CALL wrf_dm_gatherv(tms_sacr1, ntb_s*ntb_t, km_s, km_e, R8SIZE)
3112 CALL wrf_dm_gatherv(tcr_sacr2, ntb_s*ntb_t, km_s, km_e, R8SIZE)
3113 CALL wrf_dm_gatherv(tms_sacr2, ntb_s*ntb_t, km_s, km_e, R8SIZE)
3114 CALL wrf_dm_gatherv(tnr_racs1, ntb_s*ntb_t, km_s, km_e, R8SIZE)
3115 CALL wrf_dm_gatherv(tnr_racs2, ntb_s*ntb_t, km_s, km_e, R8SIZE)
3116 CALL wrf_dm_gatherv(tnr_sacr1, ntb_s*ntb_t, km_s, km_e, R8SIZE)
3117 CALL wrf_dm_gatherv(tnr_sacr2, ntb_s*ntb_t, km_s, km_e, R8SIZE)
3121 end subroutine qr_acr_qs
3122 !+---+-----------------------------------------------------------------+
3124 !+---+-----------------------------------------------------------------+
3125 !..This is a literal adaptation of Bigg (1954) probability of drops of
3126 !..a particular volume freezing. Given this probability, simply freeze
3127 !..the proportion of drops summing their masses.
3128 !+---+-----------------------------------------------------------------+
3130 subroutine freezeH2O
3135 INTEGER:: i, j, k, n, n2
3136 DOUBLE PRECISION, DIMENSION(nbr):: N_r, massr
3137 DOUBLE PRECISION, DIMENSION(nbc):: N_c, massc
3138 DOUBLE PRECISION:: sum1, sum2, sumn1, sumn2, &
3139 prob, vol, Texp, orho_w, &
3140 lam_exp, lamr, N0_r, lamc, N0_c, y
3147 massr(n2) = am_r*Dr(n2)**bm_r
3150 massc(n) = am_r*Dc(n)**bm_r
3153 !..Freeze water (smallest drops become cloud ice, otherwise graupel).
3155 ! print*, ' Freezing water for temp = ', -k
3156 Texp = DEXP( DFLOAT(k) ) - 1.0D0
3159 lam_exp = (N0r_exp(j)*am_r*crg(1)/r_r(i))**ore1
3160 lamr = lam_exp * (crg(3)*org2*org1)**obmr
3161 N0_r = N0r_exp(j)/(crg(2)*lam_exp) * lamr**cre(2)
3167 N_r(n2) = N0_r*Dr(n2)**mu_r*DEXP(-lamr*Dr(n2))*dtr(n2)
3168 vol = massr(n2)*orho_w
3169 prob = 1.0D0 - DEXP(-120.0D0*vol*5.2D-4 * Texp)
3170 if (massr(n2) .lt. xm0g) then
3171 sumn1 = sumn1 + prob*N_r(n2)
3172 sum1 = sum1 + prob*N_r(n2)*massr(n2)
3174 sumn2 = sumn2 + prob*N_r(n2)
3175 sum2 = sum2 + prob*N_r(n2)*massr(n2)
3178 tpi_qrfz(i,j,k) = sum1
3179 tni_qrfz(i,j,k) = sumn1
3180 tpg_qrfz(i,j,k) = sum2
3181 tnr_qrfz(i,j,k) = sumn2
3185 lamc = 1.0D-6 * (Nt_c*am_r* ccg(2) * ocg1 / r_c(i))**obmr
3186 N0_c = 1.0D-18 * Nt_c*ocg1 * lamc**cce(1)
3191 vol = massc(n)*orho_w
3192 prob = 1.0D0 - DEXP(-120.0D0*vol*5.2D-4 * Texp)
3193 N_c(n) = N0_c* y**mu_c * EXP(-lamc*y)*dtc(n)
3194 N_c(n) = 1.0D24 * N_c(n)
3195 sumn2 = sumn2 + prob*N_c(n)
3196 sum1 = sum1 + prob*N_c(n)*massc(n)
3198 tpi_qcfz(i,k) = sum1
3199 tni_qcfz(i,k) = sumn2
3203 end subroutine freezeH2O
3204 !+---+-----------------------------------------------------------------+
3206 !+---+-----------------------------------------------------------------+
3207 !..Cloud ice converting to snow since portion greater than min snow
3208 !.. size. Given cloud ice content (kg/m**3), number concentration
3209 !.. (#/m**3) and gamma shape parameter, mu_i, break the distrib into
3210 !.. bins and figure out the mass/number of ice with sizes larger than
3211 !.. D0s. Also, compute incomplete gamma function for the integration
3212 !.. of ice depositional growth from diameter=0 to D0s. Amount of
3213 !.. ice depositional growth is this portion of distrib while larger
3214 !.. diameters contribute to snow growth (as in Harrington et al. 1995).
3215 !+---+-----------------------------------------------------------------+
3217 subroutine qi_aut_qs
3223 DOUBLE PRECISION, DIMENSION(nbi):: N_i
3224 DOUBLE PRECISION:: N0_i, lami, Di_mean, t1, t2
3231 lami = (am_i*cig(2)*oig1*Nt_i(j)/r_i(i))**obmi
3232 Di_mean = (bm_i + mu_i + 1.) / lami
3233 N0_i = Nt_i(j)*oig1 * lami**cie(1)
3236 if (SNGL(Di_mean) .gt. 5.*D0s) then
3239 tpi_ide(i,j) = 0.0D0
3240 elseif (SNGL(Di_mean) .lt. D0i) then
3243 tpi_ide(i,j) = 1.0D0
3245 xlimit_intg = lami*D0s
3246 tpi_ide(i,j) = GAMMP(mu_i+2.0, xlimit_intg) * 1.0D0
3248 N_i(n2) = N0_i*Di(n2)**mu_i * DEXP(-lami*Di(n2))*dti(n2)
3249 if (Di(n2).ge.D0s) then
3250 t1 = t1 + N_i(n2) * am_i*Di(n2)**bm_i
3260 end subroutine qi_aut_qs
3262 !+---+-----------------------------------------------------------------+
3263 !..Variable collision efficiency for rain collecting cloud water using
3264 !.. method of Beard and Grover, 1974 if a/A less than 0.25; otherwise
3265 !.. uses polynomials to get close match of Pruppacher & Klett Fig 14-9.
3266 !+---+-----------------------------------------------------------------+
3268 subroutine table_Efrw
3273 DOUBLE PRECISION:: vtr, stokes, reynolds, Ef_rw
3274 DOUBLE PRECISION:: p, yc0, F, G, H, z, K0, X
3281 if (Dr(i).lt.50.E-6 .or. Dc(j).lt.3.E-6) then
3283 elseif (p.gt.0.25) then
3285 if (Dr(i) .lt. 75.e-6) then
3286 Ef_rw = 0.026794*X - 0.20604
3287 elseif (Dr(i) .lt. 125.e-6) then
3288 Ef_rw = -0.00066842*X*X + 0.061542*X - 0.37089
3289 elseif (Dr(i) .lt. 175.e-6) then
3290 Ef_rw = 4.091e-06*X*X*X*X - 0.00030908*X*X*X &
3291 + 0.0066237*X*X - 0.0013687*X - 0.073022
3292 elseif (Dr(i) .lt. 250.e-6) then
3293 Ef_rw = 9.6719e-5*X*X*X - 0.0068901*X*X + 0.17305*X &
3295 elseif (Dr(i) .lt. 350.e-6) then
3296 Ef_rw = 9.0488e-5*X*X*X - 0.006585*X*X + 0.16606*X &
3299 Ef_rw = 0.00010721*X*X*X - 0.0072962*X*X + 0.1704*X &
3303 vtr = -0.1021 + 4.932E3*Dr(i) - 0.9551E6*Dr(i)*Dr(i) &
3304 + 0.07934E9*Dr(i)*Dr(i)*Dr(i) &
3305 - 0.002362E12*Dr(i)*Dr(i)*Dr(i)*Dr(i)
3306 stokes = Dc(j)*Dc(j)*vtr*rho_w/(9.*1.718E-5*Dr(i))
3307 reynolds = 9.*stokes/(p*p*rho_w)
3310 G = -0.1007D0 - 0.358D0*F + 0.0261D0*F*F
3312 z = DLOG(stokes/(K0+1.D-15))
3313 H = 0.1465D0 + 1.302D0*z - 0.607D0*z*z + 0.293D0*z*z*z
3314 yc0 = 2.0D0/PI * ATAN(H)
3315 Ef_rw = (yc0+p)*(yc0+p) / ((1.+p)*(1.+p))
3319 t_Efrw(i,j) = MAX(0.0, MIN(SNGL(Ef_rw), 0.95))
3324 end subroutine table_Efrw
3326 !+---+-----------------------------------------------------------------+
3327 !..Variable collision efficiency for snow collecting cloud water using
3328 !.. method of Wang and Ji, 2000 except equate melted snow diameter to
3329 !.. their "effective collision cross-section."
3330 !+---+-----------------------------------------------------------------+
3332 subroutine table_Efsw
3337 DOUBLE PRECISION:: Ds_m, vts, vtc, stokes, reynolds, Ef_sw
3338 DOUBLE PRECISION:: p, yc0, F, G, H, z, K0
3342 vtc = 1.19D4 * (1.0D4*Dc(j)*Dc(j)*0.25D0)
3344 vts = av_s*Ds(i)**bv_s * DEXP(-fv_s*Ds(i)) - vtc
3345 Ds_m = (am_s*Ds(i)**bm_s / am_r)**obmr
3347 if (p.gt.0.25 .or. Ds(i).lt.D0s .or. Dc(j).lt.6.E-6 &
3348 .or. vts.lt.1.E-3) then
3351 stokes = Dc(j)*Dc(j)*vts*rho_w/(9.*1.718E-5*Ds_m)
3352 reynolds = 9.*stokes/(p*p*rho_w)
3355 G = -0.1007D0 - 0.358D0*F + 0.0261D0*F*F
3357 z = DLOG(stokes/(K0+1.D-15))
3358 H = 0.1465D0 + 1.302D0*z - 0.607D0*z*z + 0.293D0*z*z*z
3359 yc0 = 2.0D0/PI * ATAN(H)
3360 Ef_sw = (yc0+p)*(yc0+p) / ((1.+p)*(1.+p))
3362 t_Efsw(i,j) = MAX(0.0, MIN(SNGL(Ef_sw), 0.95))
3368 end subroutine table_Efsw
3370 !+---+-----------------------------------------------------------------+
3371 !..Integrate rain size distribution from zero to D-star to compute the
3372 !.. number of drops smaller than D-star that evaporate in a single
3373 !.. timestep. Drops larger than D-star dont evaporate entirely so do
3374 !.. not affect number concentration.
3375 !+---+-----------------------------------------------------------------+
3377 subroutine table_dropEvap
3382 DOUBLE PRECISION:: Nt_r, N0, lam_exp, lam
3388 lam_exp = (N0r_exp(j)*am_r*crg(1)/r_r(k))**ore1
3389 lam = lam_exp * (crg(3)*org2*org1)**obmr
3390 N0 = N0r_exp(j)/(crg(2)*lam_exp) * lam**cre(2)
3391 Nt_r = N0 * crg(2) / lam**cre(2)
3394 xlimit_intg = lam*Dr(i)
3395 tnr_rev(i,j,k) = GAMMP(mu_r+1.0, xlimit_intg) * Nt_r
3401 end subroutine table_dropEvap
3403 ! TO APPLY TABLE ABOVE
3404 !..Rain lookup table indexes.
3405 ! Dr_star = DSQRT(-2.D0*DT * t1_evap/(2.*PI) &
3406 ! * 0.78*4.*diffu(k)*xsat*rvs/rho_w)
3407 ! idx_d = NINT(1.0 + FLOAT(nbr) * DLOG(Dr_star/D0r) &
3408 ! / DLOG(Dr(nbr)/D0r))
3409 ! idx_d = MAX(1, MIN(idx_d, nbr))
3411 ! nir = NINT(ALOG10(rr(k)))
3412 ! do nn = nir-1, nir+1
3414 ! if ( (rr(k)/10.**nn).ge.1.0 .and. &
3415 ! (rr(k)/10.**nn).lt.10.0) goto 154
3418 ! idx_r = INT(rr(k)/10.**n) + 10*(n-nir2) - (n-nir2)
3419 ! idx_r = MAX(1, MIN(idx_r, ntb_r))
3421 ! lamr = (am_r*crg(3)*org2*nr(k)/rr(k))**obmr
3422 ! lam_exp = lamr * (crg(3)*org2*org1)**bm_r
3423 ! N0_exp = org1*rr(k)/am_r * lam_exp**cre(1)
3424 ! nir = NINT(DLOG10(N0_exp))
3425 ! do nn = nir-1, nir+1
3427 ! if ( (N0_exp/10.**nn).ge.1.0 .and. &
3428 ! (N0_exp/10.**nn).lt.10.0) goto 155
3431 ! idx_r1 = INT(N0_exp/10.**n) + 10*(n-nir3) - (n-nir3)
3432 ! idx_r1 = MAX(1, MIN(idx_r1, ntb_r1))
3434 ! pnr_rev(k) = MIN(nr(k)*odts, SNGL(tnr_rev(idx_d,idx_r1,idx_r) & ! RAIN2M
3438 !+---+-----------------------------------------------------------------+
3439 !+---+-----------------------------------------------------------------+
3440 SUBROUTINE GCF(GAMMCF,A,X,GLN)
3441 ! --- RETURNS THE INCOMPLETE GAMMA FUNCTION Q(A,X) EVALUATED BY ITS
3442 ! --- CONTINUED FRACTION REPRESENTATION AS GAMMCF. ALSO RETURNS
3443 ! --- LN(GAMMA(A)) AS GLN. THE CONTINUED FRACTION IS EVALUATED BY
3444 ! --- A MODIFIED LENTZ METHOD.
3447 INTEGER, PARAMETER:: ITMAX=100
3448 REAL, PARAMETER:: gEPS=3.E-7
3449 REAL, PARAMETER:: FPMIN=1.E-30
3450 REAL, INTENT(IN):: A, X
3453 REAL:: AN,B,C,D,DEL,H
3463 IF(ABS(D).LT.FPMIN)D=FPMIN
3465 IF(ABS(C).LT.FPMIN)C=FPMIN
3469 IF(ABS(DEL-1.).LT.gEPS)GOTO 1
3471 PRINT *, 'A TOO LARGE, ITMAX TOO SMALL IN GCF'
3472 1 GAMMCF=EXP(-X+A*LOG(X)-GLN)*H
3474 ! (C) Copr. 1986-92 Numerical Recipes Software 2.02
3475 !+---+-----------------------------------------------------------------+
3476 SUBROUTINE GSER(GAMSER,A,X,GLN)
3477 ! --- RETURNS THE INCOMPLETE GAMMA FUNCTION P(A,X) EVALUATED BY ITS
3478 ! --- ITS SERIES REPRESENTATION AS GAMSER. ALSO RETURNS LN(GAMMA(A))
3482 INTEGER, PARAMETER:: ITMAX=100
3483 REAL, PARAMETER:: gEPS=3.E-7
3484 REAL, INTENT(IN):: A, X
3490 IF(X.LT.0.) PRINT *, 'X < 0 IN GSER'
3501 IF(ABS(DEL).LT.ABS(SUM)*gEPS)GOTO 1
3503 PRINT *,'A TOO LARGE, ITMAX TOO SMALL IN GSER'
3504 1 GAMSER=SUM*EXP(-X+A*LOG(X)-GLN)
3506 ! (C) Copr. 1986-92 Numerical Recipes Software 2.02
3507 !+---+-----------------------------------------------------------------+
3508 REAL FUNCTION GAMMLN(XX)
3509 ! --- RETURNS THE VALUE LN(GAMMA(XX)) FOR XX > 0.
3511 REAL, INTENT(IN):: XX
3512 DOUBLE PRECISION, PARAMETER:: STP = 2.5066282746310005D0
3513 DOUBLE PRECISION, DIMENSION(6), PARAMETER:: &
3514 COF = (/76.18009172947146D0, -86.50532032941677D0, &
3515 24.01409824083091D0, -1.231739572450155D0, &
3516 .1208650973866179D-2, -.5395239384953D-5/)
3517 DOUBLE PRECISION:: SER,TMP,X,Y
3523 TMP=(X+0.5D0)*LOG(TMP)-TMP
3524 SER=1.000000000190015D0
3529 GAMMLN=TMP+LOG(STP*SER/X)
3531 ! (C) Copr. 1986-92 Numerical Recipes Software 2.02
3532 !+---+-----------------------------------------------------------------+
3533 REAL FUNCTION GAMMP(A,X)
3534 ! --- COMPUTES THE INCOMPLETE GAMMA FUNCTION P(A,X)
3535 ! --- SEE ABRAMOWITZ AND STEGUN 6.5.1
3538 REAL, INTENT(IN):: A,X
3539 REAL:: GAMMCF,GAMSER,GLN
3541 IF((X.LT.0.) .OR. (A.LE.0.)) THEN
3542 PRINT *, 'BAD ARGUMENTS IN GAMMP'
3544 ELSEIF(X.LT.A+1.)THEN
3545 CALL GSER(GAMSER,A,X,GLN)
3548 CALL GCF(GAMMCF,A,X,GLN)
3552 ! (C) Copr. 1986-92 Numerical Recipes Software 2.02
3553 !+---+-----------------------------------------------------------------+
3554 REAL FUNCTION WGAMMA(y)
3557 REAL, INTENT(IN):: y
3559 WGAMMA = EXP(GAMMLN(y))
3562 !+---+-----------------------------------------------------------------+
3563 ! THIS FUNCTION CALCULATES THE LIQUID SATURATION VAPOR MIXING RATIO AS
3564 ! A FUNCTION OF TEMPERATURE AND PRESSURE
3566 REAL FUNCTION RSLF(P,T)
3569 REAL, INTENT(IN):: P, T
3571 REAL, PARAMETER:: C0= .611583699E03
3572 REAL, PARAMETER:: C1= .444606896E02
3573 REAL, PARAMETER:: C2= .143177157E01
3574 REAL, PARAMETER:: C3= .264224321E-1
3575 REAL, PARAMETER:: C4= .299291081E-3
3576 REAL, PARAMETER:: C5= .203154182E-5
3577 REAL, PARAMETER:: C6= .702620698E-8
3578 REAL, PARAMETER:: C7= .379534310E-11
3579 REAL, PARAMETER:: C8=-.321582393E-13
3581 X=MAX(-80.,T-273.16)
3583 ! ESL=612.2*EXP(17.67*X/(T-29.65))
3584 ESL=C0+X*(C1+X*(C2+X*(C3+X*(C4+X*(C5+X*(C6+X*(C7+X*C8)))))))
3585 RSLF=.622*ESL/(P-ESL)
3588 ! ; Source: Murphy and Koop, Review of the vapour pressure of ice and
3589 ! supercooled water for atmospheric applications, Q. J. R.
3590 ! Meteorol. Soc (2005), 131, pp. 1539-1565.
3591 ! ESL = EXP(54.842763 - 6763.22 / T - 4.210 * ALOG(T) + 0.000367 * T
3592 ! + TANH(0.0415 * (T - 218.8)) * (53.878 - 1331.22
3593 ! / T - 9.44523 * ALOG(T) + 0.014025 * T))
3596 !+---+-----------------------------------------------------------------+
3597 ! THIS FUNCTION CALCULATES THE ICE SATURATION VAPOR MIXING RATIO AS A
3598 ! FUNCTION OF TEMPERATURE AND PRESSURE
3600 REAL FUNCTION RSIF(P,T)
3603 REAL, INTENT(IN):: P, T
3605 REAL, PARAMETER:: C0= .609868993E03
3606 REAL, PARAMETER:: C1= .499320233E02
3607 REAL, PARAMETER:: C2= .184672631E01
3608 REAL, PARAMETER:: C3= .402737184E-1
3609 REAL, PARAMETER:: C4= .565392987E-3
3610 REAL, PARAMETER:: C5= .521693933E-5
3611 REAL, PARAMETER:: C6= .307839583E-7
3612 REAL, PARAMETER:: C7= .105785160E-9
3613 REAL, PARAMETER:: C8= .161444444E-12
3615 X=MAX(-80.,T-273.16)
3616 ESI=C0+X*(C1+X*(C2+X*(C3+X*(C4+X*(C5+X*(C6+X*(C7+X*C8)))))))
3617 RSIF=.622*ESI/(P-ESI)
3620 ! ; Source: Murphy and Koop, Review of the vapour pressure of ice and
3621 ! supercooled water for atmospheric applications, Q. J. R.
3622 ! Meteorol. Soc (2005), 131, pp. 1539-1565.
3623 ! ESI = EXP(9.550426 - 5723.265/T + 3.53068*ALOG(T) - 0.00728332*T)
3626 !+---+-----------------------------------------------------------------+
3627 !+---+-----------------------------------------------------------------+
3628 END MODULE module_mp_thompson
3629 !+---+-----------------------------------------------------------------+