1 !----------------------------------------------------------------
2 ! SOA formation from glyoxal with complex formulation including
3 ! * reversible formation (Kampf et al., ES&T, submitted)
4 ! * dark/ammonium-catalyzed formation (Noziere, J. Phys. Chem., 2009)
5 ! * OH chemistry (Ervens and Volkamer, ACP, 2010)
6 ! * surface uptake (Ervens and Volkamer, ACP, 2010)
7 ! Christoph Knote, ACD, NCAR, 20130326
8 !----------------------------------------------------------------
10 MODULE module_mosaic_gly
14 INTEGER, PARAMETER :: nspecs = 13, &
29 ! >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
30 LOGICAL, PARAMETER :: lfast_tau1 = .FALSE.
31 ! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
35 ! adapted from Numerical Recipes, Second Edition, p. 706-707
36 ! changes: added "h" (timestep) argument to DERIVS calls
37 SUBROUTINE rk4(y, dydx, n, x, h, yout, derivs)
40 REAL(kind=8) :: h, x, dydx(n), y(n), yout(n)
43 REAL(kind=8) :: h6, hh, xh, dym(nspecs), dyt(nspecs), yt(nspecs)
50 yt(i) = y(i) + hh * dydx(i)
53 CALL derivs(xh, yt, h, dyt)
56 yt(i) = y(i) + hh * dyt(i)
59 CALL derivs(xh, yt, h, dym)
62 yt(i) = y(i) + h * dym(i)
63 dym(i) = dyt(i) + dym(i)
66 CALL derivs(x+h, yt, h, dyt)
69 yout(i) = y(i) + h6 * ( dydx(i) + dyt(i) + 2. * dym(i))
76 ! Simple SOA formation from glyoxal as presented in
77 ! Washenfelder et al, JGR, 2011
78 SUBROUTINE glysoa_simple(dtchem)
80 USE module_data_mosaic_therm, ONLY: t_k, area_wet_a, gas, aer, &
81 jtotal, igly, iglysoa_sfc_a, nbin_a
85 REAL(kind=8), INTENT(IN) :: dtchem
86 REAL(kind=8) :: omega, gamma_gly, A, delta_gly, frac_A
89 ! mean molecular velocity of glyoxal (cm/s)
90 omega = 1.455e4 * sqrt(t_k / 58.0_8)
92 ! aerosol uptake coefficient for glyoxal (-)
93 ! Washenfelder et al., 2011:
95 ! 2 x 10^-4 (+/- 1 x 10^-4)
96 ! Volkamer et al., 2007
98 ! B. Ervens, pers. comm., 2010
101 ! get total aerosol surface area (cm^2 / cm^3)
104 A = A + area_wet_a(ibin)
107 ! no aerosol surface area - no uptake
109 ! first order uptake, Fuchs and Sutugin, 1971
110 ! dCg = 1/4 * gamma * A * |v_mol| * Cg * dt
111 delta_gly = 0.25 * gamma_gly * A * omega * gas(igly) * dtchem
113 ! avoid negative concentrations
114 delta_gly = MIN(gas(igly), delta_gly)
116 ! update partitioning
117 gas(igly) = gas(igly) - delta_gly
119 ! distribute onto bins according to fraction of surface area
121 frac_A = area_wet_a(ibin) / A
122 ! we take the "photochemical" glysoa aerosol as surrogate
123 aer(iglysoa_sfc_a, jtotal, ibin) = aer(iglysoa_sfc_a, jtotal, ibin) &
128 END SUBROUTINE glysoa_simple
130 SUBROUTINE glysoa_complex_derivs(x, y, dt, dydx)
132 USE module_data_mosaic_therm, ONLY: conv1a, & ! converts q/mol(air) to nq/m^3 (q = mol or g)
133 p_atm, & ! pressure (atm)
134 t_k ! temperature (K)
136 REAL(kind=8), INTENT(IN) :: x, y(nspecs), dt
137 REAL(kind=8), INTENT(OUT) :: dydx(nspecs)
139 REAL(kind=8), PARAMETER :: eps = 1.e-16 , & ! minimum allowed concentration in reservoirs
140 Kh_water = 4.19e5 , & ! effective Henry's law constant of glyoxal in pure water (M atm-1) (Ip et al., GRL, 2011)
141 Kh_oh = 25.0, & ! Henry's law constant of OH in pure water (M atm-1) (Klaening et al., 1985)
142 k_oh = 1.1e9 ! OH reaction rate (mol L-1 s-1) (Ervens and Volkamer, ACP, 2010)
144 REAL(kind=8) :: gly_g_atm, & ! gas-phase concentration in atm
145 f_A1, & ! fraction of glyoxal in reservoir 1
146 tau1, & ! characteristical timescale reservoir 1
147 tau2, & ! characteristical timescale reservoir 2
148 oh_g_atm, & ! gas-phase OH concentration in atm
149 oh_a, & ! liquid-phase OH concentration
150 c_tot, & ! total concentration of dissolved salts (M)
151 Kh_eq, & ! Henry's law constant at equilibrium (M atm-1)
152 gly_ptot_eq,& ! total glyoxal concentration (reservoirs 1 and 2) at equilibrium
153 gly_r1_eq, & ! glyoxal concentration (reservoir 1) at equilibrium
154 gly_r2_eq, & ! glyoxal concentration (reservoir 2) at equilibrium
155 anh4, & ! ammonium-ion activity (constrained)
156 kII, kI, & ! second and first order dark rate constants
157 omega ! mean molecular velocity of glyoxal (cm/s)
160 REAL(kind=8) :: dg_r1, & ! from gas-phase to reservoir 1
161 dr1_r2, & ! reservoir 1 to reservoir 2 (or vice versa)
162 dr1_nh4, & ! reservoir 1 to nh4
163 dr1_oh, & ! reservoir 1 to oh
164 dg_sfc ! gas-phase to surface uptake
166 REAL(kind=8) :: accloss, & ! acc. loss
167 scaling ! tendency scaling
175 ! convert gas-phase glyoxal concentration
176 ! -------------------------------------------------------------
178 gly_g_atm = y(igly_g) / conv1a ! mole / mole
179 gly_g_atm = gly_g_atm * p_atm ! atm
181 ! with A2/A1 = Kolig, and Kolig is 1
185 IF ( y(ic_as) + y(ic_an) .GT. 12.0 ) THEN
186 ! with A2/A1 = Kolig, and Kolig is 0.5
192 ! Kampff et al., ES&T, 2013, submitted: kinetic limitation of
193 ! salting-in for SO4 concentrations > 12 M.
194 c_tot = MIN( 12.0, y(ic_as) + y(ic_an) )
196 ! effective Henry's law constant including salting-in effect (Kampff et al.)
198 ! derived from eqn. 3 in Kampff et al., -0.24 is "salting-in" constant
199 Kh_eq = Kh_water / 10**(-0.24D0 * c_tot) ! mol L-1 atm-1 == mol kg-1 atm-1
201 ! gly_g_atm in atm, Kh_eq in mol kg-1 atm-1, water in kg m-3 air
202 ! total glyoxal concentration (reservoirs 1 and 2) at equilibrium
203 gly_ptot_eq = gly_g_atm * Kh_eq * y(iwater) * 1e9 ! nmol / m3 air
205 gly_r1_eq = gly_ptot_eq * f_A1 ! in reservoir 1 at equilibrium
206 gly_r2_eq = gly_ptot_eq * (1.0 - f_A1) ! in reservoir 2 at equilibrium
208 ! process tendencies in nmol m-3 s-1
209 ! from gas-phase to reservoir 1
210 ! >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
211 IF (.NOT. lfast_tau1) THEN
212 ! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
213 dg_r1 = (1.0/tau1) * (gly_r1_eq - y(igly_r1))
214 ! >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
216 ! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
217 ! reservoir 1 to reservoir 2
218 dr1_r2 = (1.0/tau2) * (gly_r2_eq - y(igly_r2))
220 ! OH reaction (Ervens and Volkamer, Atm. Chem. Phys., 2010)
221 ! -------------------------------------------------------------
223 oh_g_atm = y(ioh_g) / conv1a ! now its in mole / mole
224 oh_g_atm = oh_g_atm * p_atm ! partial pressure (atm)
225 oh_a = oh_g_atm * Kh_oh * y(iwater) * 1e9 ! nmol / m3 air
227 dr1_oh = k_oh * y(igly_r1) * oh_a ! nmole m-3 s-1
229 ! dark pathway (Noziere et al., J. Phys. Chem., 2009)
230 ! -------------------------------------------------------------
232 ! second-order rate constant (mol-1 kg s-1):
233 anh4 = MAX( 0.0, MIN( 4.0, y(ia_nh4)) ) ! restrict to measured range
234 kII = 2.e-10 * exp(1.5 * anh4) * exp(2.5 * y(iph))
236 ! dark process uses reservoir 1
237 kI = kII * y(igly_r1) / y(iwater) * 1e-9 ! s-1
239 dr1_nh4 = kI * y(igly_r1) ! nmol m-3 s-1
241 ! surface uptake (Ervens and Volkamer, ACP, 2010)
242 ! -------------------------------------------------------------
244 ! mean molecular velocity of glyoxal (cm/s)
245 omega = 1.455e4 * sqrt(t_k / 58.0D0)
247 ! first order uptake, Fuchs and Sutugin, 1971
248 ! dCg = 1/4 * gamma * A * |v_mol| * Cg * dt,
249 ! gamma downscaled to 1.0e-3 according to Waxman et al., 2013
250 dg_sfc = 0.25D0 * 1.e-3 * y(iarea) * omega * y(igly_g)
252 ! Numerical integration
253 ! -------------------------------------------------------------
255 ! check for undershoots, avoid negative concentrations
256 ! while ensuring we don't loose mass
257 IF ( y(igly_g) < eps ) THEN
261 accloss = (dg_r1 + dg_sfc) * dt
262 IF ( ( y(igly_g) - accloss ) < eps ) THEN
263 scaling = y(igly_g) / (accloss + eps)
264 dg_r1 = dg_r1 * scaling
265 dg_sfc = dg_sfc * scaling
269 IF ( y(igly_r1) < eps ) THEN
274 accloss = (-dg_r1 + dr1_r2 + dr1_nh4 + dr1_oh) * dt
275 IF ( ( y(igly_r1) - accloss ) < eps) THEN
276 scaling = y(igly_r1) / (accloss + eps)
277 dr1_r2 = dr1_r2 * scaling
278 dr1_nh4 = dr1_nh4 * scaling
279 dr1_oh = dr1_oh * scaling
283 IF ( y(igly_r2) < eps ) THEN
284 dr1_r2 = MAX( 0.0, dr1_r2 )
286 accloss = -dr1_r2 * dt
287 IF ( ( y(igly_r2) - accloss ) < eps ) THEN
288 scaling = y(igly_r2) / (accloss + eps)
289 dr1_r2 = dr1_r2 * scaling
294 dydx(igly_g) = -dg_r1 -dg_sfc
295 dydx(igly_r1) = dg_r1 -dr1_r2 -dr1_nh4 -dr1_oh
296 dydx(igly_r2) = dr1_r2
297 dydx(igly_nh4) = +dr1_nh4
298 dydx(igly_oh) = dr1_oh
299 dydx(igly_sfc) = dg_sfc
301 END SUBROUTINE glysoa_complex_derivs
303 SUBROUTINE glysoa_complex(dtchem)
305 USE module_data_mosaic_therm, ONLY : jaerosolstate, all_liquid, mixed, &
306 jtotal, jliquid, nbin_a, &
307 area_wet_a, gas, water_a, aer, mc, &
308 ph, a_nh4, c_as, c_an, &
310 iglysoa_r1_a, iglysoa_r2_a, &
312 iglysoa_nh4_a, iglysoa_sfc_a, &
313 iso4_a, ino3_a, inh4_a, jc_h
315 ! >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
316 USE module_data_mosaic_therm, ONLY: conv1a, & ! converts q/mol(air) to nq/m^3 (q = mol or g)
317 p_atm ! pressure (atm)
318 ! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
320 REAL(kind=8), INTENT(IN) :: dtchem
322 REAL(kind=8) :: A, conv, y(nspecs), yout(nspecs), &
325 INTEGER :: i, ii, nbin_proc, bin_proc(nbin_a)
327 ! >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
328 REAL(kind=8), PARAMETER :: Kh_water = 4.19e5 ! effective Henry's law constant of glyoxal in pure water (M atm-1) (Ip et al., GRL, 2011)
330 REAL(kind=8) :: gly_g_atm, & ! gas-phase concentration in atm
331 f_A1, & ! fraction of glyoxal in reservoir 1
332 c_tot, & ! total concentration of dissolved salts (M)
333 Kh_eq, & ! Henry's law constant at equilibrium (M atm-1)
334 gly_ptot_eq,& ! total glyoxal concentration (reservoirs 1 and 2) at equilibrium
335 gly_r1_eq, & ! glyoxal concentration (reservoir 1) at equilibrium
336 deltagly ! delta to bring r1 in equilibrium
337 ! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
340 ! liquid / mixed phase bins available?
341 ! ---------------------------------------------------------------
343 bin_proc(:) = -1 ! see which bins are either mixed,
344 ! or all_liquid (only these are to be processed)
346 IF (jaerosolstate(i) == all_liquid .OR. &
347 jaerosolstate(i) == mixed) THEN
348 nbin_proc = nbin_proc + 1
349 bin_proc(nbin_proc) = i
352 IF (nbin_proc == 0) RETURN
354 ! aerosol surface area available?
355 ! ---------------------------------------------------------------
357 A = 0.0 ! total aerosol surface area (cm^2 / cm^3)
360 A = A + area_wet_a(ii)
364 ! clean diagnostic arrays
365 ! ---------------------------------------------------------------
367 ph(:) = -9999.0 ! aerosol pH
368 a_nh4(:) = 0.0 ! ammonium ion activity (M, mol/m^3)
369 c_as(:) = 0.0 ! ammonium sulfate concentration (M, mol/kg)
370 c_an(:) = 0.0 ! ammonium nitrate concentration (M, mol/kg)
373 ! ---------------------------------------------------------------
375 ! gly_g will be re-used for all bins
376 gly_g = gas(igly) ! nmol / m3
382 ! load concentrations array
383 ! -------------------------------------------------------------
385 conv = 1.e-9 / water_a(ii) ! nmol/m^3 (air) -> mol/kg (water)
391 y(igly_r1) = aer(iglysoa_r1_a,jtotal,ii)
392 y(igly_r2) = aer(iglysoa_r2_a,jtotal,ii)
393 y(igly_nh4) = aer(iglysoa_nh4_a,jtotal,ii)
394 y(igly_sfc) = aer(iglysoa_sfc_a,jtotal,ii)
395 y(igly_oh) = aer(iglysoa_oh_a,jtotal,ii)
397 y(ic_as) = aer(iso4_a,jliquid,ii) * conv ! assume we can only form (NH4)2SO4
398 y(ic_an) = aer(ino3_a,jliquid,ii) * conv ! assume we can only form NH4NO3
399 y(ia_nh4) = aer(inh4_a,jliquid,ii) * conv ! set activity == concentration
401 y(iph) = MIN(14.0D0, MAX(0.0D0, -log10(mc(jc_h,ii)) ))
403 y(iwater) = water_a(ii) ! kg m-3
405 y(ioh_g) = gas(iho) ! nmol m-3
407 y(iarea) = area_wet_a(ii) ! cm^2 / cm^3
409 ! >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
411 ! instantaneous Henry's law equilibrium
412 ! for fast partitioning (in case characteristic timescale
413 ! of Kampf et al. is only artefact...)
414 gly_g_atm = y(igly_g) / conv1a ! mole / mole
415 gly_g_atm = gly_g_atm * p_atm ! atm
417 ! with A2/A1 = Kolig, and Kolig is 1
419 IF ( y(ic_as) + y(ic_an) .GT. 12.0 ) THEN
423 ! Kampff et al., ES&T, 2013, submitted: kinetic limitation of
424 ! salting-in for SO4 concentrations > 12 M.
425 c_tot = MIN( 12.0, y(ic_as) + y(ic_an) )
427 ! effective Henry's law constant including salting-in effect (Kampff et al.)
429 ! derived from eqn. 3 in Kampff et al., -0.24 is "salting-in" constant
430 Kh_eq = Kh_water / 10**(-0.24D0 * c_tot) ! mol L-1 atm-1 == mol kg-1 atm-1
432 ! gly_g_atm in atm, Kh_eq in mol kg-1 atm-1, water in kg m-3 air
433 ! total glyoxal concentration (reservoirs 1 and 2) at equilibrium
434 gly_ptot_eq = gly_g_atm * Kh_eq * y(iwater) * 1e9 ! nmol / m3 air
436 gly_r1_eq = gly_ptot_eq * f_A1 ! in reservoir 1 at equilibrium
438 deltagly = gly_r1_eq - y(igly_r1)
440 y(igly_g) = y(igly_g) - deltagly
441 y(igly_r1) = y(igly_r1) + deltagly
443 IF (y(igly_g) < 0.0 .OR. y(igly_r1) < 0.0) THEN
444 WRITE(*,*) "THIS IS NOT RIGHT: ",y(igly_g), y(igly_r1),deltagly
447 ! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
450 ! -------------------------------------------------------------
451 CALL glysoa_complex_derivs(1._8, y, dtchem, dydx)
452 CALL rk4(y, dydx, nspecs, 1._8, dtchem, yout, glysoa_complex_derivs)
454 ! update transported fields
455 aer(iglysoa_r1_a,jtotal,ii) = yout(igly_r1)
456 aer(iglysoa_r2_a,jtotal,ii) = yout(igly_r2)
457 aer(iglysoa_nh4_a,jtotal,ii) = yout(igly_nh4)
458 aer(iglysoa_sfc_a,jtotal,ii) = yout(igly_sfc)
459 aer(iglysoa_oh_a,jtotal,ii) = yout(igly_oh)
461 ! do not put gas-phase glyoxal back yet, as we will use it
462 ! for the next bin as well...
466 c_as(ii) = yout(ic_as)
467 c_an(ii) = yout(ic_an)
469 a_nh4(ii) = yout(ia_nh4)
473 ! update gas-phase reservoir, after all bins have been treated.
476 END SUBROUTINE glysoa_complex
479 END MODULE module_mosaic_gly