Line data Source code
1 : module mo_usrrxt
2 :
3 : use shr_kind_mod, only : r8 => shr_kind_r8
4 : use cam_logfile, only : iulog
5 : use ppgrid, only : pver, pcols
6 : use cam_abortutils, only : endrun
7 :
8 : implicit none
9 :
10 : private
11 : public :: usrrxt, usrrxt_inti, usrrxt_hrates
12 :
13 : save
14 :
15 : integer :: usr_O_O2_ndx
16 : integer :: usr_HO2_HO2_ndx
17 : integer :: usr_N2O5_M_ndx
18 : integer :: usr_HNO3_OH_ndx
19 : integer :: usr_HO2NO2_M_ndx
20 : integer :: usr_N2O5_aer_ndx
21 : integer :: usr_NO3_aer_ndx
22 : integer :: usr_NO2_aer_ndx
23 : integer :: usr_CO_OH_ndx
24 : integer :: usr_CO_OH_a_ndx
25 : integer :: usr_CO_OH_b_ndx
26 : integer :: usr_PAN_M_ndx
27 : integer :: usr_CH3COCH3_OH_ndx
28 : integer :: usr_MCO3_NO2_ndx
29 : integer :: usr_MPAN_M_ndx
30 : integer :: usr_XOOH_OH_ndx
31 : integer :: usr_SO2_OH_ndx
32 : integer :: usr_DMS_OH_ndx
33 : integer :: usr_HO2_aer_ndx
34 : integer :: usr_GLYOXAL_aer_ndx
35 : integer :: usr_N_O2_ndx
36 : integer :: usr_N2D_O2_ndx
37 : integer :: usr_N2D_e_ndx
38 :
39 : integer :: tag_NO2_NO3_ndx
40 : integer :: tag_NO2_OH_ndx
41 : integer :: tag_NO2_HO2_ndx
42 : integer :: tag_C2H4_OH_ndx
43 : integer :: tag_C3H6_OH_ndx
44 : integer :: tag_CH3CO3_NO2_ndx
45 :
46 : !lke-TS1
47 : integer :: usr_PBZNIT_M_ndx
48 : integer :: tag_ACBZO2_NO2_ndx
49 : integer :: usr_ISOPNITA_aer_ndx
50 : integer :: usr_ISOPNITB_aer_ndx
51 : integer :: usr_ONITR_aer_ndx
52 : integer :: usr_HONITR_aer_ndx
53 : integer :: usr_TERPNIT_aer_ndx
54 : integer :: usr_NTERPOOH_aer_ndx
55 : integer :: usr_NC4CHO_aer_ndx
56 : integer :: usr_NC4CH2OH_aer_ndx
57 : !TS2
58 : integer :: usr_ISOPZD1O2_ndx
59 : integer :: usr_ISOPZD4O2_ndx
60 : integer :: usr_ISOPFDN_aer_ndx
61 : integer :: usr_ISOPFNP_aer_ndx
62 : integer :: usr_ISOPN2B_aer_ndx
63 : integer :: usr_ISOPN1D_aer_ndx
64 : integer :: usr_ISOPN4D_aer_ndx
65 : integer :: usr_INOOHD_aer_ndx
66 : integer :: usr_INHEB_aer_ndx
67 : integer :: usr_INHED_aer_ndx
68 : integer :: usr_MACRN_aer_ndx
69 : integer :: usr_ISOPHFP_aer_ndx
70 : integer :: usr_IEPOX_aer_ndx
71 : integer :: usr_DHPMPAL_aer_ndx
72 : integer :: usr_ICHE_aer_ndx
73 : integer :: usr_ISOPFNC_aer_ndx
74 : integer :: usr_ISOPFDNC_aer_ndx
75 : integer :: usr_ISOPB1O2_NOn_ndx
76 : integer :: usr_ISOPB1O2_NOa_ndx
77 : integer :: usr_ISOPB4O2_NOn_ndx
78 : integer :: usr_ISOPB4O2_NOa_ndx
79 : integer :: usr_ISOPED1O2_NOn_ndx
80 : integer :: usr_ISOPED1O2_NOa_ndx
81 : integer :: usr_ISOPED4O2_NOn_ndx
82 : integer :: usr_ISOPED4O2_NOa_ndx
83 : integer :: usr_ISOPZD1O2_NOn_ndx
84 : integer :: usr_ISOPZD1O2_NOa_ndx
85 : integer :: usr_ISOPZD4O2_NOn_ndx
86 : integer :: usr_ISOPZD4O2_NOa_ndx
87 : integer :: usr_ISOPNO3_NOn_ndx
88 : integer :: usr_ISOPNO3_NOa_ndx
89 : integer :: usr_MVKO2_NOn_ndx
90 : integer :: usr_MVKO2_NOa_ndx
91 : integer :: usr_MACRO2_NOn_ndx
92 : integer :: usr_MACRO2_NOa_ndx
93 : integer :: usr_IEPOXOO_NOn_ndx
94 : integer :: usr_IEPOXOO_NOa_ndx
95 : integer :: usr_ISOPN1DO2_NOn_ndx
96 : integer :: usr_ISOPN1DO2_NOa_ndx
97 : integer :: usr_ISOPN2BO2_NOn_ndx
98 : integer :: usr_ISOPN2BO2_NOa_ndx
99 : integer :: usr_ISOPN3BO2_NOn_ndx
100 : integer :: usr_ISOPN3BO2_NOa_ndx
101 : integer :: usr_ISOPN4DO2_NOn_ndx
102 : integer :: usr_ISOPN4DO2_NOa_ndx
103 : integer :: usr_ISOPNBNO3O2_NOn_ndx
104 : integer :: usr_ISOPNBNO3O2_NOa_ndx
105 : integer :: usr_ISOPNOOHBO2_NOn_ndx
106 : integer :: usr_ISOPNOOHBO2_NOa_ndx
107 : integer :: usr_ISOPNOOHDO2_NOn_ndx
108 : integer :: usr_ISOPNOOHDO2_NOa_ndx
109 : integer :: usr_NC4CHOO2_NOn_ndx
110 : integer :: usr_NC4CHOO2_NOa_ndx
111 : integer :: tag_MCO3_NO2_ndx
112 : integer :: tag_TERPACO3_NO2_ndx
113 : integer :: usr_TERPAPAN_M_ndx
114 : integer :: tag_TERPA2CO3_NO2_ndx
115 : integer :: usr_TERPA2PAN_M_ndx
116 : integer :: tag_TERPA3CO3_NO2_ndx
117 : integer :: usr_TERPA3PAN_M_ndx
118 : integer :: usr_TERPNT_aer_ndx
119 : integer :: usr_TERPNT1_aer_ndx
120 : integer :: usr_TERPNPT_aer_ndx
121 : integer :: usr_TERPNPT1_aer_ndx
122 : integer :: usr_TERPFDN_aer_ndx
123 : integer :: usr_SQTN_aer_ndx
124 : integer :: usr_TERPHFN_aer_ndx
125 : integer :: usr_TERPDHDP_aer_ndx
126 : integer :: usr_TERPACID_aer_ndx
127 : !
128 : integer :: usr_OA_O2_NDX
129 : integer :: usr_XNO2NO3_M_ndx
130 : integer :: usr_NO2XNO3_M_ndx
131 : integer :: usr_XHNO3_OH_ndx
132 : integer :: usr_XHO2NO2_M_ndx
133 : integer :: usr_XNO2NO3_aer_ndx
134 : integer :: usr_NO2XNO3_aer_ndx
135 : integer :: usr_XNO3_aer_ndx
136 : integer :: usr_XNO2_aer_ndx
137 : integer :: usr_XPAN_M_ndx
138 : integer :: usr_XMPAN_M_ndx
139 : integer :: usr_MCO3_XNO2_ndx
140 :
141 : integer :: usr_C2O3_NO2_ndx
142 : integer :: usr_C2H4_OH_ndx
143 : integer :: usr_XO2N_HO2_ndx
144 : integer :: usr_C2O3_XNO2_ndx
145 :
146 : integer :: tag_XO2N_NO_ndx
147 : integer :: tag_XO2_HO2_ndx
148 : integer :: tag_XO2_NO_ndx
149 :
150 : integer :: usr_O_O_ndx
151 : integer :: usr_CL2O2_M_ndx
152 : integer :: usr_SO3_H2O_ndx
153 : integer :: tag_CLO_CLO_M_ndx
154 :
155 : integer :: ion1_ndx, ion2_ndx, ion3_ndx, ion11_ndx
156 : integer :: elec1_ndx, elec2_ndx, elec3_ndx
157 : integer :: elec4_ndx, elec5_ndx, elec6_ndx
158 : integer :: het1_ndx
159 :
160 : integer, parameter :: nean = 3
161 : integer :: ean_ndx(nean)
162 : integer, parameter :: nrpe = 5
163 : integer :: rpe_ndx(nrpe)
164 : integer, parameter :: npir = 16
165 : integer :: pir_ndx(npir)
166 : integer, parameter :: nedn = 2
167 : integer :: edn_ndx(nedn)
168 : integer, parameter :: nnir = 13
169 : integer :: nir_ndx(nnir)
170 : integer, parameter :: niira = 112
171 : integer :: iira_ndx(niira)
172 : integer, parameter :: niirb = 14
173 : integer :: iirb_ndx(niirb)
174 :
175 : integer :: usr_clm_h2o_m_ndx, usr_clm_hcl_m_ndx
176 : integer :: usr_oh_co_ndx, het_no2_h2o_ndx, usr_oh_dms_ndx, aq_so2_h2o2_ndx, aq_so2_o3_ndx
177 :
178 : integer :: h2o_ndx
179 : !
180 : ! jfl
181 : !
182 : integer, parameter :: num_strat_tau = 22
183 : integer :: usr_strat_tau_ndx(num_strat_tau)
184 : !
185 : !lke++
186 : integer :: usr_COhc_OH_ndx
187 : integer :: usr_COme_OH_ndx
188 : integer :: usr_CO01_OH_ndx
189 : integer :: usr_CO02_OH_ndx
190 : integer :: usr_CO03_OH_ndx
191 : integer :: usr_CO04_OH_ndx
192 : integer :: usr_CO05_OH_ndx
193 : integer :: usr_CO06_OH_ndx
194 : integer :: usr_CO07_OH_ndx
195 : integer :: usr_CO08_OH_ndx
196 : integer :: usr_CO09_OH_ndx
197 : integer :: usr_CO10_OH_ndx
198 : integer :: usr_CO11_OH_ndx
199 : integer :: usr_CO12_OH_ndx
200 : integer :: usr_CO13_OH_ndx
201 : integer :: usr_CO14_OH_ndx
202 : integer :: usr_CO15_OH_ndx
203 : integer :: usr_CO16_OH_ndx
204 : integer :: usr_CO17_OH_ndx
205 : integer :: usr_CO18_OH_ndx
206 : integer :: usr_CO19_OH_ndx
207 : integer :: usr_CO20_OH_ndx
208 : integer :: usr_CO21_OH_ndx
209 : integer :: usr_CO22_OH_ndx
210 : integer :: usr_CO23_OH_ndx
211 : integer :: usr_CO24_OH_ndx
212 : integer :: usr_CO25_OH_ndx
213 : integer :: usr_CO26_OH_ndx
214 : integer :: usr_CO27_OH_ndx
215 : integer :: usr_CO28_OH_ndx
216 : integer :: usr_CO29_OH_ndx
217 : integer :: usr_CO30_OH_ndx
218 : integer :: usr_CO31_OH_ndx
219 : integer :: usr_CO32_OH_ndx
220 : integer :: usr_CO33_OH_ndx
221 : integer :: usr_CO34_OH_ndx
222 : integer :: usr_CO35_OH_ndx
223 : integer :: usr_CO36_OH_ndx
224 : integer :: usr_CO37_OH_ndx
225 : integer :: usr_CO38_OH_ndx
226 : integer :: usr_CO39_OH_ndx
227 : integer :: usr_CO40_OH_ndx
228 : integer :: usr_CO41_OH_ndx
229 : integer :: usr_CO42_OH_ndx
230 : !lke--
231 :
232 : real(r8), parameter :: t0 = 300._r8 ! K
233 : real(r8), parameter :: trlim2 = 17._r8/3._r8 ! K
234 : real(r8), parameter :: trlim3 = 15._r8/3._r8 ! K
235 :
236 : logical :: has_ion_rxts, has_d_chem
237 :
238 : contains
239 :
240 0 : subroutine usrrxt_inti
241 : !-----------------------------------------------------------------
242 : ! ... intialize the user reaction constants module
243 : !-----------------------------------------------------------------
244 :
245 : use mo_chem_utls, only : get_rxt_ndx, get_spc_ndx
246 : use spmd_utils, only : masterproc
247 :
248 : implicit none
249 :
250 : character(len=4) :: xchar
251 : character(len=32) :: rxtname
252 : integer :: i
253 :
254 : !
255 : ! full tropospheric chemistry
256 : !
257 0 : usr_O_O2_ndx = get_rxt_ndx( 'usr_O_O2' )
258 0 : usr_HO2_HO2_ndx = get_rxt_ndx( 'usr_HO2_HO2' )
259 0 : usr_N2O5_M_ndx = get_rxt_ndx( 'usr_N2O5_M' )
260 0 : usr_HNO3_OH_ndx = get_rxt_ndx( 'usr_HNO3_OH' )
261 0 : usr_HO2NO2_M_ndx = get_rxt_ndx( 'usr_HO2NO2_M' )
262 0 : usr_N2O5_aer_ndx = get_rxt_ndx( 'usr_N2O5_aer' )
263 0 : usr_NO3_aer_ndx = get_rxt_ndx( 'usr_NO3_aer' )
264 0 : usr_NO2_aer_ndx = get_rxt_ndx( 'usr_NO2_aer' )
265 0 : usr_CO_OH_ndx = get_rxt_ndx( 'usr_CO_OH' )
266 0 : usr_CO_OH_a_ndx = get_rxt_ndx( 'usr_CO_OH_a' )
267 0 : usr_CO_OH_b_ndx = get_rxt_ndx( 'usr_CO_OH_b' )
268 0 : usr_PAN_M_ndx = get_rxt_ndx( 'usr_PAN_M' )
269 0 : usr_CH3COCH3_OH_ndx = get_rxt_ndx( 'usr_CH3COCH3_OH' )
270 0 : usr_MCO3_NO2_ndx = get_rxt_ndx( 'usr_MCO3_NO2' )
271 0 : tag_MCO3_NO2_ndx = get_rxt_ndx( 'tag_MCO3_NO2' )
272 0 : if( tag_MCO3_NO2_ndx<0 .and. usr_MCO3_NO2_ndx>0 ) then
273 0 : tag_MCO3_NO2_ndx = usr_MCO3_NO2_ndx
274 : endif
275 :
276 0 : usr_MPAN_M_ndx = get_rxt_ndx( 'usr_MPAN_M' )
277 0 : usr_XOOH_OH_ndx = get_rxt_ndx( 'usr_XOOH_OH' )
278 0 : usr_SO2_OH_ndx = get_rxt_ndx( 'usr_SO2_OH' )
279 0 : usr_N_O2_ndx = get_rxt_ndx( 'usr_N_O2' )
280 0 : usr_N2D_O2_ndx = get_rxt_ndx( 'usr_N2D_O2' )
281 0 : usr_N2D_e_ndx = get_rxt_ndx( 'usr_N2D_e' )
282 0 : usr_DMS_OH_ndx = get_rxt_ndx( 'usr_DMS_OH' )
283 0 : usr_HO2_aer_ndx = get_rxt_ndx( 'usr_HO2_aer' )
284 0 : usr_GLYOXAL_aer_ndx = get_rxt_ndx( 'usr_GLYOXAL_aer' )
285 : !
286 0 : tag_NO2_NO3_ndx = get_rxt_ndx( 'tag_NO2_NO3' )
287 0 : tag_NO2_OH_ndx = get_rxt_ndx( 'tag_NO2_OH' )
288 0 : tag_NO2_HO2_ndx = get_rxt_ndx( 'tag_NO2_HO2' )
289 0 : tag_C2H4_OH_ndx = get_rxt_ndx( 'tag_C2H4_OH' )
290 0 : tag_C3H6_OH_ndx = get_rxt_ndx( 'tag_C3H6_OH' )
291 0 : tag_CH3CO3_NO2_ndx = get_rxt_ndx( 'tag_CH3CO3_NO2' )
292 : !lke-TS1
293 0 : usr_PBZNIT_M_ndx = get_rxt_ndx( 'usr_PBZNIT_M' )
294 0 : tag_ACBZO2_NO2_ndx = get_rxt_ndx( 'tag_ACBZO2_NO2' )
295 0 : usr_ISOPNITA_aer_ndx = get_rxt_ndx( 'usr_ISOPNITA_aer' )
296 0 : usr_ISOPNITB_aer_ndx = get_rxt_ndx( 'usr_ISOPNITB_aer' )
297 0 : usr_ONITR_aer_ndx = get_rxt_ndx( 'usr_ONITR_aer' )
298 0 : usr_HONITR_aer_ndx = get_rxt_ndx( 'usr_HONITR_aer' )
299 0 : usr_TERPNIT_aer_ndx = get_rxt_ndx( 'usr_TERPNIT_aer' )
300 0 : usr_NTERPOOH_aer_ndx = get_rxt_ndx( 'usr_NTERPOOH_aer' )
301 0 : usr_NC4CHO_aer_ndx = get_rxt_ndx( 'usr_NC4CHO_aer' )
302 0 : usr_NC4CH2OH_aer_ndx = get_rxt_ndx( 'usr_NC4CH2OH_aer' )
303 : !TS2
304 0 : usr_ISOPZD1O2_ndx = get_rxt_ndx( 'usr_ISOPZD1O2' )
305 0 : usr_ISOPZD4O2_ndx = get_rxt_ndx( 'usr_ISOPZD4O2' )
306 0 : usr_ISOPFDN_aer_ndx = get_rxt_ndx( 'usr_ISOPFDN_aer' )
307 0 : usr_ISOPFNP_aer_ndx = get_rxt_ndx( 'usr_ISOPFNP_aer' )
308 0 : usr_ISOPN2B_aer_ndx = get_rxt_ndx( 'usr_ISOPN2B_aer' )
309 0 : usr_ISOPN1D_aer_ndx = get_rxt_ndx( 'usr_ISOPN1D_aer' )
310 0 : usr_ISOPN4D_aer_ndx = get_rxt_ndx( 'usr_ISOPN4D_aer' )
311 0 : usr_INOOHD_aer_ndx = get_rxt_ndx( 'usr_INOOHD_aer' )
312 0 : usr_INHEB_aer_ndx = get_rxt_ndx( 'usr_INHEB_aer' )
313 0 : usr_INHED_aer_ndx = get_rxt_ndx( 'usr_INHED_aer' )
314 0 : usr_MACRN_aer_ndx = get_rxt_ndx( 'usr_MACRN_aer' )
315 0 : usr_ISOPHFP_aer_ndx = get_rxt_ndx( 'usr_ISOPHFP_aer' )
316 0 : usr_IEPOX_aer_ndx = get_rxt_ndx( 'usr_IEPOX_aer' )
317 0 : usr_DHPMPAL_aer_ndx = get_rxt_ndx( 'usr_DHPMPAL_aer' )
318 0 : usr_ICHE_aer_ndx = get_rxt_ndx( 'usr_ICHE_aer' )
319 0 : usr_ISOPFNC_aer_ndx = get_rxt_ndx( 'usr_ISOPFNC_aer' )
320 0 : usr_ISOPFDNC_aer_ndx = get_rxt_ndx( 'usr_ISOPFDNC_aer' )
321 0 : usr_ISOPB1O2_NOn_ndx = get_rxt_ndx( 'usr_ISOPB1O2_NOn' )
322 0 : usr_ISOPB1O2_NOa_ndx = get_rxt_ndx( 'usr_ISOPB1O2_NOa' )
323 0 : usr_ISOPB4O2_NOn_ndx = get_rxt_ndx( 'usr_ISOPB4O2_NOn' )
324 0 : usr_ISOPB4O2_NOa_ndx = get_rxt_ndx( 'usr_ISOPB4O2_NOa' )
325 0 : usr_ISOPED1O2_NOn_ndx = get_rxt_ndx( 'usr_ISOPED1O2_NOn' )
326 0 : usr_ISOPED1O2_NOa_ndx = get_rxt_ndx( 'usr_ISOPED1O2_NOa' )
327 0 : usr_ISOPED4O2_NOn_ndx = get_rxt_ndx( 'usr_ISOPED4O2_NOn' )
328 0 : usr_ISOPED4O2_NOa_ndx = get_rxt_ndx( 'usr_ISOPED4O2_NOa' )
329 0 : usr_ISOPZD1O2_NOn_ndx = get_rxt_ndx( 'usr_ISOPZD1O2_NOn' )
330 0 : usr_ISOPZD1O2_NOa_ndx = get_rxt_ndx( 'usr_ISOPZD1O2_NOa' )
331 0 : usr_ISOPZD4O2_NOn_ndx = get_rxt_ndx( 'usr_ISOPZD4O2_NOn' )
332 0 : usr_ISOPZD4O2_NOa_ndx = get_rxt_ndx( 'usr_ISOPZD4O2_NOa' )
333 0 : usr_ISOPNO3_NOn_ndx = get_rxt_ndx( 'usr_ISOPNO3_NOn' )
334 0 : usr_ISOPNO3_NOa_ndx = get_rxt_ndx( 'usr_ISOPNO3_NOa' )
335 0 : usr_MVKO2_NOn_ndx = get_rxt_ndx( 'usr_MVKO2_NOn' )
336 0 : usr_MVKO2_NOa_ndx = get_rxt_ndx( 'usr_MVKO2_NOa' )
337 0 : usr_MACRO2_NOn_ndx = get_rxt_ndx( 'usr_MACRO2_NOn' )
338 0 : usr_MACRO2_NOa_ndx = get_rxt_ndx( 'usr_MACRO2_NOa' )
339 0 : usr_IEPOXOO_NOn_ndx = get_rxt_ndx( 'usr_IEPOXOO_NOn' )
340 0 : usr_IEPOXOO_NOa_ndx = get_rxt_ndx( 'usr_IEPOXOO_NOa' )
341 0 : usr_ISOPN1DO2_NOn_ndx = get_rxt_ndx( 'usr_ISOPN1DO2_NOn' )
342 0 : usr_ISOPN1DO2_NOa_ndx = get_rxt_ndx( 'usr_ISOPN1DO2_NOa' )
343 0 : usr_ISOPN2BO2_NOn_ndx = get_rxt_ndx( 'usr_ISOPN2BO2_NOn' )
344 0 : usr_ISOPN2BO2_NOa_ndx = get_rxt_ndx( 'usr_ISOPN2BO2_NOa' )
345 0 : usr_ISOPN3BO2_NOn_ndx = get_rxt_ndx( 'usr_ISOPN3BO2_NOn' )
346 0 : usr_ISOPN3BO2_NOa_ndx = get_rxt_ndx( 'usr_ISOPN3BO2_NOa' )
347 0 : usr_ISOPN4DO2_NOn_ndx = get_rxt_ndx( 'usr_ISOPN4DO2_NOn' )
348 0 : usr_ISOPN4DO2_NOa_ndx = get_rxt_ndx( 'usr_ISOPN4DO2_NOa' )
349 0 : usr_ISOPNBNO3O2_NOn_ndx = get_rxt_ndx( 'usr_ISOPNBNO3O2_NOn' )
350 0 : usr_ISOPNBNO3O2_NOa_ndx = get_rxt_ndx( 'usr_ISOPNBNO3O2_NOa' )
351 0 : usr_ISOPNOOHBO2_NOn_ndx = get_rxt_ndx( 'usr_ISOPNOOHBO2_NOn' )
352 0 : usr_ISOPNOOHBO2_NOa_ndx = get_rxt_ndx( 'usr_ISOPNOOHBO2_NOa' )
353 0 : usr_ISOPNOOHDO2_NOn_ndx = get_rxt_ndx( 'usr_ISOPNOOHDO2_NOn' )
354 0 : usr_ISOPNOOHDO2_NOa_ndx = get_rxt_ndx( 'usr_ISOPNOOHDO2_NOa' )
355 0 : usr_NC4CHOO2_NOn_ndx = get_rxt_ndx( 'usr_NC4CHOO2_NOn' )
356 0 : usr_NC4CHOO2_NOa_ndx = get_rxt_ndx( 'usr_NC4CHOO2_NOa' )
357 0 : tag_TERPACO3_NO2_ndx = get_rxt_ndx( 'tag_TERPACO3_NO2' )
358 0 : usr_TERPAPAN_M_ndx = get_rxt_ndx( 'usr_TERPAPAN_M' )
359 0 : tag_TERPA2CO3_NO2_ndx = get_rxt_ndx( 'tag_TERPA2CO3_NO2' )
360 0 : usr_TERPA2PAN_M_ndx = get_rxt_ndx( 'usr_TERPA2PAN_M' )
361 0 : tag_TERPA3CO3_NO2_ndx = get_rxt_ndx( 'tag_TERPA3CO3_NO2' )
362 0 : usr_TERPA3PAN_M_ndx = get_rxt_ndx( 'usr_TERPA3PAN_M' )
363 0 : usr_TERPNT_aer_ndx = get_rxt_ndx( 'usr_TERPNT_aer' )
364 0 : usr_TERPNT1_aer_ndx = get_rxt_ndx( 'usr_TERPNT1_aer' )
365 0 : usr_TERPNPT_aer_ndx = get_rxt_ndx( 'usr_TERPNPT_aer' )
366 0 : usr_TERPNPT1_aer_ndx = get_rxt_ndx( 'usr_TERPNPT1_aer' )
367 0 : usr_TERPFDN_aer_ndx = get_rxt_ndx( 'usr_TERPFDN_aer' )
368 0 : usr_SQTN_aer_ndx = get_rxt_ndx( 'usr_SQTN_aer' )
369 0 : usr_TERPHFN_aer_ndx = get_rxt_ndx( 'usr_TERPHFN_aer' )
370 0 : usr_TERPDHDP_aer_ndx = get_rxt_ndx( 'usr_TERPDHDP_aer' )
371 0 : usr_TERPACID_aer_ndx = get_rxt_ndx( 'usr_TERPACID_aer' )
372 : !
373 : ! additional reactions for O3A/XNO
374 : !
375 0 : usr_OA_O2_ndx = get_rxt_ndx( 'usr_OA_O2' )
376 0 : usr_XNO2NO3_M_ndx = get_rxt_ndx( 'usr_XNO2NO3_M' )
377 0 : usr_NO2XNO3_M_ndx = get_rxt_ndx( 'usr_NO2XNO3_M' )
378 0 : usr_XNO2NO3_aer_ndx = get_rxt_ndx( 'usr_XNO2NO3_aer' )
379 0 : usr_NO2XNO3_aer_ndx = get_rxt_ndx( 'usr_NO2XNO3_aer' )
380 0 : usr_XHNO3_OH_ndx = get_rxt_ndx( 'usr_XHNO3_OH' )
381 0 : usr_XNO3_aer_ndx = get_rxt_ndx( 'usr_XNO3_aer' )
382 0 : usr_XNO2_aer_ndx = get_rxt_ndx( 'usr_XNO2_aer' )
383 0 : usr_MCO3_XNO2_ndx = get_rxt_ndx( 'usr_MCO3_XNO2' )
384 0 : usr_XPAN_M_ndx = get_rxt_ndx( 'usr_XPAN_M' )
385 0 : usr_XMPAN_M_ndx = get_rxt_ndx( 'usr_XMPAN_M' )
386 0 : usr_XHO2NO2_M_ndx = get_rxt_ndx( 'usr_XHO2NO2_M' )
387 : !
388 : ! reduced hydrocarbon chemistry
389 : !
390 0 : usr_C2O3_NO2_ndx = get_rxt_ndx( 'usr_C2O3_NO2' )
391 0 : usr_C2H4_OH_ndx = get_rxt_ndx( 'usr_C2H4_OH' )
392 0 : usr_XO2N_HO2_ndx = get_rxt_ndx( 'usr_XO2N_HO2' )
393 0 : usr_C2O3_XNO2_ndx = get_rxt_ndx( 'usr_C2O3_XNO2' )
394 : !
395 0 : tag_XO2N_NO_ndx = get_rxt_ndx( 'tag_XO2N_NO' )
396 0 : tag_XO2_HO2_ndx = get_rxt_ndx( 'tag_XO2_HO2' )
397 0 : tag_XO2_NO_ndx = get_rxt_ndx( 'tag_XO2_NO' )
398 : !
399 : ! stratospheric chemistry
400 : !
401 0 : usr_O_O_ndx = get_rxt_ndx( 'usr_O_O' )
402 0 : usr_CL2O2_M_ndx = get_rxt_ndx( 'usr_CL2O2_M' )
403 0 : usr_SO3_H2O_ndx = get_rxt_ndx( 'usr_SO3_H2O' )
404 : !
405 0 : tag_CLO_CLO_M_ndx = get_rxt_ndx( 'tag_CLO_CLO_M' )
406 0 : if (tag_CLO_CLO_M_ndx<0) then ! for backwards compatibility
407 0 : tag_CLO_CLO_M_ndx = get_rxt_ndx( 'tag_CLO_CLO' )
408 : endif
409 : !
410 : ! reactions to remove BAM aerosols in the stratosphere
411 : !
412 0 : usr_strat_tau_ndx( 1) = get_rxt_ndx( 'usr_CB1_strat_tau' )
413 0 : usr_strat_tau_ndx( 2) = get_rxt_ndx( 'usr_CB2_strat_tau' )
414 0 : usr_strat_tau_ndx( 3) = get_rxt_ndx( 'usr_OC1_strat_tau' )
415 0 : usr_strat_tau_ndx( 4) = get_rxt_ndx( 'usr_OC2_strat_tau' )
416 0 : usr_strat_tau_ndx( 5) = get_rxt_ndx( 'usr_SO4_strat_tau' )
417 0 : usr_strat_tau_ndx( 6) = get_rxt_ndx( 'usr_SOA_strat_tau' )
418 0 : usr_strat_tau_ndx( 7) = get_rxt_ndx( 'usr_NH4_strat_tau' )
419 0 : usr_strat_tau_ndx( 8) = get_rxt_ndx( 'usr_NH4NO3_strat_tau' )
420 0 : usr_strat_tau_ndx( 9) = get_rxt_ndx( 'usr_SSLT01_strat_tau' )
421 0 : usr_strat_tau_ndx(10) = get_rxt_ndx( 'usr_SSLT02_strat_tau' )
422 0 : usr_strat_tau_ndx(11) = get_rxt_ndx( 'usr_SSLT03_strat_tau' )
423 0 : usr_strat_tau_ndx(12) = get_rxt_ndx( 'usr_SSLT04_strat_tau' )
424 0 : usr_strat_tau_ndx(13) = get_rxt_ndx( 'usr_DST01_strat_tau' )
425 0 : usr_strat_tau_ndx(14) = get_rxt_ndx( 'usr_DST02_strat_tau' )
426 0 : usr_strat_tau_ndx(15) = get_rxt_ndx( 'usr_DST03_strat_tau' )
427 0 : usr_strat_tau_ndx(16) = get_rxt_ndx( 'usr_DST04_strat_tau' )
428 0 : usr_strat_tau_ndx(17) = get_rxt_ndx( 'usr_SO2t_strat_tau' )
429 0 : usr_strat_tau_ndx(18) = get_rxt_ndx( 'usr_SOAI_strat_tau' )
430 0 : usr_strat_tau_ndx(19) = get_rxt_ndx( 'usr_SOAM_strat_tau' )
431 0 : usr_strat_tau_ndx(20) = get_rxt_ndx( 'usr_SOAB_strat_tau' )
432 0 : usr_strat_tau_ndx(21) = get_rxt_ndx( 'usr_SOAT_strat_tau' )
433 0 : usr_strat_tau_ndx(22) = get_rxt_ndx( 'usr_SOAX_strat_tau' )
434 : !
435 : ! stratospheric aerosol chemistry
436 : !
437 0 : het1_ndx = get_rxt_ndx( 'het1' )
438 : !
439 : ! ion chemistry
440 : !
441 0 : ion1_ndx = get_rxt_ndx( 'ion_Op_O2' )
442 0 : ion2_ndx = get_rxt_ndx( 'ion_Op_N2' )
443 0 : ion3_ndx = get_rxt_ndx( 'ion_N2p_Oa' )
444 0 : ion11_ndx = get_rxt_ndx( 'ion_N2p_Ob' )
445 :
446 0 : elec1_ndx = get_rxt_ndx( 'elec1' )
447 0 : elec2_ndx = get_rxt_ndx( 'elec2' )
448 0 : elec3_ndx = get_rxt_ndx( 'elec3' )
449 :
450 0 : do i = 1,nean
451 0 : write (xchar,'(i4)') i
452 0 : rxtname = 'ean'//trim(adjustl(xchar))
453 0 : ean_ndx(i) = get_rxt_ndx(trim(rxtname))
454 : enddo
455 :
456 0 : do i = 1,nrpe
457 0 : write (xchar,'(i4)') i
458 0 : rxtname = 'rpe'//trim(adjustl(xchar))
459 0 : rpe_ndx(i) = get_rxt_ndx(trim(rxtname))
460 : enddo
461 :
462 0 : do i = 1,npir
463 0 : write (xchar,'(i4)') i
464 0 : rxtname = 'pir'//trim(adjustl(xchar))
465 0 : pir_ndx(i) = get_rxt_ndx(trim(rxtname))
466 : enddo
467 :
468 0 : do i = 1,nedn
469 0 : write (xchar,'(i4)') i
470 0 : rxtname = 'edn'//trim(adjustl(xchar))
471 0 : edn_ndx(i) = get_rxt_ndx(trim(rxtname))
472 : enddo
473 :
474 0 : do i = 1,nnir
475 0 : write (xchar,'(i4)') i
476 0 : rxtname = 'nir'//trim(adjustl(xchar))
477 0 : nir_ndx(i) = get_rxt_ndx(trim(rxtname))
478 : enddo
479 :
480 0 : do i = 1,niira
481 0 : write (xchar,'(i4)') i
482 0 : rxtname = 'iira'//trim(adjustl(xchar))
483 0 : iira_ndx(i) = get_rxt_ndx(trim(rxtname))
484 : enddo
485 :
486 0 : do i = 1,niirb
487 0 : write (xchar,'(i4)') i
488 0 : rxtname = 'iirb'//trim(adjustl(xchar))
489 0 : iirb_ndx(i) = get_rxt_ndx(trim(rxtname))
490 : enddo
491 :
492 0 : usr_clm_h2o_m_ndx = get_rxt_ndx( 'usr_CLm_H2O_M' )
493 0 : usr_clm_hcl_m_ndx = get_rxt_ndx( 'usr_CLm_HCL_M' )
494 :
495 0 : elec4_ndx = get_rxt_ndx( 'Op2P_ea' )
496 0 : elec5_ndx = get_rxt_ndx( 'Op2P_eb' )
497 0 : elec6_ndx = get_rxt_ndx( 'Op2D_e' )
498 :
499 : has_ion_rxts = ion1_ndx>0 .and. ion2_ndx>0 .and. ion3_ndx>0 .and. elec1_ndx>0 &
500 0 : .and. elec2_ndx>0 .and. elec3_ndx>0
501 :
502 : has_d_chem = &
503 : all(ean_ndx>0) .and. &
504 : all(rpe_ndx>0) .and. &
505 : all(pir_ndx>0) .and. &
506 : all(edn_ndx>0) .and. &
507 : all(nir_ndx>0) .and. &
508 : all(iira_ndx>0) .and. &
509 : all(iirb_ndx>0) .and. &
510 0 : usr_clm_h2o_m_ndx>0 .and. usr_clm_hcl_m_ndx>0
511 :
512 0 : h2o_ndx = get_spc_ndx( 'H2O' )
513 :
514 : !
515 : ! llnl super fast
516 : !
517 0 : usr_oh_co_ndx = get_rxt_ndx( 'usr_oh_co' )
518 0 : het_no2_h2o_ndx = get_rxt_ndx( 'het_no2_h2o' )
519 0 : usr_oh_dms_ndx = get_rxt_ndx( 'usr_oh_dms' )
520 0 : aq_so2_h2o2_ndx = get_rxt_ndx( 'aq_so2_h2o2' )
521 0 : aq_so2_o3_ndx = get_rxt_ndx( 'aq_so2_o3' )
522 :
523 : !lke++
524 : ! CO tags
525 : !
526 0 : usr_COhc_OH_ndx = get_rxt_ndx( 'usr_COhc_OH' )
527 0 : usr_COme_OH_ndx = get_rxt_ndx( 'usr_COme_OH' )
528 0 : usr_CO01_OH_ndx = get_rxt_ndx( 'usr_CO01_OH' )
529 0 : usr_CO02_OH_ndx = get_rxt_ndx( 'usr_CO02_OH' )
530 0 : usr_CO03_OH_ndx = get_rxt_ndx( 'usr_CO03_OH' )
531 0 : usr_CO04_OH_ndx = get_rxt_ndx( 'usr_CO04_OH' )
532 0 : usr_CO05_OH_ndx = get_rxt_ndx( 'usr_CO05_OH' )
533 0 : usr_CO06_OH_ndx = get_rxt_ndx( 'usr_CO06_OH' )
534 0 : usr_CO07_OH_ndx = get_rxt_ndx( 'usr_CO07_OH' )
535 0 : usr_CO08_OH_ndx = get_rxt_ndx( 'usr_CO08_OH' )
536 0 : usr_CO09_OH_ndx = get_rxt_ndx( 'usr_CO09_OH' )
537 0 : usr_CO10_OH_ndx = get_rxt_ndx( 'usr_CO10_OH' )
538 0 : usr_CO11_OH_ndx = get_rxt_ndx( 'usr_CO11_OH' )
539 0 : usr_CO12_OH_ndx = get_rxt_ndx( 'usr_CO12_OH' )
540 0 : usr_CO13_OH_ndx = get_rxt_ndx( 'usr_CO13_OH' )
541 0 : usr_CO14_OH_ndx = get_rxt_ndx( 'usr_CO14_OH' )
542 0 : usr_CO15_OH_ndx = get_rxt_ndx( 'usr_CO15_OH' )
543 0 : usr_CO16_OH_ndx = get_rxt_ndx( 'usr_CO16_OH' )
544 0 : usr_CO17_OH_ndx = get_rxt_ndx( 'usr_CO17_OH' )
545 0 : usr_CO18_OH_ndx = get_rxt_ndx( 'usr_CO18_OH' )
546 0 : usr_CO19_OH_ndx = get_rxt_ndx( 'usr_CO19_OH' )
547 0 : usr_CO20_OH_ndx = get_rxt_ndx( 'usr_CO20_OH' )
548 0 : usr_CO21_OH_ndx = get_rxt_ndx( 'usr_CO21_OH' )
549 0 : usr_CO22_OH_ndx = get_rxt_ndx( 'usr_CO22_OH' )
550 0 : usr_CO23_OH_ndx = get_rxt_ndx( 'usr_CO23_OH' )
551 0 : usr_CO24_OH_ndx = get_rxt_ndx( 'usr_CO24_OH' )
552 0 : usr_CO25_OH_ndx = get_rxt_ndx( 'usr_CO25_OH' )
553 0 : usr_CO26_OH_ndx = get_rxt_ndx( 'usr_CO26_OH' )
554 0 : usr_CO27_OH_ndx = get_rxt_ndx( 'usr_CO27_OH' )
555 0 : usr_CO28_OH_ndx = get_rxt_ndx( 'usr_CO28_OH' )
556 0 : usr_CO29_OH_ndx = get_rxt_ndx( 'usr_CO29_OH' )
557 0 : usr_CO30_OH_ndx = get_rxt_ndx( 'usr_CO30_OH' )
558 0 : usr_CO31_OH_ndx = get_rxt_ndx( 'usr_CO31_OH' )
559 0 : usr_CO32_OH_ndx = get_rxt_ndx( 'usr_CO32_OH' )
560 0 : usr_CO33_OH_ndx = get_rxt_ndx( 'usr_CO33_OH' )
561 0 : usr_CO34_OH_ndx = get_rxt_ndx( 'usr_CO34_OH' )
562 0 : usr_CO35_OH_ndx = get_rxt_ndx( 'usr_CO35_OH' )
563 0 : usr_CO36_OH_ndx = get_rxt_ndx( 'usr_CO36_OH' )
564 0 : usr_CO37_OH_ndx = get_rxt_ndx( 'usr_CO37_OH' )
565 0 : usr_CO38_OH_ndx = get_rxt_ndx( 'usr_CO38_OH' )
566 0 : usr_CO39_OH_ndx = get_rxt_ndx( 'usr_CO39_OH' )
567 0 : usr_CO40_OH_ndx = get_rxt_ndx( 'usr_CO40_OH' )
568 0 : usr_CO41_OH_ndx = get_rxt_ndx( 'usr_CO41_OH' )
569 0 : usr_CO42_OH_ndx = get_rxt_ndx( 'usr_CO42_OH' )
570 : !lke--
571 :
572 0 : if (masterproc) then
573 0 : write(iulog,*) ' '
574 0 : write(iulog,*) 'usrrxt_inti: diagnostics '
575 0 : write(iulog,'(10i5)') usr_O_O2_ndx,usr_HO2_HO2_ndx,tag_NO2_NO3_ndx,usr_N2O5_M_ndx,tag_NO2_OH_ndx,usr_HNO3_OH_ndx &
576 0 : ,tag_NO2_HO2_ndx,usr_HO2NO2_M_ndx,usr_N2O5_aer_ndx,usr_NO3_aer_ndx,usr_NO2_aer_ndx &
577 0 : ,usr_CO_OH_b_ndx,tag_C2H4_OH_ndx,tag_C3H6_OH_ndx,tag_CH3CO3_NO2_ndx,usr_PAN_M_ndx,usr_CH3COCH3_OH_ndx &
578 0 : ,usr_MCO3_NO2_ndx,usr_MPAN_M_ndx,usr_XOOH_OH_ndx,usr_SO2_OH_ndx,usr_N2D_O2_ndx,usr_N2D_e_ndx,usr_N_O2_ndx,usr_DMS_OH_ndx,usr_HO2_aer_ndx &
579 0 : ,usr_GLYOXAL_aer_ndx,usr_ISOPNITA_aer_ndx,usr_ISOPNITB_aer_ndx,usr_ONITR_aer_ndx,usr_HONITR_aer_ndx &
580 0 : ,usr_TERPNIT_aer_ndx,usr_NTERPOOH_aer_ndx,usr_NC4CHO_aer_ndx,usr_NC4CH2OH_aer_ndx,usr_ISOPZD1O2_ndx &
581 0 : ,usr_ISOPZD4O2_ndx,usr_ISOPFDN_aer_ndx,usr_ISOPFNP_aer_ndx,usr_ISOPN2B_aer_ndx,usr_ISOPN1D_aer_ndx &
582 0 : ,usr_ISOPN4D_aer_ndx,usr_INOOHD_aer_ndx,usr_INHEB_aer_ndx,usr_INHED_aer_ndx,usr_MACRN_aer_ndx &
583 0 : ,usr_ISOPHFP_aer_ndx,usr_IEPOX_aer_ndx,usr_DHPMPAL_aer_ndx,usr_ISOPB1O2_NOn_ndx,usr_ISOPB1O2_NOa_ndx &
584 0 : ,usr_ISOPB4O2_NOn_ndx,usr_ISOPB4O2_NOa_ndx,usr_ISOPED1O2_NOn_ndx,usr_ISOPED1O2_NOa_ndx &
585 0 : ,usr_ISOPED4O2_NOn_ndx,usr_ISOPED4O2_NOa_ndx,usr_ISOPZD1O2_NOn_ndx,usr_ISOPZD1O2_NOa_ndx &
586 0 : ,usr_ISOPZD4O2_NOn_ndx,usr_ISOPZD4O2_NOa_ndx,usr_ISOPNO3_NOn_ndx,usr_ISOPNO3_NOa_ndx &
587 0 : ,usr_MVKO2_NOn_ndx,usr_MVKO2_NOa_ndx,usr_MACRO2_NOn_ndx,usr_MACRO2_NOa_ndx &
588 0 : ,usr_IEPOXOO_NOn_ndx,usr_IEPOXOO_NOa_ndx,usr_ISOPN1DO2_NOn_ndx,usr_ISOPN1DO2_NOa_ndx &
589 0 : ,usr_ISOPN2BO2_NOn_ndx,usr_ISOPN2BO2_NOa_ndx,usr_ISOPN3BO2_NOn_ndx,usr_ISOPN3BO2_NOa_ndx &
590 0 : ,usr_ISOPN4DO2_NOn_ndx,usr_ISOPN4DO2_NOa_ndx,usr_ISOPNBNO3O2_NOn_ndx,usr_ISOPNBNO3O2_NOa_ndx &
591 0 : ,usr_ISOPNOOHBO2_NOn_ndx,usr_ISOPNOOHBO2_NOa_ndx,usr_ISOPNOOHDO2_NOn_ndx,usr_ISOPNOOHDO2_NOa_ndx &
592 0 : ,usr_NC4CHOO2_NOn_ndx,usr_NC4CHOO2_NOa_ndx,tag_MCO3_NO2_ndx &
593 0 : ,usr_TERPNT_aer_ndx,tag_TERPA2CO3_NO2_ndx,usr_TERPA2PAN_M_ndx &
594 0 : ,usr_TERPNT1_aer_ndx,usr_TERPNPT_aer_ndx,usr_TERPNPT1_aer_ndx,usr_TERPFDN_aer_ndx,usr_SQTN_aer_ndx &
595 0 : ,usr_TERPHFN_aer_ndx,usr_TERPDHDP_aer_ndx,usr_TERPACID_aer_ndx,tag_TERPACO3_NO2_ndx &
596 0 : ,usr_TERPAPAN_M_ndx,tag_TERPA3CO3_NO2_ndx, usr_TERPA3PAN_M_ndx,usr_ICHE_aer_ndx,usr_ISOPFNC_aer_ndx &
597 0 : ,usr_ISOPFDNC_aer_ndx
598 :
599 : end if
600 :
601 0 : end subroutine usrrxt_inti
602 :
603 0 : subroutine usrrxt( state, rxt, temp, tempi, tempe, invariants, h2ovmr, &
604 0 : pmid, m, sulfate, mmr, relhum, strato_sad, &
605 0 : tropchemlev, dlat, ncol, sad_trop, reff_trop, cwat, mbar, pbuf )
606 :
607 : !-----------------------------------------------------------------
608 : ! ... set the user specified reaction rates
609 : !-----------------------------------------------------------------
610 :
611 : use mo_constants, only : pi, avo => avogadro, boltz_cgs, rgas
612 : use chem_mods, only : nfs, rxntot, gas_pcnst, inv_m_ndx=>indexm
613 : use mo_setinv, only : inv_o2_ndx=>o2_ndx, inv_h2o_ndx=>h2o_ndx
614 : use physics_buffer, only : physics_buffer_desc
615 : use physics_types, only : physics_state
616 : use carma_flags_mod, only : carma_hetchem_feedback
617 : use aero_model, only : aero_model_surfarea
618 : use rad_constituents,only : rad_cnst_get_info
619 :
620 : implicit none
621 :
622 : !-----------------------------------------------------------------
623 : ! ... dummy arguments
624 : !-----------------------------------------------------------------
625 : integer, intent(in) :: ncol
626 : integer, intent(in) :: tropchemlev(pcols) ! trop/strat reaction separation vertical index
627 : real(r8), intent(in) :: dlat(:) ! degrees latitude
628 : real(r8), intent(in) :: temp(pcols,pver) ! temperature (K); neutral temperature
629 : real(r8), intent(in) :: tempi(pcols,pver) ! ionic temperature (K); only used if ion chemistry
630 : real(r8), intent(in) :: tempe(pcols,pver) ! electronic temperature (K); only used if ion chemistry
631 : real(r8), intent(in) :: m(ncol,pver) ! total atm density (/cm^3)
632 : real(r8), intent(in) :: sulfate(ncol,pver) ! sulfate aerosol (mol/mol)
633 : real(r8), intent(in) :: strato_sad(pcols,pver) ! stratospheric aerosol sad (1/cm)
634 : real(r8), intent(in) :: h2ovmr(ncol,pver) ! water vapor (mol/mol)
635 : real(r8), intent(in) :: relhum(ncol,pver) ! relative humidity
636 : real(r8), intent(in) :: pmid(pcols,pver) ! midpoint pressure (Pa)
637 : real(r8), intent(in) :: invariants(ncol,pver,nfs) ! invariants density (/cm^3)
638 : real(r8), intent(in) :: mmr(pcols,pver,gas_pcnst) ! species concentrations (kg/kg)
639 : real(r8), intent(in) :: cwat(ncol,pver) !PJC Condensed Water (liquid+ice) (kg/kg)
640 : real(r8), intent(in) :: mbar(ncol,pver) !PJC Molar mass of air (g/mol)
641 : real(r8), intent(inout) :: rxt(ncol,pver,rxntot) ! gas phase rates
642 : real(r8), intent(out) :: sad_trop(pcols,pver) ! tropospheric surface area density (cm2/cm3)
643 : real(r8), intent(out) :: reff_trop(pcols,pver) ! tropospheric effective radius (cm)
644 : type(physics_state), intent(in) :: state ! Physics state variables
645 : type(physics_buffer_desc), pointer :: pbuf(:)
646 :
647 : !-----------------------------------------------------------------
648 : ! ... local variables
649 : !-----------------------------------------------------------------
650 :
651 : real(r8), parameter :: dg = 0.1_r8 ! mole diffusion =0.1 cm2/s (Dentener, 1993)
652 :
653 : !-----------------------------------------------------------------
654 : ! ... reaction probabilities for heterogeneous reactions
655 : !-----------------------------------------------------------------
656 : real(r8), parameter :: gamma_n2o5 = 0.02_r8 ! JPL19
657 : real(r8), parameter :: gamma_ho2 = 0.10_r8 ! Gaubert et al., https://doi.org/10.5194/acp-20-14617-2020
658 : real(r8), parameter :: gamma_no2 = 8.0e-6_r8 ! Liu et al., Environ.Sci.&Tech, 53, 3517, 2019 doi:10.1021/acs.est.8b06367
659 : real(r8), parameter :: gamma_no3 = 0.002_r8 ! JPL19
660 : real(r8), parameter :: gamma_glyoxal = 2.0e-4_r8 ! Washenfelder et al, JGR, 2011
661 : !TS1 species
662 : real(r8), parameter :: gamma_isopnita = 0.005_r8 ! from Fisher et al., ACP, 2016
663 : real(r8), parameter :: gamma_isopnitb = 0.005_r8 !
664 : real(r8), parameter :: gamma_onitr = 0.005_r8 !
665 : real(r8), parameter :: gamma_honitr = 0.005_r8 !
666 : real(r8), parameter :: gamma_terpnit = 0.01_r8 !
667 : real(r8), parameter :: gamma_nterpooh = 0.01_r8 !
668 : real(r8), parameter :: gamma_nc4cho = 0.02_r8 !
669 : real(r8), parameter :: gamma_nc4ch2oh = 0.005_r8 !
670 : !TS2 species
671 : real(r8), parameter :: gamma_isopfdn = 0.1_r8 ! Marais 2015 for C5-LVOC
672 : real(r8), parameter :: gamma_isopfnp = 0.1_r8 ! Marais 2015 for C5-LVOC
673 : real(r8), parameter :: gamma_isopn2b = 0.02_r8 ! All isoprene nitrates Wolfe
674 : real(r8), parameter :: gamma_isopn1d = 0.02_r8 !
675 : real(r8), parameter :: gamma_isopn4d = 0.02_r8 !
676 : real(r8), parameter :: gamma_inoohd = 0.02_r8 !
677 : real(r8), parameter :: gamma_inheb = 0.02_r8 !Marais 2015 for IEPOX
678 : real(r8), parameter :: gamma_inhed = 0.02_r8 !Marais 2015 for IEPOX
679 : real(r8), parameter :: gamma_macrn = 0.02_r8 !
680 : real(r8), parameter :: gamma_isophfp = 0.1_r8 !Marais 2015 for C5-LVOC
681 : real(r8), parameter :: gamma_iepox = 0.0042_r8 !Marais 2015 for IEPOX
682 : real(r8), parameter :: gamma_dhpmpal = 0.1_r8 !Marais 2015 for C5-LVOC
683 : real(r8), parameter :: gamma_iche = 0.0042_r8 !Marais 2015 for IEPOX
684 : real(r8), parameter :: gamma_isopfnc = 0.1_r8 ! Marais 2015 for C5-LVOC
685 : real(r8), parameter :: gamma_isopfdnc = 0.1_r8 ! Marais 2015 for C5-LVOC
686 : real(r8), parameter :: gamma_terpnt = 0.02_r8 !
687 : real(r8), parameter :: gamma_terpnt1 = 0.02_r8 !
688 : real(r8), parameter :: gamma_terpnpt = 0.02_r8 !
689 : real(r8), parameter :: gamma_terpnpt1 = 0.02_r8 !
690 : real(r8), parameter :: gamma_terpfdn = 0.1_r8 !
691 : real(r8), parameter :: gamma_sqtn = 0.1_r8 !
692 : real(r8), parameter :: gamma_terphfn = 0.1_r8 !
693 : real(r8), parameter :: gamma_terpdhdp = 0.1_r8 !
694 : real(r8), parameter :: gamma_terpacid = 0.01_r8 !
695 :
696 : integer :: i, k
697 : integer :: l
698 0 : real(r8) :: tp(ncol) ! 300/t
699 0 : real(r8) :: tinv(ncol) ! 1/t
700 0 : real(r8) :: ko(ncol)
701 0 : real(r8) :: term1(ncol)
702 0 : real(r8) :: term2(ncol)
703 0 : real(r8) :: kinf(ncol)
704 0 : real(r8) :: fc(ncol)
705 0 : real(r8) :: xr(ncol)
706 0 : real(r8) :: sur(ncol)
707 0 : real(r8) :: sqrt_t(ncol) ! sqrt( temp )
708 0 : real(r8) :: sqrt_t_58(ncol) ! sqrt( temp / 58.)
709 0 : real(r8) :: exp_fac(ncol) ! vector exponential
710 0 : real(r8) :: lwc(ncol)
711 0 : real(r8) :: ko_m(ncol)
712 0 : real(r8) :: k0(ncol)
713 0 : real(r8) :: kinf_m(ncol)
714 0 : real(r8) :: o2(ncol)
715 : real(r8) :: c_n2o5, c_ho2, c_no2, c_no3, c_glyoxal
716 : !TS1 species
717 : real(r8) :: c_isopnita, c_isopnitb, c_onitr, c_honitr, c_terpnit, c_nterpooh
718 : real(r8) :: c_nc4cho, c_nc4ch2oh
719 : !T2 species
720 : real(r8) :: c_isopfdn, c_isopfnp, c_isopn2b, c_isopn1d, c_isopn4d, c_inoohd
721 : real(r8) :: c_inheb, c_inhed, c_macrn, c_isophfp, c_iepox, c_dhpmpal
722 : real(r8) :: c_iche, c_isopfnc, c_isopfdnc
723 : real(r8) :: c_terpnt, c_terpnt1, c_terpnpt, c_terpnpt1, c_terpfdn, c_sqtn, c_terphfn, c_terpdhdp, c_terpacid
724 :
725 : real(r8) :: amas
726 : !-----------------------------------------------------------------
727 : ! ... density of sulfate aerosol
728 : !-----------------------------------------------------------------
729 : real(r8), parameter :: gam1 = 0.04_r8 ! N2O5+SUL ->2HNO3
730 : real(r8), parameter :: wso4 = 98._r8
731 : real(r8), parameter :: den = 1.15_r8 ! each molecule of SO4(aer) density g/cm3
732 : !-------------------------------------------------
733 : ! ... volume of sulfate particles
734 : ! assuming mean rm
735 : ! continient 0.05um 0.07um 0.09um
736 : ! ocean 0.09um 0.25um 0.37um
737 : ! 0.16um Blake JGR,7195, 1995
738 : !-------------------------------------------------
739 : real(r8), parameter :: rm1 = 0.16_r8*1.e-4_r8 ! mean radii in cm
740 : real(r8), parameter :: fare = 4._r8*pi*rm1*rm1 ! each mean particle(r=0.1u) area cm2/cm3
741 :
742 : !-----------------------------------------------------------------------
743 : ! ... Aqueous phase sulfur quantities for SO2 + H2O2 and SO2 + O3
744 : !-----------------------------------------------------------------------
745 : real(r8), parameter :: HENRY298_H2O2 = 7.45e+04_r8
746 : real(r8), parameter :: H298_H2O2 = -1.45e+04_r8
747 : real(r8), parameter :: HENRY298_SO2 = 1.23e+00_r8
748 : real(r8), parameter :: H298_SO2 = -6.25e+03_r8
749 : real(r8), parameter :: K298_SO2_HSO3 = 1.3e-02_r8
750 : real(r8), parameter :: H298_SO2_HSO3 = -4.16e+03_r8
751 : real(r8), parameter :: R_CONC = 82.05e+00_r8 / avo
752 : real(r8), parameter :: R_CAL = rgas * 0.239006e+00_r8
753 : real(r8), parameter :: K_AQ = 7.57e+07_r8
754 : real(r8), parameter :: ER_AQ = 4.43e+03_r8
755 :
756 : real(r8), parameter :: HENRY298_O3 = 1.13e-02_r8
757 : real(r8), parameter :: H298_O3 = -5.04e+03_r8
758 : real(r8), parameter :: K298_HSO3_SO3 = 6.6e-08_r8
759 : real(r8), parameter :: H298_HSO3_SO3 = -2.23e+03_r8
760 : real(r8), parameter :: K0_AQ = 2.4e+04_r8
761 : real(r8), parameter :: ER0_AQ = 0.0e+00_r8
762 : real(r8), parameter :: K1_AQ = 3.7e+05_r8
763 : real(r8), parameter :: ER1_AQ = 5.53e+03_r8
764 : real(r8), parameter :: K2_AQ = 1.5e+09_r8
765 : real(r8), parameter :: ER2_AQ = 5.28e+03_r8
766 :
767 : real(r8), parameter :: pH = 4.5e+00_r8
768 :
769 0 : real(r8), pointer :: sfc(:), dm_aer(:)
770 : integer :: ntot_amode, nbins
771 :
772 0 : real(r8), pointer :: sfc_array(:,:,:), dm_array(:,:,:)
773 : !TS2
774 0 : real(r8) :: aterm(ncol)
775 : real(r8) :: natom
776 : real(r8) :: nyield
777 : real(r8) :: acorr
778 : real(r8) :: exp_natom
779 : character(len=*), parameter :: subname = 'usrrxt'
780 :
781 : ! get info about the modal aerosols
782 : ! get ntot_amode
783 0 : call rad_cnst_get_info(0, nmodes=ntot_amode)
784 0 : call rad_cnst_get_info(0, nbins=nbins)
785 :
786 0 : if (ntot_amode>0.and.nbins>0) then
787 0 : call endrun(subname // ':: ERROR running with MAM and CARMA simultaneously not supported.')
788 : end if
789 :
790 0 : if (ntot_amode>0) then
791 0 : allocate(sfc_array(pcols,pver,ntot_amode), dm_array(pcols,pver,ntot_amode) )
792 0 : else if (nbins>0) then
793 0 : allocate(sfc_array(pcols,pver,nbins), dm_array(pcols,pver,nbins) )
794 : else
795 0 : allocate(sfc_array(pcols,pver,5), dm_array(pcols,pver,5) )
796 : endif
797 :
798 0 : sfc_array(:,:,:) = 0._r8
799 0 : dm_array(:,:,:) = 0._r8
800 0 : sad_trop(:,:) = 0._r8
801 0 : reff_trop(:,:) = 0._r8
802 :
803 0 : if( usr_NO2_aer_ndx > 0 .or. usr_NO3_aer_ndx > 0 .or. usr_N2O5_aer_ndx > 0 .or. usr_HO2_aer_ndx > 0 ) then
804 :
805 : ! sad_trop should be set outside of usrrxt ??
806 0 : if( carma_hetchem_feedback ) then
807 0 : sad_trop(:ncol,:pver)=strato_sad(:ncol,:pver)
808 : else
809 :
810 : call aero_model_surfarea( &
811 0 : state, mmr, rm1, relhum, pmid, temp, strato_sad, sulfate, m, tropchemlev, dlat, &
812 0 : het1_ndx, pbuf, ncol, sfc_array, dm_array, sad_trop, reff_trop )
813 :
814 : endif
815 : endif
816 :
817 0 : level_loop : do k = 1,pver
818 0 : tinv(:) = 1._r8 / temp(:ncol,k)
819 0 : tp(:) = 300._r8 * tinv(:)
820 0 : sqrt_t(:) = sqrt( temp(:ncol,k) )
821 0 : sqrt_t_58(:) = sqrt( temp(:ncol,k) / 58.0_r8 )
822 :
823 : !-----------------------------------------------------------------
824 : ! ... o + o2 + m --> o3 + m (JPL15-10)
825 : !-----------------------------------------------------------------
826 0 : if( usr_O_O2_ndx > 0 ) then
827 0 : rxt(:,k,usr_O_O2_ndx) = 6.e-34_r8 * tp(:)**2.4_r8
828 : end if
829 0 : if( usr_OA_O2_ndx > 0 ) then
830 0 : rxt(:,k,usr_OA_O2_ndx) = 6.e-34_r8 * tp(:)**2.4_r8
831 : end if
832 :
833 : !-----------------------------------------------------------------
834 : ! ... o + o + m -> o2 + m
835 : !-----------------------------------------------------------------
836 0 : if ( usr_O_O_ndx > 0 ) then
837 0 : rxt(:,k,usr_O_O_ndx) = 2.76e-34_r8 * exp( 720.0_r8*tinv(:) )
838 : end if
839 :
840 : !-----------------------------------------------------------------
841 : ! ... cl2o2 + m -> 2*clo + m (JPL15-10)
842 : !-----------------------------------------------------------------
843 0 : if ( usr_CL2O2_M_ndx > 0 ) then
844 0 : if ( tag_CLO_CLO_M_ndx > 0 ) then
845 0 : ko(:) = 2.16e-27_r8 * exp( 8537.0_r8* tinv(:) )
846 0 : rxt(:,k,usr_CL2O2_M_ndx) = rxt(:,k,tag_CLO_CLO_M_ndx)/ko(:)
847 : else
848 0 : rxt(:,k,usr_CL2O2_M_ndx) = 0._r8
849 : end if
850 : end if
851 :
852 : !-----------------------------------------------------------------
853 : ! ... so3 + 2*h2o --> h2so4 + h2o
854 : ! Note: this reaction proceeds by the 2 intermediate steps below
855 : ! so3 + h2o --> adduct
856 : ! adduct + h2o --> h2so4 + h2o
857 : ! (Lovejoy et al., JCP, pp. 19911-19916, 1996)
858 : ! The first order rate constant used here is recommended by JPL 2011.
859 : ! This rate involves the water vapor number density.
860 : !-----------------------------------------------------------------
861 :
862 0 : if ( usr_SO3_H2O_ndx > 0 ) then
863 0 : call comp_exp( exp_fac, 6540.0_r8*tinv(:), ncol )
864 0 : if( h2o_ndx > 0 ) then
865 0 : fc(:) = 8.5e-21_r8 * m(:,k) * h2ovmr(:,k) * exp_fac(:)
866 : else
867 0 : fc(:) = 8.5e-21_r8 * invariants(:,k,inv_h2o_ndx) * exp_fac(:)
868 : end if
869 0 : rxt(:,k,usr_SO3_H2O_ndx) = 1.0e-20_r8 * fc(:)
870 : end if
871 :
872 : !-----------------------------------------------------------------
873 : ! ... n2o5 + m --> no2 + no3 + m (JPL15-10)
874 : !-----------------------------------------------------------------
875 0 : if( usr_N2O5_M_ndx > 0 ) then
876 0 : if( tag_NO2_NO3_ndx > 0 ) then
877 0 : call comp_exp( exp_fac, -10840.0_r8*tinv, ncol )
878 0 : rxt(:,k,usr_N2O5_M_ndx) = rxt(:,k,tag_NO2_NO3_ndx) * 1.724138e26_r8 * exp_fac(:)
879 : else
880 0 : rxt(:,k,usr_N2O5_M_ndx) = 0._r8
881 : end if
882 : end if
883 0 : if( usr_XNO2NO3_M_ndx > 0 ) then
884 0 : if( tag_NO2_NO3_ndx > 0 ) then
885 0 : call comp_exp( exp_fac, -10840.0_r8*tinv, ncol )
886 0 : rxt(:,k,usr_XNO2NO3_M_ndx) = rxt(:,k,tag_NO2_NO3_ndx) *1.724138e26_r8 * exp_fac(:)
887 : else
888 0 : rxt(:,k,usr_XNO2NO3_M_ndx) = 0._r8
889 : end if
890 : end if
891 0 : if( usr_NO2XNO3_M_ndx > 0 ) then
892 0 : if( tag_NO2_NO3_ndx > 0 ) then
893 0 : call comp_exp( exp_fac, -10840.0_r8*tinv, ncol )
894 0 : rxt(:,k,usr_NO2XNO3_M_ndx) = rxt(:,k,tag_NO2_NO3_ndx) * 1.734138e26_r8 * exp_fac(:)
895 : else
896 0 : rxt(:,k,usr_NO2XNO3_M_ndx) = 0._r8
897 : end if
898 : end if
899 :
900 : !-----------------------------------------------------------------
901 : ! set rates for:
902 : ! ... hno3 + oh --> no3 + h2o
903 : ! ho2no2 + m --> ho2 + no2 + m
904 : !-----------------------------------------------------------------
905 0 : if( usr_HNO3_OH_ndx > 0 ) then
906 0 : call comp_exp( exp_fac, 1335._r8*tinv, ncol )
907 0 : ko(:) = m(:,k) * 6.5e-34_r8 * exp_fac(:)
908 0 : call comp_exp( exp_fac, 2199._r8*tinv, ncol )
909 0 : ko(:) = ko(:) / (1._r8 + ko(:)/(2.7e-17_r8*exp_fac(:)))
910 0 : call comp_exp( exp_fac, 460._r8*tinv, ncol )
911 0 : rxt(:,k,usr_HNO3_OH_ndx) = ko(:) + 2.4e-14_r8*exp_fac(:)
912 : end if
913 0 : if( usr_XHNO3_OH_ndx > 0 ) then
914 0 : call comp_exp( exp_fac, 1335._r8*tinv, ncol )
915 0 : ko(:) = m(:,k) * 6.5e-34_r8 * exp_fac(:)
916 0 : call comp_exp( exp_fac, 2199._r8*tinv, ncol )
917 0 : ko(:) = ko(:) / (1._r8 + ko(:)/(2.7e-17_r8*exp_fac(:)))
918 0 : call comp_exp( exp_fac, 460._r8*tinv, ncol )
919 0 : rxt(:,k,usr_XHNO3_OH_ndx) = ko(:) + 2.4e-14_r8*exp_fac(:)
920 : end if
921 0 : if( usr_HO2NO2_M_ndx > 0 ) then
922 0 : if( tag_NO2_HO2_ndx > 0 ) then
923 0 : call comp_exp( exp_fac, -10900._r8*tinv, ncol )
924 0 : rxt(:,k,usr_HO2NO2_M_ndx) = rxt(:,k,tag_NO2_HO2_ndx) * exp_fac(:) / 2.1e-27_r8
925 : else
926 0 : rxt(:,k,usr_HO2NO2_M_ndx) = 0._r8
927 : end if
928 : end if
929 0 : if( usr_XHO2NO2_M_ndx > 0 ) then
930 0 : if( tag_NO2_HO2_ndx > 0 ) then
931 0 : call comp_exp( exp_fac, -10900._r8*tinv, ncol )
932 0 : rxt(:,k,usr_XHO2NO2_M_ndx) = rxt(:,k,tag_NO2_HO2_ndx) * exp_fac(:) / 2.1e-27_r8
933 : else
934 0 : rxt(:,k,usr_XHO2NO2_M_ndx) = 0._r8
935 : end if
936 : end if
937 : !-----------------------------------------------------------------
938 : ! ... co + oh --> co2 + ho2 (new single reaction for combined branches [JPL19])
939 : !-----------------------------------------------------------------
940 0 : if( usr_CO_OH_ndx > 0 ) then
941 0 : ko (:) = 6.9e-33_r8 * ( 298._r8 / temp(:ncol,k) )**(2.1_r8)
942 0 : kinf(:) = 1.1e-12_r8 * ( 298._r8 / temp(:ncol,k) )**(-1.3_r8)
943 :
944 0 : term2(:) = (1 + (log10( ko(:)*m(:,k) / kinf(:) ))**2)**(-1)
945 :
946 0 : term1(:) = (kinf(:) * ko(:)*m(:,k)) / (kinf(:) + ko(:)*m(:,k)) * (0.6_r8)**term2(:)
947 :
948 0 : rxt(:ncol,k,usr_CO_OH_ndx) = term1(:) + 1.85e-13_r8 * exp(-65._r8/temp(:ncol,k)) * (1._r8 - term1(:)/kinf(:))
949 :
950 : end if
951 : !-----------------------------------------------------------------
952 : ! ... co + oh --> co2 + ho2 (combined branches - do not use with CO_OH_b)
953 : ! note: for mechanisms prior to Dec 2022
954 : !-----------------------------------------------------------------
955 0 : if( usr_CO_OH_a_ndx > 0 ) then
956 0 : rxt(:,k,usr_CO_OH_a_ndx) = 1.5e-13_r8 * &
957 0 : (1._r8 + 6.e-7_r8*boltz_cgs*m(:,k)*temp(:ncol,k))
958 : end if
959 : !-----------------------------------------------------------------
960 : ! ... co + oh --> co2 + h (second branch JPL15-10, with CO+OH+M)
961 : ! note: for mechanisms prior to Dec 2022
962 : !-----------------------------------------------------------------
963 0 : if( usr_CO_OH_b_ndx > 0 ) then
964 0 : kinf(:) = 2.1e+09_r8 * (temp(:ncol,k)/ t0)**(6.1_r8)
965 0 : ko (:) = 1.5e-13_r8
966 :
967 0 : term1(:) = ko(:) / ( (kinf(:) / m(:,k)) )
968 0 : term2(:) = ko(:) / (1._r8 + term1(:))
969 :
970 0 : term1(:) = log10( term1(:) )
971 0 : term1(:) = 1.0_r8 / (1.0_r8 + term1(:)*term1(:))
972 :
973 0 : rxt(:ncol,k,usr_CO_OH_b_ndx) = term2(:) * (0.6_r8)**term1(:)
974 : end if
975 :
976 : !-----------------------------------------------------------------
977 : ! ... ho2 + ho2 --> h2o2
978 : ! note: this rate involves the water vapor number density
979 : !-----------------------------------------------------------------
980 0 : if( usr_HO2_HO2_ndx > 0 ) then
981 :
982 0 : call comp_exp( exp_fac, 460._r8*tinv, ncol )
983 0 : ko(:) = 3.0e-13_r8 * exp_fac(:)
984 0 : call comp_exp( exp_fac, 920._r8*tinv, ncol )
985 0 : kinf(:) = 2.1e-33_r8 * m(:,k) * exp_fac(:)
986 0 : call comp_exp( exp_fac, 2200._r8*tinv, ncol )
987 :
988 0 : if( h2o_ndx > 0 ) then
989 0 : fc(:) = 1._r8 + 1.4e-21_r8 * m(:,k) * h2ovmr(:,k) * exp_fac(:)
990 : else
991 0 : fc(:) = 1._r8 + 1.4e-21_r8 * invariants(:,k,inv_h2o_ndx) * exp_fac(:)
992 : end if
993 0 : rxt(:,k,usr_HO2_HO2_ndx) = (ko(:) + kinf(:)) * fc(:)
994 :
995 : end if
996 :
997 : !-----------------------------------------------------------------
998 : ! ... mco3 + no2 -> mpan
999 : !-----------------------------------------------------------------
1000 0 : if( usr_MCO3_NO2_ndx > 0 ) then
1001 0 : rxt(:,k,usr_MCO3_NO2_ndx) = 1.1e-11_r8 * tp(:) / m(:,k)
1002 : end if
1003 0 : if( usr_MCO3_XNO2_ndx > 0 ) then
1004 0 : rxt(:,k,usr_MCO3_XNO2_ndx) = 1.1e-11_r8 * tp(:) / m(:,k)
1005 : end if
1006 :
1007 : !-----------------------------------------------------------------
1008 : ! ... pan + m --> ch3co3 + no2 + m (JPL15-10)
1009 : !-----------------------------------------------------------------
1010 0 : call comp_exp( exp_fac, -14000._r8*tinv, ncol )
1011 0 : if( usr_PAN_M_ndx > 0 ) then
1012 0 : if( tag_CH3CO3_NO2_ndx > 0 ) then
1013 0 : rxt(:,k,usr_PAN_M_ndx) = rxt(:,k,tag_CH3CO3_NO2_ndx) * 1.111e28_r8 * exp_fac(:)
1014 : else
1015 0 : rxt(:,k,usr_PAN_M_ndx) = 0._r8
1016 : end if
1017 : end if
1018 0 : if( usr_XPAN_M_ndx > 0 ) then
1019 0 : if( tag_CH3CO3_NO2_ndx > 0 ) then
1020 0 : rxt(:,k,usr_XPAN_M_ndx) = rxt(:,k,tag_CH3CO3_NO2_ndx) * 1.111e28_r8 * exp_fac(:)
1021 : else
1022 0 : rxt(:,k,usr_XPAN_M_ndx) = 0._r8
1023 : end if
1024 : end if
1025 :
1026 : !-----------------------------------------------------------------
1027 : ! ... mpan + m --> mco3 + no2 + m (JPL15-10)
1028 : !-----------------------------------------------------------------
1029 0 : if( usr_MPAN_M_ndx > 0 ) then
1030 0 : if( tag_MCO3_NO2_ndx > 0 ) then
1031 0 : rxt(:,k,usr_MPAN_M_ndx) = rxt(:,k,tag_MCO3_NO2_ndx) * 1.111e28_r8 * exp_fac(:)
1032 : else
1033 0 : rxt(:,k,usr_MPAN_M_ndx) = 0._r8
1034 : end if
1035 : end if
1036 0 : if( usr_XMPAN_M_ndx > 0 ) then
1037 0 : if( tag_MCO3_NO2_ndx > 0 ) then
1038 0 : rxt(:,k,usr_XMPAN_M_ndx) = rxt(:,k,tag_MCO3_NO2_ndx) * 1.111e28_r8 * exp_fac(:)
1039 : else
1040 0 : rxt(:,k,usr_XMPAN_M_ndx) = 0._r8
1041 : end if
1042 : end if
1043 :
1044 : !lke-TS1
1045 : !-----------------------------------------------------------------
1046 : ! ... pbznit + m --> acbzo2 + no2 + m
1047 : !-----------------------------------------------------------------
1048 0 : if( usr_PBZNIT_M_ndx > 0 ) then
1049 0 : if( tag_ACBZO2_NO2_ndx > 0 ) then
1050 0 : rxt(:,k,usr_PBZNIT_M_ndx) = rxt(:,k,tag_ACBZO2_NO2_ndx) * 1.111e28_r8 * exp_fac(:)
1051 : else
1052 0 : rxt(:,k,usr_PBZNIT_M_ndx) = 0._r8
1053 : end if
1054 : end if
1055 : !-----------------------------------------------------------------
1056 : ! ... TERPAPAN + m --> TERPACO3 + no2 + m
1057 : !-----------------------------------------------------------------
1058 0 : if( usr_TERPAPAN_M_ndx > 0 ) then
1059 0 : if( tag_TERPACO3_NO2_ndx > 0 ) then
1060 0 : rxt(:,k,usr_TERPAPAN_M_ndx) = rxt(:,k,tag_TERPACO3_NO2_ndx) * 1.111e28_r8 * exp_fac(:)
1061 : else
1062 0 : rxt(:,k,usr_TERPAPAN_M_ndx) = 0._r8
1063 : end if
1064 : end if
1065 : !-----------------------------------------------------------------
1066 : ! ... TERPA2PAN + m --> TERPA2CO3 + no2 + m
1067 : !-----------------------------------------------------------------
1068 0 : if( usr_TERPA2PAN_M_ndx > 0 ) then
1069 0 : if( tag_TERPA2CO3_NO2_ndx > 0 ) then
1070 0 : rxt(:,k,usr_TERPA2PAN_M_ndx) = rxt(:,k,tag_TERPA2CO3_NO2_ndx) * 1.111e28_r8 * exp_fac(:)
1071 : else
1072 0 : rxt(:,k,usr_TERPA2PAN_M_ndx) = 0._r8
1073 : end if
1074 : end if
1075 : !-----------------------------------------------------------------
1076 : ! ... TERPA3PAN + m --> TERPA3CO3 + no2 + m
1077 : !-----------------------------------------------------------------
1078 0 : if( usr_TERPA3PAN_M_ndx > 0 ) then
1079 0 : if( tag_TERPA3CO3_NO2_ndx > 0 ) then
1080 0 : rxt(:,k,usr_TERPA3PAN_M_ndx) = rxt(:,k,tag_TERPA3CO3_NO2_ndx) * 1.111e28_r8 * exp_fac(:)
1081 : else
1082 0 : rxt(:,k,usr_TERPA3PAN_M_ndx) = 0._r8
1083 : end if
1084 : end if
1085 : !-----------------------------------------------------------------
1086 : ! ... xooh + oh -> h2o + oh
1087 : !-----------------------------------------------------------------
1088 0 : if( usr_XOOH_OH_ndx > 0 ) then
1089 0 : call comp_exp( exp_fac, 253._r8*tinv, ncol )
1090 0 : rxt(:,k,usr_XOOH_OH_ndx) = temp(:ncol,k)**2._r8 * 7.69e-17_r8 * exp_fac(:)
1091 : end if
1092 :
1093 : !-----------------------------------------------------------------
1094 : ! ... ch3coch3 + oh -> ro2 + h2o
1095 : !-----------------------------------------------------------------
1096 0 : if( usr_CH3COCH3_OH_ndx > 0 ) then
1097 0 : call comp_exp( exp_fac, -2000._r8*tinv, ncol )
1098 0 : rxt(:,k,usr_CH3COCH3_OH_ndx) = 3.82e-11_r8 * exp_fac(:) + 1.33e-13_r8
1099 : end if
1100 :
1101 : !-----------------------------------------------------------------
1102 : ! ... N + O2 -> NO + O
1103 : ! Rate coefficients calculated by J. Orlando, D. Kinnison, and J. Zhang (2024)
1104 : ! from data published in:
1105 : ! "Kinetics of the Reactions of N(4S) Atoms with O2 and CO2 over Wide Temperatures Ranges"
1106 : ! Abel Fernandez, A. Goumri, and Arthur Fontijn, 1998
1107 : ! https://doi.org/10.1021/jp972365k
1108 : !-----------------------------------------------------------------
1109 0 : if( usr_N_O2_ndx > 0 ) then
1110 0 : call comp_exp( exp_fac, -2557._r8*tinv, ncol )
1111 0 : rxt(:,k,usr_N_O2_ndx) = 2.0e-18_r8 * temp(:ncol,k)**2.15_r8 * exp_fac(:)
1112 : end if
1113 :
1114 : !-----------------------------------------------------------------
1115 : ! ... N2D + O2 -> NO + O
1116 : ! "On the rate coefficient of the N(2D)+O2->NO+O reaction in the terrestrial thermosphere"
1117 : ! Duff, J.W., H. Dothe, and R. D. Sharma, 2003
1118 : ! https://doi.org/10.1029/2002GL016720
1119 : !-----------------------------------------------------------------
1120 0 : if( usr_N2D_O2_ndx > 0 ) then
1121 0 : rxt(:,k,usr_N2D_O2_ndx) = 6.2e-12_r8 * temp(:ncol,k)/300.0_r8
1122 : end if
1123 :
1124 : !-----------------------------------------------------------------
1125 : ! ... N2D + e -> N + e Roble, 1995
1126 : ! "Energetics of the Mesosphere and Thermosphere"
1127 : ! R. Roble, 1995
1128 : ! https://doi.org/10.1029/GM087p0001
1129 : !-----------------------------------------------------------------
1130 0 : if( usr_N2D_e_ndx > 0 ) then
1131 0 : rxt(:,k,usr_N2D_e_ndx) = 3.6e-10_r8 * sqrt(tempe(:ncol,k)/300.0_r8)
1132 : end if
1133 :
1134 : !-----------------------------------------------------------------
1135 : ! ... DMS + OH --> .5 * SO2
1136 : ! JPL15-10 (use [O2] = 0.21*[M])
1137 : ! k = 8.2E-39 * exp(5376/T) * [O2] / (1 + 1.05E-5 *([O2]/[M]) * exp(3644/T))
1138 : !-----------------------------------------------------------------
1139 0 : if( usr_DMS_OH_ndx > 0 ) then
1140 0 : call comp_exp( exp_fac, 3644._r8*tinv, ncol )
1141 0 : ko(:) = 1._r8 + 1.05e-5_r8 * exp_fac * 0.21_r8
1142 0 : call comp_exp( exp_fac, 5376._r8*tinv, ncol )
1143 0 : rxt(:,k,usr_DMS_OH_ndx) = 8.2e-39_r8 * exp_fac * m(:,k) * 0.21_r8 / ko(:)
1144 : end if
1145 :
1146 : !-----------------------------------------------------------------
1147 : ! ... SO2 + OH --> SO4 (REFERENCE?? - not Liao)
1148 : !-----------------------------------------------------------------
1149 0 : if( usr_SO2_OH_ndx > 0 ) then
1150 0 : fc(:) = 3.0e-31_r8 *(300._r8*tinv(:))**3.3_r8
1151 0 : ko(:) = fc(:)*m(:,k)/(1._r8 + fc(:)*m(:,k)/1.5e-12_r8)
1152 0 : rxt(:,k,usr_SO2_OH_ndx) = ko(:)*.6_r8**(1._r8 + (log10(fc(:)*m(:,k)/1.5e-12_r8))**2._r8)**(-1._r8)
1153 : end if
1154 : !RHS TS2
1155 : !-----------------------------------------------------------------
1156 : ! ... ISOPZD1O2 --> HPALD etc. Wennberg 2018 for rate
1157 : !-----------------------------------------------------------------
1158 0 : if( usr_ISOPZD1O2_ndx > 0 ) then
1159 0 : call comp_exp( exp_fac, -12200._r8*tinv, ncol )
1160 0 : ko(:) = 5.05e15_r8 * exp_fac(:)
1161 0 : call comp_exp( exp_fac, 1.e8_r8*tinv**3._r8, ncol )
1162 0 : rxt(:,k,usr_ISOPZD1O2_ndx) = ko(:)*exp_fac(:)
1163 : end if
1164 : !-----------------------------------------------------------------
1165 : ! ... ISOPZD4O2 --> HPALD etc. Wennberg 2018 for rate
1166 : !-----------------------------------------------------------------
1167 0 : if( usr_ISOPZD4O2_ndx > 0 ) then
1168 0 : call comp_exp( exp_fac, -7160._r8*tinv, ncol )
1169 0 : ko(:) = 2.22e9_r8 * exp_fac(:)
1170 0 : call comp_exp( exp_fac, 1.e8_r8*tinv**3._r8, ncol )
1171 0 : rxt(:,k,usr_ISOPZD4O2_ndx) = ko(:)*exp_fac(:)
1172 : end if
1173 : !-----------------------------------------------------------------
1174 : ! ... ISOPB1O2_NOn Temp/Pressure Dependent Nitrate Yield
1175 : !-----------------------------------------------------------------
1176 0 : if( usr_ISOPB1O2_NOn_ndx > 0 ) then
1177 0 : nyield = (1._r8-0.14_r8)/0.14_r8
1178 0 : natom = 6.0_r8
1179 0 : exp_natom = exp( natom )
1180 : acorr = (2.0e-22_r8*exp_natom*2.45e19_r8)/(1._r8+((2.0e-22_r8* &
1181 : exp_natom*2.45e19_r8)/(0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))* &
1182 : 0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*2.45e19_r8)/ &
1183 0 : (0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))**2._r8))
1184 0 : aterm(:) = (2.0e-22_r8*exp_natom*m(:,k))/(1._r8+((2.0e-22_r8* &
1185 0 : exp_natom*m(:,k))/(0.43_r8*(298._r8*tinv(:))**8._r8)))* &
1186 0 : 0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*m(:,k))/ &
1187 0 : (0.43_r8*(298._r8*tinv(:))**8._r8)))**2._r8))
1188 0 : call comp_exp( exp_fac, 360._r8*tinv, ncol )
1189 0 : rxt(:,k,usr_ISOPB1O2_NOn_ndx) = 2.7e-12_r8 * exp_fac(:)*aterm(:)/(aterm(:)+acorr*nyield)
1190 0 : rxt(:,k,usr_ISOPB1O2_NOa_ndx) = 2.7e-12_r8 * exp_fac(:)*acorr*nyield/(aterm(:)+acorr*nyield)
1191 : end if
1192 : !-----------------------------------------------------------------
1193 : ! ... ISOPB4O2_NOn Temp/Pressure Dependent Nitrate Yield
1194 : !-----------------------------------------------------------------
1195 0 : if( usr_ISOPB4O2_NOn_ndx > 0 ) then
1196 0 : nyield = (1._r8-0.13_r8)/0.13_r8
1197 0 : natom = 6.0_r8
1198 0 : exp_natom = exp( natom )
1199 : acorr = (2.0e-22_r8*exp_natom*2.45e19_r8)/(1._r8+((2.0e-22_r8* &
1200 : exp_natom*2.45e19_r8)/(0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))* &
1201 : 0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*2.45e19_r8)/ &
1202 0 : (0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))**2._r8))
1203 0 : aterm(:) = (2.0e-22_r8*exp_natom*m(:,k))/(1._r8+((2.0e-22_r8* &
1204 0 : exp_natom*m(:,k))/(0.43_r8*(298._r8*tinv(:))**8._r8)))* &
1205 0 : 0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*m(:,k))/ &
1206 0 : (0.43_r8*(298._r8*tinv(:))**8._r8)))**2._r8))
1207 0 : call comp_exp( exp_fac, 360._r8*tinv, ncol )
1208 0 : rxt(:,k,usr_ISOPB4O2_NOn_ndx) = 2.7e-12_r8 * exp_fac(:)*aterm(:)/(aterm(:)+acorr*nyield)
1209 0 : rxt(:,k,usr_ISOPB4O2_NOa_ndx) = 2.7e-12_r8 * exp_fac(:)*acorr*nyield/(aterm(:)+acorr*nyield)
1210 : end if
1211 : !-----------------------------------------------------------------
1212 : ! ... ISOPED1O2_NOn Temp/Pressure Dependent Nitrate Yield
1213 : !-----------------------------------------------------------------
1214 0 : if( usr_ISOPED1O2_NOn_ndx > 0 ) then
1215 0 : nyield = (1._r8-0.12_r8)/0.12_r8
1216 0 : natom = 6.0_r8
1217 0 : exp_natom = exp( natom )
1218 : acorr = (2.0e-22_r8*exp_natom*2.45e19_r8)/(1._r8+((2.0e-22_r8* &
1219 : exp_natom*2.45e19_r8)/(0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))* &
1220 : 0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*2.45e19_r8)/ &
1221 0 : (0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))**2._r8))
1222 0 : aterm(:) = (2.0e-22_r8*exp_natom*m(:,k))/(1._r8+((2.0e-22_r8* &
1223 0 : exp_natom*m(:,k))/(0.43_r8*(298._r8*tinv(:))**8._r8)))* &
1224 0 : 0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*m(:,k))/ &
1225 0 : (0.43_r8*(298._r8*tinv(:))**8._r8)))**2._r8))
1226 0 : call comp_exp( exp_fac, 360._r8*tinv, ncol )
1227 0 : rxt(:,k,usr_ISOPED1O2_NOn_ndx) = 2.7e-12_r8 * exp_fac(:)*aterm(:)/(aterm(:)+acorr*nyield)
1228 0 : rxt(:,k,usr_ISOPED1O2_NOa_ndx) = 2.7e-12_r8 * exp_fac(:)*acorr*nyield/(aterm(:)+acorr*nyield)
1229 : end if
1230 : !-----------------------------------------------------------------
1231 : ! ... ISOPED4O2_NOn Temp/Pressure Dependent Nitrate Yield
1232 : !-----------------------------------------------------------------
1233 0 : if( usr_ISOPED4O2_NOn_ndx > 0 ) then
1234 0 : nyield = (1._r8-0.12_r8)/0.12_r8
1235 0 : natom = 6.0_r8
1236 0 : exp_natom = exp( natom )
1237 : acorr = (2.0e-22_r8*exp_natom*2.45e19_r8)/(1._r8+((2.0e-22_r8* &
1238 : exp_natom*2.45e19_r8)/(0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))* &
1239 : 0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*2.45e19_r8)/ &
1240 0 : (0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))**2._r8))
1241 0 : aterm(:) = (2.0e-22_r8*exp_natom*m(:,k))/(1._r8+((2.0e-22_r8* &
1242 0 : exp_natom*m(:,k))/(0.43_r8*(298._r8*tinv(:))**8._r8)))* &
1243 0 : 0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*m(:,k))/ &
1244 0 : (0.43_r8*(298._r8*tinv(:))**8._r8)))**2._r8))
1245 0 : call comp_exp( exp_fac, 360._r8*tinv, ncol )
1246 0 : rxt(:,k,usr_ISOPED4O2_NOn_ndx) = 2.7e-12_r8 * exp_fac(:)*aterm(:)/(aterm(:)+acorr*nyield)
1247 0 : rxt(:,k,usr_ISOPED4O2_NOa_ndx) = 2.7e-12_r8 * exp_fac(:)*acorr*nyield/(aterm(:)+acorr*nyield)
1248 : end if
1249 : !-----------------------------------------------------------------
1250 : ! ... ISOPZD1O2_NOn Temp/Pressure Dependent Nitrate Yield
1251 : !-----------------------------------------------------------------
1252 0 : if( usr_ISOPZD1O2_NOn_ndx > 0 ) then
1253 0 : nyield = (1._r8-0.12_r8)/0.12_r8
1254 0 : natom = 6.0_r8
1255 0 : exp_natom = exp( natom )
1256 : acorr = (2.0e-22_r8*exp_natom*2.45e19_r8)/(1._r8+((2.0e-22_r8* &
1257 : exp_natom*2.45e19_r8)/(0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))* &
1258 : 0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*2.45e19_r8)/ &
1259 0 : (0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))**2._r8))
1260 0 : aterm(:) = (2.0e-22_r8*exp_natom*m(:,k))/(1._r8+((2.0e-22_r8* &
1261 0 : exp_natom*m(:,k))/(0.43_r8*(298._r8*tinv(:))**8._r8)))* &
1262 0 : 0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*m(:,k))/ &
1263 0 : (0.43_r8*(298._r8*tinv(:))**8._r8)))**2._r8))
1264 0 : call comp_exp( exp_fac, 360._r8*tinv, ncol )
1265 0 : rxt(:,k,usr_ISOPZD1O2_NOn_ndx) = 2.7e-12_r8 * exp_fac(:)*aterm(:)/(aterm(:)+acorr*nyield)
1266 0 : rxt(:,k,usr_ISOPZD1O2_NOa_ndx) = 2.7e-12_r8 * exp_fac(:)*acorr*nyield/(aterm(:)+acorr*nyield)
1267 : end if
1268 : !-----------------------------------------------------------------
1269 : ! ... ISOPZD4O2_NOn Temp/Pressure Dependent Nitrate Yield
1270 : !-----------------------------------------------------------------
1271 0 : if( usr_ISOPZD4O2_NOn_ndx > 0 ) then
1272 0 : nyield = (1._r8-0.12_r8)/0.12_r8
1273 0 : natom = 6.0_r8
1274 0 : exp_natom = exp( natom )
1275 : acorr = (2.0e-22_r8*exp_natom*2.45e19_r8)/(1._r8+((2.0e-22_r8* &
1276 : exp_natom*2.45e19_r8)/(0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))* &
1277 : 0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*2.45e19_r8)/ &
1278 0 : (0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))**2._r8))
1279 0 : aterm(:) = (2.0e-22_r8*exp_natom*m(:,k))/(1._r8+((2.0e-22_r8* &
1280 0 : exp_natom*m(:,k))/(0.43_r8*(298._r8*tinv(:))**8._r8)))* &
1281 0 : 0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*m(:,k))/ &
1282 0 : (0.43_r8*(298._r8*tinv(:))**8._r8)))**2._r8))
1283 0 : call comp_exp( exp_fac, 360._r8*tinv, ncol )
1284 0 : rxt(:,k,usr_ISOPZD4O2_NOn_ndx) = 2.7e-12_r8 * exp_fac(:)*aterm(:)/(aterm(:)+acorr*nyield)
1285 0 : rxt(:,k,usr_ISOPZD4O2_NOa_ndx) = 2.7e-12_r8 * exp_fac(:)*acorr*nyield/(aterm(:)+acorr*nyield)
1286 : end if
1287 : !-----------------------------------------------------------------
1288 : ! ... ISOPNO3_NOn Temp/Pressure Dependent Nitrate Yield
1289 : !-----------------------------------------------------------------
1290 0 : if( usr_ISOPNO3_NOn_ndx > 0 ) then
1291 0 : nyield = (1._r8-0.135_r8)/0.135_r8
1292 0 : natom = 9.0_r8
1293 0 : exp_natom = exp( natom )
1294 : acorr = (2.0e-22_r8*exp_natom*2.45e19_r8)/(1._r8+((2.0e-22_r8* &
1295 : exp_natom*2.45e19_r8)/(0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))* &
1296 : 0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*2.45e19_r8)/ &
1297 0 : (0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))**2._r8))
1298 0 : aterm(:) = (2.0e-22_r8*exp_natom*m(:,k))/(1._r8+((2.0e-22_r8* &
1299 0 : exp_natom*m(:,k))/(0.43_r8*(298._r8*tinv(:))**8._r8)))* &
1300 0 : 0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*m(:,k))/ &
1301 0 : (0.43_r8*(298._r8*tinv(:))**8._r8)))**2._r8))
1302 0 : call comp_exp( exp_fac, 360._r8*tinv, ncol )
1303 0 : rxt(:,k,usr_ISOPNO3_NOn_ndx) = 2.7e-12_r8 * exp_fac(:)*aterm(:)/(aterm(:)+acorr*nyield)
1304 0 : rxt(:,k,usr_ISOPNO3_NOa_ndx) = 2.7e-12_r8 * exp_fac(:)*acorr*nyield/(aterm(:)+acorr*nyield)
1305 : end if
1306 : !-----------------------------------------------------------------
1307 : ! ... MVKO2_NOn Temp/Pressure Dependent Nitrate Yield
1308 : !-----------------------------------------------------------------
1309 0 : if( usr_MVKO2_NOn_ndx > 0 ) then
1310 0 : nyield = (1._r8-0.04_r8)/0.04_r8
1311 0 : natom = 6.0_r8
1312 0 : exp_natom = exp( natom )
1313 : acorr = (2.0e-22_r8*exp_natom*2.45e19_r8)/(1._r8+((2.0e-22_r8* &
1314 : exp_natom*2.45e19_r8)/(0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))* &
1315 : 0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*2.45e19_r8)/ &
1316 0 : (0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))**2._r8))
1317 0 : aterm(:) = (2.0e-22_r8*exp_natom*m(:,k))/(1._r8+((2.0e-22_r8* &
1318 0 : exp_natom*m(:,k))/(0.43_r8*(298._r8*tinv(:))**8._r8)))* &
1319 0 : 0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*m(:,k))/ &
1320 0 : (0.43_r8*(298._r8*tinv(:))**8._r8)))**2._r8))
1321 0 : call comp_exp( exp_fac, 360._r8*tinv, ncol )
1322 0 : rxt(:,k,usr_MVKO2_NOn_ndx) = 2.7e-12_r8 * exp_fac(:)*aterm(:)/(aterm(:)+acorr*nyield)
1323 0 : rxt(:,k,usr_MVKO2_NOa_ndx) = 2.7e-12_r8 * exp_fac(:)*acorr*nyield/(aterm(:)+acorr*nyield)
1324 : end if
1325 : !-----------------------------------------------------------------
1326 : ! ... MACRO2_NOn Temp/Pressure Dependent Nitrate Yield
1327 : !-----------------------------------------------------------------
1328 0 : if( usr_MACRO2_NOn_ndx > 0 ) then
1329 0 : nyield = (1._r8-0.06_r8)/0.06_r8
1330 0 : natom = 6.0_r8
1331 0 : exp_natom = exp( natom )
1332 : acorr = (2.0e-22_r8*exp_natom*2.45e19_r8)/(1._r8+((2.0e-22_r8* &
1333 : exp_natom*2.45e19_r8)/(0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))* &
1334 : 0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*2.45e19_r8)/ &
1335 0 : (0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))**2._r8))
1336 0 : aterm(:) = (2.0e-22_r8*exp_natom*m(:,k))/(1._r8+((2.0e-22_r8* &
1337 0 : exp_natom*m(:,k))/(0.43_r8*(298._r8*tinv(:))**8._r8)))* &
1338 0 : 0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*m(:,k))/ &
1339 0 : (0.43_r8*(298._r8*tinv(:))**8._r8)))**2._r8))
1340 0 : call comp_exp( exp_fac, 360._r8*tinv, ncol )
1341 0 : rxt(:,k,usr_MACRO2_NOn_ndx) = 2.7e-12_r8 * exp_fac(:)*aterm(:)/(aterm(:)+acorr*nyield)
1342 0 : rxt(:,k,usr_MACRO2_NOa_ndx) = 2.7e-12_r8 * exp_fac(:)*acorr*nyield/(aterm(:)+acorr*nyield)
1343 : end if
1344 : !-----------------------------------------------------------------
1345 : ! ... IEPOXOO_NOn Temp/Pressure Dependent Nitrate Yield
1346 : !-----------------------------------------------------------------
1347 0 : if( usr_IEPOXOO_NOn_ndx > 0 ) then
1348 0 : nyield = (1._r8-0.025_r8)/0.025_r8
1349 0 : natom = 8.0_r8
1350 0 : exp_natom = exp( natom )
1351 : acorr = (2.0e-22_r8*exp_natom*2.45e19_r8)/(1._r8+((2.0e-22_r8* &
1352 : exp_natom*2.45e19_r8)/(0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))* &
1353 : 0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*2.45e19_r8)/ &
1354 0 : (0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))**2._r8))
1355 0 : aterm(:) = (2.0e-22_r8*exp_natom*m(:,k))/(1._r8+((2.0e-22_r8* &
1356 0 : exp_natom*m(:,k))/(0.43_r8*(298._r8*tinv(:))**8._r8)))* &
1357 0 : 0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*m(:,k))/ &
1358 0 : (0.43_r8*(298._r8*tinv(:))**8._r8)))**2._r8))
1359 0 : call comp_exp( exp_fac, 360._r8*tinv, ncol )
1360 0 : rxt(:,k,usr_IEPOXOO_NOn_ndx) = 2.7e-12_r8 * exp_fac(:)*aterm(:)/(aterm(:)+acorr*nyield)
1361 0 : rxt(:,k,usr_IEPOXOO_NOa_ndx) = 2.7e-12_r8 * exp_fac(:)*acorr*nyield/(aterm(:)+acorr*nyield)
1362 : end if
1363 : !-----------------------------------------------------------------
1364 : ! ... ISOPN1DO2_NOn Temp/Pressure Dependent Nitrate Yield
1365 : !-----------------------------------------------------------------
1366 0 : if( usr_ISOPN1DO2_NOn_ndx > 0 ) then
1367 0 : nyield = (1._r8-0.084_r8)/0.084_r8
1368 0 : natom = 11.0_r8
1369 0 : exp_natom = exp( natom )
1370 : acorr = (2.0e-22_r8*exp_natom*2.45e19_r8)/(1._r8+((2.0e-22_r8* &
1371 : exp_natom*2.45e19_r8)/(0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))* &
1372 : 0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*2.45e19_r8)/ &
1373 0 : (0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))**2._r8))
1374 0 : aterm(:) = (2.0e-22_r8*exp_natom*m(:,k))/(1._r8+((2.0e-22_r8* &
1375 0 : exp_natom*m(:,k))/(0.43_r8*(298._r8*tinv(:))**8._r8)))* &
1376 0 : 0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*m(:,k))/ &
1377 0 : (0.43_r8*(298._r8*tinv(:))**8._r8)))**2._r8))
1378 0 : call comp_exp( exp_fac, 360._r8*tinv, ncol )
1379 0 : rxt(:,k,usr_ISOPN1DO2_NOn_ndx) = 2.7e-12_r8 * exp_fac(:)*aterm(:)/(aterm(:)+acorr*nyield)
1380 0 : rxt(:,k,usr_ISOPN1DO2_NOa_ndx) = 2.7e-12_r8 * exp_fac(:)*acorr*nyield/(aterm(:)+acorr*nyield)
1381 : end if
1382 : !-----------------------------------------------------------------
1383 : ! ... ISOPN2BO2_NOn Temp/Pressure Dependent Nitrate Yield
1384 : !-----------------------------------------------------------------
1385 0 : if( usr_ISOPN2BO2_NOn_ndx > 0 ) then
1386 0 : nyield = (1._r8-0.065_r8)/0.065_r8
1387 0 : natom = 11.0_r8
1388 0 : exp_natom = exp( natom )
1389 : acorr = (2.0e-22_r8*exp_natom*2.45e19_r8)/(1._r8+((2.0e-22_r8* &
1390 : exp_natom*2.45e19_r8)/(0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))* &
1391 : 0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*2.45e19_r8)/ &
1392 0 : (0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))**2._r8))
1393 0 : aterm(:) = (2.0e-22_r8*exp_natom*m(:,k))/(1._r8+((2.0e-22_r8* &
1394 0 : exp_natom*m(:,k))/(0.43_r8*(298._r8*tinv(:))**8._r8)))* &
1395 0 : 0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*m(:,k))/ &
1396 0 : (0.43_r8*(298._r8*tinv(:))**8._r8)))**2._r8))
1397 0 : call comp_exp( exp_fac, 360._r8*tinv, ncol )
1398 0 : rxt(:,k,usr_ISOPN2BO2_NOn_ndx) = 2.7e-12_r8 * exp_fac(:)*aterm(:)/(aterm(:)+acorr*nyield)
1399 0 : rxt(:,k,usr_ISOPN2BO2_NOa_ndx) = 2.7e-12_r8 * exp_fac(:)*acorr*nyield/(aterm(:)+acorr*nyield)
1400 : end if
1401 : !-----------------------------------------------------------------
1402 : ! ... ISOPN3BO2_NOn Temp/Pressure Dependent Nitrate Yield
1403 : !-----------------------------------------------------------------
1404 0 : if( usr_ISOPN3BO2_NOn_ndx > 0 ) then
1405 0 : nyield = (1._r8-0.053_r8)/0.053_r8
1406 0 : natom = 11.0_r8
1407 0 : exp_natom = exp( natom )
1408 : acorr = (2.0e-22_r8*exp_natom*2.45e19_r8)/(1._r8+((2.0e-22_r8* &
1409 : exp_natom*2.45e19_r8)/(0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))* &
1410 : 0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*2.45e19_r8)/ &
1411 0 : (0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))**2._r8))
1412 0 : aterm(:) = (2.0e-22_r8*exp_natom*m(:,k))/(1._r8+((2.0e-22_r8* &
1413 0 : exp_natom*m(:,k))/(0.43_r8*(298._r8*tinv(:))**8._r8)))* &
1414 0 : 0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*m(:,k))/ &
1415 0 : (0.43_r8*(298._r8*tinv(:))**8._r8)))**2._r8))
1416 0 : call comp_exp( exp_fac, 360._r8*tinv, ncol )
1417 0 : rxt(:,k,usr_ISOPN3BO2_NOn_ndx) = 2.7e-12_r8 * exp_fac(:)*aterm(:)/(aterm(:)+acorr*nyield)
1418 0 : rxt(:,k,usr_ISOPN3BO2_NOa_ndx) = 2.7e-12_r8 * exp_fac(:)*acorr*nyield/(aterm(:)+acorr*nyield)
1419 : end if
1420 : !-----------------------------------------------------------------
1421 : ! ... ISOPN4DO2_NOn Temp/Pressure Dependent Nitrate Yield
1422 : !-----------------------------------------------------------------
1423 0 : if( usr_ISOPN4DO2_NOn_ndx > 0 ) then
1424 0 : nyield = (1._r8-0.165_r8)/0.165_r8
1425 0 : natom = 11.0_r8
1426 0 : exp_natom = exp( natom )
1427 : acorr = (2.0e-22_r8*exp_natom*2.45e19_r8)/(1._r8+((2.0e-22_r8* &
1428 : exp_natom*2.45e19_r8)/(0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))* &
1429 : 0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*2.45e19_r8)/ &
1430 0 : (0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))**2._r8))
1431 0 : aterm(:) = (2.0e-22_r8*exp_natom*m(:,k))/(1._r8+((2.0e-22_r8* &
1432 0 : exp_natom*m(:,k))/(0.43_r8*(298._r8*tinv(:))**8._r8)))* &
1433 0 : 0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*m(:,k))/ &
1434 0 : (0.43_r8*(298._r8*tinv(:))**8._r8)))**2._r8))
1435 0 : call comp_exp( exp_fac, 360._r8*tinv, ncol )
1436 0 : rxt(:,k,usr_ISOPN4DO2_NOn_ndx) = 2.7e-12_r8 * exp_fac(:)*aterm(:)/(aterm(:)+acorr*nyield)
1437 0 : rxt(:,k,usr_ISOPN4DO2_NOa_ndx) = 2.7e-12_r8 * exp_fac(:)*acorr*nyield/(aterm(:)+acorr*nyield)
1438 : end if
1439 : !-----------------------------------------------------------------
1440 : ! ... ISOPNBNO3O2_NOn Temp/Pressure Dependent Nitrate Yield
1441 : !-----------------------------------------------------------------
1442 0 : if( usr_ISOPNBNO3O2_NOn_ndx > 0 ) then
1443 0 : nyield = (1._r8-0.203_r8)/0.203_r8
1444 0 : natom = 11.0_r8
1445 0 : exp_natom = exp( natom )
1446 : acorr = (2.0e-22_r8*exp_natom*2.45e19_r8)/(1._r8+((2.0e-22_r8* &
1447 : exp_natom*2.45e19_r8)/(0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))* &
1448 : 0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*2.45e19_r8)/ &
1449 0 : (0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))**2._r8))
1450 0 : aterm(:) = (2.0e-22_r8*exp_natom*m(:,k))/(1._r8+((2.0e-22_r8* &
1451 0 : exp_natom*m(:,k))/(0.43_r8*(298._r8*tinv(:))**8._r8)))* &
1452 0 : 0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*m(:,k))/ &
1453 0 : (0.43_r8*(298._r8*tinv(:))**8._r8)))**2._r8))
1454 0 : call comp_exp( exp_fac, 360._r8*tinv, ncol )
1455 0 : rxt(:,k,usr_ISOPNBNO3O2_NOn_ndx) = 2.7e-12_r8 * exp_fac(:)*aterm(:)/(aterm(:)+acorr*nyield)
1456 0 : rxt(:,k,usr_ISOPNBNO3O2_NOa_ndx) = 2.7e-12_r8 * exp_fac(:)*acorr*nyield/(aterm(:)+acorr*nyield)
1457 : end if
1458 : !-----------------------------------------------------------------
1459 : ! ... ISOPNOOHBO2_NOn Temp/Pressure Dependent Nitrate Yield
1460 : !-----------------------------------------------------------------
1461 0 : if( usr_ISOPNOOHBO2_NOn_ndx > 0 ) then
1462 0 : nyield = (1._r8-0.141_r8)/0.141_r8
1463 0 : natom = 12.0_r8
1464 0 : exp_natom = exp( natom )
1465 : acorr = (2.0e-22_r8*exp_natom*2.45e19_r8)/(1._r8+((2.0e-22_r8* &
1466 : exp_natom*2.45e19_r8)/(0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))* &
1467 : 0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*2.45e19_r8)/ &
1468 0 : (0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))**2._r8))
1469 0 : aterm(:) = (2.0e-22_r8*exp_natom*m(:,k))/(1._r8+((2.0e-22_r8* &
1470 0 : exp_natom*m(:,k))/(0.43_r8*(298._r8*tinv(:))**8._r8)))* &
1471 0 : 0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*m(:,k))/ &
1472 0 : (0.43_r8*(298._r8*tinv(:))**8._r8)))**2._r8))
1473 0 : call comp_exp( exp_fac, 360._r8*tinv, ncol )
1474 0 : rxt(:,k,usr_ISOPNOOHBO2_NOn_ndx) = 2.7e-12_r8 * exp_fac(:)*aterm(:)/(aterm(:)+acorr*nyield)
1475 0 : rxt(:,k,usr_ISOPNOOHBO2_NOa_ndx) = 2.7e-12_r8 * exp_fac(:)*acorr*nyield/(aterm(:)+acorr*nyield)
1476 : end if
1477 : !-----------------------------------------------------------------
1478 : ! ... ISOPNOOHDO2_NOn Temp/Pressure Dependent Nitrate Yield
1479 : !-----------------------------------------------------------------
1480 0 : if( usr_ISOPNOOHDO2_NOn_ndx > 0 ) then
1481 0 : nyield = (1._r8-0.045_r8)/0.045_r8
1482 0 : natom = 12.0_r8
1483 0 : exp_natom = exp( natom )
1484 : acorr = (2.0e-22_r8*exp_natom*2.45e19_r8)/(1._r8+((2.0e-22_r8* &
1485 : exp_natom*2.45e19_r8)/(0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))* &
1486 : 0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*2.45e19_r8)/ &
1487 0 : (0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))**2._r8))
1488 0 : aterm(:) = (2.0e-22_r8*exp_natom*m(:,k))/(1._r8+((2.0e-22_r8* &
1489 0 : exp_natom*m(:,k))/(0.43_r8*(298._r8*tinv(:))**8._r8)))* &
1490 0 : 0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*m(:,k))/ &
1491 0 : (0.43_r8*(298._r8*tinv(:))**8._r8)))**2._r8))
1492 0 : call comp_exp( exp_fac, 360._r8*tinv, ncol )
1493 0 : rxt(:,k,usr_ISOPNOOHDO2_NOn_ndx) = 2.7e-12_r8 * exp_fac(:)*aterm(:)/(aterm(:)+acorr*nyield)
1494 0 : rxt(:,k,usr_ISOPNOOHDO2_NOa_ndx) = 2.7e-12_r8 * exp_fac(:)*acorr*nyield/(aterm(:)+acorr*nyield)
1495 : end if
1496 : !-----------------------------------------------------------------
1497 : ! ... NC4CHOO2_NOn Temp/Pressure Dependent Nitrate Yield
1498 : !-----------------------------------------------------------------
1499 0 : if( usr_NC4CHOO2_NOn_ndx > 0 ) then
1500 0 : nyield = (1._r8-0.021_r8)/0.021_r8
1501 0 : natom = 11.0_r8
1502 0 : exp_natom = exp( natom )
1503 : acorr = (2.0e-22_r8*exp_natom*2.45e19_r8)/(1._r8+((2.0e-22_r8* &
1504 : exp_natom*2.45e19_r8)/(0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))* &
1505 : 0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*2.45e19_r8)/ &
1506 0 : (0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))**2._r8))
1507 0 : aterm(:) = (2.0e-22_r8*exp_natom*m(:,k))/(1._r8+((2.0e-22_r8* &
1508 0 : exp_natom*m(:,k))/(0.43_r8*(298._r8*tinv(:))**8._r8)))* &
1509 0 : 0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*m(:,k))/ &
1510 0 : (0.43_r8*(298._r8*tinv(:))**8._r8)))**2._r8))
1511 0 : call comp_exp( exp_fac, 360._r8*tinv, ncol )
1512 0 : rxt(:,k,usr_NC4CHOO2_NOn_ndx) = 2.7e-12_r8 * exp_fac(:)*aterm(:)/(aterm(:)+acorr*nyield)
1513 0 : rxt(:,k,usr_NC4CHOO2_NOa_ndx) = 2.7e-12_r8 * exp_fac(:)*acorr*nyield/(aterm(:)+acorr*nyield)
1514 : end if
1515 : !
1516 : ! reduced hydrocarbon scheme
1517 : !
1518 0 : if ( usr_C2O3_NO2_ndx > 0 ) then
1519 0 : ko(:) = 2.6e-28_r8 * m(:,k)
1520 0 : kinf(:) = 1.2e-11_r8
1521 0 : rxt(:,k,usr_C2O3_NO2_ndx) = (ko/(1._r8+ko/kinf)) * 0.6_r8**(1._r8/(1._r8+(log10(ko/kinf))**2))
1522 : end if
1523 0 : if ( usr_C2O3_XNO2_ndx > 0 ) then
1524 0 : ko(:) = 2.6e-28_r8 * m(:,k)
1525 0 : kinf(:) = 1.2e-11_r8
1526 0 : rxt(:,k,usr_C2O3_XNO2_ndx) = (ko/(1._r8+ko/kinf)) * 0.6_r8**(1._r8/(1._r8+(log10(ko/kinf))**2))
1527 : end if
1528 0 : if ( usr_C2H4_OH_ndx > 0 ) then
1529 0 : ko(:) = 1.0e-28_r8 * m(:,k)
1530 0 : kinf(:) = 8.8e-12_r8
1531 0 : rxt(:,k,usr_C2H4_OH_ndx) = (ko/(1._r8+ko/kinf)) * 0.6_r8**(1._r8/(1._r8+(log(ko/kinf))**2))
1532 : end if
1533 0 : if ( usr_XO2N_HO2_ndx > 0 ) then
1534 0 : rxt(:,k,usr_XO2N_HO2_ndx) = rxt(:,k,tag_XO2N_NO_ndx)*rxt(:,k,tag_XO2_HO2_ndx)/(rxt(:,k,tag_XO2_NO_ndx)+1.e-36_r8)
1535 : end if
1536 :
1537 : !
1538 : ! hydrolysis reactions on wetted aerosols
1539 : !
1540 : if( usr_NO2_aer_ndx > 0 .or. usr_NO3_aer_ndx > 0 .or. usr_N2O5_aer_ndx > 0 .or. usr_HO2_aer_ndx > 0 &
1541 0 : .or. usr_GLYOXAL_aer_ndx > 0 ) then
1542 :
1543 0 : long_loop : do i = 1,ncol
1544 :
1545 0 : sfc => sfc_array(i,k,:)
1546 0 : dm_aer => dm_array(i,k,:)
1547 :
1548 0 : c_n2o5 = 1.40e3_r8 * sqrt_t(i) ! mean molecular speed of n2o5
1549 0 : c_no3 = 1.85e3_r8 * sqrt_t(i) ! mean molecular speed of no3
1550 0 : c_no2 = 2.15e3_r8 * sqrt_t(i) ! mean molecular speed of no2
1551 0 : c_ho2 = 2.53e3_r8 * sqrt_t(i) ! mean molecular speed of ho2
1552 0 : c_glyoxal = 1.455e4_r8 * sqrt_t_58(i) ! mean molecular speed of ho2
1553 0 : c_isopnita = 1.20e3_r8 * sqrt_t(i) ! mean molecular speed of isopnita
1554 0 : c_isopnitb = 1.20e3_r8 * sqrt_t(i) ! mean molecular speed of isopnitb
1555 0 : c_onitr = 1.20e3_r8 * sqrt_t(i) ! mean molecular speed of onitr
1556 0 : c_honitr = 1.26e3_r8 * sqrt_t(i) ! mean molecular speed of honitr
1557 0 : c_terpnit = 0.992e3_r8 * sqrt_t(i) ! mean molecular speed of terpnit
1558 0 : c_nterpooh = 0.957e3_r8 * sqrt_t(i) ! mean molecular speed of nterpooh
1559 0 : c_nc4cho = 1.21e3_r8 * sqrt_t(i) ! mean molecular speed of nc4cho
1560 0 : c_nc4ch2oh = 1.20e3_r8 * sqrt_t(i) ! mean molecular speed of nc4ch2oh
1561 0 : c_isopfdn = 9.68e2_r8 * sqrt_t(i) ! mean molecular speed of isopfdn
1562 0 : c_isopfnp = 1.04e3_r8 * sqrt_t(i) ! mean molecular speed of isopfnp
1563 0 : c_isopn2b = 1.20e3_r8 * sqrt_t(i) ! mean molecular speed of isopn2
1564 0 : c_isopn1d = 1.20e3_r8 * sqrt_t(i) ! mean molecular speed of isopn1d
1565 0 : c_isopn4d = 1.20e3_r8 * sqrt_t(i) ! mean molecular speed of isopn4d
1566 0 : c_inoohd = 1.14e3_r8 * sqrt_t(i) ! mean molecular speed of inoohd
1567 0 : c_inheb = 1.14e3_r8 * sqrt_t(i) ! mean molecular speed of inheb
1568 0 : c_inhed = 1.14e3_r8 * sqrt_t(i) ! mean molecular speed of inhed
1569 0 : c_macrn = 1.19e3_r8 * sqrt_t(i) ! mean molecular speed of macrn
1570 0 : c_isophfp = 1.19e3_r8 * sqrt_t(i) ! mean molecular speed of isophfp
1571 0 : c_iepox = 1.34e3_r8 * sqrt_t(i) ! mean molecular speed of iepox
1572 0 : c_dhpmpal = 1.24e3_r8 * sqrt_t(i) ! mean molecular speed of dhpmpal
1573 0 : c_iche = 1.35e3_r8 * sqrt_t(i) ! mean molecular speed of iche
1574 0 : c_isopfnc = 1.04e3_r8 * sqrt_t(i) ! mean molecular speed of isopfnc
1575 0 : c_isopfdnc = 9.72e2_r8 * sqrt_t(i) ! mean molecular speed of isopfdnc
1576 0 : c_terpnt = 9.92e2_r8 * sqrt_t(i) ! mean molecular speed of terpnt
1577 0 : c_terpnt1 = 9.92e2_r8 * sqrt_t(i) ! mean molecular speed of terpnt1
1578 0 : c_terpnpt = 9.57e2_r8 * sqrt_t(i) ! mean molecular speed of terpnpt
1579 0 : c_terpnpt1 = 9.57e2_r8 * sqrt_t(i) ! mean molecular speed of terpnpt1
1580 0 : c_terpfdn = 8.48e2_r8 * sqrt_t(i) ! mean molecular speed of terpfdn
1581 0 : c_sqtn = 8.64e2_r8 * sqrt_t(i) ! mean molecular speed of sqtn
1582 0 : c_terphfn = 8.93e2_r8 * sqrt_t(i) ! mean molecular speed of terphfn
1583 0 : c_terpdhdp = 9.47e2_r8 * sqrt_t(i) ! mean molecular speed of terpdhdp
1584 0 : c_terpacid = 1.07e3_r8 * sqrt_t(i) ! mean molecular speed of terpacid
1585 : !-------------------------------------------------------------------------
1586 : ! Heterogeneous reaction rates for uptake of a gas on an aerosol:
1587 : ! rxt = sfc / ( (rad_aer/Dg_gas) + (4/(c_gas*gamma_gas)))
1588 : !-------------------------------------------------------------------------
1589 : !-------------------------------------------------------------------------
1590 : ! ... n2o5 -> 2 hno3 (on sulfate, nh4no3, oc2, soa)
1591 : !-------------------------------------------------------------------------
1592 0 : if( usr_N2O5_aer_ndx > 0 ) then
1593 0 : rxt(i,k,usr_N2O5_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_n2o5, gamma_n2o5 )
1594 : end if
1595 0 : if( usr_XNO2NO3_aer_ndx > 0 ) then
1596 0 : rxt(i,k,usr_XNO2NO3_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_n2o5, gamma_n2o5 )
1597 : end if
1598 0 : if( usr_NO2XNO3_aer_ndx > 0 ) then
1599 0 : rxt(i,k,usr_NO2XNO3_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_n2o5, gamma_n2o5 )
1600 : end if
1601 : !-------------------------------------------------------------------------
1602 : ! ... no3 -> hno3 (on sulfate, nh4no3, oc, soa)
1603 : !-------------------------------------------------------------------------
1604 0 : if( usr_NO3_aer_ndx > 0 ) then
1605 0 : rxt(i,k,usr_NO3_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_no3, gamma_no3 )
1606 : end if
1607 0 : if( usr_XNO3_aer_ndx > 0 ) then
1608 0 : rxt(i,k,usr_XNO3_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_no3, gamma_no3 )
1609 : end if
1610 : !-------------------------------------------------------------------------
1611 : ! ... no2 -> 0.5 * (ho+no+hno3) (on sulfate, nh4no3, oc2, soa)
1612 : !-------------------------------------------------------------------------
1613 0 : if( usr_NO2_aer_ndx > 0 ) then
1614 0 : rxt(i,k,usr_NO2_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_no2, gamma_no2 )
1615 : end if
1616 0 : if( usr_XNO2_aer_ndx > 0 ) then
1617 0 : rxt(i,k,usr_XNO2_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_no2, gamma_no2 )
1618 : end if
1619 :
1620 : !-------------------------------------------------------------------------
1621 : ! ... ho2 -> 0.5 * h2o2 (on sulfate, nh4no3, oc2, soa)
1622 : !-------------------------------------------------------------------------
1623 0 : if( usr_HO2_aer_ndx > 0 ) then
1624 0 : rxt(i,k,usr_HO2_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_ho2, gamma_ho2 )
1625 : end if
1626 : !-------------------------------------------------------------------------
1627 : ! ... glyoxal -> soag1 (on sulfate, nh4no3, oc2, soa)
1628 : ! first order uptake, Fuchs and Sutugin, 1971, dCg = 1/4 * gamma * ! A * |v_mol| * Cg * dt
1629 : !-------------------------------------------------------------------------
1630 0 : if( usr_GLYOXAL_aer_ndx > 0 ) then
1631 0 : rxt(i,k,usr_GLYOXAL_aer_ndx) = hetrxtrate_gly( sfc, c_glyoxal, gamma_glyoxal )
1632 : end if
1633 : !-------------------------------------------------------------------------
1634 : ! ... ISOPNITA -> HNO3 (on sulfate, nh4no3, oc2, soa)
1635 : !-------------------------------------------------------------------------
1636 0 : if( usr_ISOPNITA_aer_ndx > 0 ) then
1637 0 : rxt(i,k,usr_ISOPNITA_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_isopnita, gamma_isopnita )
1638 : end if
1639 : !-------------------------------------------------------------------------
1640 : ! ... ISOPNITB -> HNO3 (on sulfate, nh4no3, oc2, soa)
1641 : !-------------------------------------------------------------------------
1642 0 : if( usr_ISOPNITB_aer_ndx > 0 ) then
1643 0 : rxt(i,k,usr_ISOPNITB_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_isopnitb, gamma_isopnitb )
1644 : end if
1645 : !-------------------------------------------------------------------------
1646 : ! ... ONITR -> HNO3 (on sulfate, nh4no3, oc2, soa)
1647 : !-------------------------------------------------------------------------
1648 0 : if( usr_ONITR_aer_ndx > 0 ) then
1649 0 : rxt(i,k,usr_ONITR_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_onitr, gamma_onitr )
1650 : end if
1651 : !-------------------------------------------------------------------------
1652 : ! ... HONITR -> HNO3 (on sulfate, nh4no3, oc2, soa)
1653 : !-------------------------------------------------------------------------
1654 0 : if( usr_HONITR_aer_ndx > 0 ) then
1655 0 : rxt(i,k,usr_HONITR_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_honitr, gamma_honitr )
1656 : end if
1657 : !-------------------------------------------------------------------------
1658 : ! ... TERPNIT -> HNO3 (on sulfate, nh4no3, oc2, soa)
1659 : !-------------------------------------------------------------------------
1660 0 : if( usr_TERPNIT_aer_ndx > 0 ) then
1661 0 : rxt(i,k,usr_TERPNIT_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_terpnit, gamma_terpnit )
1662 : end if
1663 : !-------------------------------------------------------------------------
1664 : ! ... NTERPOOH -> HNO3 (on sulfate, nh4no3, oc2, soa)
1665 : !-------------------------------------------------------------------------
1666 0 : if( usr_NTERPOOH_aer_ndx > 0 ) then
1667 0 : rxt(i,k,usr_NTERPOOH_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_nterpooh, gamma_nterpooh )
1668 : end if
1669 : !-------------------------------------------------------------------------
1670 : ! ... NC4CHO -> HNO3 (on sulfate, nh4no3, oc2, soa)
1671 : !-------------------------------------------------------------------------
1672 0 : if( usr_NC4CHO_aer_ndx > 0 ) then
1673 0 : rxt(i,k,usr_NC4CHO_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_nc4cho, gamma_nc4cho )
1674 : end if
1675 : !-------------------------------------------------------------------------
1676 : ! ... NC4CH2OH -> HNO3 (on sulfate, nh4no3, oc2, soa)
1677 : !-------------------------------------------------------------------------
1678 0 : if( usr_NC4CH2OH_aer_ndx > 0 ) then
1679 0 : rxt(i,k,usr_NC4CH2OH_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_nc4ch2oh, gamma_nc4ch2oh )
1680 : end if
1681 : !-------------------------------------------------------------------------
1682 : ! ... ISOPFDN -> HNO3 (on sulfate, nh4no3, oc2, soa)
1683 : !-------------------------------------------------------------------------
1684 0 : if( usr_ISOPFDN_aer_ndx > 0 ) then
1685 0 : rxt(i,k,usr_ISOPFDN_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_isopfdn, gamma_isopfdn )
1686 : end if
1687 : !-------------------------------------------------------------------------
1688 : ! ... ISOPFNP -> (on sulfate, nh4no3, oc2, soa)
1689 : !-------------------------------------------------------------------------
1690 0 : if( usr_ISOPFNP_aer_ndx > 0 ) then
1691 0 : rxt(i,k,usr_ISOPFNP_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_isopfnp, gamma_isopfnp )
1692 : end if
1693 : !-------------------------------------------------------------------------
1694 : ! ... ISOPN2B -> HNO3 (on sulfate, nh4no3, oc2, soa)
1695 : !-------------------------------------------------------------------------
1696 0 : if( usr_ISOPN2B_aer_ndx > 0 ) then
1697 0 : rxt(i,k,usr_ISOPN2B_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_isopn2b, gamma_isopn2b )
1698 : end if
1699 : !-------------------------------------------------------------------------
1700 : ! ... ISOPN1D -> HNO3 (on sulfate, nh4no3, oc2, soa)
1701 : !-------------------------------------------------------------------------
1702 0 : if( usr_ISOPN1D_aer_ndx > 0 ) then
1703 0 : rxt(i,k,usr_ISOPN1D_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_isopn1d, gamma_isopn1d )
1704 : end if
1705 : !-------------------------------------------------------------------------
1706 : ! ... ISOPN4D -> HNO3 (on sulfate, nh4no3, oc2, soa)
1707 : !-------------------------------------------------------------------------
1708 0 : if( usr_ISOPN4D_aer_ndx > 0 ) then
1709 0 : rxt(i,k,usr_ISOPN4D_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_isopn4d, gamma_isopn4d )
1710 : end if
1711 : !-------------------------------------------------------------------------
1712 : ! ... INOOHD -> HNO3 (on sulfate, nh4no3, oc2, soa)
1713 : !-------------------------------------------------------------------------
1714 0 : if( usr_INOOHD_aer_ndx > 0 ) then
1715 0 : rxt(i,k,usr_INOOHD_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_inoohd, gamma_inoohd )
1716 : end if
1717 : !-------------------------------------------------------------------------
1718 : ! ... INHEB -> HNO3 (on sulfate, nh4no3, oc2, soa)
1719 : !-------------------------------------------------------------------------
1720 0 : if( usr_INHEB_aer_ndx > 0 ) then
1721 0 : rxt(i,k,usr_INHEB_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_inheb, gamma_inheb )
1722 : end if
1723 : !-------------------------------------------------------------------------
1724 : ! ... INHED -> HNO3 (on sulfate, nh4no3, oc2, soa)
1725 : !-------------------------------------------------------------------------
1726 0 : if( usr_INHED_aer_ndx > 0 ) then
1727 0 : rxt(i,k,usr_INHED_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_inhed, gamma_inhed )
1728 : end if
1729 : !-------------------------------------------------------------------------
1730 : ! ... MACRN -> HNO3 (on sulfate, nh4no3, oc2, soa)
1731 : !-------------------------------------------------------------------------
1732 0 : if( usr_MACRN_aer_ndx > 0 ) then
1733 0 : rxt(i,k,usr_MACRN_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_macrn, gamma_macrn )
1734 : end if
1735 : !-------------------------------------------------------------------------
1736 : ! ... ISOPHFP -> (on sulfate, nh4no3, oc2, soa)
1737 : !-------------------------------------------------------------------------
1738 0 : if( usr_ISOPHFP_aer_ndx > 0 ) then
1739 0 : rxt(i,k,usr_ISOPHFP_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_isophfp, gamma_isophfp )
1740 : end if
1741 : !-------------------------------------------------------------------------
1742 : ! ... IEPOX -> (on sulfate, nh4no3, oc2, soa)
1743 : !-------------------------------------------------------------------------
1744 0 : if( usr_IEPOX_aer_ndx > 0 ) then
1745 0 : rxt(i,k,usr_IEPOX_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_iepox, gamma_iepox )
1746 : end if
1747 : !-------------------------------------------------------------------------
1748 : ! ... DHPMPAL -> (on sulfate, nh4no3, oc2, soa)
1749 : !-------------------------------------------------------------------------
1750 0 : if( usr_DHPMPAL_aer_ndx > 0 ) then
1751 0 : rxt(i,k,usr_DHPMPAL_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_dhpmpal, gamma_dhpmpal )
1752 : end if
1753 : !-------------------------------------------------------------------------
1754 : ! ... ICHE -> (on sulfate, nh4no3, oc2, soa)
1755 : !-------------------------------------------------------------------------
1756 0 : if( usr_ICHE_aer_ndx > 0 ) then
1757 0 : rxt(i,k,usr_ICHE_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_iche, gamma_iche )
1758 : end if
1759 : !-------------------------------------------------------------------------
1760 : ! ... ISOPFNC -> (on sulfate, nh4no3, oc2, soa)
1761 : !-------------------------------------------------------------------------
1762 0 : if( usr_ISOPFNC_aer_ndx > 0 ) then
1763 0 : rxt(i,k,usr_ISOPFNC_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_isopfnc, gamma_isopfnc )
1764 : end if
1765 : !-------------------------------------------------------------------------
1766 : ! ... ISOPFDNC -> (on sulfate, nh4no3, oc2, soa)
1767 : !-------------------------------------------------------------------------
1768 0 : if( usr_ISOPFDNC_aer_ndx > 0 ) then
1769 0 : rxt(i,k,usr_ISOPFDNC_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_isopfdnc, gamma_isopfdnc )
1770 : end if
1771 : !-------------------------------------------------------------------------
1772 : ! ... TERPNT -> HNO3 (on sulfate, nh4no3, oc2, soa)
1773 : !-------------------------------------------------------------------------
1774 0 : if( usr_TERPNT_aer_ndx > 0 ) then
1775 0 : rxt(i,k,usr_TERPNT_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_terpnt, gamma_terpnt )
1776 : end if
1777 : !-------------------------------------------------------------------------
1778 : ! ... TERPNT1 -> HNO3 (on sulfate, nh4no3, oc2, soa)
1779 : !-------------------------------------------------------------------------
1780 0 : if( usr_TERPNT1_aer_ndx > 0 ) then
1781 0 : rxt(i,k,usr_TERPNT1_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_terpnt1, gamma_terpnt1 )
1782 : end if
1783 : !-------------------------------------------------------------------------
1784 : ! ... TERPNPT -> HNO3 (on sulfate, nh4no3, oc2, soa)
1785 : !-------------------------------------------------------------------------
1786 0 : if( usr_TERPNPT_aer_ndx > 0 ) then
1787 0 : rxt(i,k,usr_TERPNPT_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_terpnpt, gamma_terpnpt )
1788 : end if
1789 : !-------------------------------------------------------------------------
1790 : ! ... TERPNPT1 -> HNO3 (on sulfate, nh4no3, oc2, soa)
1791 : !-------------------------------------------------------------------------
1792 0 : if( usr_TERPNPT1_aer_ndx > 0 ) then
1793 0 : rxt(i,k,usr_TERPNPT1_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_terpnpt1, gamma_terpnpt1 )
1794 : end if
1795 : !-------------------------------------------------------------------------
1796 : ! ... TERPFDN -> HNO3 (on sulfate, nh4no3, oc2, soa)
1797 : !-------------------------------------------------------------------------
1798 0 : if( usr_TERPFDN_aer_ndx > 0 ) then
1799 0 : rxt(i,k,usr_TERPFDN_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_terpfdn, gamma_terpfdn )
1800 : end if
1801 : !-------------------------------------------------------------------------
1802 : ! ... SQTN -> (on sulfate, nh4no3, oc2, soa)
1803 : !-------------------------------------------------------------------------
1804 0 : if( usr_SQTN_aer_ndx > 0 ) then
1805 0 : rxt(i,k,usr_SQTN_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_sqtn, gamma_sqtn )
1806 : end if
1807 : !-------------------------------------------------------------------------
1808 : ! ... TERPHFN -> (on sulfate, nh4no3, oc2, soa)
1809 : !-------------------------------------------------------------------------
1810 0 : if( usr_TERPHFN_aer_ndx > 0 ) then
1811 0 : rxt(i,k,usr_TERPHFN_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_terphfn, gamma_terphfn )
1812 : end if
1813 : !-------------------------------------------------------------------------
1814 : ! ... TERPDHDP -> (on sulfate, nh4no3, oc2, soa)
1815 : !-------------------------------------------------------------------------
1816 0 : if( usr_TERPDHDP_aer_ndx > 0 ) then
1817 0 : rxt(i,k,usr_TERPDHDP_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_terpdhdp, gamma_terpdhdp )
1818 : end if
1819 : !-------------------------------------------------------------------------
1820 : ! ... TERPACID -> (on sulfate, nh4no3, oc2, soa)
1821 : !-------------------------------------------------------------------------
1822 0 : if( usr_TERPACID_aer_ndx > 0 ) then
1823 0 : rxt(i,k,usr_TERPACID_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_terpacid, gamma_terpacid )
1824 : end if
1825 :
1826 : end do long_loop
1827 : end if
1828 :
1829 : ! LLNL super fast chem reaction rates
1830 :
1831 : !-----------------------------------------------------------------------
1832 : ! ... CO + OH --> CO2 + HO2
1833 : !-----------------------------------------------------------------------
1834 0 : if ( usr_oh_co_ndx > 0 ) then
1835 0 : ko(:) = 5.9e-33_r8 * tp(:)**1.4_r8
1836 0 : kinf(:) = 1.1e-12_r8 * (temp(:ncol,k) / 300._r8)**1.3_r8
1837 0 : ko_m(:) = ko(:) * m(:,k)
1838 0 : k0(:) = 1.5e-13_r8 * (temp(:ncol,k) / 300._r8)**0.6_r8
1839 0 : kinf_m(:) = (2.1e+09_r8 * (temp(:ncol,k) / 300._r8)**6.1_r8) / m(:,k)
1840 0 : rxt(:,k,usr_oh_co_ndx) = (ko_m(:)/(1._r8+(ko_m(:)/kinf(:)))) * &
1841 0 : 0.6_r8**(1._r8/(1._r8+(log10(ko_m(:)/kinf(:)))**2._r8)) + &
1842 0 : (k0(:)/(1._r8+(k0(:)/kinf_m(:)))) * &
1843 0 : 0.6_r8**(1._r8/(1._r8+(log10(k0(:)/kinf_m(:)))**2._r8))
1844 : endif
1845 : !-----------------------------------------------------------------------
1846 : ! ... NO2 + H2O --> 0.5 HONO + 0.5 HNO3
1847 : !-----------------------------------------------------------------------
1848 0 : if ( het_no2_h2o_ndx > 0 ) then
1849 0 : rxt(:,k,het_no2_h2o_ndx) = 4.0e-24_r8
1850 : endif
1851 : !-----------------------------------------------------------------------
1852 : ! ... DMS + OH --> 0.75 SO2 + 0.25 MSA
1853 : !-----------------------------------------------------------------------
1854 0 : if ( usr_oh_dms_ndx > 0 ) then
1855 0 : o2(:ncol) = invariants(:ncol,k,inv_o2_ndx)
1856 0 : rxt(:,k,usr_oh_dms_ndx) = 2.000e-10_r8 * exp(5820.0_r8 * tinv(:)) / &
1857 0 : ((2.000e29_r8 / o2(:)) + exp(6280.0_r8 * tinv(:)))
1858 : endif
1859 0 : if ( aq_so2_h2o2_ndx > 0 .or. aq_so2_o3_ndx > 0 ) then
1860 0 : lwc(:) = cwat(:ncol,k) * invariants(:ncol,k,inv_m_ndx) * mbar(:ncol,k) /avo !PJC convert kg/kg to g/cm3
1861 : !-----------------------------------------------------------------------
1862 : ! ... SO2 + H2O2 --> S(VI)
1863 : !-----------------------------------------------------------------------
1864 0 : if ( aq_so2_h2o2_ndx > 0 ) then
1865 0 : rxt(:,k,aq_so2_h2o2_ndx) = lwc(:) * 1.0e-03_r8 * avo * &
1866 : K_AQ * &
1867 :
1868 0 : exp(ER_AQ * ((1.0e+00_r8 / 298.0e+00_r8) - tinv(:))) * &
1869 : HENRY298_SO2 * &
1870 : K298_SO2_HSO3 * &
1871 : HENRY298_H2O2 * &
1872 : exp(((H298_SO2 + H298_SO2_HSO3 + H298_H2O2) / R_CAL) * &
1873 0 : ((1.0e+00_r8 / 298.0e+00_r8) - tinv(:))) * &
1874 0 : (R_CONC * temp(:ncol,k))**2.0e+00_r8 / &
1875 :
1876 0 : (1.0e+00_r8 + 13.0e+00_r8 * 10.0e+00_r8**(-pH))
1877 : endif
1878 : !-----------------------------------------------------------------------
1879 : ! ... SO2 + O3 --> S(VI)
1880 : !-----------------------------------------------------------------------
1881 0 : if (aq_so2_o3_ndx >0) then
1882 0 : rxt(:,k,aq_so2_o3_ndx) = lwc(:) * 1.0e-03_r8 * avo * &
1883 : HENRY298_SO2 * exp((H298_SO2 / R_CAL) * &
1884 0 : ((1.0e+00_r8 / 298.0e+00_r8) - tinv(:))) * &
1885 : (K0_AQ * exp(ER0_AQ * &
1886 0 : ((1.0e+00_r8 / 298.0e+00_r8) - tinv(:))) + &
1887 : K298_SO2_HSO3 * exp((H298_SO2_HSO3 / R_CAL) * &
1888 0 : ((1.0e+00_r8 / 298.0e+00_r8) - tinv(:))) * &
1889 : (K1_AQ * exp(ER1_AQ * &
1890 0 : ((1.0e+00_r8 / 298.0e+00_r8) - tinv(:))) / &
1891 : 10.0e+00_r8**(-pH) + K2_AQ * exp(ER2_AQ * &
1892 0 : ((1.0e+00_r8 / 298.0e+00_r8) - tinv(:))) * &
1893 : K298_HSO3_SO3 * exp((H298_HSO3_SO3 / R_CAL) * &
1894 0 : ((1.0e+00_r8 / 298.0e+00_r8) - tinv(:))) / &
1895 : (10.0e+00_r8**(-pH))**2.0e+00_r8) ) * &
1896 : HENRY298_O3 * exp((H298_O3 / R_CAL) * &
1897 0 : ((1.0e+00_r8 / 298.0e+00_r8) - tinv(:))) * &
1898 0 : (R_CONC * temp(:ncol,k))**2.0e+00_r8
1899 : endif
1900 : endif
1901 :
1902 0 : if ( has_d_chem ) then
1903 :
1904 0 : call comp_exp( exp_fac, -600._r8 * tinv, ncol )
1905 0 : rxt(:,k,ean_ndx(1)) = 1.e-31_r8 * tp(:) * exp_fac(:)
1906 0 : rxt(:,k,ean_ndx(2)) = 9.1e-12_r8 * tp(:)**(-1.46_r8)
1907 0 : call comp_exp( exp_fac, -193._r8 * tinv, ncol )
1908 0 : rxt(:,k,ean_ndx(3)) = (4.e-30_r8 * exp_fac(:)) * 0.21_r8
1909 :
1910 0 : rxt(:,k,rpe_ndx(1)) = 4.2e-6_r8 * tp(:)**0.5_r8
1911 0 : rxt(:,k,rpe_ndx(2)) = 6.3e-7_r8 * tp(:)**0.5_r8
1912 0 : rxt(:,k,rpe_ndx(3)) = 2.5e-6_r8 * tp(:)**0.1_r8
1913 0 : rxt(:,k,rpe_ndx(4)) = 2.48e-6_r8 * tp(:)**0.76_r8
1914 0 : rxt(:,k,rpe_ndx(5)) = 1.4e-6_r8 * tp(:)**0.4_r8
1915 :
1916 0 : rxt(:,k,pir_ndx(1)) = 4.e-30_r8 * tp(:)**2.93_r8
1917 0 : rxt(:,k,pir_ndx(2)) = 4.6e-27_r8 * tp(:)**4._r8
1918 :
1919 0 : call comp_exp( exp_fac, -15900._r8 * tinv, ncol )
1920 0 : rxt(:,k,pir_ndx(3)) = (2.5e-2_r8 * tp(:)**5._r8) * exp_fac(:)
1921 0 : rxt(:,k,pir_ndx(4)) = 2.3e-27_r8 * tp(:)**7.5_r8
1922 :
1923 0 : call comp_exp( exp_fac, -10272._r8 * tinv, ncol )
1924 0 : rxt(:,k,pir_ndx(5)) = (2.6e-3_r8 * tp(:)**8.5_r8) * exp_fac(:)
1925 0 : rxt(:,k,pir_ndx(6)) = 3.6e-27_r8 * tp(:)**8.1_r8
1926 :
1927 0 : call comp_exp( exp_fac, -9000._r8 * tinv, ncol )
1928 0 : rxt(:,k,pir_ndx(7)) = (1.5e-1_r8 * tp(:)**9.1_r8) * exp_fac(:)
1929 0 : rxt(:,k,pir_ndx(8)) = 4.6e-28_r8 * tp(:)**14._r8
1930 :
1931 0 : call comp_exp( exp_fac, -6400._r8 * tinv, ncol )
1932 0 : rxt(:,k,pir_ndx(9)) = (1.7e-3_r8 * tp(:)**15._r8) * exp_fac(:)
1933 0 : rxt(:,k,pir_ndx(10)) = 1.35e-28_r8 * tp(:)**2.83_r8
1934 :
1935 0 : rxt(:,k,pir_ndx(11)) = 1.e-27_r8 * (308._r8 * tinv(:))**4.7_r8
1936 0 : rxt(:,k,pir_ndx(12)) = rxt(:,k,pir_ndx(11))
1937 0 : rxt(:,k,pir_ndx(13)) = 1.4e-29_r8 * tp(:)**4._r8
1938 :
1939 0 : call comp_exp( exp_fac, -3872._r8 * tinv, ncol )
1940 0 : rxt(:,k,pir_ndx(14)) = (3.4e-7_r8 * tp(:)**5._r8) * exp_fac(:)
1941 :
1942 0 : rxt(:,k,pir_ndx(15)) = 3.0e-31_r8 * tp(:)**4.3_r8
1943 0 : call comp_exp( exp_fac, -2093._r8 * tinv, ncol )
1944 0 : rxt(:,k,pir_ndx(16)) = (1.5e-8_r8 * tp(:)**4.3_r8) * exp_fac(:)
1945 :
1946 0 : rxt(:,k,edn_ndx(1)) = 3.1e-10_r8 * tp(:)**0.83_r8
1947 0 : call comp_exp( exp_fac, -4990._r8 * tinv, ncol )
1948 0 : rxt(:,k,edn_ndx(2)) = (1.9e-12_r8 * tp(:)**(-1.5_r8)) * exp_fac(:)
1949 :
1950 0 : rxt(:,k,nir_ndx(1)) = 1.05e-12_r8 * tp(:)**2.15_r8
1951 0 : rxt(:,k,nir_ndx(2)) = 2.5e-11_r8 * tp(:)**0.79_r8
1952 0 : rxt(:,k,nir_ndx(3)) = 7.5e-11_r8 * tp(:)**0.79_r8
1953 0 : rxt(:,k,nir_ndx(4)) = rxt(:,k,nir_ndx(1))
1954 0 : rxt(:,k,nir_ndx(5)) = 1.3e-11_r8 * tp(:)**1.64_r8
1955 0 : rxt(:,k,nir_ndx(6)) = 3.3e-11_r8 * tp(:)**2.38_r8
1956 :
1957 0 : call comp_exp( exp_fac, -7300_r8 * tinv, ncol )
1958 0 : rxt(:,k,nir_ndx(7)) = (1.0e-3_r8 * tp(:)) * exp_fac(:)
1959 0 : call comp_exp( exp_fac, -7050_r8 * tinv, ncol )
1960 0 : rxt(:,k,nir_ndx(8)) = (7.2e-4_r8 * tp(:)) * exp_fac(:)
1961 0 : call comp_exp( exp_fac, -6800_r8 * tinv, ncol )
1962 0 : rxt(:,k,nir_ndx(9)) = (6.5e-3_r8 * tp(:)) * exp_fac(:)
1963 0 : call comp_exp( exp_fac, -7600_r8 * tinv, ncol )
1964 0 : rxt(:,k,nir_ndx(10)) = (5.7e-4_r8 * tp(:)) * exp_fac(:)
1965 :
1966 0 : call comp_exp( exp_fac, -7150_r8 * tinv, ncol )
1967 0 : rxt(:,k,nir_ndx(11)) = (1.5e-2_r8 * tp(:)) * exp_fac(:)
1968 :
1969 0 : call comp_exp( exp_fac, -13130_r8 * tinv, ncol )
1970 0 : rxt(:,k,nir_ndx(12)) = (6.0e-3_r8 * tp(:)) * exp_fac(:)
1971 0 : rxt(:,k,nir_ndx(13)) = 5.22e-28_r8 * tp(:)**2.62_r8
1972 :
1973 0 : rxt(:,k,iira_ndx(1)) = 6.0e-8_r8 * tp(:)**.5_r8
1974 0 : do i = 2,niira
1975 0 : rxt(:,k,iira_ndx(i)) = rxt(:,k,iira_ndx(i-1))
1976 : enddo
1977 :
1978 0 : rxt(:,k,iirb_ndx(1)) = 1.25e-25_r8 * tp(:)**4._r8
1979 0 : do i = 2,niirb
1980 0 : rxt(:,k,iirb_ndx(i)) = rxt(:,k,iirb_ndx(i-1))
1981 : enddo
1982 :
1983 0 : call comp_exp( exp_fac, -6600._r8 * tinv, ncol )
1984 0 : rxt(:,k,usr_clm_h2o_m_ndx) = 2.e-8_r8 * exp_fac(:)
1985 :
1986 0 : call comp_exp( exp_fac, -11926._r8 * tinv, ncol )
1987 0 : rxt(:,k,usr_clm_hcl_m_ndx) = tinv(:) * exp_fac(:)
1988 :
1989 : endif
1990 : end do level_loop
1991 :
1992 : !-----------------------------------------------------------------
1993 : ! ... the ionic rates
1994 : !-----------------------------------------------------------------
1995 0 : if ( has_ion_rxts ) then
1996 0 : level_loop2 : do k = 1,pver
1997 0 : tp(:ncol) = (2._r8*tempi(:ncol,k) + temp(:ncol,k)) / ( 3._r8 * t0 )
1998 0 : tp(:) = max( min( tp(:),20._r8 ),1._r8 )
1999 0 : rxt(:,k,ion1_ndx) = 2.82e-11_r8 + tp(:)*(-7.74e-12_r8 + tp(:)*(1.073e-12_r8 &
2000 0 : + tp(:)*(-5.17e-14_r8 + 9.65e-16_r8*tp(:))))
2001 0 : tp(:ncol) = (.6363_r8*tempi(:ncol,k) + .3637_r8*temp(:ncol,k)) / t0
2002 0 : tp(:) = max( min( tp(:),trlim2 ),1._r8 )
2003 0 : rxt(:,k,ion2_ndx) = 1.533e-12_r8 + tp(:)*(-5.92e-13_r8 + tp(:)*8.6e-14_r8)
2004 0 : tp(:ncol) = 2._r8 * t0 /(tempi(:ncol,k) + temp(:ncol,k))
2005 0 : where( tp(:ncol) < trlim3 )
2006 0 : rxt(:,k,ion3_ndx) = 1.4e-10_r8 * tp(:)**.44_r8
2007 0 : rxt(:,k,ion11_ndx) = 1.e-11_r8 * tp(:)**.23_r8
2008 : elsewhere
2009 0 : rxt(:,k,ion3_ndx) = 5.2e-11_r8 / tp(:)**.2_r8
2010 0 : rxt(:,k,ion11_ndx) = 3.6e-12_r8 / tp(:)**.41_r8
2011 : end where
2012 0 : tp(:ncol) = t0 / tempe(:ncol,k)
2013 0 : rxt(:,k,elec1_ndx) = 4.e-7_r8 * tp(:)**.85_r8
2014 0 : rxt(:,k,elec3_ndx) = 1.8e-7_r8 * tp(:)**.39_r8
2015 0 : where( tp(:ncol) < 4._r8 )
2016 0 : rxt(:,k,elec2_ndx) = 2.7e-7_r8 * tp(:)**.7_r8
2017 : elsewhere
2018 0 : rxt(:,k,elec2_ndx) = 1.6e-7_r8 * tp(:)**.55_r8
2019 : end where
2020 : end do level_loop2
2021 : endif
2022 :
2023 : ! quenching of O+(2P) and O+(2D) by e to produce O+
2024 : ! See TABLE 1 of Roble (1995)
2025 : ! drm 2015-07-27
2026 0 : if (elec4_ndx > 0 .and. elec5_ndx > 0 .and. elec6_ndx > 0) then
2027 0 : do k=1,pver
2028 0 : tp(:ncol) = sqrt(300._r8 / tempe(:ncol,k))
2029 0 : rxt(:,k,elec4_ndx) = 1.5e-7_r8 * tp(:)
2030 0 : rxt(:,k,elec5_ndx) = 4.0e-8_r8 * tp(:)
2031 0 : rxt(:,k,elec6_ndx) = 6.6e-8_r8 * tp(:)
2032 : end do
2033 : endif
2034 :
2035 : !-----------------------------------------------------------------
2036 : ! ... tropospheric "aerosol" rate constants
2037 : !-----------------------------------------------------------------
2038 0 : if ( het1_ndx > 0 .AND. (.NOT. usr_N2O5_aer_ndx > 0) ) then
2039 0 : amas = 4._r8*pi*rm1**3*den/3._r8 ! each mean particle(r=0.1u) mass (g)
2040 0 : do k = 1,pver
2041 : !-------------------------------------------------------------------------
2042 : ! ... estimate humidity effect on aerosols (from Shettle and Fenn, 1979)
2043 : ! xr is a factor of the increase aerosol radii with hum (hum=0., factor=1)
2044 : !-------------------------------------------------------------------------
2045 0 : xr(:) = .999151_r8 + relhum(:ncol,k)*(1.90445_r8 + relhum(:ncol,k)*(-6.35204_r8 + relhum(:ncol,k)*5.32061_r8))
2046 : !-------------------------------------------------------------------------
2047 : ! ... estimate sulfate particles surface area (cm2/cm3) in each grid
2048 : !-------------------------------------------------------------------------
2049 0 : if ( carma_hetchem_feedback ) then
2050 0 : sur(:ncol) = strato_sad(:ncol,k)
2051 : else
2052 0 : sur(:) = sulfate(:,k)*m(:,k)/avo*wso4 & ! xform mixing ratio to g/cm3
2053 : / amas & ! xform g/cm3 to num particles/cm3
2054 : * fare & ! xform num particles/cm3 to cm2/cm3
2055 0 : * xr(:)*xr(:) ! humidity factor
2056 : endif
2057 : !-----------------------------------------------------------------
2058 : ! ... compute the "aerosol" reaction rates
2059 : !-----------------------------------------------------------------
2060 : ! k = gam * A * velo/4
2061 : !
2062 : ! where velo = sqrt[ 8*bk*T/pi/(w/av) ]
2063 : ! bk = 1.381e-16
2064 : ! av = 6.02e23
2065 : ! w = 108 (n2o5) HO2(33) CH2O (30) NH3(15)
2066 : !
2067 : ! so that velo = 1.40e3*sqrt(T) (n2o5) gama=0.1
2068 : ! so that velo = 2.53e3*sqrt(T) (HO2) gama>0.2
2069 : ! so that velo = 2.65e3*sqrt(T) (CH2O) gama>0.022
2070 : ! so that velo = 3.75e3*sqrt(T) (NH3) gama=0.4
2071 : !--------------------------------------------------------
2072 : !-----------------------------------------------------------------
2073 : ! ... use this n2o5 -> 2*hno3 only in troposphere
2074 : !-----------------------------------------------------------------
2075 0 : rxt(:,k,het1_ndx) = rxt(:,k,het1_ndx) &
2076 0 : +.25_r8 * gam1 * sur(:) * 1.40e3_r8 * sqrt( temp(:ncol,k) )
2077 : end do
2078 : end if
2079 :
2080 : !lke++
2081 : !-----------------------------------------------------------------
2082 : ! ... CO tags
2083 : !-----------------------------------------------------------------
2084 0 : if( usr_CO_OH_b_ndx > 0 .and. usr_CO_OH_ndx < 0 ) then
2085 0 : usr_CO_OH_ndx = usr_CO_OH_b_ndx
2086 : end if
2087 0 : if( usr_CO_OH_ndx > 0 ) then
2088 0 : if( usr_COhc_OH_ndx > 0 ) then
2089 0 : rxt(:ncol,:,usr_COhc_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2090 : end if
2091 0 : if( usr_COme_OH_ndx > 0 ) then
2092 0 : rxt(:ncol,:,usr_COme_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2093 : end if
2094 0 : if( usr_CO01_OH_ndx > 0 ) then
2095 0 : rxt(:ncol,:,usr_CO01_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2096 : end if
2097 0 : if( usr_CO02_OH_ndx > 0 ) then
2098 0 : rxt(:ncol,:,usr_CO02_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2099 : end if
2100 0 : if( usr_CO03_OH_ndx > 0 ) then
2101 0 : rxt(:ncol,:,usr_CO03_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2102 : end if
2103 0 : if( usr_CO04_OH_ndx > 0 ) then
2104 0 : rxt(:ncol,:,usr_CO04_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2105 : end if
2106 0 : if( usr_CO05_OH_ndx > 0 ) then
2107 0 : rxt(:ncol,:,usr_CO05_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2108 : end if
2109 0 : if( usr_CO06_OH_ndx > 0 ) then
2110 0 : rxt(:ncol,:,usr_CO06_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2111 : end if
2112 0 : if( usr_CO07_OH_ndx > 0 ) then
2113 0 : rxt(:ncol,:,usr_CO07_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2114 : end if
2115 0 : if( usr_CO08_OH_ndx > 0 ) then
2116 0 : rxt(:ncol,:,usr_CO08_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2117 : end if
2118 0 : if( usr_CO09_OH_ndx > 0 ) then
2119 0 : rxt(:ncol,:,usr_CO09_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2120 : end if
2121 0 : if( usr_CO10_OH_ndx > 0 ) then
2122 0 : rxt(:ncol,:,usr_CO10_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2123 : end if
2124 0 : if( usr_CO11_OH_ndx > 0 ) then
2125 0 : rxt(:ncol,:,usr_CO11_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2126 : end if
2127 0 : if( usr_CO12_OH_ndx > 0 ) then
2128 0 : rxt(:ncol,:,usr_CO12_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2129 : end if
2130 0 : if( usr_CO13_OH_ndx > 0 ) then
2131 0 : rxt(:ncol,:,usr_CO13_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2132 : end if
2133 0 : if( usr_CO14_OH_ndx > 0 ) then
2134 0 : rxt(:ncol,:,usr_CO14_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2135 : end if
2136 0 : if( usr_CO15_OH_ndx > 0 ) then
2137 0 : rxt(:ncol,:,usr_CO15_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2138 : end if
2139 0 : if( usr_CO16_OH_ndx > 0 ) then
2140 0 : rxt(:ncol,:,usr_CO16_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2141 : end if
2142 0 : if( usr_CO17_OH_ndx > 0 ) then
2143 0 : rxt(:ncol,:,usr_CO17_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2144 : end if
2145 0 : if( usr_CO18_OH_ndx > 0 ) then
2146 0 : rxt(:ncol,:,usr_CO18_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2147 : end if
2148 0 : if( usr_CO19_OH_ndx > 0 ) then
2149 0 : rxt(:ncol,:,usr_CO19_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2150 : end if
2151 0 : if( usr_CO20_OH_ndx > 0 ) then
2152 0 : rxt(:ncol,:,usr_CO20_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2153 : end if
2154 0 : if( usr_CO21_OH_ndx > 0 ) then
2155 0 : rxt(:ncol,:,usr_CO21_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2156 : end if
2157 0 : if( usr_CO22_OH_ndx > 0 ) then
2158 0 : rxt(:ncol,:,usr_CO22_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2159 : end if
2160 0 : if( usr_CO23_OH_ndx > 0 ) then
2161 0 : rxt(:ncol,:,usr_CO23_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2162 : end if
2163 0 : if( usr_CO24_OH_ndx > 0 ) then
2164 0 : rxt(:ncol,:,usr_CO24_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2165 : end if
2166 0 : if( usr_CO25_OH_ndx > 0 ) then
2167 0 : rxt(:ncol,:,usr_CO25_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2168 : end if
2169 0 : if( usr_CO26_OH_ndx > 0 ) then
2170 0 : rxt(:ncol,:,usr_CO26_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2171 : end if
2172 0 : if( usr_CO27_OH_ndx > 0 ) then
2173 0 : rxt(:ncol,:,usr_CO27_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2174 : end if
2175 0 : if( usr_CO28_OH_ndx > 0 ) then
2176 0 : rxt(:ncol,:,usr_CO28_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2177 : end if
2178 0 : if( usr_CO29_OH_ndx > 0 ) then
2179 0 : rxt(:ncol,:,usr_CO29_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2180 : end if
2181 0 : if( usr_CO30_OH_ndx > 0 ) then
2182 0 : rxt(:ncol,:,usr_CO30_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2183 : end if
2184 0 : if( usr_CO31_OH_ndx > 0 ) then
2185 0 : rxt(:ncol,:,usr_CO31_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2186 : end if
2187 0 : if( usr_CO32_OH_ndx > 0 ) then
2188 0 : rxt(:ncol,:,usr_CO32_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2189 : end if
2190 0 : if( usr_CO33_OH_ndx > 0 ) then
2191 0 : rxt(:ncol,:,usr_CO33_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2192 : end if
2193 0 : if( usr_CO34_OH_ndx > 0 ) then
2194 0 : rxt(:ncol,:,usr_CO34_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2195 : end if
2196 0 : if( usr_CO35_OH_ndx > 0 ) then
2197 0 : rxt(:ncol,:,usr_CO35_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2198 : end if
2199 0 : if( usr_CO36_OH_ndx > 0 ) then
2200 0 : rxt(:ncol,:,usr_CO36_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2201 : end if
2202 0 : if( usr_CO37_OH_ndx > 0 ) then
2203 0 : rxt(:ncol,:,usr_CO37_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2204 : end if
2205 0 : if( usr_CO38_OH_ndx > 0 ) then
2206 0 : rxt(:ncol,:,usr_CO38_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2207 : end if
2208 0 : if( usr_CO39_OH_ndx > 0 ) then
2209 0 : rxt(:ncol,:,usr_CO39_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2210 : end if
2211 0 : if( usr_CO40_OH_ndx > 0 ) then
2212 0 : rxt(:ncol,:,usr_CO40_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2213 : end if
2214 0 : if( usr_CO41_OH_ndx > 0 ) then
2215 0 : rxt(:ncol,:,usr_CO41_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2216 : end if
2217 0 : if( usr_CO42_OH_ndx > 0 ) then
2218 0 : rxt(:ncol,:,usr_CO42_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
2219 : end if
2220 : end if
2221 : !lke--
2222 : !
2223 : ! jfl : additional BAM removal reactions. Zero out below the tropopause
2224 : !
2225 0 : do l=1,num_strat_tau
2226 : !
2227 0 : if ( usr_strat_tau_ndx(l) > 0 ) then
2228 0 : do i=1,ncol
2229 0 : rxt(i,tropchemlev(i)+1:pver,usr_strat_tau_ndx(l)) = 0._r8
2230 : end do
2231 : end if
2232 : !
2233 : end do
2234 : !
2235 :
2236 0 : deallocate( sfc_array, dm_array )
2237 :
2238 0 : end subroutine usrrxt
2239 :
2240 0 : subroutine usrrxt_hrates( rxt, tempn, tempi, tempe, &
2241 0 : h2ovmr, m, ncol, kbot )
2242 : !-----------------------------------------------------------------
2243 : ! ... set the user specified reaction rates for heating
2244 : !-----------------------------------------------------------------
2245 :
2246 0 : use shr_kind_mod, only : r8 => shr_kind_r8
2247 : use chem_mods, only : rxntot
2248 : use ppgrid, only : pver, pcols
2249 :
2250 : implicit none
2251 :
2252 : !-----------------------------------------------------------------
2253 : ! ... dummy arguments
2254 : !-----------------------------------------------------------------
2255 : integer, intent(in) :: ncol ! number columns in chunk
2256 : integer, intent(in) :: kbot ! heating levels
2257 : real(r8), intent(in) :: tempn(pcols,pver) ! neutral temperature (K)
2258 : real(r8), intent(in) :: tempi(pcols,pver) ! ion temperature (K)
2259 : real(r8), intent(in) :: tempe(pcols,pver) ! electron temperature (K)
2260 : real(r8), intent(in) :: m(ncol,pver) ! total atm density (1/cm^3)
2261 : real(r8), intent(in) :: h2ovmr(ncol,pver) ! water vapor (vmr)
2262 : real(r8), intent(inout) :: rxt(ncol,pver,rxntot) ! gas phase rates
2263 :
2264 : !-----------------------------------------------------------------
2265 : ! ... local variables
2266 : !-----------------------------------------------------------------
2267 :
2268 : integer :: k
2269 : real(r8), dimension(ncol) :: &
2270 0 : tp, &
2271 0 : tinv, &
2272 0 : ko, &
2273 0 : kinf, &
2274 0 : fc
2275 :
2276 : !-----------------------------------------------------------------
2277 : ! ... o + o2 + m --> o3 + m
2278 : !-----------------------------------------------------------------
2279 0 : do k = 1,kbot
2280 0 : tinv(:ncol) = 1._r8 / tempn(:ncol,k)
2281 0 : tp(:) = 300._r8 * tinv(:)
2282 0 : rxt(:,k,usr_O_O2_ndx) = 6.e-34_r8 * tp(:)**2.4_r8
2283 :
2284 : !-----------------------------------------------------------------
2285 : ! ... o + o + m -> o2 + m
2286 : !-----------------------------------------------------------------
2287 0 : rxt(:,k,usr_O_O_ndx) = 2.76e-34_r8 * exp( 720.0_r8*tinv(:) )
2288 :
2289 : !-----------------------------------------------------------------
2290 : ! ... ho2 + ho2 --> h2o2
2291 : ! Note: this rate involves the water vapor number density
2292 : !-----------------------------------------------------------------
2293 0 : ko(:) = 3.0e-13_r8 * exp( 460._r8*tinv(:) )
2294 0 : kinf(:) = 2.1e-33_r8 * m(:,k) * exp( 920._r8*tinv(:) )
2295 0 : fc(:) = 1._r8 + 1.4e-21_r8 * m(:,k) * h2ovmr(:,k) * exp( 2200._r8*tinv(:) )
2296 0 : rxt(:,k,usr_HO2_HO2_ndx) = (ko(:) + kinf(:)) * fc(:)
2297 :
2298 : end do
2299 :
2300 : !-----------------------------------------------------------------
2301 : ! ... the ionic rates
2302 : !-----------------------------------------------------------------
2303 0 : if ( has_ion_rxts ) then
2304 0 : level_loop2 : do k = 1,kbot
2305 0 : tp(:ncol) = (2._r8*tempi(:ncol,k) + tempn(:ncol,k)) / ( 3._r8 * t0 )
2306 0 : tp(:) = max( min( tp(:),20._r8 ),1._r8 )
2307 0 : rxt(:,k,ion1_ndx) = 2.82e-11_r8 + tp(:)*(-7.74e-12_r8 + tp(:)*(1.073e-12_r8 &
2308 0 : + tp(:)*(-5.17e-14_r8 + 9.65e-16_r8*tp(:))))
2309 0 : tp(:ncol) = (.6363_r8*tempi(:ncol,k) + .3637_r8*tempn(:ncol,k)) / t0
2310 0 : tp(:) = max( min( tp(:),trlim2 ),1._r8 )
2311 0 : rxt(:,k,ion2_ndx) = 1.533e-12_r8 + tp(:)*(-5.92e-13_r8 + tp(:)*8.6e-14_r8)
2312 0 : tp(:ncol) = 2._r8 * t0 /(tempi(:ncol,k) + tempn(:ncol,k))
2313 0 : where( tp(:ncol) < trlim3 )
2314 0 : rxt(:,k,ion3_ndx) = 1.4e-10_r8 * tp(:)**.44_r8
2315 : elsewhere
2316 0 : rxt(:,k,ion3_ndx) = 5.2e-11_r8 / tp(:)**.2_r8
2317 : endwhere
2318 0 : tp(:ncol) = t0 / tempe(:ncol,k)
2319 0 : rxt(:,k,elec1_ndx) = 4.e-7_r8 * tp(:)**.85_r8
2320 0 : rxt(:,k,elec3_ndx) = 1.8e-7_r8 * tp(:)**.39_r8
2321 0 : where( tp(:ncol) < 4._r8 )
2322 0 : rxt(:,k,elec2_ndx) = 2.7e-7_r8 * tp(:)**.7_r8
2323 : elsewhere
2324 0 : rxt(:,k,elec2_ndx) = 1.6e-7_r8 * tp(:)**.55_r8
2325 : endwhere
2326 : end do level_loop2
2327 : endif
2328 0 : end subroutine usrrxt_hrates
2329 :
2330 : !-------------------------------------------------------------------------
2331 : !-------------------------------------------------------------------------
2332 0 : subroutine comp_exp( x, y, n )
2333 :
2334 : implicit none
2335 :
2336 : real(r8), intent(out) :: x(:)
2337 : real(r8), intent(in) :: y(:)
2338 : integer, intent(in) :: n
2339 :
2340 : #ifdef IBM
2341 : call vexp( x, y, n )
2342 : #else
2343 0 : x(:n) = exp( y(:n) )
2344 : #endif
2345 :
2346 0 : end subroutine comp_exp
2347 :
2348 : !-------------------------------------------------------------------------
2349 : ! Heterogeneous reaction rates for uptake of a gas on an aerosol:
2350 : !-------------------------------------------------------------------------
2351 0 : function hetrxtrate( sfc, dm_aer, dg_gas, c_gas, gamma_gas ) result(rate)
2352 :
2353 : real(r8), intent(in) :: sfc(:)
2354 : real(r8), intent(in) :: dm_aer(:)
2355 : real(r8), intent(in) :: dg_gas
2356 : real(r8), intent(in) :: c_gas
2357 : real(r8), intent(in) :: gamma_gas
2358 : real(r8) :: rate
2359 :
2360 0 : real(r8),allocatable :: rxt(:)
2361 : integer :: n, i
2362 :
2363 0 : n = size(sfc)
2364 :
2365 0 : allocate(rxt(n))
2366 0 : do i=1,n
2367 0 : rxt(i) = sfc(i) / (0.5_r8*dm_aer(i)/dg_gas + (4._r8/(c_gas*gamma_gas)))
2368 : enddo
2369 :
2370 0 : rate = sum(rxt)
2371 :
2372 0 : deallocate(rxt)
2373 :
2374 0 : endfunction hetrxtrate
2375 :
2376 : !-------------------------------------------------------------------------
2377 : ! Heterogeneous reaction rates for uptake of a glyoxal gas on an aerosol:
2378 : !-------------------------------------------------------------------------
2379 0 : function hetrxtrate_gly( sfc, c_gas, gamma_gas ) result(rate)
2380 :
2381 : real(r8), intent(in) :: sfc(:)
2382 : real(r8), intent(in) :: c_gas
2383 : real(r8), intent(in) :: gamma_gas
2384 : real(r8) :: rate
2385 :
2386 0 : real(r8),allocatable :: rxt(:)
2387 : integer :: n, i
2388 :
2389 0 : n = size(sfc)
2390 :
2391 0 : allocate(rxt(n))
2392 0 : do i=1,n
2393 0 : rxt(i) = 0.25_r8 * c_gas * sfc(i) * gamma_gas
2394 : enddo
2395 :
2396 0 : rate = sum(rxt)
2397 :
2398 0 : deallocate(rxt)
2399 :
2400 0 : endfunction hetrxtrate_gly
2401 :
2402 :
2403 : end module mo_usrrxt
|