144 subroutine initialize(this, chem_spec_data, aero_phase, aero_rep, n_cells)
155 integer(kind=i_kind),
intent(in) :: n_cells
157 type(
property_t),
pointer :: products, spec_props
158 character(len=:),
allocatable :: key_name, reactant_name, product_name, &
159 phase_name, error_msg
160 integer :: i_spec, n_aero_jac_elem, n_aero_phase, i_phase, i_aero_rep, &
162 integer,
allocatable :: phase_ids(:)
163 real(kind=
dp) :: temp_real
165 if (.not.
associated(this%property_set))
call die_msg(244070915, &
166 "Missing property set needed to initialize surface reaction.")
168 key_name =
"gas-phase reactant"
170 this%property_set%get_string(key_name, reactant_name), &
171 "Missing gas-phase reactant name in surface reaction.")
173 key_name =
"gas-phase products"
175 this%property_set%get_property_t(key_name, products), &
176 "Missing gas-phase products for surface reaction.")
178 key_name =
"aerosol phase"
180 this%property_set%get_string(key_name, phase_name), &
181 "Missing aerosol phase in surface reaction.")
183 error_msg =
" for surface reaction of gas-phase species '"// &
184 reactant_name//
"' on aerosol phase '"//phase_name//
"'"
186 call assert(362731302,
associated(aero_rep))
187 call assert_msg(187310091,
size(aero_rep) .gt. 0, &
188 "Missing aerosol representation"//error_msg)
194 do i_aero_rep = 1,
size(aero_rep)
195 phase_ids = aero_rep(i_aero_rep)%val%phase_ids(phase_name, is_at_surface=.true.)
196 n_aero_phase = n_aero_phase +
size(phase_ids)
197 do i_phase = 1,
size(phase_ids)
198 n_aero_jac_elem = n_aero_jac_elem + &
199 aero_rep(i_aero_rep)%val%num_jac_elem(phase_ids(i_phase))
203 allocate(this%condensed_data_int(num_int_prop_ &
204 + 2 + 3 * products%size() &
207 + (1 + products%size()) * n_aero_jac_elem))
208 allocate(this%condensed_data_real(num_real_prop_ &
210 + 2 * n_aero_jac_elem))
211 this%condensed_data_int(:) = 0_i_kind
212 this%condensed_data_real(:) = 0.0_dp
215 this%num_env_params = num_env_param_
217 num_aero_phase_ = n_aero_phase
219 key_name =
"reaction probability"
221 this%property_set%get_real(key_name, gamma_), &
222 "Missing reaction probability for"//error_msg)
225 react_id_ = chem_spec_data%gas_state_id(reactant_name)
226 call assert_msg(908581300, react_id_ .gt. 0, &
227 "Missing gas-phase species"//error_msg)
229 chem_spec_data%get_property_set(reactant_name, spec_props), &
230 "Missing gas-phase species properties"//error_msg)
231 key_name =
"molecular weight [kg mol-1]"
232 call assert_msg(110823327, spec_props%get_real(key_name, mw_), &
233 "Missing molecular weight for gas-phase reactant"//error_msg)
234 key_name =
"diffusion coeff [m2 s-1]"
235 call assert_msg(860403969, spec_props%get_real(key_name, diff_coeff_), &
236 "Missing diffusion coefficient for gas-phase reactant"// &
240 num_prod_ = products%size()
241 call products%iter_reset()
243 do while (products%get_key(product_name))
244 prod_id_(i_spec) = chem_spec_data%gas_state_id(product_name)
245 call assert_msg(863839516, prod_id_(i_spec) .gt. 0, &
246 "Missing surface reaction product: "//product_name)
247 call assert(237691686, products%get_property_t(val=spec_props))
248 yield_(i_spec) = 1.0_dp
250 if (spec_props%get_real(key_name, temp_real)) yield_(i_spec) = temp_real
251 call products%iter_next()
257 phase_int_loc_(i_aero_id) = num_int_prop_ + 2 + 3 * num_prod_ + &
258 2 * num_aero_phase_ + 1
259 phase_real_loc_(i_aero_id) = num_real_prop_ + num_prod_ + 1
260 do i_aero_rep = 1,
size(aero_rep)
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 num_aero_phase_jac_elem_(i_aero_id) = &
264 aero_rep(i_aero_rep)%val%num_jac_elem(phase_ids(i_phase))
265 aero_phase_id_(i_aero_id) = phase_ids(i_phase)
266 aero_rep_id_(i_aero_id) = i_aero_rep
267 i_aero_id = i_aero_id + 1
268 if (i_aero_id .le. num_aero_phase_)
then
269 phase_int_loc_(i_aero_id) = phase_int_loc_(i_aero_id - 1) + 3 + &
271 num_aero_phase_jac_elem_(i_aero_id - 1)
272 phase_real_loc_(i_aero_id) = phase_real_loc_(i_aero_id - 1) + &
273 2 * num_aero_phase_jac_elem_(i_aero_id - 1)