35 env_state, del_t, immersion_freezing_scheme_type, &
36 freezing_rate, do_freezing_naive, INAS_a, INAS_b)
45 real(kind=
dp),
intent(in) :: del_t
47 integer,
intent(in) :: immersion_freezing_scheme_type
49 real(kind=
dp),
intent(in) :: freezing_rate
52 logical,
intent(in) :: do_freezing_naive
54 real(kind=
dp),
intent(in) :: inas_a
56 real(kind=
dp),
intent(in) :: inas_b
60 if (env_state%temp <=
const%water_freeze_temp)
then
62 .OR. (immersion_freezing_scheme_type == &
64 if (do_freezing_naive)
then
66 aero_state, aero_data, env_state, del_t, &
67 immersion_freezing_scheme_type, freezing_rate)
70 aero_state, aero_data, env_state, del_t, &
71 immersion_freezing_scheme_type, freezing_rate)
73 else if (immersion_freezing_scheme_type == &
81 'Invalid immersion freezing scheme type')
99 real(kind=
dp),
intent(in) :: inas_a
101 real(kind=
dp),
intent(in) :: inas_b
104 real(kind=
dp) :: p, s, t0, temp
105 real(kind=
dp) :: aerosol_diameter
107 t0 =
const%water_freeze_temp
109 if (aero_state%apa%particle(i_part)%imf_temperature == 0d0)
then
111 aero_state%apa%particle(i_part), aero_data)
112 s =
const%pi * aerosol_diameter**2
114 temp = (log(1d0 - p) + exp(-s * exp(-inas_a * t0 + inas_b))) / (-s)
115 aero_state%apa%particle(i_part)%imf_temperature = t0 + (log(temp) &
127 aero_data, env_state)
136 real(kind=
dp),
allocatable :: h2o_masses(:), total_masses(:), &
148 h2o_frac = h2o_masses / total_masses
150 if (aero_state%apa%particle(i_part)%frozen)
then
153 if (h2o_frac(i_part) <
const%imf_water_threshold)
then
156 if (env_state%temp <= &
157 aero_state%apa%particle(i_part)%imf_temperature)
then
158 aero_state%apa%particle(i_part)%frozen = .true.
159 aero_state%apa%particle(i_part)%den_ice = &
160 const%reference_ice_density
161 aero_state%apa%particle(i_part)%ice_shape_phi = 1d0
173 aero_data, env_state, del_t, immersion_freezing_scheme_type, &
183 real(kind=
dp),
intent(in) :: del_t
185 real(kind=
dp),
intent(in) :: freezing_rate
187 integer,
intent(in) :: immersion_freezing_scheme_type
189 integer :: i_part, i_bin, i_class, n_bins, n_class
190 real(kind=
dp) :: a_w_ice, pis, pvs
191 real(kind=
dp) :: p_freeze
193 real(kind=
dp) :: p_freeze_max, radius_max, diameter_max
195 integer :: k_th, n_parts_in_bin
196 real(kind=
dp) :: rand
197 real(kind=
dp),
allocatable :: h2o_masses(:), total_masses(:), &
199 integer :: i_spec_max
200 real(kind=
dp) :: j_het_max
213 h2o_frac = h2o_masses / total_masses
221 n_bins = aero_sorted_n_bin(aero_state%aero_sorted)
222 n_class = aero_sorted_n_class(aero_state%aero_sorted)
225 p_freeze_max = 1d0 - exp(-freezing_rate * del_t)
227 p_freeze_max =
const%nan
230 loop_bins:
do i_bin = 1,n_bins
231 loop_classes:
do i_class = 1,n_class
232 n_parts_in_bin = integer_varray_n_entry(&
233 aero_state%aero_sorted%size_class%inverse(i_bin, i_class))
234 radius_max = aero_state%aero_sorted%bin_grid%edges(i_bin + 1)
235 diameter_max = radius_max * 2
236 if (immersion_freezing_scheme_type == &
242 k_th = n_parts_in_bin + 1
243 loop_chosen_particles:
do while(.true.)
245 k_th = k_th - rand_geo
247 EXIT loop_chosen_particles
249 i_part = aero_state%aero_sorted%size_class &
250 %inverse(i_bin, i_class)%entry(k_th)
251 if (aero_state%apa%particle(i_part)%frozen)
then
254 if (h2o_frac(i_part) <
const%imf_water_threshold)
then
257 if (immersion_freezing_scheme_type == &
260 aero_state%apa%particle(i_part), aero_data, a_w_ice, del_t)
262 "p_freeze > p_freeze_max.")
264 if (rand < p_freeze / p_freeze_max)
then
265 aero_state%apa%particle(i_part)%frozen = .true.
266 aero_state%apa%particle(i_part)%den_ice = &
267 const%reference_ice_density
268 aero_state%apa%particle(i_part)%ice_shape_phi = 1d0
272 aero_state%apa%particle(i_part)%frozen = .true.
273 aero_state%apa%particle(i_part)%den_ice = &
274 const%reference_ice_density
275 aero_state%apa%particle(i_part)%ice_shape_phi = 1d0
278 end do loop_chosen_particles
290 aero_state, aero_data, env_state, del_t, &
291 immersion_freezing_scheme_type, freezing_rate)
300 real(kind=
dp),
intent(in) :: del_t
302 integer,
intent(in) :: immersion_freezing_scheme_type
304 real(kind=
dp),
intent(in) :: freezing_rate
307 real(kind=
dp) :: a_w_ice, pis, pvs
308 real(kind=
dp) :: p_freeze
309 real(kind=
dp),
allocatable :: h2o_masses(:), total_masses(:), &
311 real(kind=
dp) :: rand
321 h2o_frac = h2o_masses / total_masses
328 p_freeze = 1d0 - exp(-freezing_rate * del_t)
334 if (aero_state%apa%particle(i_part)%frozen) cycle
335 if (h2o_frac(i_part) <
const%imf_water_threshold) cycle
338 if (immersion_freezing_scheme_type == &
341 aero_data, a_w_ice, del_t)
344 if (rand < p_freeze)
then
345 aero_state%apa%particle(i_part)%frozen = .true.
346 aero_state%apa%particle(i_part)%den_ice = &
347 const%reference_ice_density
348 aero_state%apa%particle(i_part)%ice_shape_phi = 1d0
369 if (env_state%temp >
const%water_freeze_temp)
then
371 aero_state%apa%particle(i_part)%frozen = .false.
372 aero_state%apa%particle(i_part)%den_ice =
const%nan
373 aero_state%apa%particle(i_part)%ice_shape_phi =
const%nan
391 real(kind=
dp),
intent(in) :: a_w_ice
393 real(kind=
dp),
intent(in) :: del_t
395 real(kind=
dp) :: aerosol_diameter
396 real(kind=
dp) :: immersed_surface_area
397 real(kind=
dp) :: total_vol
398 real(kind=
dp) :: surface_ratio
399 real(kind=
dp) :: abifm_m, abifm_c
400 real(kind=
dp) :: j_het, j_het_x_area
404 immersed_surface_area =
const%pi * aerosol_diameter**2
410 if (i_spec == aero_data%i_water) cycle
411 abifm_m = aero_data%abifm_m(i_spec)
412 abifm_c = aero_data%abifm_c(i_spec)
413 j_het = 10d0**(abifm_m * (1d0 - a_w_ice) + abifm_c) * 10000d0
414 surface_ratio = aero_particle%vol(i_spec) / total_vol
415 j_het_x_area = j_het_x_area + j_het * immersed_surface_area * &
431 real(kind=
dp),
intent(in) :: a_w_ice
433 integer,
intent(out) :: i_spec_max
435 real(kind=
dp),
intent(out) :: j_het_max
437 real(kind=
dp) :: abifm_m, abifm_c
438 real(kind=
dp) :: j_het
441 j_het_max =
const%nan
443 if (i_spec == aero_data%i_water) cycle
444 abifm_m = aero_data%abifm_m(i_spec)
445 abifm_c = aero_data%abifm_c(i_spec)
446 j_het = 10d0**(abifm_m * (1d0 - a_w_ice) + abifm_c) * 10000d0
447 if (j_het > j_het_max)
then
466 real(kind=
dp),
intent(in) :: diameter_max
468 real(kind=
dp),
intent(in) :: del_t
470 real(kind=
dp),
intent(in) :: j_het_max
472 real(kind=
dp) :: immersed_surface_area
474 immersed_surface_area =
const%pi * diameter_max**2
475 abifm_pfrz_max = 1d0 - exp(-j_het_max * immersed_surface_area * del_t)
482 subroutine spec_file_read_immersion_freezing_scheme_type(file, &
483 immersion_freezing_scheme_type)
488 integer,
intent(out) :: immersion_freezing_scheme_type
490 character(len=SPEC_LINE_MAX_VAR_LEN) :: imf_scheme
512 if (trim(imf_scheme) ==
'const')
then
514 elseif (trim(imf_scheme) ==
'singular')
then
516 elseif (trim(imf_scheme) ==
'ABIFM')
then
520 "Unknown immersion freezing scheme: " // trim(imf_scheme))
523 end subroutine spec_file_read_immersion_freezing_scheme_type