10#include <camp/sub_model_solver.h>
11#include <camp/sub_models.h>
16#define SUB_MODEL_UNIFAC 1
17#define SUB_MODEL_ZSR_AEROSOL_WATER 2
18#define SUB_MODEL_PDFITE 3
29 &local_jac, (
unsigned int)model_data->n_per_cell_state_var) != 1) {
31 "\n\nERROR allocating sub-model Jacobian structure for sub-model "
32 "interdepenedence\n\n");
37 int n_sub_model = model_data->n_sub_model;
40 for (
int i_sub_model = 0; i_sub_model < n_sub_model; i_sub_model++) {
41 int *sub_model_int_data =
42 &(model_data->sub_model_int_data
43 [model_data->sub_model_int_indices[i_sub_model]]);
44 double *sub_model_float_data =
45 &(model_data->sub_model_float_data
46 [model_data->sub_model_float_indices[i_sub_model]]);
49 int sub_model_type = *(sub_model_int_data++);
51 switch (sub_model_type) {
54 sub_model_float_data, &local_jac);
58 sub_model_float_data, &local_jac);
62 sub_model_int_data, sub_model_float_data, &local_jac);
69 printf(
"\n\nERROR building sparse Jacobian for sub models\n\n");
74 for (
unsigned int i_ind = 0; i_ind < model_data->n_per_cell_state_var;
86 model_data->n_mapped_params = 0;
87 for (
unsigned int i_ind = 0; i_ind < model_data->n_per_cell_state_var;
94 for (
unsigned int j_ind = 0; j_ind < model_data->n_per_cell_state_var;
98 ++(model_data->n_mapped_params);
123 model_data->jac_map_params =
124 malloc(
sizeof(JacMap) * model_data->n_mapped_params);
125 if (model_data->jac_map_params == NULL) {
126 printf(
"\n\nError allocating sub model Jacobian map\n\n");
134 int n_sub_model = model_data->n_sub_model;
137 for (
int i_sub_model = 0; i_sub_model < n_sub_model; i_sub_model++) {
141 &local_jac, (
unsigned int)model_data->n_per_cell_state_var) != 1) {
143 "\n\nERROR allocating sub-model Jacobian structure for sub-model "
144 "interdepenedence\n\n");
148 int *sub_model_int_data =
149 &(model_data->sub_model_int_data
150 [model_data->sub_model_int_indices[i_sub_model]]);
151 double *sub_model_float_data =
152 &(model_data->sub_model_float_data
153 [model_data->sub_model_float_indices[i_sub_model]]);
156 int sub_model_type = *(sub_model_int_data++);
158 switch (sub_model_type) {
161 sub_model_float_data, &local_jac);
165 sub_model_float_data, &local_jac);
169 sub_model_int_data, sub_model_float_data, &local_jac);
176 "\n\nERROR building sub-model Jacobian structure for sub-model "
177 "interdependence\n\n");
183 for (
unsigned int i_ind = 0; i_ind < model_data->n_per_cell_state_var;
185 for (
unsigned int i_elem =
190 if (i_dep != i_ind &&
192 for (
unsigned int j_ind = 0; j_ind < model_data->n_per_cell_state_var;
195 model_data->jac_map_params[i_map].solver_id =
197 model_data->jac_map_params[i_map].rxn_id =
199 model_data->jac_map_params[i_map].param_id =
212 if (i_map != model_data->n_mapped_params) {
213 printf(
"\n\nError mapping sub-model Jacobian elements %d %d\n\n", i_map,
214 model_data->n_mapped_params);
227 int n_sub_model = model_data->n_sub_model;
230 for (
int i_sub_model = 0; i_sub_model < n_sub_model; i_sub_model++) {
231 int *sub_model_int_data =
232 &(model_data->sub_model_int_data
233 [model_data->sub_model_int_indices[i_sub_model]]);
234 double *sub_model_float_data =
235 &(model_data->sub_model_float_data
236 [model_data->sub_model_float_indices[i_sub_model]]);
239 int sub_model_type = *(sub_model_int_data++);
241 switch (sub_model_type) {
252 sub_model_int_data, sub_model_float_data, deriv_ids, jac);
266 int n_sub_model = model_data->n_sub_model;
270 for (
int i_sub_model = 0; i_sub_model < n_sub_model; i_sub_model++) {
271 int *sub_model_int_data =
272 &(model_data->sub_model_int_data
273 [model_data->sub_model_int_indices[i_sub_model]]);
274 double *sub_model_float_data =
275 &(model_data->sub_model_float_data
276 [model_data->sub_model_float_indices[i_sub_model]]);
277 double *sub_model_env_data =
278 &(model_data->grid_cell_sub_model_env_data
279 [model_data->sub_model_env_idx[i_sub_model]]);
282 int sub_model_type = *(sub_model_int_data++);
285 switch (sub_model_type) {
288 sub_model_float_data,
289 sub_model_env_data, model_data);
293 sub_model_float_data,
294 sub_model_env_data, model_data);
298 sub_model_int_data, sub_model_float_data, sub_model_env_data,
310 int n_sub_model = model_data->n_sub_model;
314 for (
int i_sub_model = 0; i_sub_model < n_sub_model; i_sub_model++) {
315 int *sub_model_int_data =
316 &(model_data->sub_model_int_data
317 [model_data->sub_model_int_indices[i_sub_model]]);
318 double *sub_model_float_data =
319 &(model_data->sub_model_float_data
320 [model_data->sub_model_float_indices[i_sub_model]]);
321 double *sub_model_env_data =
322 &(model_data->grid_cell_sub_model_env_data
323 [model_data->sub_model_env_idx[i_sub_model]]);
326 int sub_model_type = *(sub_model_int_data++);
329 switch (sub_model_type) {
332 sub_model_env_data, model_data);
336 sub_model_env_data, model_data);
340 sub_model_float_data,
341 sub_model_env_data, model_data);
353#ifdef CAMP_USE_SUNDIALS
355 realtype time_step) {
357 int n_sub_model = model_data->n_sub_model;
361 for (
int i_sub_model = 0; i_sub_model < n_sub_model; i_sub_model++) {
362 int *sub_model_int_data =
363 &(model_data->sub_model_int_data
364 [model_data->sub_model_int_indices[i_sub_model]]);
365 double *sub_model_float_data =
366 &(model_data->sub_model_float_data
367 [model_data->sub_model_float_indices[i_sub_model]]);
368 double *sub_model_env_data =
369 &(model_data->grid_cell_sub_model_env_data
370 [model_data->sub_model_env_idx[i_sub_model]]);
373 int sub_model_type = *(sub_model_int_data++);
376 switch (sub_model_type) {
379 sub_model_int_data, sub_model_float_data, sub_model_env_data,
380 model_data, J_data, (
double)time_step);
384 sub_model_int_data, sub_model_float_data, sub_model_env_data,
385 model_data, J_data, (
double)time_step);
389 sub_model_int_data, sub_model_float_data, sub_model_env_data,
390 model_data, J_data, (
double)time_step);
396 for (
int i_map = 0; i_map < model_data->n_mapped_params; ++i_map)
397 J_data[model_data->jac_map_params[i_map].solver_id] +=
398 J_data[model_data->jac_map_params[i_map].rxn_id] *
399 J_data[model_data->jac_map_params[i_map].param_id];
414 int n_float_param,
int n_env_param,
415 int *int_param,
double *float_param,
417 ModelData *model_data =
418 (ModelData *)&(((SolverData *)solver_data)->model_data);
421 int *sub_model_int_data = &(
422 model_data->sub_model_int_data
423 [model_data->sub_model_int_indices[model_data->n_added_sub_models]]);
424 double *sub_model_float_data =
425 &(model_data->sub_model_float_data[model_data->sub_model_float_indices
426 [model_data->n_added_sub_models]]);
429 model_data->sub_model_int_indices[model_data->n_added_sub_models + 1] =
432 ->sub_model_int_indices[model_data->n_added_sub_models];
433 model_data->sub_model_float_indices[model_data->n_added_sub_models + 1] =
435 model_data->sub_model_float_indices[model_data->n_added_sub_models];
436 model_data->sub_model_env_idx[model_data->n_added_sub_models + 1] =
437 model_data->sub_model_env_idx[model_data->n_added_sub_models] +
439 ++(model_data->n_added_sub_models);
442 *(sub_model_int_data++) = sub_model_type;
445 for (; n_int_param > 0; --n_int_param)
446 *(sub_model_int_data++) = *(int_param++);
449 for (; n_float_param > 0; --n_float_param)
450 *(sub_model_float_data++) = (double)*(float_param++);
452 model_data->n_sub_model_env_data += n_env_param;
469 int update_sub_model_type,
void *update_data,
471 ModelData *model_data =
472 (ModelData *)&(((SolverData *)solver_data)->model_data);
475 model_data->grid_cell_sub_model_env_data =
477 ->sub_model_env_data[cell_id * model_data->n_sub_model_env_data]);
480 int n_sub_model = model_data->n_sub_model;
483 for (; (*sub_model_id) < n_sub_model; (*sub_model_id)++) {
484 int *sub_model_int_data =
485 &(model_data->sub_model_int_data
486 [model_data->sub_model_int_indices[*sub_model_id]]);
487 double *sub_model_float_data =
488 &(model_data->sub_model_float_data
489 [model_data->sub_model_float_indices[*sub_model_id]]);
490 double *sub_model_env_data = &(
491 model_data->grid_cell_sub_model_env_data[model_data->sub_model_env_idx[(
495 int sub_model_type = *(sub_model_int_data++);
500 if (sub_model_type != update_sub_model_type)
continue;
510 ModelData *model_data =
511 (ModelData *)&(((SolverData *)solver_data)->model_data);
514 int n_sub_model = model_data->n_sub_model;
518 for (
int i_sub_model = 0; i_sub_model < n_sub_model; i_sub_model++) {
519 int *sub_model_int_data =
520 &(model_data->sub_model_int_data
521 [model_data->sub_model_int_indices[i_sub_model]]);
522 double *sub_model_float_data =
523 &(model_data->sub_model_float_data
524 [model_data->sub_model_float_indices[i_sub_model]]);
527 int sub_model_type = *(sub_model_int_data++);
530 switch (sub_model_type) {
539 sub_model_float_data);
unsigned int jacobian_column_pointer_value(Jacobian jac, unsigned int col_id)
void jacobian_free(Jacobian *jac)
unsigned int jacobian_build_matrix(Jacobian *jac)
int jacobian_initialize_empty(Jacobian *jac, unsigned int num_spec)
unsigned int jacobian_get_element_id(Jacobian jac, unsigned int dep_id, unsigned int ind_id)
void jacobian_register_element(Jacobian *jac, unsigned int dep_id, unsigned int ind_id)
unsigned int jacobian_row_index(Jacobian jac, unsigned int elem_id)
#define CHEM_SPEC_VARIABLE
void sub_model_PDFiTE_get_used_jac_elem(int *sub_model_int_data, double *sub_model_float_data, Jacobian *jac)
Flag Jacobian elements used by this sub model.
void sub_model_PDFiTE_calculate(int *sub_model_int_data, double *sub_model_float_data, double *sub_model_env_data, ModelData *model_data)
Perform the sub-model calculations for the current model state.
void sub_model_PDFiTE_get_jac_contrib(int *sub_model_int_data, double *sub_model_float_data, double *sub_model_env_data, ModelData *model_data, realtype *J, double time_step)
Add contributions to the Jacobian from derivates calculated using the output of this sub model.
void sub_model_PDFiTE_print(int *sub_model_int_data, double *sub_model_float_data)
Print the PDFiTE Activity sub model parameters.
void sub_model_PDFiTE_update_ids(int *sub_model_int_data, double *sub_model_float_data, int *deriv_ids, Jacobian jac)
Update the time derivative and Jacbobian array indices.
void sub_model_PDFiTE_update_env_state(int *sub_model_int_data, double *sub_model_float_data, double *sub_model_env_data, ModelData *model_data)
Update sub model data for new environmental conditions.
void sub_model_UNIFAC_get_jac_contrib(int *sub_model_int_data, double *sub_model_float_data, double *sub_model_env_data, ModelData *model_data, realtype *J, double time_step)
Add contributions to the Jacobian from derivates calculated using the output of this sub model.
void sub_model_UNIFAC_update_ids(int *sub_model_int_data, double *sub_model_float_data, int *deriv_ids, Jacobian jac)
Update stored ids for elements used within a row of the Jacobian matrix.
void sub_model_UNIFAC_update_env_state(int *sub_model_int_data, double *sub_model_float_data, double *sub_model_env_data, ModelData *model_data)
Update sub-model data for new environmental conditions.
void sub_model_UNIFAC_get_used_jac_elem(int *sub_model_int_data, double *sub_model_float_data, Jacobian *jac)
Get the Jacobian elements used for a particular row of the matrix.
void sub_model_UNIFAC_calculate(int *sub_model_int_data, double *sub_model_float_data, double *sub_model_env_data, ModelData *model_data)
Perform the sub-model calculations for the current model state.
void sub_model_UNIFAC_print(int *sub_model_int_data, double *sub_model_float_data)
Print the sub model data.
void sub_model_ZSR_aerosol_water_get_used_jac_elem(int *sub_model_int_data, double *sub_model_float_data, Jacobian *jac)
Flag Jacobian elements used by this sub model.
void sub_model_ZSR_aerosol_water_calculate(int *sub_model_int_data, double *sub_model_float_data, double *sub_model_env_data, ModelData *model_data)
Do pre-derivative calculations.
void sub_model_ZSR_aerosol_water_print(int *sub_model_int_data, double *sub_model_float_data)
Print the ZSR Aerosol Water sub model parameters.
void sub_model_ZSR_aerosol_water_update_env_state(int *sub_model_int_data, double *sub_model_float_data, double *sub_model_env_data, ModelData *model_data)
Update sub model data for new environmental conditions.
void sub_model_ZSR_aerosol_water_get_jac_contrib(int *sub_model_int_data, double *sub_model_float_data, double *sub_model_env_data, ModelData *model_data, realtype *J, double time_step)
Add contributions to the Jacobian from derivates calculated using the output of this sub model.
void sub_model_ZSR_aerosol_water_update_ids(int *sub_model_int_data, double *sub_model_float_data, int *deriv_ids, Jacobian jac)
Update the time derivative and Jacbobian array indices.
void sub_model_print_data(void *solver_data)
Print the sub model data.
void sub_model_update_ids(ModelData *model_data, int *deriv_ids, Jacobian jac)
Update the time derivative and Jacobian array ids.
void sub_model_add_condensed_data(int sub_model_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 for sub models.
#define SUB_MODEL_ZSR_AEROSOL_WATER
void sub_model_get_used_jac_elem(ModelData *model_data, Jacobian *jac)
Get the Jacobian elements used by a particular sub model.
void sub_model_set_jac_map(ModelData *model_data, Jacobian jac)
Set the map for sub-model interdependence.
void sub_model_update_env_state(ModelData *model_data)
Update sub model data for a new environmental state.
void sub_model_calculate(ModelData *model_data)
Perform the sub model calculations for the current model state.
void sub_model_get_jac_contrib(ModelData *model_data, double *J_data, realtype time_step)
Calculate the Jacobian constributions from sub model calculations.
void sub_model_update_data(int cell_id, int *sub_model_id, int update_sub_model_type, void *update_data, void *solver_data)
Update sub-model data.