17#define TEMPERATURE_K_ env_data[0]
18#define PRESSURE_PA_ env_data[1]
20#define NUM_REACT_ int_data[0]
21#define NUM_PROD_ int_data[1]
22#define k0_A_ float_data[0]
23#define k0_B_ float_data[1]
24#define k0_C_ float_data[2]
25#define k2_A_ float_data[3]
26#define k2_B_ float_data[4]
27#define k2_C_ float_data[5]
28#define k3_A_ float_data[6]
29#define k3_B_ float_data[7]
30#define k3_C_ float_data[8]
31#define SCALING_ float_data[9]
32#define CONV_ float_data[10]
33#define RATE_CONSTANT_ (rxn_env_data[0])
34#define NUM_INT_PROP_ 2
35#define NUM_FLOAT_PROP_ 11
36#define NUM_ENV_PARAM_ 1
37#define REACT_(x) (int_data[NUM_INT_PROP_ + x] - 1)
38#define PROD_(x) (int_data[NUM_INT_PROP_ + NUM_REACT_ + x] - 1)
39#define DERIV_ID_(x) int_data[NUM_INT_PROP_ + NUM_REACT_ + NUM_PROD_ + x]
40#define JAC_ID_(x) int_data[NUM_INT_PROP_ + 2 * (NUM_REACT_ + NUM_PROD_) + x]
41#define YIELD_(x) float_data[NUM_FLOAT_PROP_ + x]
50 double *rxn_float_data,
Jacobian *jac) {
51 int *int_data = rxn_int_data;
52 double *float_data = rxn_float_data;
54 for (
int i_ind = 0; i_ind <
NUM_REACT_; i_ind++) {
55 for (
int i_dep = 0; i_dep <
NUM_REACT_; i_dep++) {
58 for (
int i_dep = 0; i_dep <
NUM_PROD_; i_dep++) {
76 double *rxn_float_data) {
77 int *int_data = rxn_int_data;
78 double *float_data = rxn_float_data;
87 for (
int i_ind = 0; i_ind <
NUM_REACT_; i_ind++) {
88 for (
int i_dep = 0; i_dep <
NUM_REACT_; i_dep++) {
92 for (
int i_dep = 0; i_dep <
NUM_PROD_; i_dep++) {
111 double *rxn_float_data,
112 double *rxn_env_data) {
113 int *int_data = rxn_int_data;
114 double *float_data = rxn_float_data;
130 k3 / (((
double)1.0) + k3 / k2)) *
146#ifdef CAMP_USE_SUNDIALS
149 double *rxn_float_data,
double *rxn_env_data,
double time_step) {
150 int *int_data = rxn_int_data;
151 double *float_data = rxn_float_data;
157 for (
int i_spec = 0; i_spec <
NUM_REACT_; i_spec++)
158 rate *= state[
REACT_(i_spec)];
163 for (
int i_spec = 0; i_spec <
NUM_REACT_; i_spec++, i_dep_var++) {
167 for (
int i_spec = 0; i_spec <
NUM_PROD_; i_spec++, i_dep_var++) {
171 if (-rate *
YIELD_(i_spec) * time_step <= state[
PROD_(i_spec)]) {
191#ifdef CAMP_USE_SUNDIALS
194 double *rxn_float_data,
195 double *rxn_env_data,
double time_step) {
196 int *int_data = rxn_int_data;
197 double *float_data = rxn_float_data;
203 for (
int i_ind = 0; i_ind <
NUM_REACT_; i_ind++) {
206 for (
int i_spec = 0; i_spec <
NUM_REACT_; i_spec++)
207 if (i_ind != i_spec) rate *= state[
REACT_(i_spec)];
209 for (
int i_dep = 0; i_dep <
NUM_REACT_; i_dep++, i_elem++) {
210 if (
JAC_ID_(i_elem) < 0)
continue;
214 for (
int i_dep = 0; i_dep <
NUM_PROD_; i_dep++, i_elem++) {
215 if (
JAC_ID_(i_elem) < 0)
continue;
218 if (-rate * state[
REACT_(i_ind)] *
YIELD_(i_dep) * time_step <=
219 state[
PROD_(i_dep)]) {
236 int *int_data = rxn_int_data;
237 double *float_data = rxn_float_data;
239 printf(
"\n\nCMAQ_OH_HNO3 reaction\n");
unsigned int jacobian_get_element_id(Jacobian jac, unsigned int dep_id, unsigned int ind_id)
Get an element id in the Jacobian data arrays.
void jacobian_add_value(Jacobian jac, unsigned int elem_id, unsigned int prod_or_loss, long double jac_contribution)
Add a contribution to the Jacobian.
void jacobian_register_element(Jacobian *jac, unsigned int dep_id, unsigned int ind_id)
Adds an element to the sparse matrix.
#define JACOBIAN_PRODUCTION
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 time_derivative_add_value(TimeDerivative time_deriv, unsigned int spec_id, long double rate_contribution)
Add a contribution to the time derivative.