13 subroutine effective_radius(temp, l_qc, nc, ilamc, l_qi, ilami, l_qs, rs, &
20 real(wp),
dimension(:),
intent(in) :: temp, nc, rs
21 real(dp),
dimension(:),
intent(in) :: ilamc, ilami
22 logical,
dimension(:),
intent(in) :: l_qc, l_qi, l_qs
23 real(wp),
dimension(:),
intent(out) :: re_qc, re_qi, re_qs
24 real(wp),
dimension(15),
parameter :: g_ratio = &
25 [24._wp,60._wp,120._wp,210._wp,336._wp,504._wp,720._wp,990._wp, &
26 1320._wp,1716._wp,2184._wp,2730._wp,3360._wp,4080._wp,4896._wp]
27 real(dp) :: smob, smoc
29 integer :: k, nz, nu_c
43 re_qc(k) = max(2.51e-6_wp, &
44 min(real(0.5_dp*(3._dp+real(nu_c, kind=dp))*ilamc(k), kind=wp), 50.e-6_wp))
47 re_qi(k) = max(2.51e-6_wp, &
48 min(real(0.5_dp*(3._dp+real(mu_i, kind=dp))*ilami(k), kind=wp), 125.e-6_wp))
51 tc0 = min(-0.1, temp(k)-t0)
52 call snow_moments(rs=rs(k), tc=tc0, smob=smob, smoc=smoc)
53 re_qs(k) = max(5.01e-6_wp, min(real(0.5_wp*(smoc/smob), kind=wp), 999.e-6_wp))
59 subroutine reflectivity_10cm(refl10cm_from_melting_flag, &
60 temp, l_qr, rr, nr, ilamr, l_qs, rs, smoc, smob, smoz, &
61 l_qg, rg, ng, idx, ilamg, dbz)
69 logical,
intent(in) :: refl10cm_from_melting_flag
70 logical,
dimension(:),
intent(in) :: l_qr, l_qs, l_qg
71 real(wp),
dimension(:),
intent(in) :: temp, rg, ng, rr, nr, rs
72 real(dp),
dimension(:),
intent(in) :: ilamr, smoc, smob, smoz, ilamg
73 integer,
dimension(:),
intent(in) :: idx
74 real(wp),
dimension(:),
intent(out) :: dbz
75 real(wp) :: ze_rain(size(temp)), ze_snow(size(temp)), ze_graupel(size(temp))
76 real(dp) :: n0_r, lamr, n0_g
77 integer :: k, nz, k_melt
82 ze_graupel = 1.e-22_wp
84 if (refl10cm_from_melting_flag)
then
85 k_melt = find_melting_level(temp, l_qr, l_qs, l_qg)
93 n0_r = nr(k)*org2*lamr**cre(2)
94 ze_rain(k) = n0_r*crg(4)*ilamr(k)**cre(4)
97 ze_snow(k) = (0.176_wp/0.93_wp) * (6._wp/pi)*(6._wp/pi) * &
98 (am_s/900._wp)*(am_s/900._wp)*smoz(k)
100 if (refl10cm_from_melting_flag)
then
101 if (k_melt > 2 .and. k < k_melt-1)
then
102 ze_snow(k) = reflectivity_from_melting_snow(rs(k), &
103 smob(k), smoc(k), rr(k))
108 n0_g = ng(k)*ogg2*(1._dp/ilamg(k))**cge(2,1)
109 ze_graupel(k) = (0.176_wp/0.93_wp) * (6._wp/pi)*(6._wp/pi) * &
110 (am_g(idx(k))/900._wp)*(am_g(idx(k))/900._wp) * n0_g*cgg(4,1)*ilamg(k)**cge(4,1)
112 if (refl10cm_from_melting_flag)
then
113 if (k_melt > 2 .and. k < k_melt-1)
then
114 ze_graupel(k) = reflectivity_from_melting_graupel(rg(k), ng(k), &
115 ilamg(k), idx(k), rr(k))
119 dbz(k) = max(-35._wp, 10._wp*real(log10((ze_rain(k)+ze_snow(k)+ze_graupel(k))*1.e18_dp), kind=wp))
144 function complex_water_ray(lambda, t)
result(refractive_index)
152 real(dp),
intent(in) :: lambda, t
153 real(dp) :: epsinf,epss,epsr,epsi,alpha,lambdas,nenner
154 complex(dp),
parameter :: i = (0._dp, 1._dp)
155 complex(dp) :: refractive_index
157 epsinf = 5.27137_dp + 0.02164740d0*t - 0.00131198_dp*t*t
158 epss = 78.54_dp * (1.0_dp - 4.579e-3_dp * (t - 25.0_dp) + &
159 1.190e-5_dp * (t - 25.0_dp)*(t - 25.0_dp) - 2.800e-8_dp * &
160 (t - 25.0_dp)*(t - 25.0_dp)*(t - 25.0_dp))
161 alpha = -16.8129_dp/(t+273.16_dp) + 0.0609265_dp
162 lambdas = 0.00033836_dp * exp(2513.98_dp/(t+273.16_dp)) * 1e-2_dp
164 nenner = 1._dp+2._dp*(lambdas/lambda)**(1_dp-alpha)*sin(alpha*pi*0.5_dp) + &
165 (lambdas/lambda)**(2._dp-2._dp*alpha)
166 epsr = epsinf + ((epss-epsinf) * ((lambdas/lambda)**(1_dp-alpha) * &
167 sin(alpha*pi*0.5_dp)+1._dp)) / nenner
168 epsi = ((epss-epsinf) * ((lambdas/lambda)**(1_dp-alpha) * &
169 cos(alpha*pi*0.5_dp)+0._dp)) / nenner + lambda*1.25664_dp/1.88496_dp
171 refractive_index = sqrt(cmplx(epsr,-epsi, kind=dp))
175 function complex_ice_maetzler(lambda, t)
result(refractive_index)
182 real(dp),
intent(in) :: lambda, t
183 real(dp) :: f,c,tk,b1,b2,b,deltabeta,betam,beta,theta,alfa
184 complex(dp) :: refractive_index
188 f = c / lambda * 1e-9_dp
192 deltabeta = exp(-10.02_dp + 0.0364_dp*(tk-273.16_dp))
193 betam = (b1/tk) * (exp(b/tk) / ((exp(b/tk)-1._dp)**2_dp) ) + b2*f*f
194 beta = betam + deltabeta
195 theta = 300._dp / tk - 1._dp
196 alfa = (0.00504_dp + 0.0062_dp*theta) * exp(-22.1_dp*theta)
198 refractive_index = 3.1884_dp + 9.1e-4_dp*(tk-273.16_dp)
199 refractive_index = refractive_index+ cmplx(0.0_dp, (alfa/f + beta*f), kind=dp)
200 refractive_index = sqrt(conjg(refractive_index))
204 function reflectivity_from_melting_graupel(rg, ng, ilamg, idx, rr)
result(ze_graupel)
209 gbins_radar, dgbins_radar, radar_bins
211 real(wp),
intent(in) :: rg, ng, rr
212 real(dp),
intent(in) :: ilamg
213 integer,
intent(in) :: idx
214 real(dp),
parameter :: melt_outside = 0.9_dp
215 real(dp),
parameter :: lambda_radar = 0.10_dp
216 complex(dp) :: m_w_0, m_i_0
217 real(dp),
dimension(radar_bins+1) :: simpson
218 real(dp),
dimension(3),
parameter :: basis = [1._dp/3._dp, 4._dp/3._dp, 1._dp/3._dp]
219 real(dp) :: sr, fmelt, eta, lamg, backscatter, f_d, n0_g, mass, k_w
221 real(wp) :: ze_graupel
223 do n = 1, radar_bins+1
226 do n = 1, radar_bins-1, 2
227 simpson(n) = simpson(n) + basis(1)
228 simpson(n+1) = simpson(n+1) + basis(2)
229 simpson(n+2) = simpson(n+2) + basis(3)
232 m_w_0 = complex_water_ray(lambda_radar, 0._dp)
233 m_i_0 = complex_ice_maetzler(lambda_radar, 0._dp)
234 k_w = (abs((m_w_0*m_w_0 - 1._dp) /(m_w_0*m_w_0 + 2._dp)))**2
236 sr = max(0.01_dp, min(1.0_dp - rg/max(rg + rr, r1), 0.99_dp))
237 fmelt = real(sr*sr, kind=dp)
240 n0_g = ng*ogg2*lamg**cge(2,1)
243 mass = am_g(idx) * gbins_radar(n)**bm_g
244 call rayleigh_soak_wetgraupel(x_g=mass, a_geo=real(ocmg(idx), kind=dp), b_geo=real(obmg, kind=dp), &
245 fmelt=fmelt, lambda_radar=lambda_radar, meltratio_outside=melt_outside, &
246 m_w=m_w_0, m_i=m_i_0, backscatter=backscatter)
247 f_d = n0_g*gbins_radar(n)**mu_g * exp(-lamg*gbins_radar(n))
248 eta = eta + f_d * backscatter * simpson(n) * dgbins_radar(n)
250 ze_graupel = lambda_radar*lambda_radar*lambda_radar*lambda_radar / &
251 (pi*pi*pi*pi*pi * k_w) * eta
255 function reflectivity_from_melting_snow(rs, smob, smoc, rr)
result(ze_snow)
259 use module_mp_tempo_params,
only : am_s, bm_s, lam0, lam1, obms, ocms, kap0, kap1, mu_s, &
260 sbins_radar, dsbins_radar, radar_bins
262 real(wp),
intent(in) :: rs, rr
263 real(dp),
intent(in) :: smob, smoc
264 real(dp),
parameter :: melt_outside = 0.9_dp
265 real(dp),
parameter :: lambda_radar = 0.10_dp
266 complex(dp) :: m_w_0, m_i_0
267 real(dp),
dimension(radar_bins+1) :: simpson
268 real(dp),
dimension(3),
parameter :: basis = [1._dp/3._dp, 4._dp/3._dp, 1._dp/3._dp]
269 real(dp) :: sr, fmelt, eta, backscatter, f_d, mass, k_w, om3, m0, mrat, slam1, slam2
273 do n = 1, radar_bins+1
276 do n = 1, radar_bins-1, 2
277 simpson(n) = simpson(n) + basis(1)
278 simpson(n+1) = simpson(n+1) + basis(2)
279 simpson(n+2) = simpson(n+2) + basis(3)
282 m_w_0 = complex_water_ray(lambda_radar, 0._dp)
283 m_i_0 = complex_ice_maetzler(lambda_radar, 0._dp)
284 k_w = (abs((m_w_0*m_w_0 - 1._dp) /(m_w_0*m_w_0 + 2._dp)))**2
286 sr = max(0.01_dp, min(1.0_dp - rs/(rs + rr), 0.99_dp))
287 fmelt = real(sr*sr, kind=dp)
296 mass = am_s * sbins_radar(n)**bm_s
298 call rayleigh_soak_wetgraupel(x_g=mass, a_geo=real(ocms, kind=dp), b_geo=real(obms, kind=dp), &
299 fmelt=fmelt, lambda_radar=lambda_radar, meltratio_outside=melt_outside, &
300 m_w=m_w_0, m_i=m_i_0, backscatter=backscatter)
301 f_d = mrat*(kap0*exp(-slam1*sbins_radar(n)) + kap1*(m0*sbins_radar(n))**mu_s * exp(-slam2*sbins_radar(n)))
302 eta = eta + f_d * backscatter * simpson(n) * dsbins_radar(n)
304 ze_snow = lambda_radar*lambda_radar*lambda_radar*lambda_radar / &
305 (pi*pi*pi*pi*pi * k_w) * eta
309 subroutine rayleigh_soak_wetgraupel(x_g, a_geo, b_geo, fmelt, lambda_radar, &
310 meltratio_outside, m_w, m_i, backscatter)
316 real(dp),
intent(in) :: x_g, a_geo, b_geo, fmelt, lambda_radar, meltratio_outside
317 complex(dp),
intent(in) :: m_w, m_i
318 real(dp),
intent(out) :: backscatter
319 real(dp) :: fm, mra, x_w, d_g, vg, rhog, meltratio_outside_grenz, &
320 volg, fmgrenz, d_large, volwater, volice, volair, volmix1, volmix2, &
322 complex(dp) :: m_core, m_air, m_tmp, m1t, m2t, m3t, beta2, beta3
324 m_air = (1._dp, 0._dp)
325 fm = max(min(fmelt, 1._dp), 0._dp)
326 mra = max(min(meltratio_outside, 1._dp), 0._dp)
327 mra = mra + (1._dp-mra)*fm
330 d_g = a_geo * x_g**b_geo
332 vg = pi/6._dp * d_g**3
333 rhog = max(min(x_g / vg, 900._dp), 10._dp)
335 meltratio_outside_grenz = 1._dp - rhog / 1000._dp
337 if (mra <= meltratio_outside_grenz)
then
338 volg = vg * (1._dp - mra * fm)
341 fmgrenz=(900._dp-rhog)/(mra*900._dp-rhog+900._dp*rhog/1000._dp)
342 if (fm <= fmgrenz)
then
344 volg = (1.0_dp - mra * fm) * vg
347 volg = (x_g - x_w) / 900._dp + x_w / 1000._dp
352 d_large = (6._dp / pi * volg) ** (1._dp/3._dp)
353 volice = (x_g - x_w) / (volg * 900._dp)
354 volwater = x_w / (1000._dp * volg)
355 volair = 1.0_dp - volice - volwater
357 volmix1 = volice / max(volice+volwater,1e-10_dp)
358 volmix2 = 1._dp - volmix1
368 beta2 = 2._dp*m1t/(m2t-m1t) * (m2t/(m2t-m1t)*log(m2t/m1t)-1._dp)
369 beta3 = 2._dp*m1t/(m3t-m1t) * (m3t/(m3t-m1t)*log(m3t/m1t)-1._dp)
371 m_tmp = sqrt(((1._dp-vol2-vol3)*m1t + vol2*beta2*m2t + vol3*beta3*m3t) / &
372 (1._dp-vol2-vol3+vol2*beta2+vol3*beta3))
377 m3t = (2._dp*m_air)**2
378 vol1 = (1._dp-volair)
382 beta2 = 2._dp*m1t/(m2t-m1t) * (m2t/(m2t-m1t)*log(m2t/m1t)-1._dp)
383 beta3 = 2._dp*m1t/(m3t-m1t) * (m3t/(m3t-m1t)*log(m3t/m1t)-1._dp)
386 m_core = sqrt(((1._dp-vol2-vol3)*m1t + vol2*beta2*m2t + vol3*beta3*m3t) / &
387 (1._dp-vol2-vol3+vol2*beta2+vol3*beta3))
390 backscatter = (abs((m_core**2-1._dp)/(m_core**2+2._dp)))**2 * pi*pi*pi*pi*pi * d_large**6 / &
391 (lambda_radar*lambda_radar*lambda_radar*lambda_radar)
398 subroutine max_hail_diam(rho, rg, ng, ilamg, idx, max_hail_diameter)
404 real(wp),
dimension(:),
intent(in) :: rho, rg, ng
405 real(dp),
dimension(:),
intent(in) :: ilamg
406 integer,
dimension(:),
intent(in) :: idx
407 real(wp),
dimension(:),
intent(out) :: max_hail_diameter
408 real(dp) :: lamg, n0_g, sum_nh, sum_t, f_d, hail_max
410 real(dp),
parameter :: threshold_conc = 0.0005
414 max_hail_diameter(k) = 0._wp
415 if(rg(k)/rho(k) >= 1.e-6_wp)
then
416 if (rho_g(idx(k)) < 350._wp) cycle
417 lamg = 1._dp / ilamg(k)
418 n0_g = ng(k)*ogg2*lamg**cge(2,1)
423 f_d = n0_g*hbins(n)**mu_g * exp(-lamg*hbins(n)) * dhbins(n)
424 sum_nh = sum_nh + f_d
425 if (sum_nh > threshold_conc)
exit
428 if (n >= nhbins)
then
429 hail_max = hbins(nhbins)
430 elseif (hbins(n+1) > 1.e-3_wp)
then
431 hail_max = hbins(n) - (sum_nh-threshold_conc)/(sum_nh-sum_t) * (hbins(n)-hbins(n+1))
435 max_hail_diameter(k) = 1000._wp * hail_max