CAMP 1.0.0
Chemistry Across Multiple Phases
rxn_solver.c
Go to the documentation of this file.
1/* Copyright (C) 2021 Barcelona Supercomputing Center and University of
2 * Illinois at Urbana-Champaign
3 * SPDX-License-Identifier: MIT
4 *
5 * Reaction-specific functions for use by the solver
6 *
7 */
8/** \file
9 * \brief Reaction solver functions
10 */
11#define CAMP_DEBUG_SPEC_ 118
12
13#include <camp/rxn_solver.h>
14#include <camp/rxns.h>
15#include <stdio.h>
16#include <stdlib.h>
17
18// Reaction types (Must match parameters defined in camp_rxn_factory)
19#define RXN_ARRHENIUS 1
20#define RXN_TROE 2
21#define RXN_CMAQ_H2O2 3
22#define RXN_CMAQ_OH_HNO3 4
23#define RXN_PHOTOLYSIS 5
24#define RXN_HL_PHASE_TRANSFER 6
25#define RXN_AQUEOUS_EQUILIBRIUM 7
26#define RXN_SIMPOL_PHASE_TRANSFER 10
27#define RXN_CONDENSED_PHASE_ARRHENIUS 11
28#define RXN_FIRST_ORDER_LOSS 12
29#define RXN_EMISSION 13
30#define RXN_WET_DEPOSITION 14
31#define RXN_TERNARY_CHEMICAL_ACTIVATION 15
32#define RXN_WENNBERG_TUNNELING 16
33#define RXN_WENNBERG_NO_RO2 17
34#define RXN_CONDENSED_PHASE_PHOTOLYSIS 18
35#define RXN_SURFACE 19
36#define RXN_CONDENSED_PHASE_DIFFUSION 20
37
38/** \brief Get the Jacobian elements used by a particular reaction
39 *
40 * \param model_data A pointer to the model data
41 * \param jac Jacobian
42 */
43void rxn_get_used_jac_elem(ModelData *model_data, Jacobian *jac) {
44 // Get the number of reactions
45 int n_rxn = model_data->n_rxn;
46
47 // Loop through the reactions to determine the Jacobian elements used
48 // advancing the rxn_data pointer each time
49 for (int i_rxn = 0; i_rxn < n_rxn; i_rxn++) {
50 // Get pointers to the reaction data
51 int *rxn_int_data =
52 &(model_data->rxn_int_data[model_data->rxn_int_indices[i_rxn]]);
53 double *rxn_float_data =
54 &(model_data->rxn_float_data[model_data->rxn_float_indices[i_rxn]]);
55
56 // Get the reaction type
57 int rxn_type = *(rxn_int_data++);
58
59 // Call the appropriate function
60 switch (rxn_type) {
62 rxn_aqueous_equilibrium_get_used_jac_elem(rxn_int_data, rxn_float_data,
63 jac);
64 break;
65 case RXN_ARRHENIUS:
66 rxn_arrhenius_get_used_jac_elem(rxn_int_data, rxn_float_data, jac);
67 break;
68 case RXN_CMAQ_H2O2:
69 rxn_CMAQ_H2O2_get_used_jac_elem(rxn_int_data, rxn_float_data, jac);
70 break;
72 rxn_CMAQ_OH_HNO3_get_used_jac_elem(rxn_int_data, rxn_float_data, jac);
73 break;
76 rxn_float_data, jac);
77 break;
80 rxn_float_data, jac);
81 break;
82 case RXN_EMISSION:
83 rxn_emission_get_used_jac_elem(rxn_int_data, rxn_float_data, jac);
84 break;
86 rxn_first_order_loss_get_used_jac_elem(rxn_int_data, rxn_float_data,
87 jac);
88 break;
90 rxn_HL_phase_transfer_get_used_jac_elem(model_data, rxn_int_data,
91 rxn_float_data, jac);
92 break;
93 case RXN_PHOTOLYSIS:
94 rxn_photolysis_get_used_jac_elem(rxn_int_data, rxn_float_data, jac);
95 break;
97 rxn_SIMPOL_phase_transfer_get_used_jac_elem(model_data, rxn_int_data,
98 rxn_float_data, jac);
99 break;
100 case RXN_SURFACE:
101 rxn_surface_get_used_jac_elem(model_data, rxn_int_data,
102 rxn_float_data, jac);
103 break;
106 rxn_float_data, jac);
107 break;
110 rxn_float_data, jac);
111 break;
112 case RXN_TROE:
113 rxn_troe_get_used_jac_elem(rxn_int_data, rxn_float_data, jac);
114 break;
116 rxn_wennberg_no_ro2_get_used_jac_elem(rxn_int_data, rxn_float_data,
117 jac);
118 break;
120 rxn_wennberg_tunneling_get_used_jac_elem(rxn_int_data, rxn_float_data,
121 jac);
122 break;
124 rxn_wet_deposition_get_used_jac_elem(rxn_int_data, rxn_float_data, jac);
125 break;
126 }
127 }
128}
129
130/** \brief Update the time derivative and Jacobian array ids
131 *
132 * \param model_data Pointer to the model data
133 * \param deriv_ids Ids for state variables on the time derivative array
134 * \param jac Jacobian
135 */
136void rxn_update_ids(ModelData *model_data, int *deriv_ids, Jacobian jac) {
137 // Get the number of reactions
138 int n_rxn = model_data->n_rxn;
139
140 // Loop through the reactions advancing the rxn_data pointer each time
141 for (int i_rxn = 0; i_rxn < n_rxn; i_rxn++) {
142 // Get pointers to the reaction data
143 int *rxn_int_data =
144 &(model_data->rxn_int_data[model_data->rxn_int_indices[i_rxn]]);
145 double *rxn_float_data =
146 &(model_data->rxn_float_data[model_data->rxn_float_indices[i_rxn]]);
147
148 // Get the reaction type
149 int rxn_type = *(rxn_int_data++);
150
151 // Call the appropriate function
152 switch (rxn_type) {
154 rxn_aqueous_equilibrium_update_ids(model_data, deriv_ids, jac,
155 rxn_int_data, rxn_float_data);
156 break;
157 case RXN_ARRHENIUS:
158 rxn_arrhenius_update_ids(model_data, deriv_ids, jac, rxn_int_data,
159 rxn_float_data);
160 break;
161 case RXN_CMAQ_H2O2:
162 rxn_CMAQ_H2O2_update_ids(model_data, deriv_ids, jac, rxn_int_data,
163 rxn_float_data);
164 break;
165 case RXN_CMAQ_OH_HNO3:
166 rxn_CMAQ_OH_HNO3_update_ids(model_data, deriv_ids, jac, rxn_int_data,
167 rxn_float_data);
168 break;
170 rxn_condensed_phase_arrhenius_update_ids(model_data, deriv_ids, jac,
171 rxn_int_data, rxn_float_data);
172 break;
174 rxn_condensed_phase_photolysis_update_ids(model_data, deriv_ids, jac,
175 rxn_int_data, rxn_float_data);
176 break;
177 case RXN_EMISSION:
178 rxn_emission_update_ids(model_data, deriv_ids, jac, rxn_int_data,
179 rxn_float_data);
180 break;
182 rxn_first_order_loss_update_ids(model_data, deriv_ids, jac,
183 rxn_int_data, rxn_float_data);
184 break;
186 rxn_HL_phase_transfer_update_ids(model_data, deriv_ids, jac,
187 rxn_int_data, rxn_float_data);
188 break;
189 case RXN_PHOTOLYSIS:
190 rxn_photolysis_update_ids(model_data, deriv_ids, jac, rxn_int_data,
191 rxn_float_data);
192 break;
194 rxn_SIMPOL_phase_transfer_update_ids(model_data, deriv_ids, jac,
195 rxn_int_data, rxn_float_data);
196 break;
197 case RXN_SURFACE:
198 rxn_surface_update_ids(model_data, deriv_ids, jac,
199 rxn_int_data, rxn_float_data);
200 break;
202 rxn_condensed_phase_diffusion_update_ids(model_data, deriv_ids, jac,
203 rxn_int_data, rxn_float_data);
204 break;
207 model_data, deriv_ids, jac, rxn_int_data, rxn_float_data);
208 break;
209 case RXN_TROE:
210 rxn_troe_update_ids(model_data, deriv_ids, jac, rxn_int_data,
211 rxn_float_data);
212 break;
214 rxn_wennberg_no_ro2_update_ids(model_data, deriv_ids, jac, rxn_int_data,
215 rxn_float_data);
216 break;
218 rxn_wennberg_tunneling_update_ids(model_data, deriv_ids, jac,
219 rxn_int_data, rxn_float_data);
220 break;
222 rxn_wet_deposition_update_ids(model_data, deriv_ids, jac, rxn_int_data,
223 rxn_float_data);
224 break;
225 }
226 }
227}
228
229/** \brief Update reaction data for new environmental state
230 *
231 * \param model_data Pointer to the model data with updated env state
232 */
233void rxn_update_env_state(ModelData *model_data) {
234 // Get the number of reactions
235 int n_rxn = model_data->n_rxn;
236
237 // Loop through the reactions advancing the rxn_data pointer each time
238 for (int i_rxn = 0; i_rxn < n_rxn; i_rxn++) {
239 // Get pointers to the reaction data
240 int *rxn_int_data =
241 &(model_data->rxn_int_data[model_data->rxn_int_indices[i_rxn]]);
242 double *rxn_float_data =
243 &(model_data->rxn_float_data[model_data->rxn_float_indices[i_rxn]]);
244 double *rxn_env_data =
245 &(model_data->grid_cell_rxn_env_data[model_data->rxn_env_idx[i_rxn]]);
246
247 // Get the reaction type
248 int rxn_type = *(rxn_int_data++);
249
250 // Call the appropriate function
251 switch (rxn_type) {
253 rxn_aqueous_equilibrium_update_env_state(model_data, rxn_int_data,
254 rxn_float_data, rxn_env_data);
255 break;
256 case RXN_ARRHENIUS:
257 rxn_arrhenius_update_env_state(model_data, rxn_int_data, rxn_float_data,
258 rxn_env_data);
259 break;
260 case RXN_CMAQ_H2O2:
261 rxn_CMAQ_H2O2_update_env_state(model_data, rxn_int_data, rxn_float_data,
262 rxn_env_data);
263 break;
264 case RXN_CMAQ_OH_HNO3:
265 rxn_CMAQ_OH_HNO3_update_env_state(model_data, rxn_int_data,
266 rxn_float_data, rxn_env_data);
267 break;
270 model_data, rxn_int_data, rxn_float_data, rxn_env_data);
271 break;
274 model_data, rxn_int_data, rxn_float_data, rxn_env_data);
275 break;
276 case RXN_EMISSION:
277 rxn_emission_update_env_state(model_data, rxn_int_data, rxn_float_data,
278 rxn_env_data);
279 break;
281 rxn_first_order_loss_update_env_state(model_data, rxn_int_data,
282 rxn_float_data, rxn_env_data);
283 break;
285 rxn_HL_phase_transfer_update_env_state(model_data, rxn_int_data,
286 rxn_float_data, rxn_env_data);
287 break;
288 case RXN_PHOTOLYSIS:
289 rxn_photolysis_update_env_state(model_data, rxn_int_data,
290 rxn_float_data, rxn_env_data);
291 break;
294 model_data, rxn_int_data, rxn_float_data, rxn_env_data);
295 break;
296 case RXN_SURFACE:
298 model_data, rxn_int_data, rxn_float_data, rxn_env_data);
299 break;
302 model_data, rxn_int_data, rxn_float_data, rxn_env_data);
303 break;
306 model_data, rxn_int_data, rxn_float_data, rxn_env_data);
307 break;
308 case RXN_TROE:
309 rxn_troe_update_env_state(model_data, rxn_int_data, rxn_float_data,
310 rxn_env_data);
311 break;
313 rxn_wennberg_no_ro2_update_env_state(model_data, rxn_int_data,
314 rxn_float_data, rxn_env_data);
315 break;
317 rxn_wennberg_tunneling_update_env_state(model_data, rxn_int_data,
318 rxn_float_data, rxn_env_data);
319 break;
321 rxn_wet_deposition_update_env_state(model_data, rxn_int_data,
322 rxn_float_data, rxn_env_data);
323 break;
324 }
325 }
326}
327
328/** \brief Calculate the time derivative \f$f(t,y)\f$
329 *
330 * \param model_data Pointer to the model data
331 * \param time_deriv TimeDerivative to use to build derivative array
332 * \param time_step Current model time step (s)
333 */
334#ifdef CAMP_USE_SUNDIALS
335void rxn_calc_deriv(ModelData *model_data, TimeDerivative time_deriv,
336 realtype time_step) {
337 // Get the number of reactions
338 int n_rxn = model_data->n_rxn;
339
340 // Loop through the reactions advancing the rxn_data pointer each time
341 for (int i_rxn = 0; i_rxn < n_rxn; i_rxn++) {
342 // Get pointers to the reaction data
343 int *rxn_int_data =
344 &(model_data->rxn_int_data[model_data->rxn_int_indices[i_rxn]]);
345 double *rxn_float_data =
346 &(model_data->rxn_float_data[model_data->rxn_float_indices[i_rxn]]);
347 double *rxn_env_data =
348 &(model_data->grid_cell_rxn_env_data[model_data->rxn_env_idx[i_rxn]]);
349
350 // Get the reaction type
351 int rxn_type = *(rxn_int_data++);
352
353 // Call the appropriate function
354 switch (rxn_type) {
356 rxn_aqueous_equilibrium_calc_deriv_contrib(model_data, time_deriv,
357 rxn_int_data, rxn_float_data,
358 rxn_env_data, time_step);
359 break;
360 case RXN_ARRHENIUS:
361 rxn_arrhenius_calc_deriv_contrib(model_data, time_deriv, rxn_int_data,
362 rxn_float_data, rxn_env_data,
363 time_step);
364 break;
365 case RXN_CMAQ_H2O2:
366 rxn_CMAQ_H2O2_calc_deriv_contrib(model_data, time_deriv, rxn_int_data,
367 rxn_float_data, rxn_env_data,
368 time_step);
369 break;
370 case RXN_CMAQ_OH_HNO3:
371 rxn_CMAQ_OH_HNO3_calc_deriv_contrib(model_data, time_deriv,
372 rxn_int_data, rxn_float_data,
373 rxn_env_data, time_step);
374 break;
377 model_data, time_deriv, rxn_int_data, rxn_float_data, rxn_env_data,
378 time_step);
379 break;
382 model_data, time_deriv, rxn_int_data, rxn_float_data, rxn_env_data,
383 time_step);
384 break;
385 case RXN_EMISSION:
386 rxn_emission_calc_deriv_contrib(model_data, time_deriv, rxn_int_data,
387 rxn_float_data, rxn_env_data,
388 time_step);
389 break;
391 rxn_first_order_loss_calc_deriv_contrib(model_data, time_deriv,
392 rxn_int_data, rxn_float_data,
393 rxn_env_data, time_step);
394 break;
396 rxn_HL_phase_transfer_calc_deriv_contrib(model_data, time_deriv,
397 rxn_int_data, rxn_float_data,
398 rxn_env_data, time_step);
399 break;
400 case RXN_PHOTOLYSIS:
401 rxn_photolysis_calc_deriv_contrib(model_data, time_deriv, rxn_int_data,
402 rxn_float_data, rxn_env_data,
403 time_step);
404 break;
407 model_data, time_deriv, rxn_int_data, rxn_float_data, rxn_env_data,
408 time_step);
409 break;
410 case RXN_SURFACE:
412 model_data, time_deriv, rxn_int_data, rxn_float_data, rxn_env_data,
413 time_step);
414 break;
417 model_data, time_deriv, rxn_int_data, rxn_float_data, rxn_env_data,
418 time_step);
419 break;
422 model_data, time_deriv, rxn_int_data, rxn_float_data, rxn_env_data,
423 time_step);
424 break;
425 case RXN_TROE:
426 rxn_troe_calc_deriv_contrib(model_data, time_deriv, rxn_int_data,
427 rxn_float_data, rxn_env_data, time_step);
428 break;
430 rxn_wennberg_no_ro2_calc_deriv_contrib(model_data, time_deriv,
431 rxn_int_data, rxn_float_data,
432 rxn_env_data, time_step);
433 break;
435 rxn_wennberg_tunneling_calc_deriv_contrib(model_data, time_deriv,
436 rxn_int_data, rxn_float_data,
437 rxn_env_data, time_step);
438 break;
440 rxn_wet_deposition_calc_deriv_contrib(model_data, time_deriv,
441 rxn_int_data, rxn_float_data,
442 rxn_env_data, time_step);
443 break;
444 }
445 }
446}
447#endif
448
449/** \brief Calculate the time derivative \f$f(t,y)\f$ for only some specific
450 * types
451 *
452 * \param model_data Pointer to the model data
453 * \param time_deriv TimeDerivative to use to build derivative array
454 * \param time_step Current model time step (s)
455 */
456#ifdef CAMP_USE_SUNDIALS
457void rxn_calc_deriv_specific_types(ModelData *model_data,
458 TimeDerivative time_deriv,
459 realtype time_step) {
460 // Get the number of reactions
461 int n_rxn = model_data->n_rxn;
462
463 // Loop through the reactions advancing the rxn_data pointer each time
464 for (int i_rxn = 0; i_rxn < n_rxn; i_rxn++) {
465 // Get pointers to the reaction data
466 int *rxn_int_data =
467 &(model_data->rxn_int_data[model_data->rxn_int_indices[i_rxn]]);
468 double *rxn_float_data =
469 &(model_data->rxn_float_data[model_data->rxn_float_indices[i_rxn]]);
470 double *rxn_env_data =
471 &(model_data->grid_cell_rxn_env_data[model_data->rxn_env_idx[i_rxn]]);
472
473 // Get the reaction type
474 int rxn_type = *(rxn_int_data++);
475
476 // Call the appropriate function
477 switch (rxn_type) {
479 rxn_HL_phase_transfer_calc_deriv_contrib(model_data, time_deriv,
480 rxn_int_data, rxn_float_data,
481 rxn_env_data, time_step);
482 break;
485 model_data, time_deriv, rxn_int_data, rxn_float_data, rxn_env_data,
486 time_step);
487 break;
488 }
489 }
490}
491#endif
492
493/** \brief Calculate the Jacobian
494 *
495 * \param model_data Pointer to the model data
496 * \param jac The reaction Jacobian (for one grid cell)
497 * \param time_step Current model time step (s)
498 */
499#ifdef CAMP_USE_SUNDIALS
500void rxn_calc_jac(ModelData *model_data, Jacobian jac, realtype time_step) {
501 // Get the number of reactions
502 int n_rxn = model_data->n_rxn;
503
504 // Loop through the reactions advancing the rxn_data pointer each time
505 for (int i_rxn = 0; i_rxn < n_rxn; i_rxn++) {
506 // Get pointers to the reaction data
507 int *rxn_int_data =
508 &(model_data->rxn_int_data[model_data->rxn_int_indices[i_rxn]]);
509 double *rxn_float_data =
510 &(model_data->rxn_float_data[model_data->rxn_float_indices[i_rxn]]);
511 double *rxn_env_data =
512 &(model_data->grid_cell_rxn_env_data[model_data->rxn_env_idx[i_rxn]]);
513
514 // Get the reaction type
515 int rxn_type = *(rxn_int_data++);
516
517 // Call the appropriate function
518 switch (rxn_type) {
520 rxn_aqueous_equilibrium_calc_jac_contrib(model_data, jac, rxn_int_data,
521 rxn_float_data, rxn_env_data,
522 time_step);
523 break;
524 case RXN_ARRHENIUS:
525 rxn_arrhenius_calc_jac_contrib(model_data, jac, rxn_int_data,
526 rxn_float_data, rxn_env_data, time_step);
527 break;
528 case RXN_CMAQ_H2O2:
529 rxn_CMAQ_H2O2_calc_jac_contrib(model_data, jac, rxn_int_data,
530 rxn_float_data, rxn_env_data, time_step);
531 break;
532 case RXN_CMAQ_OH_HNO3:
533 rxn_CMAQ_OH_HNO3_calc_jac_contrib(model_data, jac, rxn_int_data,
534 rxn_float_data, rxn_env_data,
535 time_step);
536 break;
539 model_data, jac, rxn_int_data, rxn_float_data, rxn_env_data,
540 time_step);
541 break;
544 model_data, jac, rxn_int_data, rxn_float_data, rxn_env_data,
545 time_step);
546 break;
547 case RXN_EMISSION:
548 rxn_emission_calc_jac_contrib(model_data, jac, rxn_int_data,
549 rxn_float_data, rxn_env_data, time_step);
550 break;
552 rxn_first_order_loss_calc_jac_contrib(model_data, jac, rxn_int_data,
553 rxn_float_data, rxn_env_data,
554 time_step);
555 break;
557 rxn_HL_phase_transfer_calc_jac_contrib(model_data, jac, rxn_int_data,
558 rxn_float_data, rxn_env_data,
559 time_step);
560 break;
561 case RXN_PHOTOLYSIS:
562 rxn_photolysis_calc_jac_contrib(model_data, jac, rxn_int_data,
563 rxn_float_data, rxn_env_data,
564 time_step);
565 break;
568 rxn_int_data, rxn_float_data,
569 rxn_env_data, time_step);
570 break;
571 case RXN_SURFACE:
572 rxn_surface_calc_jac_contrib(model_data, jac,
573 rxn_int_data, rxn_float_data,
574 rxn_env_data, time_step);
575 break;
578 model_data, jac, rxn_int_data, rxn_float_data, rxn_env_data,
579 time_step);
580 break;
583 model_data, jac, rxn_int_data, rxn_float_data, rxn_env_data,
584 time_step);
585 break;
586 case RXN_TROE:
587 rxn_troe_calc_jac_contrib(model_data, jac, rxn_int_data, rxn_float_data,
588 rxn_env_data, time_step);
589 break;
591 rxn_wennberg_no_ro2_calc_jac_contrib(model_data, jac, rxn_int_data,
592 rxn_float_data, rxn_env_data,
593 time_step);
594 break;
596 rxn_wennberg_tunneling_calc_jac_contrib(model_data, jac, rxn_int_data,
597 rxn_float_data, rxn_env_data,
598 time_step);
599 break;
601 rxn_wet_deposition_calc_jac_contrib(model_data, jac, rxn_int_data,
602 rxn_float_data, rxn_env_data,
603 time_step);
604 break;
605 }
606 }
607}
608#endif
609
610/** \brief Calculate the Jacobian for only some specific types
611 *
612 * \param model_data Pointer to the model data
613 * \param jac The reaction Jacobian (for one grid cell)
614 * \param time_step Current model time step (s)
615 */
616#ifdef CAMP_USE_SUNDIALS
617
618void rxn_calc_jac_specific_types(ModelData *model_data, Jacobian jac,
619 realtype time_step) {
620 // Get the number of reactions
621 int n_rxn = model_data->n_rxn;
622
623 // Loop through the reactions advancing the rxn_data pointer each time
624 for (int i_rxn = 0; i_rxn < n_rxn; i_rxn++) {
625 // Get pointers to the reaction data
626 int *rxn_int_data =
627 &(model_data->rxn_int_data[model_data->rxn_int_indices[i_rxn]]);
628 double *rxn_float_data =
629 &(model_data->rxn_float_data[model_data->rxn_float_indices[i_rxn]]);
630 double *rxn_env_data =
631 &(model_data->grid_cell_rxn_env_data[model_data->rxn_env_idx[i_rxn]]);
632
633 // Get the reaction type
634 int rxn_type = *(rxn_int_data++);
635
636 // Call the appropriate function
637 switch (rxn_type) {
639 rxn_aqueous_equilibrium_calc_jac_contrib(model_data, jac, rxn_int_data,
640 rxn_float_data, rxn_env_data,
641 time_step);
642 break;
645 model_data, jac, rxn_int_data, rxn_float_data, rxn_env_data,
646 time_step);
647 break;
650 model_data, jac, rxn_int_data, rxn_float_data, rxn_env_data,
651 time_step);
652 break;
654 rxn_HL_phase_transfer_calc_jac_contrib(model_data, jac, rxn_int_data,
655 rxn_float_data, rxn_env_data,
656 time_step);
657 break;
660 rxn_int_data, rxn_float_data,
661 rxn_env_data, time_step);
662 break;
663 }
664 }
665}
666
667#endif
668
669/** \brief Add condensed data to the condensed data block of memory
670 *
671 * \param rxn_type Reaction type
672 * \param n_int_param Number of integer parameters
673 * \param n_float_param Number of floating-point parameters
674 * \param n_env_param Number of environment-dependent parameters
675 * \param int_param Pointer to integer parameter array
676 * \param float_param Pointer to floating-point parameter array
677 * \param solver_data Pointer to solver data
678 */
679// TODO: question: move n_added_rxns out of struct to function parameter since
680// is only used in this function
681void rxn_add_condensed_data(int rxn_type, int n_int_param, int n_float_param,
682 int n_env_param, int *int_param,
683 double *float_param, void *solver_data) {
684 ModelData *model_data =
685 (ModelData *)&(((SolverData *)solver_data)->model_data);
686
687 // Get pointers to the reaction data
688 int *rxn_int_data =
689 &(model_data->rxn_int_data
690 [model_data->rxn_int_indices[model_data->n_added_rxns]]);
691 double *rxn_float_data =
692 &(model_data->rxn_float_data
693 [model_data->rxn_float_indices[model_data->n_added_rxns]]);
694
695 // Save next indices by adding lengths
696 model_data->rxn_int_indices[model_data->n_added_rxns + 1] =
697 (n_int_param + 1) +
698 model_data->rxn_int_indices[model_data->n_added_rxns]; //+1 is type
699 model_data->rxn_float_indices[model_data->n_added_rxns + 1] =
700 n_float_param + model_data->rxn_float_indices[model_data->n_added_rxns];
701 model_data->rxn_env_idx[model_data->n_added_rxns + 1] =
702 model_data->rxn_env_idx[model_data->n_added_rxns] + n_env_param;
703 ++(model_data->n_added_rxns);
704
705 // Add the reaction type
706 *(rxn_int_data++) = rxn_type;
707
708 // Add integer parameters
709 for (; n_int_param > 0; --n_int_param) *(rxn_int_data++) = *(int_param++);
710
711 // Add floating-point parameters
712 for (; n_float_param > 0; --n_float_param)
713 *(rxn_float_data++) = (double)*(float_param++);
714
715 model_data->n_rxn_env_data += n_env_param;
716}
717
718/** \brief Update reaction data
719 *
720 * Update data for one or more reactions. Reactions of a certain type are
721 * passed a void pointer to updated data that must be in the format specified
722 * by the reaction type. This data could be used to find specific reactions of
723 * the specified type and, for example, update rate constants.
724 *
725 * \param cell_id Id of the grid cell to update
726 * \param rxn_id Id of the reaction (or 0 if unknown)
727 * \param update_rxn_type Type of the reaction
728 * \param update_data Pointer to updated data to pass to the reaction
729 * \param solver_data Pointer to solver data
730 */
731void rxn_update_data(int cell_id, int *rxn_id, int update_rxn_type,
732 void *update_data, void *solver_data) {
733 ModelData *model_data =
734 (ModelData *)&(((SolverData *)solver_data)->model_data);
735
736 // Point to the environment-dependent data for the grid cell
737 model_data->grid_cell_rxn_env_data =
738 &(model_data->rxn_env_data[cell_id * model_data->n_rxn_env_data]);
739
740 // Get the number of reactions
741 int n_rxn = model_data->n_rxn;
742
743 // Loop through the reactions advancing the rxn_data pointer each time
744 for (; (*rxn_id) < n_rxn; (*rxn_id)++) {
745 // Get pointers to the reaction data
746 int *rxn_int_data =
747 &(model_data->rxn_int_data[model_data->rxn_int_indices[*rxn_id]]);
748 double *rxn_float_data =
749 &(model_data->rxn_float_data[model_data->rxn_float_indices[*rxn_id]]);
750
751 double *rxn_env_data =
752 &(model_data->grid_cell_rxn_env_data[model_data->rxn_env_idx[*rxn_id]]);
753
754 // Get the reaction type
755 int rxn_type = *(rxn_int_data++);
756
757 bool found = false;
758
759 // Try the update data function for reactions of the correct type
760 if (rxn_type == update_rxn_type) {
761 switch (rxn_type) {
762 case RXN_EMISSION:
763 found = rxn_emission_update_data((void *)update_data, rxn_int_data,
764 rxn_float_data, rxn_env_data);
765 break;
768 (void *)update_data, rxn_int_data, rxn_float_data, rxn_env_data);
769 break;
770 case RXN_PHOTOLYSIS:
771 found = rxn_photolysis_update_data((void *)update_data, rxn_int_data,
772 rxn_float_data, rxn_env_data);
773 break;
775 found = rxn_condensed_phase_photolysis_update_data((void *)update_data, rxn_int_data,
776 rxn_float_data, rxn_env_data);
777 break;
780 (void *)update_data, rxn_int_data, rxn_float_data, rxn_env_data);
781 break;
782 }
783 if (found) return;
784 }
785 }
786}
787
788/** \brief Print the reaction data
789 *
790 * \param solver_data Pointer to the solver data
791 */
792void rxn_print_data(void *solver_data) {
793 ModelData *model_data =
794 (ModelData *)&(((SolverData *)solver_data)->model_data);
795
796 // Get the number of reactions
797 int n_rxn = model_data->n_rxn;
798
799 printf("\n\nReaction data\n\nnumber of reactions: %d\n\n", n_rxn);
800
801 // Loop through the reactions advancing the rxn_data pointer each time
802 for (int i_rxn = 0; i_rxn < n_rxn; i_rxn++) {
803 // Get pointers to the reaction data
804 int *rxn_int_data =
805 &(model_data->rxn_int_data[model_data->rxn_int_indices[i_rxn]]);
806 double *rxn_float_data =
807 &(model_data->rxn_float_data[model_data->rxn_float_indices[i_rxn]]);
808
809 // Get the reaction type
810 int rxn_type = *(rxn_int_data++);
811
812 // Call the appropriate function
813 switch (rxn_type) {
815 rxn_aqueous_equilibrium_print(rxn_int_data, rxn_float_data);
816 break;
817 case RXN_ARRHENIUS:
818 rxn_arrhenius_print(rxn_int_data, rxn_float_data);
819 break;
820 case RXN_CMAQ_H2O2:
821 rxn_CMAQ_H2O2_print(rxn_int_data, rxn_float_data);
822 break;
823 case RXN_CMAQ_OH_HNO3:
824 rxn_CMAQ_OH_HNO3_print(rxn_int_data, rxn_float_data);
825 break;
827 rxn_condensed_phase_arrhenius_print(rxn_int_data, rxn_float_data);
828 break;
830 rxn_condensed_phase_photolysis_print(rxn_int_data, rxn_float_data);
831 break;
832 case RXN_EMISSION:
833 rxn_emission_print(rxn_int_data, rxn_float_data);
834 break;
836 rxn_first_order_loss_print(rxn_int_data, rxn_float_data);
837 break;
839 rxn_HL_phase_transfer_print(rxn_int_data, rxn_float_data);
840 break;
841 case RXN_PHOTOLYSIS:
842 rxn_photolysis_print(rxn_int_data, rxn_float_data);
843 break;
845 rxn_SIMPOL_phase_transfer_print(rxn_int_data, rxn_float_data);
846 break;
847 case RXN_SURFACE:
848 rxn_surface_print(rxn_int_data, rxn_float_data);
849 break;
851 rxn_condensed_phase_diffusion_print(rxn_int_data, rxn_float_data);
852 break;
854 rxn_ternary_chemical_activation_print(rxn_int_data, rxn_float_data);
855 break;
856 case RXN_TROE:
857 rxn_troe_print(rxn_int_data, rxn_float_data);
858 break;
860 rxn_wennberg_no_ro2_print(rxn_int_data, rxn_float_data);
861 break;
863 rxn_wennberg_tunneling_print(rxn_int_data, rxn_float_data);
864 break;
866 rxn_wet_deposition_print(rxn_int_data, rxn_float_data);
867 break;
868 }
869 }
870 fflush(stdout);
871}
872
873/** \brief Free an update data object
874 *
875 * \param update_data Object to free
876 */
877void rxn_free_update_data(void *update_data) { free(update_data); }
void rxn_CMAQ_H2O2_update_ids(ModelData *model_data, int *deriv_ids, Jacobian jac, int *rxn_int_data, double *rxn_float_data)
Update the time derivative and Jacbobian array indices.
Definition: rxn_CMAQ_H2O2.c:70
void rxn_CMAQ_H2O2_update_env_state(ModelData *model_data, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data)
Update reaction data for new environmental conditions.
void rxn_CMAQ_H2O2_get_used_jac_elem(int *rxn_int_data, double *rxn_float_data, Jacobian *jac)
Flag Jacobian elements used by this reaction.
Definition: rxn_CMAQ_H2O2.c:45
void rxn_CMAQ_H2O2_print(int *rxn_int_data, double *rxn_float_data)
Print the CMAQ_H2O2 reaction parameters.
void rxn_CMAQ_H2O2_calc_deriv_contrib(ModelData *model_data, TimeDerivative time_deriv, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data, double time_step)
Calculate contributions to the time derivative from this reaction.
void rxn_CMAQ_H2O2_calc_jac_contrib(ModelData *model_data, Jacobian jac, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data, double time_step)
Calculate contributions to the Jacobian from this reaction.
void rxn_CMAQ_OH_HNO3_update_env_state(ModelData *model_data, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data)
Update reaction data for new environmental conditions.
void rxn_CMAQ_OH_HNO3_print(int *rxn_int_data, double *rxn_float_data)
Print the CMAQ_OH_HNO3 reaction parameters.
void rxn_CMAQ_OH_HNO3_calc_jac_contrib(ModelData *model_data, Jacobian jac, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data, double time_step)
Calculate contributions to the Jacobian from this reaction.
void rxn_CMAQ_OH_HNO3_calc_deriv_contrib(ModelData *model_data, TimeDerivative time_deriv, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data, double time_step)
Calculate contributions to the time derivative from this reaction.
void rxn_CMAQ_OH_HNO3_get_used_jac_elem(int *rxn_int_data, double *rxn_float_data, Jacobian *jac)
Flag Jacobian elements used by this reaction.
void rxn_CMAQ_OH_HNO3_update_ids(ModelData *model_data, int *deriv_ids, Jacobian jac, int *rxn_int_data, double *rxn_float_data)
Update the time derivative and Jacbobian array indices.
void rxn_HL_phase_transfer_print(int *rxn_int_data, double *rxn_float_data)
Print the Phase Transfer reaction parameters.
void rxn_HL_phase_transfer_calc_jac_contrib(ModelData *model_data, Jacobian jac, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data, realtype time_step)
Calculate contributions to the Jacobian from this reaction.
void rxn_HL_phase_transfer_update_env_state(ModelData *model_data, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data)
Update reaction data for new environmental conditions.
void rxn_HL_phase_transfer_get_used_jac_elem(ModelData *model_data, int *rxn_int_data, double *rxn_float_data, Jacobian *jac)
Flag Jacobian elements used by this reaction.
void rxn_HL_phase_transfer_update_ids(ModelData *model_data, int *deriv_ids, Jacobian jac, int *rxn_int_data, double *rxn_float_data)
Update the time derivative and Jacbobian array indices.
void rxn_HL_phase_transfer_calc_deriv_contrib(ModelData *model_data, TimeDerivative time_deriv, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data, realtype time_step)
Calculate contributions to the time derivative from this reaction.
void rxn_SIMPOL_phase_transfer_get_used_jac_elem(ModelData *model_data, int *rxn_int_data, double *rxn_float_data, Jacobian *jac)
Flag Jacobian elements used by this reaction.
void rxn_SIMPOL_phase_transfer_update_env_state(ModelData *model_data, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data)
Update reaction data for new environmental conditions.
void rxn_SIMPOL_phase_transfer_calc_jac_contrib(ModelData *model_data, Jacobian jac, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data, realtype time_step)
Calculate contributions to the Jacobian from this reaction.
void rxn_SIMPOL_phase_transfer_print(int *rxn_int_data, double *rxn_float_data)
Print the Phase Transfer reaction parameters.
void rxn_SIMPOL_phase_transfer_calc_deriv_contrib(ModelData *model_data, TimeDerivative time_deriv, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data, realtype time_step)
Calculate contributions to the time derivative from this reaction.
void rxn_SIMPOL_phase_transfer_update_ids(ModelData *model_data, int *deriv_ids, Jacobian jac, int *rxn_int_data, double *rxn_float_data)
Update the time derivative and Jacbobian array indices.
void rxn_aqueous_equilibrium_update_env_state(ModelData *model_data, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data)
Update reaction data for new environmental conditions.
void rxn_aqueous_equilibrium_calc_jac_contrib(ModelData *model_data, Jacobian jac, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data, double time_step)
Calculate contributions to the Jacobian from this reaction.
void rxn_aqueous_equilibrium_calc_deriv_contrib(ModelData *model_data, TimeDerivative time_deriv, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data, double time_step)
Calculate contributions to the time derivative from this reaction.
void rxn_aqueous_equilibrium_print(int *rxn_int_data, double *rxn_float_data)
Print the Aqueous Equilibrium reaction parameters.
void rxn_aqueous_equilibrium_get_used_jac_elem(int *rxn_int_data, double *rxn_float_data, Jacobian *jac)
Flag Jacobian elements used by this reaction.
void rxn_aqueous_equilibrium_update_ids(ModelData *model_data, int *deriv_ids, Jacobian jac, int *rxn_int_data, double *rxn_float_data)
Update the time derivative and Jacbobian array indices.
void rxn_arrhenius_get_used_jac_elem(int *rxn_int_data, double *rxn_float_data, Jacobian *jac)
Flag Jacobian elements used by this reaction.
Definition: rxn_arrhenius.c:44
void rxn_arrhenius_update_ids(ModelData *model_data, int *deriv_ids, Jacobian jac, int *rxn_int_data, double *rxn_float_data)
Update the time derivative and Jacbobian array indices.
Definition: rxn_arrhenius.c:69
void rxn_arrhenius_calc_deriv_contrib(ModelData *model_data, TimeDerivative time_deriv, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data, double time_step)
Calculate contributions to the time derivative from this reaction.
void rxn_arrhenius_calc_jac_contrib(ModelData *model_data, Jacobian jac, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data, double time_step)
Calculate contributions to the Jacobian from this reaction.
void rxn_arrhenius_update_env_state(ModelData *model_data, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data)
Update reaction data for new environmental conditions.
void rxn_arrhenius_print(int *rxn_int_data, double *rxn_float_data)
Print the Arrhenius reaction parameters.
void rxn_condensed_phase_arrhenius_calc_deriv_contrib(ModelData *model_data, TimeDerivative time_deriv, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data, double time_step)
Calculate contributions to the time derivative f(t,y) from this reaction.
void rxn_condensed_phase_arrhenius_get_used_jac_elem(int *rxn_int_data, double *rxn_float_data, Jacobian *jac)
Flag Jacobian elements used by this reaction.
void rxn_condensed_phase_arrhenius_calc_jac_contrib(ModelData *model_data, Jacobian jac, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data, double time_step)
Calculate contributions to the Jacobian from this reaction.
void rxn_condensed_phase_arrhenius_update_env_state(ModelData *model_data, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data)
Update reaction data for new environmental conditions.
void rxn_condensed_phase_arrhenius_print(int *rxn_int_data, double *rxn_float_data)
Print the Condensed Phase Arrhenius reaction parameters.
void rxn_condensed_phase_arrhenius_update_ids(ModelData *model_data, int *deriv_ids, Jacobian jac, int *rxn_int_data, double *rxn_float_data)
Update the time derivative and Jacbobian array indices.
void rxn_condensed_phase_diffusion_update_env_state(ModelData *model_data, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data)
Update reaction data for new environmental conditions.
void rxn_condensed_phase_diffusion_print(int *rxn_int_data, double *rxn_float_data)
Print the Phase Transfer reaction parameters.
void rxn_condensed_phase_diffusion_calc_deriv_contrib(ModelData *model_data, TimeDerivative time_deriv, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data, realtype time_step)
Calculate contributions to the time derivative from this reaction.
void rxn_condensed_phase_diffusion_update_ids(ModelData *model_data, int *deriv_ids, Jacobian jac, int *rxn_int_data, double *rxn_float_data)
Update the time derivative and Jacbobian array indices.
void rxn_condensed_phase_diffusion_calc_jac_contrib(ModelData *model_data, Jacobian jac, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data, realtype time_step)
Calculate contributions to the Jacobian from this reaction.
void rxn_condensed_phase_diffusion_get_used_jac_elem(ModelData *model_data, int *rxn_int_data, double *rxn_float_data, Jacobian *jac)
Flag Jacobian elements used by this reaction.
void rxn_condensed_phase_photolysis_print(int *rxn_int_data, double *rxn_float_data)
Print the Condensed Phase photolysis reaction parameters.
void rxn_condensed_phase_photolysis_calc_deriv_contrib(ModelData *model_data, TimeDerivative time_deriv, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data, double time_step)
Calculate contributions to the time derivative f(t,y) from this reaction.
void rxn_condensed_phase_photolysis_update_env_state(ModelData *model_data, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data)
Update reaction data for new environmental conditions.
void rxn_condensed_phase_photolysis_get_used_jac_elem(int *rxn_int_data, double *rxn_float_data, Jacobian *jac)
Flag Jacobian elements used by this reaction.
void rxn_condensed_phase_photolysis_update_ids(ModelData *model_data, int *deriv_ids, Jacobian jac, int *rxn_int_data, double *rxn_float_data)
Update the time derivative and Jacbobian array indices.
void rxn_condensed_phase_photolysis_calc_jac_contrib(ModelData *model_data, Jacobian jac, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data, double time_step)
Calculate contributions to the Jacobian from this reaction.
bool rxn_condensed_phase_photolysis_update_data(void *update_data, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data)
Update reaction data.
void rxn_emission_get_used_jac_elem(int *rxn_int_data, double *rxn_float_data, Jacobian *jac)
Flag Jacobian elements used by this reaction.
Definition: rxn_emission.c:36
void rxn_emission_calc_deriv_contrib(ModelData *model_data, TimeDerivative time_deriv, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data, realtype time_step)
Calculate contributions to the time derivative from this reaction.
Definition: rxn_emission.c:133
void rxn_emission_update_ids(ModelData *model_data, int *deriv_ids, Jacobian jac, int *rxn_int_data, double *rxn_float_data)
Update the time derivative and Jacbobian array indices.
Definition: rxn_emission.c:52
void rxn_emission_print(int *rxn_int_data, double *rxn_float_data)
Print the reaction parameters.
Definition: rxn_emission.c:179
bool rxn_emission_update_data(void *update_data, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data)
Update reaction data.
Definition: rxn_emission.c:82
void rxn_emission_calc_jac_contrib(ModelData *model_data, Jacobian jac, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data, realtype time_step)
Calculate contributions to the Jacobian from this reaction.
Definition: rxn_emission.c:160
void rxn_emission_update_env_state(ModelData *model_data, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data)
Update reaction data for new environmental conditions.
Definition: rxn_emission.c:109
void rxn_first_order_loss_calc_jac_contrib(ModelData *model_data, Jacobian jac, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data, realtype time_step)
Calculate contributions to the Jacobian from this reaction.
void rxn_first_order_loss_print(int *rxn_int_data, double *rxn_float_data)
Print the reaction parameters.
void rxn_first_order_loss_get_used_jac_elem(int *rxn_int_data, double *rxn_float_data, Jacobian *jac)
Flag Jacobian elements used by this reaction.
void rxn_first_order_loss_calc_deriv_contrib(ModelData *model_data, TimeDerivative time_deriv, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data, realtype time_step)
Calculate contributions to the time derivative from this reaction.
void rxn_first_order_loss_update_env_state(ModelData *model_data, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data)
Update reaction data for new environmental conditions.
void rxn_first_order_loss_update_ids(ModelData *model_data, int *deriv_ids, Jacobian jac, int *rxn_int_data, double *rxn_float_data)
Update the time derivative and Jacbobian array indices.
bool rxn_first_order_loss_update_data(void *update_data, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data)
Update reaction data.
void rxn_photolysis_calc_jac_contrib(ModelData *model_data, Jacobian jac, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data, realtype time_step)
Calculate contributions to the Jacobian from this reaction.
bool rxn_photolysis_update_data(void *update_data, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data)
Update reaction data.
void rxn_photolysis_update_env_state(ModelData *model_data, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data)
Update reaction data for new environmental conditions.
void rxn_photolysis_calc_deriv_contrib(ModelData *model_data, TimeDerivative time_deriv, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data, realtype time_step)
Calculate contributions to the time derivative from this reaction.
void rxn_photolysis_get_used_jac_elem(int *rxn_int_data, double *rxn_float_data, Jacobian *jac)
Flag Jacobian elements used by this reaction.
void rxn_photolysis_print(int *rxn_int_data, double *rxn_float_data)
Print the Photolysis reaction parameters.
void rxn_photolysis_update_ids(ModelData *model_data, int *deriv_ids, Jacobian jac, int *rxn_int_data, double *rxn_float_data)
Update the time derivative and Jacbobian array indices.
#define RXN_PHOTOLYSIS
Definition: rxn_solver.c:23
void rxn_update_ids(ModelData *model_data, int *deriv_ids, Jacobian jac)
Update the time derivative and Jacobian array ids.
Definition: rxn_solver.c:136
void rxn_calc_deriv_specific_types(ModelData *model_data, TimeDerivative time_deriv, realtype time_step)
Calculate the time derivative for only some specific types.
Definition: rxn_solver.c:457
#define RXN_CONDENSED_PHASE_PHOTOLYSIS
Definition: rxn_solver.c:34
#define RXN_WENNBERG_TUNNELING
Definition: rxn_solver.c:32
#define RXN_AQUEOUS_EQUILIBRIUM
Definition: rxn_solver.c:25
#define RXN_CMAQ_H2O2
Definition: rxn_solver.c:21
#define RXN_ARRHENIUS
Definition: rxn_solver.c:19
void rxn_calc_jac_specific_types(ModelData *model_data, Jacobian jac, realtype time_step)
Calculate the Jacobian for only some specific types.
Definition: rxn_solver.c:618
void rxn_add_condensed_data(int rxn_type, int n_int_param, int n_float_param, int n_env_param, int *int_param, double *float_param, void *solver_data)
Add condensed data to the condensed data block of memory.
Definition: rxn_solver.c:681
#define RXN_CONDENSED_PHASE_DIFFUSION
Definition: rxn_solver.c:36
void rxn_print_data(void *solver_data)
Print the reaction data.
Definition: rxn_solver.c:792
void rxn_free_update_data(void *update_data)
Free an update data object.
Definition: rxn_solver.c:877
void rxn_get_used_jac_elem(ModelData *model_data, Jacobian *jac)
Get the Jacobian elements used by a particular reaction.
Definition: rxn_solver.c:43
#define RXN_FIRST_ORDER_LOSS
Definition: rxn_solver.c:28
#define RXN_WENNBERG_NO_RO2
Definition: rxn_solver.c:33
#define RXN_CMAQ_OH_HNO3
Definition: rxn_solver.c:22
#define RXN_TERNARY_CHEMICAL_ACTIVATION
Definition: rxn_solver.c:31
#define RXN_TROE
Definition: rxn_solver.c:20
void rxn_update_env_state(ModelData *model_data)
Update reaction data for new environmental state.
Definition: rxn_solver.c:233
#define RXN_CONDENSED_PHASE_ARRHENIUS
Definition: rxn_solver.c:27
#define RXN_SURFACE
Definition: rxn_solver.c:35
void rxn_calc_jac(ModelData *model_data, Jacobian jac, realtype time_step)
Calculate the Jacobian.
Definition: rxn_solver.c:500
#define RXN_EMISSION
Definition: rxn_solver.c:29
void rxn_update_data(int cell_id, int *rxn_id, int update_rxn_type, void *update_data, void *solver_data)
Update reaction data.
Definition: rxn_solver.c:731
#define RXN_SIMPOL_PHASE_TRANSFER
Definition: rxn_solver.c:26
#define RXN_HL_PHASE_TRANSFER
Definition: rxn_solver.c:24
void rxn_calc_deriv(ModelData *model_data, TimeDerivative time_deriv, realtype time_step)
Calculate the time derivative .
Definition: rxn_solver.c:335
#define RXN_WET_DEPOSITION
Definition: rxn_solver.c:30
void rxn_surface_get_used_jac_elem(ModelData *model_data, int *rxn_int_data, double *rxn_float_data, Jacobian *jac)
Flag Jacobian elements used by this reaction.
Definition: rxn_surface.c:56
void rxn_surface_update_env_state(ModelData *model_data, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data)
Update reaction data for new environmental conditions.
Definition: rxn_surface.c:178
void rxn_surface_calc_deriv_contrib(ModelData *model_data, TimeDerivative time_deriv, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data, realtype time_step)
Calculate contributions to the time derivative from this reaction.
Definition: rxn_surface.c:203
void rxn_surface_update_ids(ModelData *model_data, int *deriv_ids, Jacobian jac, int *rxn_int_data, double *rxn_float_data)
Update the time derivative and Jacbobian array indices.
Definition: rxn_surface.c:132
void rxn_surface_calc_jac_contrib(ModelData *model_data, Jacobian jac, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data, realtype time_step)
Calculate contributions to the Jacobian from this reaction.
Definition: rxn_surface.c:264
void rxn_surface_print(int *rxn_int_data, double *rxn_float_data)
Print the surface reaction parameters.
Definition: rxn_surface.c:363
void rxn_ternary_chemical_activation_calc_jac_contrib(ModelData *model_data, Jacobian jac, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data, realtype time_step)
Calculate contributions to the Jacobian from this reaction.
void rxn_ternary_chemical_activation_print(int *rxn_int_data, double *rxn_float_data)
Print the Ternary Chemical Activation reaction parameters.
void rxn_ternary_chemical_activation_update_env_state(ModelData *model_data, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data)
Update reaction data for new environmental conditions.
void rxn_ternary_chemical_activation_get_used_jac_elem(int *rxn_int_data, double *rxn_float_data, Jacobian *jac)
Flag Jacobian elements used by this reaction.
void rxn_ternary_chemical_activation_update_ids(ModelData *model_data, int *deriv_ids, Jacobian jac, int *rxn_int_data, double *rxn_float_data)
Update the time derivative and Jacbobian array indices.
void rxn_ternary_chemical_activation_calc_deriv_contrib(ModelData *model_data, TimeDerivative time_deriv, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data, realtype time_step)
Calculate contributions to the time derivative from this reaction.
void rxn_troe_calc_jac_contrib(ModelData *model_data, Jacobian jac, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data, realtype time_step)
Calculate contributions to the Jacobian from this reaction.
Definition: rxn_troe.c:189
void rxn_troe_print(int *rxn_int_data, double *rxn_float_data)
Print the Troe reaction parameters.
Definition: rxn_troe.c:231
void rxn_troe_get_used_jac_elem(int *rxn_int_data, double *rxn_float_data, Jacobian *jac)
Flag Jacobian elements used by this reaction.
Definition: rxn_troe.c:47
void rxn_troe_update_ids(ModelData *model_data, int *deriv_ids, Jacobian jac, int *rxn_int_data, double *rxn_float_data)
Update the time derivative and Jacbobian array indices.
Definition: rxn_troe.c:72
void rxn_troe_update_env_state(ModelData *model_data, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data)
Update reaction data for new environmental conditions.
Definition: rxn_troe.c:107
void rxn_troe_calc_deriv_contrib(ModelData *model_data, TimeDerivative time_deriv, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data, realtype time_step)
Calculate contributions to the time derivative from this reaction.
Definition: rxn_troe.c:143
void rxn_wennberg_no_ro2_calc_jac_contrib(ModelData *model_data, Jacobian jac, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data, double time_step)
Calculate contributions to the Jacobian from this reaction.
void rxn_wennberg_no_ro2_update_env_state(ModelData *model_data, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data)
Update reaction data for new environmental conditions.
void rxn_wennberg_no_ro2_get_used_jac_elem(int *rxn_int_data, double *rxn_float_data, Jacobian *jac)
Flag Jacobian elements used by this reaction.
void rxn_wennberg_no_ro2_update_ids(ModelData *model_data, int *deriv_ids, Jacobian jac, int *rxn_int_data, double *rxn_float_data)
Update the time derivative and Jacbobian array indices.
void rxn_wennberg_no_ro2_print(int *rxn_int_data, double *rxn_float_data)
Print the Wennberg NO + RO2 reaction parameters.
void rxn_wennberg_no_ro2_calc_deriv_contrib(ModelData *model_data, TimeDerivative time_deriv, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data, double time_step)
Calculate contributions to the time derivative from this reaction.
void rxn_wennberg_tunneling_update_ids(ModelData *model_data, int *deriv_ids, Jacobian jac, int *rxn_int_data, double *rxn_float_data)
Update the time derivative and Jacbobian array indices.
void rxn_wennberg_tunneling_print(int *rxn_int_data, double *rxn_float_data)
Print the Wennberg tunneling reaction parameters.
void rxn_wennberg_tunneling_calc_jac_contrib(ModelData *model_data, Jacobian jac, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data, double time_step)
Calculate contributions to the Jacobian from this reaction.
void rxn_wennberg_tunneling_update_env_state(ModelData *model_data, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data)
Update reaction data for new environmental conditions.
void rxn_wennberg_tunneling_calc_deriv_contrib(ModelData *model_data, TimeDerivative time_deriv, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data, double time_step)
Calculate contributions to the time derivative from this reaction.
void rxn_wennberg_tunneling_get_used_jac_elem(int *rxn_int_data, double *rxn_float_data, Jacobian *jac)
Flag Jacobian elements used by this reaction.
void rxn_wet_deposition_get_used_jac_elem(int *rxn_int_data, double *rxn_float_data, Jacobian *jac)
Flag Jacobian elements used by this reaction.
void rxn_wet_deposition_update_ids(ModelData *model_data, int *deriv_ids, Jacobian jac, int *rxn_int_data, double *rxn_float_data)
Update the time derivative and Jacbobian array indices.
void rxn_wet_deposition_update_env_state(ModelData *model_data, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data)
Update reaction data for new environmental conditions.
void rxn_wet_deposition_calc_deriv_contrib(ModelData *model_data, TimeDerivative time_deriv, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data, realtype time_step)
Calculate contributions to the time derivative from this reaction.
void rxn_wet_deposition_print(int *rxn_int_data, double *rxn_float_data)
Print the reaction parameters.
bool rxn_wet_deposition_update_data(void *update_data, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data)
Update reaction data.
void rxn_wet_deposition_calc_jac_contrib(ModelData *model_data, Jacobian jac, int *rxn_int_data, double *rxn_float_data, double *rxn_env_data, realtype time_step)
Calculate contributions to the Jacobian from this reaction.