CCPP SciDoc v7.0.0  v7.0.0
Common Community Physics Package Developed at DTC
 
Loading...
Searching...
No Matches
module_mp_tempo_params.F90
2 !! parameters and variables used in tempo microphysics
3
4! define machine precision
5#if defined(tempo_mpas)
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
9#elif defined(wrfmodel)
10 use ccpp_kind_types, only : wp => kind_phys, sp => kind_phys
11#else
12 use machine, only: wp => kind_phys, sp => kind_sngl_prec, dp => kind_dbl_prec
13#endif
14 use iso_fortran_env, only : real32, real64 ! for machine-independent lookup table precisions
15
16 implicit none
17
18 public
19
20#if defined(wrfmodel)
21 integer, parameter :: dp = selected_real_kind(15,307)
22#endif
23
24 character(len=11) :: tempo_version !! tempo version string (max is xxx.xxx.xxx)
25
26 ! parameters that can be changed ------------------------------------------------------------------------
27 integer, parameter :: idx_bg1 = 6 !! index from rho_g when hail_aware = false: density = 500 \‍(kg\, m^{-3}\‍)
28
39 real(wp), parameter :: av_r = 4854._wp
40 real(wp), parameter :: bv_r = 1.0_wp !! rain fallspeed power-law coefficient
41 real(wp), parameter :: av_s = 40._wp !! snow fallspeed power-law coefficient
42 real(wp), parameter :: bv_s = 0.55_wp !! snow fallspeed power-law coefficient
43 real(wp), parameter :: fv_s = 100._wp !! snow fallspeed power-law coefficient
44 real(wp), parameter :: bv_c = 2.0_wp !! cloud fallspeed power-law coefficient
45 real(wp), parameter :: bv_i = 1.0_wp !! ice fallspeed power-law coefficient
46 real(wp), parameter :: av_g_old = 442._wp !! graupel fallspeed power-law coefficient (hail_aware = false)
47 real(wp), parameter :: bv_g_old = 0.89_wp !! graupel fallspeed power-law coefficient (hail_aware = false)
48 real(wp), parameter :: av_g_new = 161.794724_wp !! graupel fallspeed power-law coefficient HARDCODED for idx_bg1 = 6 (hail_aware = true)
49 real(wp), parameter :: bv_g_new = 0.640961647_wp !! graupel fallspeed power-law coefficient HARDCODED for idx_bg1 = 6 (hail_aware = true)
50 real(wp), parameter :: fv_r = 195.0_wp !! rain fallspeed power-law coefficient
51 real(wp), parameter :: av_c = 0.316946e8_wp !! cloud fallspeed power-law coefficient
52 real(wp), parameter :: a_coeff = 0.47244157_wp !! graupel fallspeed power-law coefficient
53 real(wp), parameter :: b_coeff = 0.54698726_wp !! grapuel fallspeed power-law coefficient
54 real(wp), parameter :: av_i = 1493.9 !! ice fallspeed power-law coefficient
64 real(wp), parameter :: am_s = 0.069_wp
65 real(wp), parameter :: bm_s = 2.0_wp !! snow mass power-law coefficient
66 real(wp), parameter :: bm_g = 3.0_wp !! graupel mass power-law coefficient
67 real(wp), parameter :: bm_i = 3.0_wp !! ice mass power-law coefficient
68 real(wp), parameter :: bm_r = 3.0_wp !! rain mass power-law coefficient
69
70 real(wp), parameter :: rho_i = 890._wp !! density of cloud ice \‍([kg\, m^{-3}]\‍)
71 real(wp), parameter :: xm0i = 1.e-12_wp !! ice initiates with this mass \‍([kg]\‍)
72 real(wp), parameter :: d0c = 1.e-6_wp !! minimum diameter of cloud droplets \‍([m]\‍)
73 real(wp), parameter :: d0r = 50.e-6_wp !! minimum diameter of raindrops \‍([m]\‍)
74 real(wp), parameter :: d0s = 300.e-6_wp !! minimum diameter of snow \‍([m]\‍)
75 real(wp), parameter :: d0g = 350.e-6_wp !! minimum diameter of graupel \‍([m]\‍)
76 real(wp), parameter :: d0r_max = 2.5e-3_wp !! maximum diameter of raindrops \‍([m]\‍)
77
78 real(wp), parameter :: c_cube = 0.5_wp !! capacitance of a sphere \‍(\left(D^{3}\right)\‍)
79 real(wp), parameter :: c_sqrd = 0.15_wp !! capacitance of plates/aggregates \‍(\left(D^{2}\right)\‍)
80
88 real(wp), parameter :: mu_r = 0.0_wp
89 real(wp), parameter :: mu_s = 0.6357_wp !! shape parameter for snow
90 real(wp), parameter :: mu_g = 0.0_wp !! shape parameter for graupel
91 real(wp), parameter :: mu_i = 0.0_wp !! shape parameter for cloud ice
92
93 real(wp), parameter :: nu_c_scale = 1000.e6_wp !! scaling parameter for nu_c
94 integer, parameter :: nu_c_max = 15 !! maximum value for nu_c
95 integer, parameter :: nu_c_min = 2 !! minimum value for nu_c
96
97 real(wp), parameter :: naccn0 = 300.0e6_wp !! used for water-friendly aerosol initialization
98 real(wp), parameter :: naccn1 = 50.0e6_wp !! used for water-friendly aerosol initialization
99 real(wp), parameter :: nain0 = 1.5e6_wp !! used for ice-friendly aerosol initialization
100 real(wp), parameter :: nain1 = 0.5e6_wp !! used for ice-friendly aerosol initialization
101 real(wp), parameter :: nwfa_default = 11.1e6_wp !! default value for water-friendly aerosols
102 real(wp), parameter :: nifa_default = nain1*0.01_wp !! default value for ice-friendly aerosols
103 real(wp), parameter :: aero_max = 9999.e6_wp !! maximum aerosol value
104 real(wp), parameter :: hgfrz = 235.16_wp !! temperature to freeze all liquid \‍([K]\‍)
105 real(wp), parameter :: nt_c_o = 50.e6_wp !! cloud number concentration over ocean (non-aerosol aware) \‍([m^{-3}]\‍)
106 real(wp), parameter :: nt_c_l = 100.e6_wp !! cloud number concentration over land (non-aerosol aware) \‍([m^{-3}]\‍)
107 real(wp), parameter :: nt_c_max = 1999.e6_wp !! maximum cloud number concentration \‍([m^{-3}]\‍)
108 real(wp), parameter :: nt_c_min = 2._wp !! minimum cloud number concentration \‍([m^{-3}]\‍)
109
110 real(wp), parameter :: tno = 5.0_wp !! constant in the [Cooper](https://doi.org/10.1007/978-1-935704-17-1_4) curve for ice nucleation
111 real(wp), parameter :: ato = 0.304_wp !! constant in the [Cooper](https://doi.org/10.1007/978-1-935704-17-1_4) curve for ice nucleation
112 real(wp) :: rho_s = 100.0_wp !! density of snow \‍([kg\, m^{-3}]\‍)
113
114 real(wp), parameter :: demott_nuc_ssati = 0.25_wp !! ice supersaturation threshold for [DeMott](https://doi.org/10.1073/pnas.0910818107) nucleation
115 real(wp), parameter :: demott_nuc_tempc = -20._wp !! temperature threshold for [DeMott](https://doi.org/10.1073/pnas.0910818107) nucleation
116 real(wp), parameter :: max_ni = 4999.e3_wp !! maximum ice number concentration \‍([m^{-3}]\‍)
117 real(wp), parameter :: icenuc_max = 1000.e3_wp !! maximum ice nucleation number \‍([m^{-3}]\‍)
118 real(wp), parameter :: rime_threshold = 2.0_wp !! snow to graupel rime threshold parameter
119 real(wp), parameter :: rime_conversion = 0.95_wp !! snow to graupel rime conversion parameter
120 real(wp), parameter :: ef_si = 0.05_wp !! snow-ice collection efficiency
121 real(wp), parameter :: ef_rs = 0.95_wp !! rain-snow collection efficiency
122 real(wp), parameter :: ef_rg = 0.75_wp !! rain-graupel collection efficiency
123 real(wp), parameter :: ef_ri = 0.95_wp !! rain-ice collection efficiency
124 real(wp), parameter :: autocon_nr_factor = 10._wp !! factor controlling rain number tendency from autconversion (larger produces few drops)
125 real(wp), parameter :: timestep_conversion_rime_to_rain = 120._wp !! timestep above which rime above freezing becomes rain (this timestep should be at least 120s)
126
127 ! parameters that should NOT be changed -----------------------------------------------------------------
128 integer, parameter :: table_sp = real32 !! precision for lookup tables (machine independent)
129 integer, parameter :: table_dp = real64 !! precision for lookup tables (machine independent)
130
131 integer, parameter :: nrhg = 9 !! graupel density array size when hail_aware = true
132 integer, parameter :: nrhg1 = 1 !! graupel density array size when hail_aware = false
133
134 real(wp), parameter :: min_qv = 1.e-10_wp !! minimum value of water vapor mixing ratio \‍([kg\, kg^{-1}]\‍)
135 real(wp), parameter :: r1 = 1.e-12_wp !! minimum hydrometeor mass \‍([kg\, m^{-3}]\‍)
136 real(wp), parameter :: r2 = 1.e-6_wp !! minimum hydrometeor number \‍([kg\, m^{-3}]\‍)
137 real(wp), parameter :: low_limit_mass_for_precip = 1.e-9_wp !! minimum hydrometor mass needed in the lowest-model level for precipitation
138 real(wp), parameter :: eps = 1.e-15_wp !! small non-zero number
139 real(wp), parameter :: meters3_to_liters = 1000._wp !! number of liters in 1 \‍(m^{3}\‍)
140 real(dp), parameter :: gonv_min = 1.e2_dp !! minimum graupel y-intercept \‍([m^{-4}]\‍)
141 real(dp), parameter :: gonv_max = 1.e6_dp !! maximum graupel y-intercept \‍([m^{-4}]\‍)
142
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] !! !! densities of graupel when hail_aware = true \‍([kg\, m^{-3}]\‍)
145
146 real(wp), parameter :: sc = 0.632_wp !! [schmidt number](https://glossary.ametsoc.org/wiki/Schmidt_number)
147 real(wp), parameter :: earth_gravity = 9.8_wp !! gravity of Earth \‍([m\, s^{-2}]\‍)
148
149 ! these can be overwritten by a host model and don't have a parameter attribute
150 real(wp) :: pi = 3.1415926536_wp !! pi is approximately 355/113
151 real(wp) :: t0 = 273.15_wp !! melting point of ice \‍([K]\‍)
152 real(wp) :: rho_w = 1000._wp !! density of liquid water \‍([kg\, m^{-3}]\‍)
153 real(wp) :: lsub = 2.834e6_wp !! enthalpy of sublimation \‍([J\, kg^{-1}]\‍)
154 real(wp) :: lvap0 = 2.5e6_wp !! enthalpy of vaporization \‍([J\, kg^{-1}]\‍)
155 real(wp) :: rv = 461.5_wp !! gas constant for water vapor \‍([J\, K^{-1}\, kg^{-1}]\‍)
156 real(wp) :: rdry = 287.04_wp !! gas constant for dry air \‍([J\, K^{-1}\, kg^{-1}]\‍)
157 real(wp) :: roverrv = 0.622_wp !! dry gas constant divided by water vapor gas constant
158 real(wp) :: cp = 1004.0_wp !! heat capacity of air at constant pressure \‍([J\, K^{-1}\, kg^{-1}]\‍)
159 real(wp) :: r_uni = 8.314_wp !! gas constant \‍([J\, K^{-1}\, mol^{-1}]\‍)
160 real(wp) :: lfus !! enthalpy of fusion \‍([J\, kg^{-1}]\‍)
161 real(wp) :: rho_not !! density constant \‍([kg\, m^{-3}]\‍)
162 real(wp) :: rho_not0 !! density constant \‍([kg\, m^{-3}]\‍)
163
164 real(wp), parameter :: kap0 = 490.6_wp !! snow parameter from [Field et al. (2005)](https://doi.org/10.1256/qj.04.134)
165 real(wp), parameter :: kap1 = 17.46_wp !! snow parameter from [Field et al. (2005)](https://doi.org/10.1256/qj.04.134)
166 real(wp), parameter :: lam0 = 20.78_wp !! snow parameter from [Field et al. (2005)](https://doi.org/10.1256/qj.04.134)
167 real(wp), parameter :: lam1 = 3.29_wp !! snow parameter from [Field et al. (2005)](https://doi.org/10.1256/qj.04.134)
168
169 ! lookup table dimensions
170 integer, parameter :: nbins = 100 !! lookup table dimension (number of bins)
171 integer, parameter :: nbc = nbins !! lookup table dimension for cloud water
172 integer, parameter :: nbr = nbins !! lookup table dimension for rain
173 integer, parameter :: nbs = nbins !! lookup table dimension for snow
174 integer, parameter :: nbi = nbins !! lookup table dimension
175 integer, parameter :: nbg = nbins !! lookup table dimension
176 integer, parameter :: ntb_i = 64 !! lookup table dimension for cloud ice
177 integer, parameter :: ntb_i1 = 55 !! lookup table dimension for cloud ice
178 integer, parameter :: ntb_c = 37 !! lookup table dimension for cloud water
179 integer, parameter :: ntb_t = 9 !! lookup table dimension for temperature
180 integer, parameter :: ntb_g1 = 37 !! lookup table dimension for graupel
181 integer, parameter :: ntb_s = 37 !! lookup table dimension for snow
182 integer, parameter :: ntb_g = 37 !! lookup table dimension for graupel
183 integer, parameter :: ntb_r = 37 !! lookup table dimension for rain
184 integer, parameter :: ntb_r1 = 37 !! lookup table dimension for rain
185 integer, parameter :: ntb_t1 = 45 !! lookup table dimension for temperature
186 integer, parameter :: ntb_in = 55 !! lookup table dimension for IN
187 integer, parameter :: ntb_arc = 7 !! lookup table dimension for CCN activation
188 integer, parameter :: ntb_arw = 9 !! lookup table dimension for CCN activation
189 integer, parameter :: ntb_art = 7 !! lookup table dimension for CCN activation
190 integer, parameter :: ntb_arr = 5 !! lookup table dimension for CCN activation
191 integer, parameter :: ntb_ark = 4 !! lookup table dimension for CCN activation
192
193 ! lookup table data
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, &
199 1.e-2_wp] !! mass bins for cloud water \‍([kg\, m^{-3}]\‍)
200
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, &
210 1.e-3_wp] !! mass bins for ice water \‍([kg\, m^{-3}]\‍)
211
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, &
217 1.e-2_wp] !! mass bins for rain \‍([kg\, m^{-3}]\‍)
218
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, &
224 1.e-2_wp] !! mass bins for snow \‍([kg\, m^{-3}]\‍)
225
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, &
231 1.e-2_wp] !! mass bins for graupel \‍([kg\, m^{-3}]\‍)
232
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, &
238 1.e10_wp] !! y-intercept bins for rain \‍([m^{-4}]\‍)
239
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, &
245 1.e6_wp] !! y-intercept bins for graupel \‍([m^{-4}]\‍)
246
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, &
254 1.e6_wp] !! number bins for ice \‍([m^{-3}]\‍)
255
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, &
263 1.e6_wp] !! number bins for IN concentration from \‍(0.001-1000\, L^{-1}\‍) \‍([m^{-3}]\‍)
264
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] !! aerosol lookup table bins for number concentration
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] !! aerosol lookup table bins for vertical velocity
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] !! aerosol lookup table bins for temperature
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] !! aerosol lookup table bins for radius
276 real(wp), dimension(ntb_ark), parameter :: &
277 ta_ka = [0.2_wp, 0.4_wp, 0.6_wp, 0.8_wp] !! aerosol lookup table bins for hygroscopicity
278
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] !! snow moment data from [Field et al. (2005)](https://doi.org/10.1256/qj.04.134)
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] !! snow moment data from [Field et al. (2005)](https://doi.org/10.1256/qj.04.134)
285
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] !! temperature lookup table data
289
290 ! variables ---------------------------------------------------------------------------------------------
291 integer, protected :: dim_nrhg !! number of dimensions for graupel density
292
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] !! graupel fallspeed power-law coefficients (hail_aware = true)
304
305 real(wp), protected :: am_i !! ice mass-diameter power-law coefficient
306 real(wp), protected :: am_r !! rain mass-diameter power-law coefficient
307 real(wp), protected, dimension (nrhg) :: am_g !! graupel mass-diameter power-law coefficient
308 real(wp), protected :: olfus !! 1 / lfus \‍([kg\, J^{-1}]\‍)
309 real(wp), protected :: orv !! 1 / rv \‍([K\, kg\, J^{-1}]\‍)
310 real(wp), protected :: ar_volume !! volume for Koop nucleation
311 real(wp), protected :: sc3 !! schmidt number to the 1/3 power
312 real(wp), protected :: d0i !! minimum diameter of cloud ice \‍([m]\‍)
313 real(wp), protected :: xm0s !! minimum mass of snow \‍([kg]\‍)
314 real(wp), protected :: xm0g !! minimum mass of graupel \‍([kg]\‍)
315 real(wp), protected :: obmi !! 1 / bm_i
316 real(wp), protected :: obmr !! 1 / bm_r
317 real(wp), protected :: oams !! 1 / am_s
318 real(wp), protected :: obms !! 1 / bm_s
319 real(wp), protected :: ocms !! oams ^ obms
320 real(wp), protected, dimension(nrhg) :: oamg !! 1 / am_g
321 real(wp), protected, dimension(nrhg) :: ocmg !! oamg ^ obmg
322 real(wp), protected :: obmg !! 1 / bm_g
323
324 ! various gamma calculations used throughout the microphysics
325 real(wp), protected, dimension(5,15) :: cce, ccg !! for \‍(ccg = \Gamma(x)\‍), cce is x for cloud water
326 real(wp), protected, dimension(15) :: ocg1, ocg2 !! inverse of specific ccg values
327 real(wp), protected, dimension(7) :: cie, cig !! for \‍(cig = \Gamma(x)\‍), cie is x for cloud ice
328 real(wp), protected :: oig1, oig2 !! inverse of specific cig values
329 real(wp), protected, dimension(13) :: cre, crg !! for \‍(crg = \Gamma(x)\‍), cre is x for rain
330 real(wp), protected :: ore1, org1, org2, org3 !! inverse of specific cre and crg values
331 real(wp), protected, dimension(17) :: cse, csg !! for \‍(csg = \Gamma(x)\‍), cse is x for snow
332 real(wp), protected, dimension(12,nrhg) :: cge, cgg !! for \‍(cgg = \Gamma(x)\‍), cge is x for graupel
333 real(wp), protected :: oge1, ogg1, ogg2, ogg3 !! inverse of specific cge and cgg values
334
335 ! precomputed constants in various rate equations
336 real(wp), protected :: t1_qr_qc, t1_qr_qi, t2_qr_qi !! terms for rain collecting cloud water and cloud ice equations
337 real(wp), protected :: t1_qs_qc, t1_qs_qi !! terms for snow collecting cloud water and cloud ice equations
338 real(wp), protected :: t1_qr_ev, t2_qr_ev !! terms for rain evaporation equation
339 real(wp), protected :: t1_qs_sd, t2_qs_sd !! terms for deposition/sublimation of snow equation
340 real(wp), protected :: t1_qs_me, t2_qs_me !! terms for melting snow equation
341 real(wp), protected :: t1_qg_sd !! term for deposition/sublimation of graupel equation
342 real(wp), protected :: t1_qg_me !! term for melting graupel equation
343
344 integer :: nic2, nii2, nii3, nir2, nir3, nis2, nig2, nig3, niin2 !! lookup table indexes
350 real(dp) :: nic1
351
352 real(dp), protected, dimension(nbc) :: dc, dtc !! diameter and bin space for cloud water bins \‍([m]\‍)
353 real(dp), protected, dimension(nbi) :: di, dti !! diameter and bin space for ice bins \‍([m]\‍)
354 real(dp), protected, dimension(nbr) :: dr, dtr !! diameter and bin space for rain bins \‍([m]\‍)
355 real(dp), protected, dimension(nbs) :: ds, dts !! diameter and bin space for snow bins \‍([m]\‍)
356 real(dp), protected, dimension(nbg) :: dg, dtg !! diameter and bin space for graupel bins \‍([m]\‍)
357 real(dp), protected, dimension(nbc) :: t_nc !! cloud droplet number concentration bins \‍([cm^{-3}]\‍)
358
359 integer, parameter :: nhbins = 50 !! used for hail size calculation
360 real(dp), protected, dimension(:), allocatable :: hbins, dhbins !! diameter and bin space for hail size bins \‍([m]\‍)
361
362 integer, parameter :: radar_bins = 50 !! used for radar caculation
363 real(dp), protected, dimension(:), allocatable :: sbins_radar, dsbins_radar !! diameter and bin space for snow used in radar calculation \‍([m]\‍)
364 real(dp), protected, dimension(:), allocatable :: gbins_radar, dgbins_radar !! diameter and bin space for graupel used in radar calculation \‍([m]\‍)
365
366 ! lookup table data set in module_mp_tempo_init and cannot be protected
367 real(dp), allocatable, dimension(:,:) :: t_efrw, t_efsw !! collection efficiency data arrays
368 real(dp), allocatable, dimension(:,:,:) :: tpc_wev, tnc_wev !! evaporation data arrays
369 real(table_sp), allocatable, dimension(:,:,:,:,:) :: tnccn_act !! cloud condensation nuclei data arrays
370 real(table_dp), allocatable, dimension(:,:,:,:,:) :: tcg_racg, tmr_racg, tcr_gacr, &
371 tnr_racg, tnr_gacr !! rain-graupel collection data arrays
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 !! rain-snow collection data arrays
375 real(table_dp), allocatable, dimension(:,:,:,:) :: tpi_qcfz, tni_qcfz !! cloud droplet freezing data arrays
376 real(table_dp), allocatable, dimension(:,:,:,:) :: tpi_qrfz, tpg_qrfz, tni_qrfz, tnr_qrfz !! rain freezing data arrays
377 real(dp), allocatable, dimension(:,:) :: tps_iaus, tni_iaus, tpi_ide !! cloud ice depositional growth and conversion to snow data array
378
379 ! -------------------------------------------------------------------------------------------------------
380 ! -------------------------------------------------------------------------------------------------------
381 contains
382
383 subroutine get_version(version, verbose_flag)
384 !! returns the tempo version string from the README.md file
385 !! or returns empty string if not found
386
387 character(len=*), intent(inout) :: version
388 logical, intent(in) :: verbose_flag
389 character(len=100) :: first_line, filename
390 integer :: io_unit
391 logical :: fileexists
392
393 filename = 'README.md'
394 inquire(file=trim(filename), exist=fileexists)
395 if (.not. fileexists) then
396 version = ''
397 ! write(*,'(A)') 'Unable to determine TEMPO Microphysics Version'
398 return
399 endif
400
401 open(newunit=io_unit, file=filename, status='old', action='read')
402 read(io_unit, '(A)') first_line
403 close(io_unit)
404
405 ! format is tempo-vX.X.X
406 version = trim(first_line(8:))
407 if (verbose_flag) write(*,'(A)') 'TEMPO Microphysics Version: '//trim(version)
408 end subroutine get_version
409
410
411 subroutine initialize_graupel_vars(hail_flag)
412 !! initialize graupel variables based on hail-aware configuration flag
413
414 logical, intent(in) :: hail_flag
415
416 if (hail_flag) then
417 ! in case these were previously set to av_g_old and bv_g_old reset
418 av_g(idx_bg1) = av_g_new
419 bv_g(idx_bg1) = bv_g_new
420 dim_nrhg = nrhg
421 else
422 av_g(idx_bg1) = av_g_old
423 bv_g(idx_bg1) = bv_g_old
424 dim_nrhg = nrhg1
425 endif
426 end subroutine initialize_graupel_vars
427
428
429 subroutine initialize_parameters()
430 !! initialize tempo parameters and variables
431
432 integer :: m, n
433
434 ! pi could be set by a host model, thus these parameters need to be calculated here
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]
446 ! av_i = av_s * d0s ** (bv_s - bv_i)
447 ar_volume = 4.0_wp / 3.0_wp * pi * (2.5e-6_wp)**3
448
449 lfus = lsub - lvap0
450 olfus = 1.0_wp / lfus
451 roverrv = rdry / rv
452 orv = 1.0_wp / rv
453 rho_not = 101325.0_wp / (rdry*298.0_wp)
454 rho_not0 = 101325.0_wp / (rdry*t0)
455
456 ! Schmidt number to one-third used numerous times
457 sc3 = sc**(1.0_wp/3.0_wp)
458
459 ! compute minimum ice diameter from mass and minimum snow/graupel mass from diameter
460 d0i = (xm0i/am_i)**(1.0_wp/bm_i)
461
462 ! pre-compute various constants used in the microphysics equations
463 xm0s = am_s * d0s**bm_s
464 xm0g = am_g(nrhg) * d0g**bm_g
465 obmi = 1.0_wp / bm_i
466 obmr = 1.0_wp / bm_r
467 oams = 1.0_wp / am_s
468 obms = 1.0_wp / bm_s
469 ocms = oams**obms
470 obmg = 1.0_wp / bm_g
471 do m = 1, nrhg
472 oamg(m) = 1.0_wp / am_g(m)
473 ocmg(m) = oamg(m)**obmg
474 enddo
475
476 ! gamma functions for cloud water
477 do n = 1, 15
478 cce(1,n) = n + 1._wp
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)
490 enddo
491
492 ! gamma functions for cloud ice
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)
509
510 ! gamma functions for rain
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
524
525 do n = 1, 13
526 crg(n) = gamma(cre(n))
527 enddo
528
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)
533
534 ! gamma functions for snow
535 cse(1) = bm_s + 1._wp
536 cse(2) = bm_s + 2._wp
537 cse(3) = 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
552
553 do n = 1, 17
554 csg(n) = gamma(cse(n))
555 enddo
556
557 ! gamma functions for graupel
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
564
565 do m = 1, nrhg
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)
572 enddo
573
574 do m = 1, nrhg
575 do n = 1, 12
576 cgg(n,m) = gamma(cge(n,m))
577 enddo
578 enddo
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)
583
584 ! rain collecting cloud water and cloud ice
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)
588
589 ! snow collecting cloud water and cloud ice
590 t1_qs_qc = pi * 0.25_wp * av_s
591 t1_qs_qi = pi * 0.25_wp * av_s
592
593 ! evaporation of rain; ignore depositional growth of rain.
594 t1_qr_ev = 0.78_wp * crg(10)
595 t2_qr_ev = 0.308_wp * sc3 * sqrt(av_r) * crg(11)
596
597 ! sublimation/depositional growth of snow
598 t1_qs_sd = 0.86_wp
599 t2_qs_sd = 0.28_wp * sc3 * sqrt(av_s)
600
601 ! melting of snow
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)
604
605 ! sublimation/depositional growth of graupel
606 t1_qg_sd = 0.86_wp * cgg(10,1)
607
608 ! melting of graupel
609 t1_qg_me = pi * 4._wp * c_cube * olfus * 0.86_wp * cgg(10,1)
610 end subroutine initialize_parameters
611
612
613 subroutine initialize_bins_for_tables()
614 !! initialize log-spaced bins of hydrometer quantities used for lookup tables
615
616 integer :: n
617
618 ! constants for helping find lookup table indexes
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)))
628
629 ! bins of cloud water (from minimum diameter to 100 microns)
630 dc(1) = real(d0c, kind=dp)
631 dtc(1) = real(d0c, kind=dp)
632 do n = 2, nbc
633 dc(n) = dc(n-1) + 1.0e-6_dp
634 dtc(n) = (dc(n) - dc(n-1))
635 enddo
636
637 ! bins of cloud ice (from min diameter up to 2x min snow size)
638 call create_bins(numbins=nbi, lowbin=real(d0i, kind=dp), &
639 highbin=2.0_dp*d0s, bins=di, deltabins=dti)
640
641 ! bins of rain (from min diameter up to 5 mm)
642 call create_bins(numbins=nbr, lowbin=real(d0r, kind=dp), &
643 highbin=0.005_dp, bins=dr, deltabins=dtr)
644
645 ! bins of snow (from min diameter up to 2 cm)
646 call create_bins(numbins=nbs, lowbin=real(d0s, kind=dp), &
647 highbin=0.02_dp, bins=ds, deltabins=dts)
648
649 ! bins of graupel (from min diameter up to 5 cm)
650 call create_bins(numbins=nbg, lowbin=real(d0g, kind=dp), &
651 highbin=0.05_dp, bins=dg, deltabins=dtg)
652
653 ! bins of cloud droplet number concentration (1 to 3000 per cc)
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
659
660
661 subroutine initialize_bins_for_hail_size()
662 !! initialize log-spaced bins for hail size calculation
663
664 real(dp), parameter :: lowbin = 500.e-6_dp
665 real(dp), parameter :: highbin = 0.075_dp
666
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
672
673
674 subroutine initialize_bins_for_radar()
675 !! initialize log-spaced bins for radar calculation
676
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
680
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)
683 ! bins of snow (from 100 microns up to 2 cm)
684 call create_bins(numbins=radar_bins, lowbin=lowbin, &
685 highbin=s_highbin, bins=sbins_radar, deltabins=dsbins_radar)
686
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)
689 ! bins of graupel (from 100 microns up to 5 cm)
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
693
694
695 subroutine create_bins(numbins, lowbin, highbin, bins, deltabins)
696 !! calculates log-spaced bins of hydrometer sizes to simplify calculations later
697
698 integer, intent(in) :: numbins
699 real(dp), intent(in) :: lowbin, highbin
700
701 real(dp), dimension(:), intent(out) :: bins
702 real(dp), dimension(:), intent(out), optional :: deltabins
703
704 integer :: n
705 real(dp), dimension(numbins+1) :: xdx
706
707 xdx(1) = lowbin
708 xdx(numbins+1) = highbin
709 do n = 2, numbins
710 xdx(n) = exp(real(n-1, kind=dp)/real(numbins, kind=dp) * log(xdx(numbins+1)/xdx(1)) + log(xdx(1)))
711 enddo
712
713 do n = 1, numbins
714 bins(n) = sqrt(xdx(n)*xdx(n+1))
715 enddo
716
717 if (present(deltabins)) then
718 do n = 1, numbins
719 deltabins(n) = xdx(n+1) - xdx(n)
720 enddo
721 endif
722 end subroutine create_bins
723
724
725 subroutine initialize_arrays_freezewater(table_size)
726 !! initialize data arrays for [Bigg (1953)](https://doi.org/10.1002/qj.49707934207) freezing of cloud water and rain
727 !! @warning
728 !! six lookup table arrays are allocated and set here
729 !! @endwarning
730
731 integer, intent(out), optional :: table_size
732
733 ! cloud water freezing
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)
736
737 ! rain freezing
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)
742
743 ! table size is precision * entries * dimensions
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))
747 endif
748 end subroutine initialize_arrays_freezewater
749
750
751 subroutine initialize_arrays_qr_acr_qs(table_size)
752 !! initialize data arrays for rain-snow collection
753 !! @warning
754 !! twelve lookup table arrays are allocated and set here
755 !! @endwarning
756
757 integer, intent(out), optional :: table_size
758
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)
771
772 ! table size is precision * entries * dimensions
773 if (present(table_size)) then
774 table_size = table_dp * 12 * (ntb_s*ntb_t*ntb_r1*ntb_r)
775 endif
776 end subroutine initialize_arrays_qr_acr_qs
777
778
779 subroutine initialize_arrays_qr_acr_qg(table_size)
780 !! initialize data arrays for rain-graupel collection
781 !! @warning
782 !! five lookup table arrays are allocated and set here
783 !! @endwarning
784
785 integer, intent(out), optional :: table_size
786
787 ! rain-graupel
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)
793
794 ! table size is precision * entries * dimensions
795 if (present(table_size)) then
796 table_size = table_dp * 5 * (ntb_g1*ntb_g*nrhg*ntb_r1*ntb_r)
797 endif
798 end subroutine initialize_arrays_qr_acr_qg
799
800
801 subroutine initialize_arrays_ccn(table_size)
802 !! initialize data arrays for ccn lookup table
803 !! @warning
804 !! one lookup table array is allocated and set here
805 !! @endwarning
806
807 integer, intent(out), optional :: table_size
808
809 if (.not. allocated(tnccn_act)) &
810 allocate(tnccn_act(ntb_arc,ntb_arw,ntb_art,ntb_arr,ntb_ark), source=0._table_sp)
811
812 ! table size is precision * entries * dimensions
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
815 endif
816 end subroutine initialize_arrays_ccn
817
818
819 subroutine initialize_arrays_drop_evap()
820 !! initialize data arrays for drop evaporation data
821 !! @warning
822 !! two lookup table arrays are allocated and set here
823 !! @endwarning
824
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
828
829
830 subroutine initialize_array_efsw()
831 !! initializes the collision efficiency data array for snow collecting cloud water
832 !! @warning
833 !! one lookup table array is allocated and set here
834 !! @endwarning
835
836 if (.not. allocated(t_efsw)) allocate(t_efsw(nbs,nbc), source=0._dp)
837 end subroutine initialize_array_efsw
838
839
840 subroutine initialize_array_efrw()
841 !! initializes the collision efficiency data array for rain collecting cloud water
842 !! @warning
843 !! one lookup table array is allocated and set here
844 !! @endwarning
845
846 if (.not. allocated(t_efrw)) allocate(t_efrw(nbr,nbc), source=0._dp)
847 end subroutine initialize_array_efrw
848
849
850 subroutine initialize_arrays_qi_aut_qs()
851 !! initializes data arrays for cloud ice to snow conversion and growth
852 !! @warning
853 !! three lookup table arrays are allocated and set here
854 !! @endwarning
855
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
860
861end module module_mp_tempo_params
862