42 integer,
private,
parameter :: QA_MP = 3
52 'Ratio of Water Vapor mass to total mass (Specific humidity)', &
53 'Ratio of Cloud Water mass to total mass ', &
54 'Ratio of Rain Water mass to total mass '/)
71 integer,
private,
parameter :: i_qv = 1
72 integer,
private,
parameter :: i_qc = 2
73 integer,
private,
parameter :: i_qr = 3
75 integer,
private,
parameter :: i_hyd_qc = 1
76 integer,
private,
parameter :: i_hyd_qr = 2
78 logical,
private :: flag_liquid = .true.
79 logical,
private :: couple_aerosol = .false.
81 real(
rp),
private,
parameter :: re_qc = 8.e-6_rp
97 log_info(
"ATMOS_PHY_MP_kessler_setup",*)
'Setup'
98 log_info(
"ATMOS_PHY_MP_kessler_setup",*)
'KESSLER-type 1-moment bulk 3 category'
100 if( couple_aerosol )
then
101 log_error(
"ATMOS_PHY_MP_kessler_setup",*)
'MP_aerosol_couple should be .false. for KESSLER type MP!'
113 KA, KS, KE, IA, IS, IE, JA, JS, JE, &
116 TEMP, QTRC, CPtot, CVtot, &
124 mp_saturation_adjustment => atmos_phy_mp_saturation_adjustment
127 integer,
intent(in) :: ka, ks, ke
128 integer,
intent(in) :: ia, is, ie
129 integer,
intent(in) :: ja, js, je
130 real(
rp),
intent(in) :: dens (ka,ia,ja)
131 real(
rp),
intent(in) :: pres (ka,ia,ja)
132 real(
dp),
intent(in) :: dt
133 real(
rp),
intent(inout) :: temp (ka,ia,ja)
134 real(
rp),
intent(inout) :: qtrc (ka,ia,ja,qa_mp)
135 real(
rp),
intent(inout) :: cptot (ka,ia,ja)
136 real(
rp),
intent(inout) :: cvtot (ka,ia,ja)
137 real(
rp),
intent(out) :: rhoe_t (ka,ia,ja)
138 real(
rp),
intent(out) :: evaporate(ka,ia,ja)
140 real(
rp) :: qtrc_dummy(ka,ia,ja)
141 real(
rp) :: rhoe_d_sat(ka,ia,ja)
142 real(
rp) :: qc_t_sat (ka,ia,ja)
147 log_progress(*)
'atmosphere / physics / microphysics / Kessler'
151 ka, ks, ke, ia, is, ie, ja, js, je, &
152 dens(:,:,:), pres(:,:,:), &
154 temp(:,:,:), qtrc(:,:,:,:), &
155 cptot(:,:,:), cvtot(:,:,:), &
162 qc_t_sat(k,i,j) = qtrc(k,i,j,i_qc)
168 qtrc_dummy(:,:,:) = -1.0_rp
170 call mp_saturation_adjustment( &
171 ka, ks, ke, ia, is, ie, ja, js, je, &
176 qtrc(:,:,:,i_qc), qtrc_dummy(:,:,:), &
177 cptot(:,:,:), cvtot(:,:,:), &
183 rhoe_t(k,i,j) = rhoe_t(k,i,j) + rhoe_d_sat(k,i,j) / dt
190 qc_t_sat(k,i,j) = ( qtrc(k,i,j,i_qc) - qc_t_sat(k,i,j) ) / dt
195 call file_history_in( qc_t_sat(:,:,:),
'Pcsat',
'QC production term by satadjust',
'kg/kg/s' )
200 evaporate(k,i,j) = max( -qc_t_sat(k,i,j), 0.0_rp ) &
201 * dens(k,i,j) / (4.0_rp/3.0_rp*pi*dwatr*re_qc**3)
213 subroutine mp_kessler( &
214 KA, KS, KE, IA, IS, IE, JA, JS, JE, &
229 saturation_dens2qsat_liq => atmos_saturation_dens2qsat_liq
231 integer,
intent(in) :: ka, ks, ke
232 integer,
intent(in) :: ia, is, ie
233 integer,
intent(in) :: ja, js, je
235 real(
rp),
intent(in) :: dens0(ka,ia,ja)
236 real(
rp),
intent(in) :: pres0(ka,ia,ja)
237 real(
dp),
intent(in) :: dt
239 real(
rp),
intent(inout) :: temp0 (ka,ia,ja)
240 real(
rp),
intent(inout) :: qtrc0 (ka,ia,ja,qa_mp)
241 real(
rp),
intent(inout) :: cptot0(ka,ia,ja)
242 real(
rp),
intent(inout) :: cvtot0(ka,ia,ja)
244 real(
rp),
intent(out) :: rhoe_t(ka,ia,ja)
249 real(
rp) :: cptot, cvtot
250 real(
rp) :: qv, qc, qr
251 real(
rp) :: qv_t, qc_t, qr_t
252 real(
rp) :: e_t, cp_t, cv_t
261 real(
rp) :: vent_factor
288 qv = qtrc0(k,i,j,i_qv)
289 qc = qtrc0(k,i,j,i_qc)
290 qr = qtrc0(k,i,j,i_qr)
292 call saturation_dens2qsat_liq( &
296 sliq = qv / max( qsatl, eps)
299 dq_auto = 1.e-3_rp * max( qc-1.e-3_rp, 0.0_rp )
302 dq_accr = 2.2_rp * qc * qr**0.875_rp
305 vent_factor = 1.6_rp + 124.9_rp * ( dens*qr )**0.2046_rp
306 dq_evap = ( 1.0_rp-min(sliq,1.0_rp) ) / dens * vent_factor &
307 * ( dens*qr )**0.525_rp / ( 5.4e5_rp + 2.55e8_rp / ( pres*qsatl ) )
310 qc_t = (-dq_auto-dq_accr )
311 qc_t = max( qc_t, -qc*rdt )
313 qr_t = ( dq_auto+dq_accr-dq_evap )
314 qr_t = max( qr_t, -qr*rdt )
316 qv_t = - ( qc_t + qr_t )
317 qv_t = max( qv_t, -qv*rdt)
320 qtrc0(k,i,j,i_qv) = qtrc0(k,i,j,i_qv) + qv_t * dt
321 qtrc0(k,i,j,i_qc) = qtrc0(k,i,j,i_qc) + qc_t * dt
322 qtrc0(k,i,j,i_qr) = qtrc0(k,i,j,i_qr) + qr_t * dt
327 cptot = cptot0(k,i,j) + cp_t * dt
331 cvtot = cvtot0(k,i,j) + cv_t * dt
333 rhoe_t(k,i,j) = dens * e_t
335 temp0(k,i,j) = ( temp * cvtot0(k,i,j) + e_t * dt ) / cvtot
336 cptot0(k,i,j) = cptot
337 cvtot0(k,i,j) = cvtot
346 end subroutine mp_kessler
354 REFSTATE_dens_profile, &
358 integer,
intent(in) :: ka, ks, ke
359 real(
rp),
intent(in) :: dens0 (ka)
360 real(
rp),
intent(in) :: rhoq0 (ka,qa_mp-1)
361 real(
rp),
intent(in) :: refstate_dens_profile(ka)
362 real(
rp),
intent(out) :: vterm (ka,qa_mp-1)
371 vterm(k,i_hyd_qc) = 0.0_rp
375 qr = rhoq0(k,i_hyd_qr) / dens0(k)
376 zerosw = 0.5_rp - sign(0.5_rp, qr - 1.e-12_rp )
378 vterm(k,i_hyd_qr) = - 36.34_rp * ( dens0(k) * ( qr + zerosw ) )**0.1364_rp &
379 * refstate_dens_profile(ks) / refstate_dens_profile(k) * ( 1.0_rp - zerosw )
388 KA, KS, KE, IA, IS, IE, JA, JS, JE, &
393 integer,
intent(in) :: ka, ks, ke
394 integer,
intent(in) :: ia, is, ie
395 integer,
intent(in) :: ja, js, je
397 real(
rp),
intent(in) :: qtrc(ka,ia,ja,qa_mp-1)
398 real(
rp),
intent(in) :: mask_criterion
400 real(
rp),
intent(out) :: cldfrac(ka,ia,ja)
409 qhydro = qtrc(k,i,j,i_hyd_qc) + qtrc(k,i,j,i_hyd_qr)
410 cldfrac(k,i,j) = 0.5_rp + sign(0.5_rp,qhydro-mask_criterion)
421 KA, KS, KE, IA, IS, IE, JA, JS, JE, &
422 DENS0, TEMP0, QTRC0, &
429 integer,
intent(in) :: ka, ks, ke
430 integer,
intent(in) :: ia, is, ie
431 integer,
intent(in) :: ja, js, je
433 real(
rp),
intent(in) :: dens0(ka,ia,ja)
434 real(
rp),
intent(in) :: temp0(ka,ia,ja)
435 real(
rp),
intent(in) :: qtrc0(ka,ia,ja,qa_mp-1)
437 real(
rp),
intent(out) :: re (ka,ia,ja,
n_hyd)
439 real(
rp),
parameter :: um2cm = 100.0_rp
443 re(:,:,:,
i_hc) = 8.e-6_rp * um2cm
445 re(:,:,:,
i_hr) = 100.e-6_rp * um2cm
447 re(:,:,:,
i_hr+1:) = 0.0_rp
455 KA, KS, KE, IA, IS, IE, JA, JS, JE, &
463 integer,
intent(in) :: ka, ks, ke
464 integer,
intent(in) :: ia, is, ie
465 integer,
intent(in) :: ja, js, je
467 real(
rp),
intent(in) :: qtrc(ka,ia,ja,qa_mp-1)
469 real(
rp),
intent(out) :: qe(ka,ia,ja,
n_hyd)
473 qe(:,:,:,
i_hc) = qtrc(:,:,:,i_hyd_qc)
475 qe(:,:,:,
i_hr) = qtrc(:,:,:,i_hyd_qr)
477 qe(:,:,:,
i_hr+1:) = 0.0_rp
485 KA, KS, KE, IA, IS, IE, JA, JS, JE, &
493 integer,
intent(in) :: ka, ks, ke
494 integer,
intent(in) :: ia, is, ie
495 integer,
intent(in) :: ja, js, je
497 real(
rp),
intent(in) :: qe(ka,ia,ja,
n_hyd)
499 real(
rp),
intent(out) :: qtrc(ka,ia,ja,qa_mp-1)
504 qtrc(:,:,:,i_hyd_qc) = qe(:,:,:,
i_hc)
506 qtrc(:,:,:,i_hyd_qr) = qe(:,:,:,
i_hr)