172 subroutine initialize(this, chem_spec_data, aero_rep, n_cells)
181 integer(kind=i_kind),
intent(in) :: n_cells
184 character(len=:),
allocatable :: key_name, gas_spec_name, &
185 water_name, aero_spec_name, phase_name, error_msg
186 integer(kind=i_kind) :: i_spec, i_aero_rep, n_aero_ids, i_aero_id, &
187 n_aero_jac_elem, i_phase, tmp_size
188 type(
string_t),
allocatable :: unique_spec_names(:), &
189 unique_water_names(:)
190 integer(kind=i_kind),
allocatable :: phase_ids(:)
191 real(kind=
dp) :: temp_real, n_star
194 if (.not.
associated(this%property_set))
call die_msg(318525776, &
195 "Missing property set needed to initialize reaction")
198 key_name =
"gas-phase species"
200 this%property_set%get_string(key_name, gas_spec_name), &
201 "Missing gas-phase species in phase-transfer reaction")
204 key_name =
"aerosol phase"
206 this%property_set%get_string(key_name, phase_name), &
207 "Missing aerosol phase in phase-transfer reaction")
210 key_name =
"aerosol-phase species"
212 this%property_set%get_string(key_name, aero_spec_name), &
213 "Missing aerosol-phase species in phase-transfer reaction")
216 error_msg =
" for HL partitioning reaction of gas-phase species '"// &
217 gas_spec_name//
"' to aerosol-phase species '"// &
218 aero_spec_name//
"' in phase '"//phase_name
221 key_name =
"aerosol-phase water"
223 this%property_set%get_string(key_name, water_name), &
224 "Missing aerosol-phase water"//error_msg)
227 call assert_msg(234155350,
associated(aero_rep), &
228 "Missing aerosol representation"//error_msg)
229 call assert_msg(207961800,
size(aero_rep).gt.0, &
230 "Missing aerosol representation"//error_msg)
236 do i_aero_rep = 1,
size(aero_rep)
240 unique_spec_names = aero_rep(i_aero_rep)%val%unique_names( &
241 phase_name = phase_name,
spec_name = aero_spec_name, &
242 phase_is_at_surface = .true.)
243 unique_water_names = aero_rep(i_aero_rep)%val%unique_names( &
244 phase_name = phase_name,
spec_name = water_name, &
245 phase_is_at_surface = .true.)
248 if (.not.
allocated(unique_spec_names)) cycle
251 call assert_msg(598091463,
size(unique_spec_names).eq. &
252 size(unique_water_names),
"Missing species "// &
253 aero_spec_name//
" or "//water_name//
" in phase "//phase_name// &
254 " or improper implementation of aerosol phase in aerosol "// &
255 "representation"//error_msg)
258 n_aero_ids = n_aero_ids +
size(unique_spec_names)
262 phase_ids = aero_rep(i_aero_rep)%val%phase_ids(phase_name, is_at_surface=.true.)
263 do i_phase = 1,
size(phase_ids)
264 n_aero_jac_elem = n_aero_jac_elem + &
265 aero_rep(i_aero_rep)%val%num_jac_elem(phase_ids(i_phase))
268 deallocate(unique_spec_names)
269 deallocate(unique_water_names)
274 allocate(this%condensed_data_int(num_int_prop_ + 2 + n_aero_ids * 13 + &
275 n_aero_jac_elem * 2))
276 allocate(this%condensed_data_real(num_real_prop_ + n_aero_ids + &
277 n_aero_jac_elem * 2))
278 this%condensed_data_int(:) = int(0, kind=
i_kind)
279 this%condensed_data_real(:) = real(0.0, kind=
dp)
282 this%num_env_params = num_env_param_
285 num_aero_phase_ = n_aero_ids
289 chem_spec_data%get_property_set(aero_spec_name, spec_props), &
290 "Missing aerosol species properties"//error_msg)
293 key_name =
"molecular weight [kg mol-1]"
294 call assert_msg(209812557, spec_props%get_real(key_name, mw_), &
295 "Missing property 'MW' for aerosol species"//error_msg)
299 conv_ =
const%univ_gas_const / mw_ * 1.0e6
302 key_name =
"aerosol-phase water"
304 this%property_set%get_string(key_name, water_name), &
305 "Missing aerosol-phase water"//error_msg)
309 phase_int_loc_(i_aero_id) = num_int_prop_+8*num_aero_phase_+3
310 phase_real_loc_(i_aero_id) = num_real_prop_+1
311 do i_aero_rep = 1,
size(aero_rep)
315 unique_spec_names = aero_rep(i_aero_rep)%val%unique_names( &
316 phase_name = phase_name,
spec_name = aero_spec_name, &
317 phase_is_at_surface = .true.)
318 unique_water_names = aero_rep(i_aero_rep)%val%unique_names( &
319 phase_name = phase_name,
spec_name = water_name, &
320 phase_is_at_surface = .true.)
323 phase_ids = aero_rep(i_aero_rep)%val%phase_ids(phase_name, is_at_surface=.true.)
328 do i_spec = 1,
size(unique_spec_names)
329 num_aero_phase_jac_elem_(i_aero_id) = &
330 aero_rep(i_aero_rep)%val%num_jac_elem(phase_ids(i_spec))
331 aero_spec_(i_aero_id) = &
332 aero_rep(i_aero_rep)%val%spec_state_id( &
333 unique_spec_names(i_spec)%string)
334 aero_water_(i_aero_id) = &
335 aero_rep(i_aero_rep)%val%spec_state_id( &
336 unique_water_names(i_spec)%string)
337 aero_phase_id_(i_aero_id) = phase_ids(i_spec)
338 aero_rep_id_(i_aero_id) = i_aero_rep
339 i_aero_id = i_aero_id + 1
340 if (i_aero_id .le. num_aero_phase_)
then
341 phase_int_loc_(i_aero_id) = phase_int_loc_(i_aero_id - 1) + 5 + &
342 2*num_aero_phase_jac_elem_(i_aero_id - 1)
343 phase_real_loc_(i_aero_id) = phase_real_loc_(i_aero_id - 1) + 1 + &
344 2*num_aero_phase_jac_elem_(i_aero_id - 1)
348 deallocate(unique_spec_names)
349 deallocate(unique_water_names)
354 gas_spec_ = chem_spec_data%gas_state_id(gas_spec_name)
358 "Missing gas-phase species"//error_msg)
362 chem_spec_data%get_property_set(gas_spec_name, spec_props), &
363 "Missing gas-phase species properties"//error_msg)
366 key_name =
"HLC(298K) [M Pa-1]"
367 call assert_msg(637925661, spec_props%get_real(key_name, a_), &
368 "Missing Henry's Law constant at 298 K"//error_msg)
370 key_name =
"HLC exp factor [K]"
371 call assert_msg(801365019, spec_props%get_real(key_name, c_), &
372 "Missing Henry's Law constant exponential factor"// &
383 if (spec_props%get_real(key_name, n_star))
then
385 delta_h_ = real(- 10.0d0*(n_star-1.0d0) + &
386 7.53d0*(n_star**(2.0d0/3.0d0)-1.0d0) - 1.0d0, kind=
dp)
388 delta_s_ = real(- 32.0d0*(n_star-1.0d0) + &
389 9.21d0*(n_star**(2.0d0/3.0d0)-1.0d0) - 1.3d0, kind=
dp)
391 delta_h_ = real(delta_h_ * 4184.0d0, kind=
dp)
392 delta_s_ = real(delta_s_ * 4.184d0, kind=
dp)
394 delta_h_ = real(0.0, kind=
dp)
395 delta_s_ = real(0.0, kind=
dp)
399 key_name =
"diffusion coeff [m2 s-1]"
400 call assert_msg(100205531, spec_props%get_real(key_name, diff_coeff_), &
401 "Missing diffusion coefficient for gas-phase species"//error_msg)
404 key_name =
"molecular weight [kg mol-1]"
405 call assert_msg(469582180, spec_props%get_real(key_name, temp_real), &
406 "Missing molecular weight for gas-phase species"//error_msg)
407 pre_c_avg_ = sqrt(8.0*
const%univ_gas_const/(
const%pi*temp_real))
410 tmp_size = phase_int_loc_(i_aero_id - 1) + 5 + &
411 2*num_aero_phase_jac_elem_(i_aero_id - 1) - 1
412 call assert_msg(881234422,
size(this%condensed_data_int) .eq. tmp_size, &
413 "int array size mismatch"//error_msg)
414 tmp_size = phase_real_loc_(i_aero_id - 1) + 1 + &
415 2*num_aero_phase_jac_elem_(i_aero_id - 1) - 1
416 call assert_msg(520767976,
size(this%condensed_data_real) .eq. tmp_size,&
417 "real array size mismatch"//error_msg)