6 use mpas_kind_types,
only : wp => rkind, sp => r4kind, dp => r8kind
7#elif defined(tempo_ccpp)
8 use machine,
only : wp => kind_phys, sp => kind_sngl_prec, dp => kind_dbl_prec
10 use ccpp_kind_types,
only : wp => kind_phys, sp => kind_phys
12 use machine,
only: wp => kind_phys, sp => kind_sngl_prec, dp => kind_dbl_prec
14 use iso_fortran_env,
only : real32, real64
21 integer,
parameter :: dp = selected_real_kind(15,307)
24 character(len=11) :: tempo_version
27 integer,
parameter :: idx_bg1 = 6
39 real(wp),
parameter :: av_r = 4854._wp
40 real(wp),
parameter :: bv_r = 1.0_wp
41 real(wp),
parameter :: av_s = 40._wp
42 real(wp),
parameter :: bv_s = 0.55_wp
43 real(wp),
parameter :: fv_s = 100._wp
44 real(wp),
parameter :: bv_c = 2.0_wp
45 real(wp),
parameter :: bv_i = 1.0_wp
46 real(wp),
parameter :: av_g_old = 442._wp
47 real(wp),
parameter :: bv_g_old = 0.89_wp
48 real(wp),
parameter :: av_g_new = 161.794724_wp
49 real(wp),
parameter :: bv_g_new = 0.640961647_wp
50 real(wp),
parameter :: fv_r = 195.0_wp
51 real(wp),
parameter :: av_c = 0.316946e8_wp
52 real(wp),
parameter :: a_coeff = 0.47244157_wp
53 real(wp),
parameter :: b_coeff = 0.54698726_wp
54 real(wp),
parameter :: av_i = 1493.9
64 real(wp),
parameter :: am_s = 0.069_wp
65 real(wp),
parameter :: bm_s = 2.0_wp
66 real(wp),
parameter :: bm_g = 3.0_wp
67 real(wp),
parameter :: bm_i = 3.0_wp
68 real(wp),
parameter :: bm_r = 3.0_wp
70 real(wp),
parameter :: rho_i = 890._wp
71 real(wp),
parameter :: xm0i = 1.e-12_wp
72 real(wp),
parameter :: d0c = 1.e-6_wp
73 real(wp),
parameter :: d0r = 50.e-6_wp
74 real(wp),
parameter :: d0s = 300.e-6_wp
75 real(wp),
parameter :: d0g = 350.e-6_wp
76 real(wp),
parameter :: d0r_max = 2.5e-3_wp
78 real(wp),
parameter :: c_cube = 0.5_wp
79 real(wp),
parameter :: c_sqrd = 0.15_wp
88 real(wp),
parameter :: mu_r = 0.0_wp
89 real(wp),
parameter :: mu_s = 0.6357_wp
90 real(wp),
parameter :: mu_g = 0.0_wp
91 real(wp),
parameter :: mu_i = 0.0_wp
93 real(wp),
parameter :: nu_c_scale = 1000.e6_wp
94 integer,
parameter :: nu_c_max = 15
95 integer,
parameter :: nu_c_min = 2
97 real(wp),
parameter :: naccn0 = 300.0e6_wp
98 real(wp),
parameter :: naccn1 = 50.0e6_wp
99 real(wp),
parameter :: nain0 = 1.5e6_wp
100 real(wp),
parameter :: nain1 = 0.5e6_wp
101 real(wp),
parameter :: nwfa_default = 11.1e6_wp
102 real(wp),
parameter :: nifa_default = nain1*0.01_wp
103 real(wp),
parameter :: aero_max = 9999.e6_wp
104 real(wp),
parameter :: hgfrz = 235.16_wp
105 real(wp),
parameter :: nt_c_o = 50.e6_wp
106 real(wp),
parameter :: nt_c_l = 100.e6_wp
107 real(wp),
parameter :: nt_c_max = 1999.e6_wp
108 real(wp),
parameter :: nt_c_min = 2._wp
110 real(wp),
parameter :: tno = 5.0_wp
111 real(wp),
parameter :: ato = 0.304_wp
112 real(wp) :: rho_s = 100.0_wp
114 real(wp),
parameter :: demott_nuc_ssati = 0.25_wp
115 real(wp),
parameter :: demott_nuc_tempc = -20._wp
116 real(wp),
parameter :: max_ni = 4999.e3_wp
117 real(wp),
parameter :: icenuc_max = 1000.e3_wp
118 real(wp),
parameter :: rime_threshold = 2.0_wp
119 real(wp),
parameter :: rime_conversion = 0.95_wp
120 real(wp),
parameter :: ef_si = 0.05_wp
121 real(wp),
parameter :: ef_rs = 0.95_wp
122 real(wp),
parameter :: ef_rg = 0.75_wp
123 real(wp),
parameter :: ef_ri = 0.95_wp
124 real(wp),
parameter :: autocon_nr_factor = 10._wp
125 real(wp),
parameter :: timestep_conversion_rime_to_rain = 120._wp
128 integer,
parameter :: table_sp = real32
129 integer,
parameter :: table_dp = real64
131 integer,
parameter :: nrhg = 9
132 integer,
parameter :: nrhg1 = 1
134 real(wp),
parameter :: min_qv = 1.e-10_wp
135 real(wp),
parameter :: r1 = 1.e-12_wp
136 real(wp),
parameter :: r2 = 1.e-6_wp
137 real(wp),
parameter :: low_limit_mass_for_precip = 1.e-9_wp
138 real(wp),
parameter :: eps = 1.e-15_wp
139 real(wp),
parameter :: meters3_to_liters = 1000._wp
140 real(dp),
parameter :: gonv_min = 1.e2_dp
141 real(dp),
parameter :: gonv_max = 1.e6_dp
143 real(wp),
dimension(nrhg),
parameter :: rho_g = [50._wp, 100._wp, 200._wp, 300._wp, 400._wp, &
144 500._wp, 600._wp, 700._wp, 800._wp]
146 real(wp),
parameter :: sc = 0.632_wp
147 real(wp),
parameter :: earth_gravity = 9.8_wp
150 real(wp) :: pi = 3.1415926536_wp
151 real(wp) :: t0 = 273.15_wp
152 real(wp) :: rho_w = 1000._wp
153 real(wp) :: lsub = 2.834e6_wp
154 real(wp) :: lvap0 = 2.5e6_wp
155 real(wp) :: rv = 461.5_wp
156 real(wp) :: rdry = 287.04_wp
157 real(wp) :: roverrv = 0.622_wp
158 real(wp) :: cp = 1004.0_wp
159 real(wp) :: r_uni = 8.314_wp
164 real(wp),
parameter :: kap0 = 490.6_wp
165 real(wp),
parameter :: kap1 = 17.46_wp
166 real(wp),
parameter :: lam0 = 20.78_wp
167 real(wp),
parameter :: lam1 = 3.29_wp
170 integer,
parameter :: nbins = 100
171 integer,
parameter :: nbc = nbins
172 integer,
parameter :: nbr = nbins
173 integer,
parameter :: nbs = nbins
174 integer,
parameter :: nbi = nbins
175 integer,
parameter :: nbg = nbins
176 integer,
parameter :: ntb_i = 64
177 integer,
parameter :: ntb_i1 = 55
178 integer,
parameter :: ntb_c = 37
179 integer,
parameter :: ntb_t = 9
180 integer,
parameter :: ntb_g1 = 37
181 integer,
parameter :: ntb_s = 37
182 integer,
parameter :: ntb_g = 37
183 integer,
parameter :: ntb_r = 37
184 integer,
parameter :: ntb_r1 = 37
185 integer,
parameter :: ntb_t1 = 45
186 integer,
parameter :: ntb_in = 55
187 integer,
parameter :: ntb_arc = 7
188 integer,
parameter :: ntb_arw = 9
189 integer,
parameter :: ntb_art = 7
190 integer,
parameter :: ntb_arr = 5
191 integer,
parameter :: ntb_ark = 4
194 real(wp),
dimension(ntb_c),
parameter :: &
195 r_c = [1.e-6_wp,2.e-6_wp,3.e-6_wp,4.e-6_wp,5.e-6_wp,6.e-6_wp,7.e-6_wp,8.e-6_wp,9.e-6_wp, &
196 1.e-5_wp,2.e-5_wp,3.e-5_wp,4.e-5_wp,5.e-5_wp,6.e-5_wp,7.e-5_wp,8.e-5_wp,9.e-5_wp, &
197 1.e-4_wp,2.e-4_wp,3.e-4_wp,4.e-4_wp,5.e-4_wp,6.e-4_wp,7.e-4_wp,8.e-4_wp,9.e-4_wp, &
198 1.e-3_wp,2.e-3_wp,3.e-3_wp,4.e-3_wp,5.e-3_wp,6.e-3_wp,7.e-3_wp,8.e-3_wp,9.e-3_wp, &
201 real(wp),
dimension(ntb_i),
parameter :: &
202 r_i = [1.e-10_wp,2.e-10_wp,3.e-10_wp,4.e-10_wp, &
203 5.e-10_wp,6.e-10_wp,7.e-10_wp,8.e-10_wp,9.e-10_wp, &
204 1.e-9_wp,2.e-9_wp,3.e-9_wp,4.e-9_wp,5.e-9_wp,6.e-9_wp,7.e-9_wp,8.e-9_wp,9.e-9_wp, &
205 1.e-8_wp,2.e-8_wp,3.e-8_wp,4.e-8_wp,5.e-8_wp,6.e-8_wp,7.e-8_wp,8.e-8_wp,9.e-8_wp, &
206 1.e-7_wp,2.e-7_wp,3.e-7_wp,4.e-7_wp,5.e-7_wp,6.e-7_wp,7.e-7_wp,8.e-7_wp,9.e-7_wp, &
207 1.e-6_wp,2.e-6_wp,3.e-6_wp,4.e-6_wp,5.e-6_wp,6.e-6_wp,7.e-6_wp,8.e-6_wp,9.e-6_wp, &
208 1.e-5_wp,2.e-5_wp,3.e-5_wp,4.e-5_wp,5.e-5_wp,6.e-5_wp,7.e-5_wp,8.e-5_wp,9.e-5_wp, &
209 1.e-4_wp,2.e-4_wp,3.e-4_wp,4.e-4_wp,5.e-4_wp,6.e-4_wp,7.e-4_wp,8.e-4_wp,9.e-4_wp, &
212 real(wp),
dimension(ntb_r),
parameter :: &
213 r_r = [1.e-6_wp,2.e-6_wp,3.e-6_wp,4.e-6_wp,5.e-6_wp,6.e-6_wp,7.e-6_wp,8.e-6_wp,9.e-6_wp, &
214 1.e-5_wp,2.e-5_wp,3.e-5_wp,4.e-5_wp,5.e-5_wp,6.e-5_wp,7.e-5_wp,8.e-5_wp,9.e-5_wp, &
215 1.e-4_wp,2.e-4_wp,3.e-4_wp,4.e-4_wp,5.e-4_wp,6.e-4_wp,7.e-4_wp,8.e-4_wp,9.e-4_wp, &
216 1.e-3_wp,2.e-3_wp,3.e-3_wp,4.e-3_wp,5.e-3_wp,6.e-3_wp,7.e-3_wp,8.e-3_wp,9.e-3_wp, &
219 real(wp),
dimension(ntb_s),
parameter :: &
220 r_s = [1.e-6_wp,2.e-6_wp,3.e-6_wp,4.e-6_wp,5.e-6_wp,6.e-6_wp,7.e-6_wp,8.e-6_wp,9.e-6_wp, &
221 1.e-5_wp,2.e-5_wp,3.e-5_wp,4.e-5_wp,5.e-5_wp,6.e-5_wp,7.e-5_wp,8.e-5_wp,9.e-5_wp, &
222 1.e-4_wp,2.e-4_wp,3.e-4_wp,4.e-4_wp,5.e-4_wp,6.e-4_wp,7.e-4_wp,8.e-4_wp,9.e-4_wp, &
223 1.e-3_wp,2.e-3_wp,3.e-3_wp,4.e-3_wp,5.e-3_wp,6.e-3_wp,7.e-3_wp,8.e-3_wp,9.e-3_wp, &
226 real(wp),
dimension(ntb_g),
parameter :: &
227 r_g = [1.e-6_wp,2.e-6_wp,3.e-6_wp,4.e-6_wp,5.e-6_wp,6.e-6_wp,7.e-6_wp,8.e-6_wp,9.e-6_wp, &
228 1.e-5_wp,2.e-5_wp,3.e-5_wp,4.e-5_wp,5.e-5_wp,6.e-5_wp,7.e-5_wp,8.e-5_wp,9.e-5_wp, &
229 1.e-4_wp,2.e-4_wp,3.e-4_wp,4.e-4_wp,5.e-4_wp,6.e-4_wp,7.e-4_wp,8.e-4_wp,9.e-4_wp, &
230 1.e-3_wp,2.e-3_wp,3.e-3_wp,4.e-3_wp,5.e-3_wp,6.e-3_wp,7.e-3_wp,8.e-3_wp,9.e-3_wp, &
233 real(wp),
dimension(ntb_r1),
parameter :: &
234 n0r_exp = [1.e6_wp,2.e6_wp,3.e6_wp,4.e6_wp,5.e6_wp,6.e6_wp,7.e6_wp,8.e6_wp,9.e6_wp, &
235 1.e7_wp,2.e7_wp,3.e7_wp,4.e7_wp,5.e7_wp,6.e7_wp,7.e7_wp,8.e7_wp,9.e7_wp, &
236 1.e8_wp,2.e8_wp,3.e8_wp,4.e8_wp,5.e8_wp,6.e8_wp,7.e8_wp,8.e8_wp,9.e8_wp, &
237 1.e9_wp,2.e9_wp,3.e9_wp,4.e9_wp,5.e9_wp,6.e9_wp,7.e9_wp,8.e9_wp,9.e9_wp, &
240 real(wp),
dimension(ntb_g1),
parameter :: &
241 n0g_exp = [1.e2_wp,2.e2_wp,3.e2_wp,4.e2_wp,5.e2_wp,6.e2_wp,7.e2_wp,8.e2_wp,9.e2_wp, &
242 1.e3_wp,2.e3_wp,3.e3_wp,4.e3_wp,5.e3_wp,6.e3_wp,7.e3_wp,8.e3_wp,9.e3_wp, &
243 1.e4_wp,2.e4_wp,3.e4_wp,4.e4_wp,5.e4_wp,6.e4_wp,7.e4_wp,8.e4_wp,9.e4_wp, &
244 1.e5_wp,2.e5_wp,3.e5_wp,4.e5_wp,5.e5_wp,6.e5_wp,7.e5_wp,8.e5_wp,9.e5_wp, &
247 real(wp),
dimension(ntb_i1),
parameter :: &
248 nt_i = [1.0_wp,2.0_wp,3.0_wp,4.0_wp,5.0_wp,6.0_wp,7.0_wp,8.0_wp,9.0_wp, &
249 1.e1_wp,2.e1_wp,3.e1_wp,4.e1_wp,5.e1_wp,6.e1_wp,7.e1_wp,8.e1_wp,9.e1_wp, &
250 1.e2_wp,2.e2_wp,3.e2_wp,4.e2_wp,5.e2_wp,6.e2_wp,7.e2_wp,8.e2_wp,9.e2_wp, &
251 1.e3_wp,2.e3_wp,3.e3_wp,4.e3_wp,5.e3_wp,6.e3_wp,7.e3_wp,8.e3_wp,9.e3_wp, &
252 1.e4_wp,2.e4_wp,3.e4_wp,4.e4_wp,5.e4_wp,6.e4_wp,7.e4_wp,8.e4_wp,9.e4_wp, &
253 1.e5_wp,2.e5_wp,3.e5_wp,4.e5_wp,5.e5_wp,6.e5_wp,7.e5_wp,8.e5_wp,9.e5_wp, &
256 real(wp),
dimension(ntb_in),
parameter :: &
257 nt_in = [1.0_wp,2.0_wp,3.0_wp,4.0_wp,5.0_wp,6.0_wp,7.0_wp,8.0_wp,9.0_wp, &
258 1.e1_wp,2.e1_wp,3.e1_wp,4.e1_wp,5.e1_wp,6.e1_wp,7.e1_wp,8.e1_wp,9.e1_wp, &
259 1.e2_wp,2.e2_wp,3.e2_wp,4.e2_wp,5.e2_wp,6.e2_wp,7.e2_wp,8.e2_wp,9.e2_wp, &
260 1.e3_wp,2.e3_wp,3.e3_wp,4.e3_wp,5.e3_wp,6.e3_wp,7.e3_wp,8.e3_wp,9.e3_wp, &
261 1.e4_wp,2.e4_wp,3.e4_wp,4.e4_wp,5.e4_wp,6.e4_wp,7.e4_wp,8.e4_wp,9.e4_wp, &
262 1.e5_wp,2.e5_wp,3.e5_wp,4.e5_wp,5.e5_wp,6.e5_wp,7.e5_wp,8.e5_wp,9.e5_wp, &
265 real(wp),
dimension(ntb_arc),
parameter :: &
266 ta_na = [10._wp, 31.6_wp, 100._wp, 316._wp, &
267 1000._wp, 3160._wp, 10000._wp]
268 real(wp),
dimension(ntb_arw),
parameter :: &
269 ta_ww = [0.01_wp, 0.0316_wp, 0.1_wp, 0.316_wp, &
270 1._wp, 3.16_wp, 10._wp, 31.6_wp, 100._wp]
271 real(wp),
dimension(ntb_art),
parameter :: &
272 ta_tk = [243.15_wp, 253.15_wp, 263.15_wp, &
273 273.15_wp, 283.15_wp, 293.15_wp, 303.15_wp]
274 real(wp),
dimension(ntb_arr),
parameter :: &
275 ta_ra = [0.01_wp, 0.02_wp, 0.04_wp, 0.08_wp, 0.16_wp]
276 real(wp),
dimension(ntb_ark),
parameter :: &
277 ta_ka = [0.2_wp, 0.4_wp, 0.6_wp, 0.8_wp]
279 real(wp),
dimension(10),
parameter :: &
280 sa = [5.065339_wp, -0.062659_wp, -3.032362_wp, 0.029469_wp, -0.000285_wp, &
281 0.31255_wp, 0.000204_wp, 0.003199_wp, 0._wp, -0.015952_wp]
282 real(wp),
dimension(10),
parameter :: &
283 sb = [0.476221_wp, -0.015896_wp, 0.165977_wp, 0.007468_wp, -0.000141_wp, &
284 0.060366_wp, 0.000079_wp, 0.000594_wp, 0._wp, -0.003577_wp]
286 real(wp),
dimension(ntb_t),
parameter :: &
287 tc = [-0.01_wp, -5._wp, -10._wp, -15._wp, &
288 -20._wp, -25._wp, -30._wp, -35._wp, -40._wp]
291 integer,
protected :: dim_nrhg
298 real(wp),
protected,
dimension(nrhg) :: av_g = [45.9173813_wp, 67.0867386_wp, 98.0158463_wp, &
299 122.353378_wp, 143.204224_wp, 161.794724_wp, &
300 178.762115_wp, 194.488785_wp, 209.225876_wp]
301 real(wp),
protected,
dimension(nrhg) :: bv_g = [0.640961647_wp, 0.640961647_wp, 0.640961647_wp, &
302 0.640961647_wp, 0.640961647_wp, 0.640961647_wp, &
303 0.640961647_wp, 0.640961647_wp, 0.640961647_wp]
305 real(wp),
protected :: am_i
306 real(wp),
protected :: am_r
307 real(wp),
protected,
dimension (nrhg) :: am_g
308 real(wp),
protected :: olfus
309 real(wp),
protected :: orv
310 real(wp),
protected :: ar_volume
311 real(wp),
protected :: sc3
312 real(wp),
protected :: d0i
313 real(wp),
protected :: xm0s
314 real(wp),
protected :: xm0g
315 real(wp),
protected :: obmi
316 real(wp),
protected :: obmr
317 real(wp),
protected :: oams
318 real(wp),
protected :: obms
319 real(wp),
protected :: ocms
320 real(wp),
protected,
dimension(nrhg) :: oamg
321 real(wp),
protected,
dimension(nrhg) :: ocmg
322 real(wp),
protected :: obmg
325 real(wp),
protected,
dimension(5,15) :: cce, ccg
326 real(wp),
protected,
dimension(15) :: ocg1, ocg2
327 real(wp),
protected,
dimension(7) :: cie, cig
328 real(wp),
protected :: oig1, oig2
329 real(wp),
protected,
dimension(13) :: cre, crg
330 real(wp),
protected :: ore1, org1, org2, org3
331 real(wp),
protected,
dimension(17) :: cse, csg
332 real(wp),
protected,
dimension(12,nrhg) :: cge, cgg
333 real(wp),
protected :: oge1, ogg1, ogg2, ogg3
336 real(wp),
protected :: t1_qr_qc, t1_qr_qi, t2_qr_qi
337 real(wp),
protected :: t1_qs_qc, t1_qs_qi
338 real(wp),
protected :: t1_qr_ev, t2_qr_ev
339 real(wp),
protected :: t1_qs_sd, t2_qs_sd
340 real(wp),
protected :: t1_qs_me, t2_qs_me
341 real(wp),
protected :: t1_qg_sd
342 real(wp),
protected :: t1_qg_me
344 integer :: nic2, nii2, nii3, nir2, nir3, nis2, nig2, nig3, niin2
352 real(dp),
protected,
dimension(nbc) :: dc, dtc
353 real(dp),
protected,
dimension(nbi) :: di, dti
354 real(dp),
protected,
dimension(nbr) :: dr, dtr
355 real(dp),
protected,
dimension(nbs) :: ds, dts
356 real(dp),
protected,
dimension(nbg) :: dg, dtg
357 real(dp),
protected,
dimension(nbc) :: t_nc
359 integer,
parameter :: nhbins = 50
360 real(dp),
protected,
dimension(:),
allocatable :: hbins, dhbins
362 integer,
parameter :: radar_bins = 50
363 real(dp),
protected,
dimension(:),
allocatable :: sbins_radar, dsbins_radar
364 real(dp),
protected,
dimension(:),
allocatable :: gbins_radar, dgbins_radar
367 real(dp),
allocatable,
dimension(:,:) :: t_efrw, t_efsw
368 real(dp),
allocatable,
dimension(:,:,:) :: tpc_wev, tnc_wev
369 real(table_sp),
allocatable,
dimension(:,:,:,:,:) :: tnccn_act
370 real(table_dp),
allocatable,
dimension(:,:,:,:,:) :: tcg_racg, tmr_racg, tcr_gacr, &
372 real(table_dp),
allocatable,
dimension(:,:,:,:) :: tcs_racs1, tmr_racs1, tcs_racs2, &
373 tmr_racs2, tcr_sacr1, tms_sacr1, tcr_sacr2, tms_sacr2, &
374 tnr_racs1, tnr_racs2, tnr_sacr1, tnr_sacr2
375 real(table_dp),
allocatable,
dimension(:,:,:,:) :: tpi_qcfz, tni_qcfz
376 real(table_dp),
allocatable,
dimension(:,:,:,:) :: tpi_qrfz, tpg_qrfz, tni_qrfz, tnr_qrfz
377 real(dp),
allocatable,
dimension(:,:) :: tps_iaus, tni_iaus, tpi_ide
383 subroutine get_version(version, verbose_flag)
387 character(len=*),
intent(inout) :: version
388 logical,
intent(in) :: verbose_flag
389 character(len=100) :: first_line, filename
391 logical :: fileexists
393 filename =
'README.md'
394 inquire(file=trim(filename), exist=fileexists)
395 if (.not. fileexists)
then
401 open(newunit=io_unit, file=filename, status=
'old', action=
'read')
402 read(io_unit,
'(A)') first_line
406 version = trim(first_line(8:))
407 if (verbose_flag)
write(*,
'(A)')
'TEMPO Microphysics Version: '//trim(version)
408 end subroutine get_version
411 subroutine initialize_graupel_vars(hail_flag)
414 logical,
intent(in) :: hail_flag
418 av_g(idx_bg1) = av_g_new
419 bv_g(idx_bg1) = bv_g_new
422 av_g(idx_bg1) = av_g_old
423 bv_g(idx_bg1) = bv_g_old
426 end subroutine initialize_graupel_vars
429 subroutine initialize_parameters()
435 am_i = pi * rho_i / 6.0_wp
436 am_r = pi * rho_w / 6.0_wp
437 am_g = [pi * rho_g(1) / 6.0_wp, &
438 pi * rho_g(2) / 6.0_wp, &
439 pi * rho_g(3) / 6.0_wp, &
440 pi * rho_g(4) / 6.0_wp, &
441 pi * rho_g(5) / 6.0_wp, &
442 pi * rho_g(6) / 6.0_wp, &
443 pi * rho_g(7) / 6.0_wp, &
444 pi * rho_g(8) / 6.0_wp, &
445 pi * rho_g(9) / 6.0_wp]
447 ar_volume = 4.0_wp / 3.0_wp * pi * (2.5e-6_wp)**3
450 olfus = 1.0_wp / lfus
453 rho_not = 101325.0_wp / (rdry*298.0_wp)
454 rho_not0 = 101325.0_wp / (rdry*t0)
457 sc3 = sc**(1.0_wp/3.0_wp)
460 d0i = (xm0i/am_i)**(1.0_wp/bm_i)
463 xm0s = am_s * d0s**bm_s
464 xm0g = am_g(nrhg) * d0g**bm_g
472 oamg(m) = 1.0_wp / am_g(m)
473 ocmg(m) = oamg(m)**obmg
479 cce(2,n) = bm_r + n + 1._wp
480 cce(3,n) = bm_r + n + 4._wp
481 cce(4,n) = n + bv_c + 1._wp
482 cce(5,n) = bm_r + n + bv_c + 1._wp
483 ccg(1,n) = gamma(cce(1,n))
484 ccg(2,n) = gamma(cce(2,n))
485 ccg(3,n) = gamma(cce(3,n))
486 ccg(4,n) = gamma(cce(4,n))
487 ccg(5,n) = gamma(cce(5,n))
488 ocg1(n) = 1.0_wp / ccg(1,n)
489 ocg2(n) = 1.0_wp / ccg(2,n)
493 cie(1) = mu_i + 1._wp
494 cie(2) = bm_i + mu_i + 1._wp
495 cie(3) = bm_i + mu_i + bv_i + 1._wp
496 cie(4) = mu_i + bv_i + 1._wp
497 cie(5) = mu_i + 2._wp
498 cie(6) = bm_i*0.5_wp + mu_i + bv_i + 1._wp
499 cie(7) = bm_i*0.5_wp + mu_i + 1._wp
500 cig(1) = gamma(cie(1))
501 cig(2) = gamma(cie(2))
502 cig(3) = gamma(cie(3))
503 cig(4) = gamma(cie(4))
504 cig(5) = gamma(cie(5))
505 cig(6) = gamma(cie(6))
506 cig(7) = gamma(cie(7))
507 oig1 = 1.0_wp / cig(1)
508 oig2 = 1.0_wp / cig(2)
511 cre(1) = bm_r + 1._wp
512 cre(2) = mu_r + 1._wp
513 cre(3) = bm_r + mu_r + 1._wp
514 cre(4) = bm_r*2._wp + mu_r + 1._wp
515 cre(5) = mu_r + bv_r + 1._wp
516 cre(6) = bm_r + mu_r + bv_r + 1._wp
517 cre(7) = bm_r*0.5_wp + mu_r + bv_r + 1._wp
518 cre(8) = bm_r + mu_r + bv_r + 3._wp
519 cre(9) = mu_r + bv_r + 3._wp
520 cre(10) = mu_r + 2._wp
521 cre(11) = 0.5_wp*(bv_r + 5._wp + 2._wp*mu_r)
522 cre(12) = bm_r*0.5_wp + mu_r + 1._wp
523 cre(13) = bm_r*2._wp + mu_r + bv_r + 1._wp
526 crg(n) = gamma(cre(n))
529 ore1 = 1.0_wp / cre(1)
530 org1 = 1.0_wp / crg(1)
531 org2 = 1.0_wp / crg(2)
532 org3 = 1.0_wp / crg(3)
535 cse(1) = bm_s + 1._wp
536 cse(2) = bm_s + 2._wp
538 cse(4) = bm_s + bv_s + 1._wp
539 cse(5) = bm_s*2._wp + bv_s + 1._wp
540 cse(6) = bm_s*2._wp + 1._wp
541 cse(7) = bm_s + mu_s + 1._wp
542 cse(8) = bm_s + mu_s + 2._wp
543 cse(9) = bm_s + mu_s + 3._wp
544 cse(10) = bm_s + mu_s + bv_s + 1._wp
545 cse(11) = bm_s*2._wp + mu_s + bv_s + 1._wp
546 cse(12) = bm_s*2._wp + mu_s + 1._wp
547 cse(13) = bv_s + 2._wp
548 cse(14) = bm_s + bv_s
549 cse(15) = mu_s + 1._wp
550 cse(16) = 1.0_wp + (1.0_wp + bv_s)/2._wp
551 cse(17) = bm_s + bv_s + 2._wp
554 csg(n) = gamma(cse(n))
558 cge(1,:) = bm_g + 1._wp
559 cge(2,:) = mu_g + 1._wp
560 cge(3,:) = bm_g + mu_g + 1._wp
561 cge(4,:) = bm_g*2. + mu_g + 1._wp
562 cge(10,:) = mu_g + 2._wp
563 cge(12,:) = bm_g*0.5_wp + mu_g + 1._wp
566 cge(5,m) = bm_g*2._wp + mu_g + bv_g(m) + 1._wp
567 cge(6,m) = bm_g + mu_g + bv_g(m) + 1._wp
568 cge(7,m) = bm_g*0.5_wp + mu_g + bv_g(m) + 1._wp
569 cge(8,m) = mu_g + bv_g(m) + 1._wp
570 cge(9,m) = mu_g + bv_g(m) + 3._wp
571 cge(11,m) = 0.5_wp*(bv_g(m) + 5._wp + 2._wp*mu_g)
576 cgg(n,m) = gamma(cge(n,m))
579 oge1 = 1.0_wp / cge(1,1)
580 ogg1 = 1.0_wp / cgg(1,1)
581 ogg2 = 1.0_wp / cgg(2,1)
582 ogg3 = 1.0_wp / cgg(3,1)
585 t1_qr_qc = pi * 0.25_wp * av_r * crg(9)
586 t1_qr_qi = pi * 0.25_wp * av_r * crg(9)
587 t2_qr_qi = pi * 0.25_wp * am_r*av_r * crg(8)
590 t1_qs_qc = pi * 0.25_wp * av_s
591 t1_qs_qi = pi * 0.25_wp * av_s
594 t1_qr_ev = 0.78_wp * crg(10)
595 t2_qr_ev = 0.308_wp * sc3 * sqrt(av_r) * crg(11)
599 t2_qs_sd = 0.28_wp * sc3 * sqrt(av_s)
602 t1_qs_me = pi * 4._wp *c_sqrd * olfus * 0.86_wp
603 t2_qs_me = pi * 4._wp *c_sqrd * olfus * 0.28_wp * sc3 * sqrt(av_s)
606 t1_qg_sd = 0.86_wp * cgg(10,1)
609 t1_qg_me = pi * 4._wp * c_cube * olfus * 0.86_wp * cgg(10,1)
610 end subroutine initialize_parameters
613 subroutine initialize_bins_for_tables()
619 nic2 = nint(log10(r_c(1)))
620 nii2 = nint(log10(r_i(1)))
621 nir2 = nint(log10(r_r(1)))
622 nis2 = nint(log10(r_s(1)))
623 nig2 = nint(log10(r_g(1)))
624 nii3 = nint(log10(nt_i(1)))
625 nir3 = nint(log10(n0r_exp(1)))
626 nig3 = nint(log10(n0g_exp(1)))
627 niin2 = nint(log10(nt_in(1)))
630 dc(1) = real(d0c, kind=dp)
631 dtc(1) = real(d0c, kind=dp)
633 dc(n) = dc(n-1) + 1.0e-6_dp
634 dtc(n) = (dc(n) - dc(n-1))
638 call create_bins(numbins=nbi, lowbin=real(d0i, kind=dp), &
639 highbin=2.0_dp*d0s, bins=di, deltabins=dti)
642 call create_bins(numbins=nbr, lowbin=real(d0r, kind=dp), &
643 highbin=0.005_dp, bins=dr, deltabins=dtr)
646 call create_bins(numbins=nbs, lowbin=real(d0s, kind=dp), &
647 highbin=0.02_dp, bins=ds, deltabins=dts)
650 call create_bins(numbins=nbg, lowbin=real(d0g, kind=dp), &
651 highbin=0.05_dp, bins=dg, deltabins=dtg)
654 call create_bins(numbins=nbc, lowbin=1.0_dp, &
655 highbin=3000.0_dp, bins=t_nc)
656 t_nc = t_nc * 1.0e6_dp
657 nic1 = real(log(t_nc(nbc)/t_nc(1)), kind=dp)
658 end subroutine initialize_bins_for_tables
661 subroutine initialize_bins_for_hail_size()
664 real(dp),
parameter :: lowbin = 500.e-6_dp
665 real(dp),
parameter :: highbin = 0.075_dp
667 if (.not.
allocated(hbins))
allocate(hbins(nhbins), source=0._dp)
668 if (.not.
allocated(dhbins))
allocate(dhbins(nhbins), source=0._dp)
669 call create_bins(numbins=nhbins, lowbin=lowbin, highbin=highbin, &
670 bins=hbins, deltabins=dhbins)
671 end subroutine initialize_bins_for_hail_size
674 subroutine initialize_bins_for_radar()
677 real(dp),
parameter :: lowbin = 100.e-6_dp
678 real(dp),
parameter :: s_highbin = 0.02_dp
679 real(dp),
parameter :: g_highbin = 0.05_dp
681 if (.not.
allocated(sbins_radar))
allocate(sbins_radar(radar_bins), source=0._dp)
682 if (.not.
allocated(dsbins_radar))
allocate(dsbins_radar(radar_bins), source=0._dp)
684 call create_bins(numbins=radar_bins, lowbin=lowbin, &
685 highbin=s_highbin, bins=sbins_radar, deltabins=dsbins_radar)
687 if (.not.
allocated(gbins_radar))
allocate(gbins_radar(radar_bins), source=0._dp)
688 if (.not.
allocated(dgbins_radar))
allocate(dgbins_radar(radar_bins), source=0._dp)
690 call create_bins(numbins=radar_bins, lowbin=lowbin, &
691 highbin=g_highbin, bins=gbins_radar, deltabins=dgbins_radar)
692 end subroutine initialize_bins_for_radar
695 subroutine create_bins(numbins, lowbin, highbin, bins, deltabins)
698 integer,
intent(in) :: numbins
699 real(dp),
intent(in) :: lowbin, highbin
701 real(dp),
dimension(:),
intent(out) :: bins
702 real(dp),
dimension(:),
intent(out),
optional :: deltabins
705 real(dp),
dimension(numbins+1) :: xdx
708 xdx(numbins+1) = highbin
710 xdx(n) = exp(real(n-1, kind=dp)/real(numbins, kind=dp) * log(xdx(numbins+1)/xdx(1)) + log(xdx(1)))
714 bins(n) = sqrt(xdx(n)*xdx(n+1))
717 if (
present(deltabins))
then
719 deltabins(n) = xdx(n+1) - xdx(n)
722 end subroutine create_bins
725 subroutine initialize_arrays_freezewater(table_size)
731 integer,
intent(out),
optional :: table_size
734 if (.not.
allocated(tpi_qcfz))
allocate(tpi_qcfz(ntb_c,nbc,ntb_t1,ntb_in), source=0._table_dp)
735 if (.not.
allocated(tni_qcfz))
allocate(tni_qcfz(ntb_c,nbc,ntb_t1,ntb_in), source=0._table_dp)
738 if (.not.
allocated(tpi_qrfz))
allocate(tpi_qrfz(ntb_r,ntb_r1,ntb_t1,ntb_in), source=0._table_dp)
739 if (.not.
allocated(tpg_qrfz))
allocate(tpg_qrfz(ntb_r,ntb_r1,ntb_t1,ntb_in), source=0._table_dp)
740 if (.not.
allocated(tni_qrfz))
allocate(tni_qrfz(ntb_r,ntb_r1,ntb_t1,ntb_in), source=0._table_dp)
741 if (.not.
allocated(tnr_qrfz))
allocate(tnr_qrfz(ntb_r,ntb_r1,ntb_t1,ntb_in), source=0._table_dp)
744 if (
present(table_size))
then
745 table_size = (table_dp * 2 * (ntb_c*nbc*ntb_t1*ntb_in)) + &
746 (table_dp * 4 * (ntb_r*ntb_r1*ntb_t1*ntb_in))
748 end subroutine initialize_arrays_freezewater
751 subroutine initialize_arrays_qr_acr_qs(table_size)
757 integer,
intent(out),
optional :: table_size
759 if (.not.
allocated(tcs_racs1))
allocate(tcs_racs1(ntb_s,ntb_t,ntb_r1,ntb_r), source=0._table_dp)
760 if (.not.
allocated(tmr_racs1))
allocate(tmr_racs1(ntb_s,ntb_t,ntb_r1,ntb_r), source=0._table_dp)
761 if (.not.
allocated(tcs_racs2))
allocate(tcs_racs2(ntb_s,ntb_t,ntb_r1,ntb_r), source=0._table_dp)
762 if (.not.
allocated(tmr_racs2))
allocate(tmr_racs2(ntb_s,ntb_t,ntb_r1,ntb_r), source=0._table_dp)
763 if (.not.
allocated(tcr_sacr1))
allocate(tcr_sacr1(ntb_s,ntb_t,ntb_r1,ntb_r), source=0._table_dp)
764 if (.not.
allocated(tms_sacr1))
allocate(tms_sacr1(ntb_s,ntb_t,ntb_r1,ntb_r), source=0._table_dp)
765 if (.not.
allocated(tcr_sacr2))
allocate(tcr_sacr2(ntb_s,ntb_t,ntb_r1,ntb_r), source=0._table_dp)
766 if (.not.
allocated(tms_sacr2))
allocate(tms_sacr2(ntb_s,ntb_t,ntb_r1,ntb_r), source=0._table_dp)
767 if (.not.
allocated(tnr_racs1))
allocate(tnr_racs1(ntb_s,ntb_t,ntb_r1,ntb_r), source=0._table_dp)
768 if (.not.
allocated(tnr_racs2))
allocate(tnr_racs2(ntb_s,ntb_t,ntb_r1,ntb_r), source=0._table_dp)
769 if (.not.
allocated(tnr_sacr1))
allocate(tnr_sacr1(ntb_s,ntb_t,ntb_r1,ntb_r), source=0._table_dp)
770 if (.not.
allocated(tnr_sacr2))
allocate(tnr_sacr2(ntb_s,ntb_t,ntb_r1,ntb_r), source=0._table_dp)
773 if (
present(table_size))
then
774 table_size = table_dp * 12 * (ntb_s*ntb_t*ntb_r1*ntb_r)
776 end subroutine initialize_arrays_qr_acr_qs
779 subroutine initialize_arrays_qr_acr_qg(table_size)
785 integer,
intent(out),
optional :: table_size
788 if (.not.
allocated(tcg_racg))
allocate(tcg_racg(ntb_g1,ntb_g,nrhg,ntb_r1,ntb_r), source=0._table_dp)
789 if (.not.
allocated(tmr_racg))
allocate(tmr_racg(ntb_g1,ntb_g,nrhg,ntb_r1,ntb_r), source=0._table_dp)
790 if (.not.
allocated(tcr_gacr))
allocate(tcr_gacr(ntb_g1,ntb_g,nrhg,ntb_r1,ntb_r), source=0._table_dp)
791 if (.not.
allocated(tnr_racg))
allocate(tnr_racg(ntb_g1,ntb_g,nrhg,ntb_r1,ntb_r), source=0._table_dp)
792 if (.not.
allocated(tnr_gacr))
allocate(tnr_gacr(ntb_g1,ntb_g,nrhg,ntb_r1,ntb_r), source=0._table_dp)
795 if (
present(table_size))
then
796 table_size = table_dp * 5 * (ntb_g1*ntb_g*nrhg*ntb_r1*ntb_r)
798 end subroutine initialize_arrays_qr_acr_qg
801 subroutine initialize_arrays_ccn(table_size)
807 integer,
intent(out),
optional :: table_size
809 if (.not.
allocated(tnccn_act)) &
810 allocate(tnccn_act(ntb_arc,ntb_arw,ntb_art,ntb_arr,ntb_ark), source=0._table_sp)
813 if (
present(table_size))
then
814 table_size = table_sp * 1 * (ntb_arc*ntb_arw*ntb_art*ntb_arr*ntb_ark) + (table_sp + table_sp) * 1
816 end subroutine initialize_arrays_ccn
819 subroutine initialize_arrays_drop_evap()
825 if (.not.
allocated(tpc_wev))
allocate(tpc_wev(nbc,ntb_c,nbc), source=0._dp)
826 if (.not.
allocated(tnc_wev))
allocate(tnc_wev(nbc,ntb_c,nbc), source=0._dp)
827 end subroutine initialize_arrays_drop_evap
830 subroutine initialize_array_efsw()
836 if (.not.
allocated(t_efsw))
allocate(t_efsw(nbs,nbc), source=0._dp)
837 end subroutine initialize_array_efsw
840 subroutine initialize_array_efrw()
846 if (.not.
allocated(t_efrw))
allocate(t_efrw(nbr,nbc), source=0._dp)
847 end subroutine initialize_array_efrw
850 subroutine initialize_arrays_qi_aut_qs()
856 if (.not.
allocated(tps_iaus))
allocate(tps_iaus(ntb_i,ntb_i1), source=0._dp)
857 if (.not.
allocated(tni_iaus))
allocate(tni_iaus(ntb_i,ntb_i1), source=0._dp)
858 if (.not.
allocated(tpi_ide))
allocate(tpi_ide(ntb_i,ntb_i1), source=0._dp)
859 end subroutine initialize_arrays_qi_aut_qs