181 subroutine initialize(this, chem_spec_data, aero_phase, aero_rep, n_cells)
192 integer(kind=i_kind),
intent(in) :: n_cells
194 type(
property_t),
pointer :: spec_props, b_params
195 character(len=:),
allocatable :: key_name, gas_spec_name, aero_spec_name
196 character(len=:),
allocatable :: phase_name, act_name, error_msg
197 integer(kind=i_kind) :: i_spec, i_aero_rep, n_aero_ids, i_aero_id
198 integer(kind=i_kind) :: i_phase, n_aero_jac_elem, tmp_size
199 type(
string_t),
allocatable :: unique_spec_names(:), unique_act_names(:)
200 integer(kind=i_kind),
allocatable :: phase_ids(:)
201 real(kind=
dp) :: temp_real, n_star
202 logical :: has_act_coeff
205 if (.not.
associated(this%property_set))
call die_msg(382913491, &
206 "Missing property set needed to initialize reaction")
209 key_name =
"gas-phase species"
211 this%property_set%get_string(key_name, gas_spec_name), &
212 "Missing gas-phase species in SIMPOL.1 phase transfer reaction")
215 key_name =
"aerosol phase"
217 this%property_set%get_string(key_name, phase_name), &
218 "Missing aerosol phase in SIMPOL.1 phase-transfer reaction")
221 key_name =
"aerosol-phase species"
223 this%property_set%get_string(key_name, aero_spec_name), &
224 "Missing aerosol-phase species in SIMPOL.1 phase-transfer "// &
228 error_msg =
" for SIMPOL.1 phase transfer of gas species '"// &
229 gas_spec_name//
"' to aerosol-phase species '"// &
230 aero_spec_name//
"' in phase '"//phase_name//
"'"
233 key_name =
"aerosol-phase activity coefficient"
234 has_act_coeff = this%property_set%get_string(key_name, act_name)
237 call assert_msg(260518827,
associated(aero_rep), &
238 "Missing aerosol representation"//error_msg)
239 call assert_msg(590304021,
size(aero_rep).gt.0, &
240 "Missing aerosol representation"//error_msg)
245 do i_aero_rep = 1,
size(aero_rep)
249 unique_spec_names = aero_rep(i_aero_rep)%val%unique_names( &
250 phase_name = phase_name,
spec_name = aero_spec_name, &
251 phase_is_at_surface = .true.)
254 if (.not.
allocated(unique_spec_names)) cycle
257 n_aero_ids = n_aero_ids +
size(unique_spec_names)
261 phase_ids = aero_rep(i_aero_rep)%val%phase_ids(phase_name, is_at_surface=.true.)
262 do i_phase = 1,
size(phase_ids)
263 n_aero_jac_elem = n_aero_jac_elem + &
264 aero_rep(i_aero_rep)%val%num_jac_elem(phase_ids(i_phase))
267 deallocate(unique_spec_names)
272 "Aerosol species not found"//error_msg)
275 allocate(this%condensed_data_int(num_int_prop_ + 2 + n_aero_ids * 13 + &
276 n_aero_jac_elem * 2))
277 allocate(this%condensed_data_real(num_real_prop_ + n_aero_jac_elem * 4))
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 properties"//error_msg)
293 key_name =
"molecular weight [kg mol-1]"
294 call assert_msg(839930958, spec_props%get_real(key_name, mw_), &
295 "Missing property 'MW'"//error_msg)
301 conv_ =
const%univ_gas_const / mw_ * 1.0e6
305 phase_int_loc_(i_aero_id) = num_int_prop_+12*num_aero_phase_+3
306 phase_real_loc_(i_aero_id) = num_real_prop_+1
307 do i_aero_rep = 1,
size(aero_rep)
311 unique_spec_names = aero_rep(i_aero_rep)%val%unique_names( &
312 phase_name = phase_name,
spec_name = aero_spec_name, &
313 phase_is_at_surface = .true.)
316 if (has_act_coeff)
then
317 unique_act_names = aero_rep(i_aero_rep)%val%unique_names( &
318 phase_name = phase_name,
spec_name = act_name, &
319 phase_is_at_surface = .true.)
320 call assert_msg(236251734,
size(unique_act_names).eq. &
321 size(unique_spec_names), &
322 "Mismatch of SIMPOL species and activity coeffs"// &
327 phase_ids = aero_rep(i_aero_rep)%val%phase_ids(phase_name, is_at_surface=.true.)
331 do i_spec = 1,
size(unique_spec_names)
332 num_aero_phase_jac_elem_(i_aero_id) = &
333 aero_rep(i_aero_rep)%val%num_jac_elem(phase_ids(i_spec))
334 aero_spec_(i_aero_id) = &
335 aero_rep(i_aero_rep)%val%spec_state_id( &
336 unique_spec_names(i_spec)%string)
337 if (has_act_coeff)
then
338 aero_act_id_(i_aero_id) = &
339 aero_rep(i_aero_rep)%val%spec_state_id( &
340 unique_act_names(i_spec)%string)
342 aero_act_id_(i_aero_id) = -1
344 aero_phase_id_(i_aero_id) = phase_ids(i_spec)
345 aero_rep_id_(i_aero_id) = i_aero_rep
346 i_aero_id = i_aero_id + 1
347 if (i_aero_id .le. num_aero_phase_)
then
348 phase_int_loc_(i_aero_id) = phase_int_loc_(i_aero_id - 1) + 1 + &
349 2*num_aero_phase_jac_elem_(i_aero_id - 1)
350 phase_real_loc_(i_aero_id) = phase_real_loc_(i_aero_id - 1) + &
351 4*num_aero_phase_jac_elem_(i_aero_id - 1)
355 deallocate(unique_spec_names)
362 this%property_set%get_property_t(key_name, b_params), &
363 "Missing 'B' parameters"//error_msg)
364 call assert_msg(654885723, b_params%size().eq.4, &
365 "Incorrect number of 'B' parameters"//error_msg)
366 call b_params%iter_reset()
367 call assert_msg(694024883, b_params%get_real(val = b1_), &
368 "Got non-real 'B1' parameter"//error_msg)
369 call b_params%iter_next()
370 call assert_msg(231316411, b_params%get_real(val = b2_), &
371 "Got non-real 'B2' parameter"//error_msg)
372 call b_params%iter_next()
373 call assert_msg(126167907, b_params%get_real(val = b3_), &
374 "Got non-real 'B3' parameter"//error_msg)
375 call b_params%iter_next()
376 call assert_msg(573535753, b_params%get_real(val = b4_), &
377 "Got non-real 'B4' parameter"//error_msg)
380 gas_spec_ = chem_spec_data%gas_state_id(gas_spec_name)
384 "Missing gas-phase species"//error_msg)
388 chem_spec_data%get_property_set(gas_spec_name, spec_props), &
389 "Missing properties for gas-phase species"//error_msg)
399 if (spec_props%get_real(key_name, n_star))
then
401 delta_h_ = real(- 10.0d0*(n_star-1.0d0) + &
402 7.53d0*(n_star**(2.0d0/3.0d0)-1.0d0) - 1.0d0, kind=
dp)
404 delta_s_ = real(- 32.0d0*(n_star-1.0d0) + &
405 9.21d0*(n_star**(2.0d0/3.0d0)-1.0d0) - 1.3d0, kind=
dp)
407 delta_h_ = real(delta_h_ * 4184.0d0, kind=
dp)
408 delta_s_ = real(delta_s_ * 4.184d0, kind=
dp)
410 delta_h_ = real(0.0, kind=
dp)
411 delta_s_ = real(0.0, kind=
dp)
415 key_name =
"diffusion coeff [m2 s-1]"
416 call assert_msg(948176709, spec_props%get_real(key_name, diff_coeff_), &
417 "Missing diffusion coefficient"//error_msg)
420 key_name =
"molecular weight [kg mol-1]"
421 call assert_msg(272813400, spec_props%get_real(key_name, temp_real), &
422 "Missing molecular weight"//error_msg)
423 pre_c_avg_ = sqrt(8.0*
const%univ_gas_const/(
const%pi*temp_real))
426 tmp_size = phase_int_loc_(i_aero_id - 1) + 1 + &
427 2*num_aero_phase_jac_elem_(i_aero_id - 1) - 1
428 call assert_msg(625802519,
size(this%condensed_data_int) .eq. tmp_size, &
429 "int array size mismatch"//error_msg)
430 tmp_size = phase_real_loc_(i_aero_id - 1) + &
431 4*num_aero_phase_jac_elem_(i_aero_id - 1) - 1
432 call assert_msg(391089510,
size(this%condensed_data_real) .eq. tmp_size, &
433 "real array size mismatch"//error_msg)