11#include <camp/aero_rep_solver.h>
12#include <camp/aero_reps.h>
19#define AERO_REP_SINGLE_PARTICLE 1
20#define AERO_REP_MODAL_BINNED_MASS 2
34 int aero_phase_idx,
bool *jac_struct) {
35 int num_flagged_elem = 0;
38 int *aero_rep_int_data = &(
40 ->aero_rep_int_data[model_data->aero_rep_int_indices[aero_rep_idx]]);
41 double *aero_rep_float_data =
42 &(model_data->aero_rep_float_data
43 [model_data->aero_rep_float_indices[aero_rep_idx]]);
46 int aero_rep_type = *(aero_rep_int_data++);
49 switch (aero_rep_type) {
52 model_data, aero_phase_idx, aero_rep_int_data, aero_rep_float_data,
57 model_data, aero_phase_idx, aero_rep_int_data, aero_rep_float_data,
61 return num_flagged_elem;
71 int n_aero_rep = model_data->n_aero_rep;
75 for (
int i_aero_rep = 0; i_aero_rep < n_aero_rep; i_aero_rep++) {
77 int *aero_rep_int_data = &(
79 ->aero_rep_int_data[model_data->aero_rep_int_indices[i_aero_rep]]);
80 double *aero_rep_float_data =
81 &(model_data->aero_rep_float_data
82 [model_data->aero_rep_float_indices[i_aero_rep]]);
85 int aero_rep_type = *(aero_rep_int_data++);
88 switch (aero_rep_type) {
91 aero_rep_int_data, aero_rep_float_data, state_flags);
95 aero_rep_int_data, aero_rep_float_data, state_flags);
107 int n_aero_rep = model_data->n_aero_rep;
111 for (
int i_aero_rep = 0; i_aero_rep < n_aero_rep; i_aero_rep++) {
113 int *aero_rep_int_data = &(
115 ->aero_rep_int_data[model_data->aero_rep_int_indices[i_aero_rep]]);
116 double *aero_rep_float_data =
117 &(model_data->aero_rep_float_data
118 [model_data->aero_rep_float_indices[i_aero_rep]]);
119 double *aero_rep_env_data =
120 &(model_data->grid_cell_aero_rep_env_data
121 [model_data->aero_rep_env_idx[i_aero_rep]]);
124 int aero_rep_type = *(aero_rep_int_data++);
127 switch (aero_rep_type) {
130 model_data, aero_rep_int_data, aero_rep_float_data,
148 int n_aero_rep = model_data->n_aero_rep;
152 for (
int i_aero_rep = 0; i_aero_rep < n_aero_rep; i_aero_rep++) {
154 int *aero_rep_int_data = &(
156 ->aero_rep_int_data[model_data->aero_rep_int_indices[i_aero_rep]]);
157 double *aero_rep_float_data =
158 &(model_data->aero_rep_float_data
159 [model_data->aero_rep_float_indices[i_aero_rep]]);
160 double *aero_rep_env_data =
161 &(model_data->grid_cell_aero_rep_env_data
162 [model_data->aero_rep_env_idx[i_aero_rep]]);
165 int aero_rep_type = *(aero_rep_int_data++);
168 switch (aero_rep_type) {
199 int aero_phase_idx,
double *layer_radius,
200 double *partial_deriv) {
202 int *aero_rep_int_data = &(
204 ->aero_rep_int_data[model_data->aero_rep_int_indices[aero_rep_idx]]);
205 double *aero_rep_float_data =
206 &(model_data->aero_rep_float_data
207 [model_data->aero_rep_float_indices[aero_rep_idx]]);
208 double *aero_rep_env_data =
209 &(model_data->grid_cell_aero_rep_env_data
210 [model_data->aero_rep_env_idx[aero_rep_idx]]);
213 int aero_rep_type = *(aero_rep_int_data++);
216 switch (aero_rep_type) {
219 model_data, aero_phase_idx, layer_radius, partial_deriv, aero_rep_int_data,
220 aero_rep_float_data, aero_rep_env_data);
224 model_data, aero_phase_idx, layer_radius, partial_deriv, aero_rep_int_data,
225 aero_rep_float_data, aero_rep_env_data);
247 int aero_phase_idx,
double *radius,
248 double *partial_deriv) {
250 int *aero_rep_int_data = &(
252 ->aero_rep_int_data[model_data->aero_rep_int_indices[aero_rep_idx]]);
253 double *aero_rep_float_data =
254 &(model_data->aero_rep_float_data
255 [model_data->aero_rep_float_indices[aero_rep_idx]]);
256 double *aero_rep_env_data =
257 &(model_data->grid_cell_aero_rep_env_data
258 [model_data->aero_rep_env_idx[aero_rep_idx]]);
261 int aero_rep_type = *(aero_rep_int_data++);
264 switch (aero_rep_type) {
267 model_data, aero_phase_idx, radius, partial_deriv, aero_rep_int_data,
268 aero_rep_float_data, aero_rep_env_data);
272 model_data, aero_phase_idx, radius, partial_deriv, aero_rep_int_data,
273 aero_rep_float_data, aero_rep_env_data);
297 int aero_phase_idx_first,
int aero_phase_idx_second,
298 double *surface_area,
double *partial_deriv) {
300 int *aero_rep_int_data = &(
302 ->aero_rep_int_data[model_data->aero_rep_int_indices[aero_rep_idx]]);
303 double *aero_rep_float_data =
304 &(model_data->aero_rep_float_data
305 [model_data->aero_rep_float_indices[aero_rep_idx]]);
306 double *aero_rep_env_data =
307 &(model_data->grid_cell_aero_rep_env_data
308 [model_data->aero_rep_env_idx[aero_rep_idx]]);
311 int aero_rep_type = *(aero_rep_int_data++);
314 switch (aero_rep_type) {
317 model_data, aero_phase_idx_first, aero_phase_idx_second, surface_area,
318 partial_deriv, aero_rep_int_data, aero_rep_float_data, aero_rep_env_data);
322 model_data, aero_phase_idx_first, aero_phase_idx_second, surface_area,
323 partial_deriv, aero_rep_int_data, aero_rep_float_data, aero_rep_env_data);
343 int aero_phase_idx,
double *layer_thickness,
344 double *partial_deriv) {
346 int *aero_rep_int_data = &(
348 ->aero_rep_int_data[model_data->aero_rep_int_indices[aero_rep_idx]]);
349 double *aero_rep_float_data =
350 &(model_data->aero_rep_float_data
351 [model_data->aero_rep_float_indices[aero_rep_idx]]);
352 double *aero_rep_env_data =
353 &(model_data->grid_cell_aero_rep_env_data
354 [model_data->aero_rep_env_idx[aero_rep_idx]]);
357 int aero_rep_type = *(aero_rep_int_data++);
360 switch (aero_rep_type) {
363 model_data, aero_phase_idx, layer_thickness, partial_deriv, aero_rep_int_data,
364 aero_rep_float_data, aero_rep_env_data);
368 model_data, aero_phase_idx, layer_thickness, partial_deriv, aero_rep_int_data,
369 aero_rep_float_data, aero_rep_env_data);
394 int aero_phase_idx,
double *number_conc,
395 double *partial_deriv) {
397 int *aero_rep_int_data = &(
399 ->aero_rep_int_data[model_data->aero_rep_int_indices[aero_rep_idx]]);
400 double *aero_rep_float_data =
401 &(model_data->aero_rep_float_data
402 [model_data->aero_rep_float_indices[aero_rep_idx]]);
403 double *aero_rep_env_data =
404 &(model_data->grid_cell_aero_rep_env_data
405 [model_data->aero_rep_env_idx[aero_rep_idx]]);
408 int aero_rep_type = *(aero_rep_int_data++);
411 switch (aero_rep_type) {
414 model_data, aero_phase_idx, number_conc, partial_deriv,
415 aero_rep_int_data, aero_rep_float_data, aero_rep_env_data);
419 model_data, aero_phase_idx, number_conc, partial_deriv,
420 aero_rep_int_data, aero_rep_float_data, aero_rep_env_data);
436 int aero_phase_idx) {
438 int aero_conc_type = 0;
441 int *aero_rep_int_data = &(
443 ->aero_rep_int_data[model_data->aero_rep_int_indices[aero_rep_idx]]);
444 double *aero_rep_float_data =
445 &(model_data->aero_rep_float_data
446 [model_data->aero_rep_float_indices[aero_rep_idx]]);
447 double *aero_rep_env_data =
448 &(model_data->grid_cell_aero_rep_env_data
449 [model_data->aero_rep_env_idx[aero_rep_idx]]);
452 int aero_rep_type = *(aero_rep_int_data++);
455 switch (aero_rep_type) {
458 aero_phase_idx, &aero_conc_type, aero_rep_int_data,
459 aero_rep_float_data, aero_rep_env_data);
463 aero_phase_idx, &aero_conc_type, aero_rep_int_data,
464 aero_rep_float_data, aero_rep_env_data);
467 return aero_conc_type;
490 int aero_rep_idx,
int aero_phase_idx,
491 double *aero_phase_mass,
492 double *partial_deriv) {
494 int *aero_rep_int_data = &(
496 ->aero_rep_int_data[model_data->aero_rep_int_indices[aero_rep_idx]]);
497 double *aero_rep_float_data =
498 &(model_data->aero_rep_float_data
499 [model_data->aero_rep_float_indices[aero_rep_idx]]);
500 double *aero_rep_env_data =
501 &(model_data->grid_cell_aero_rep_env_data
502 [model_data->aero_rep_env_idx[aero_rep_idx]]);
505 int aero_rep_type = *(aero_rep_int_data++);
508 switch (aero_rep_type) {
511 model_data, aero_phase_idx, aero_phase_mass, partial_deriv,
512 aero_rep_int_data, aero_rep_float_data, aero_rep_env_data);
516 model_data, aero_phase_idx, aero_phase_mass, partial_deriv,
517 aero_rep_int_data, aero_rep_float_data, aero_rep_env_data);
544 double *aero_phase_avg_MW,
545 double *partial_deriv) {
547 int *aero_rep_int_data = &(
549 ->aero_rep_int_data[model_data->aero_rep_int_indices[aero_rep_idx]]);
550 double *aero_rep_float_data =
551 &(model_data->aero_rep_float_data
552 [model_data->aero_rep_float_indices[aero_rep_idx]]);
553 double *aero_rep_env_data =
554 &(model_data->grid_cell_aero_rep_env_data
555 [model_data->aero_rep_env_idx[aero_rep_idx]]);
558 int aero_rep_type = *(aero_rep_int_data++);
561 switch (aero_rep_type) {
564 model_data, aero_phase_idx, aero_phase_avg_MW, partial_deriv,
565 aero_rep_int_data, aero_rep_float_data, aero_rep_env_data);
569 model_data, aero_phase_idx, aero_phase_avg_MW, partial_deriv,
570 aero_rep_int_data, aero_rep_float_data, aero_rep_env_data);
587 int n_float_param,
int n_env_param,
588 int *int_param,
double *float_param,
590 ModelData *model_data =
591 (ModelData *)&(((SolverData *)solver_data)->model_data);
594 int *aero_rep_int_data =
595 &(model_data->aero_rep_int_data
596 [model_data->aero_rep_int_indices[model_data->n_added_aero_reps]]);
597 double *aero_rep_float_data = &(
598 model_data->aero_rep_float_data
599 [model_data->aero_rep_float_indices[model_data->n_added_aero_reps]]);
602 model_data->aero_rep_int_indices[model_data->n_added_aero_reps + 1] =
605 ->aero_rep_int_indices[model_data->n_added_aero_reps];
606 model_data->aero_rep_float_indices[model_data->n_added_aero_reps + 1] =
608 model_data->aero_rep_float_indices[model_data->n_added_aero_reps];
609 model_data->aero_rep_env_idx[model_data->n_added_aero_reps + 1] =
610 model_data->aero_rep_env_idx[model_data->n_added_aero_reps] + n_env_param;
611 ++(model_data->n_added_aero_reps);
614 *(aero_rep_int_data++) = aero_rep_type;
617 for (; n_int_param > 0; --n_int_param)
618 *(aero_rep_int_data++) = *(int_param++);
621 for (; n_float_param > 0; --n_float_param)
622 *(aero_rep_float_data++) = (double)*(float_param++);
624 model_data->n_aero_rep_env_data += n_env_param;
636 int update_aero_rep_type,
void *update_data,
638 ModelData *model_data =
639 (ModelData *)&(((SolverData *)solver_data)->model_data);
642 model_data->grid_cell_aero_rep_env_data = &(
643 model_data->aero_rep_env_data[cell_id * model_data->n_aero_rep_env_data]);
646 int n_aero_rep = model_data->n_aero_rep;
649 for (; (*aero_rep_id) < n_aero_rep; (*aero_rep_id)++) {
651 int *aero_rep_int_data =
652 &(model_data->aero_rep_int_data
653 [model_data->aero_rep_int_indices[*aero_rep_id]]);
654 double *aero_rep_float_data =
655 &(model_data->aero_rep_float_data
656 [model_data->aero_rep_float_indices[*aero_rep_id]]);
657 double *aero_rep_env_data =
658 &(model_data->grid_cell_aero_rep_env_data
659 [model_data->aero_rep_env_idx[*aero_rep_id]]);
662 int aero_rep_type = *(aero_rep_int_data++);
667 if (aero_rep_type == update_aero_rep_type) {
668 switch (aero_rep_type) {
671 (
void *)update_data, aero_rep_int_data, aero_rep_float_data,
676 (
void *)update_data, aero_rep_int_data, aero_rep_float_data,
690 ModelData *model_data =
691 (ModelData *)&(((SolverData *)solver_data)->model_data);
694 int n_aero_rep = model_data->n_aero_rep;
697 "\n\nAerosol representation data\n\nnumber of aerosol "
698 "representations: %d\n\n",
702 for (
int i_aero_rep = 0; i_aero_rep < n_aero_rep; i_aero_rep++) {
704 int *aero_rep_int_data = &(
706 ->aero_rep_int_data[model_data->aero_rep_int_indices[i_aero_rep]]);
707 double *aero_rep_float_data =
708 &(model_data->aero_rep_float_data
709 [model_data->aero_rep_float_indices[i_aero_rep]]);
712 int aero_rep_type = *(aero_rep_int_data++);
715 switch (aero_rep_type) {
718 aero_rep_float_data);
bool aero_rep_modal_binned_mass_update_data(void *update_data, int *aero_rep_int_data, double *aero_rep_float_data, double *aero_rep_env_data)
Update the aerosol representation data.
void aero_rep_modal_binned_mass_get_layer_thickness__m(ModelData *model_data, int aero_phase_idx, double *layer_thickness, double *partial_deriv, int *aero_rep_int_data, double *aero_rep_float_data, double *aero_rep_env_data)
Get the thickness of a particle layer (m)
void aero_rep_modal_binned_mass_get_aero_phase_avg_MW__kg_mol(ModelData *model_data, int aero_phase_idx, double *aero_phase_avg_MW, double *partial_deriv, int *aero_rep_int_data, double *aero_rep_float_data, double *aero_rep_env_data)
Get the average molecular weight in an aerosol phase ( )
void aero_rep_modal_binned_mass_get_number_conc__n_m3(ModelData *model_data, int aero_phase_idx, double *number_conc, double *partial_deriv, int *aero_rep_int_data, double *aero_rep_float_data, double *aero_rep_env_data)
Get the particle number concentration ( )
void aero_rep_modal_binned_mass_update_state(ModelData *model_data, int *aero_rep_int_data, double *aero_rep_float_data, double *aero_rep_env_data)
Update aerosol representation data for a new state.
void aero_rep_modal_binned_mass_get_aero_conc_type(int aero_phase_idx, int *aero_conc_type, int *aero_rep_int_data, double *aero_rep_float_data, double *aero_rep_env_data)
Get the type of aerosol concentration used.
void aero_rep_modal_binned_mass_update_env_state(ModelData *model_data, int *aero_rep_int_data, double *aero_rep_float_data, double *aero_rep_env_data)
Update aerosol representation data for new environmental conditions.
void aero_rep_modal_binned_mass_print(int *aero_rep_int_data, double *aero_rep_float_data)
Print the mass-only modal/binned reaction parameters.
void aero_rep_modal_binned_mass_get_effective_radius__m(ModelData *model_data, int aero_phase_idx, double *radius, double *partial_deriv, int *aero_rep_int_data, double *aero_rep_float_data, double *aero_rep_env_data)
Get the effective particle radius (m)
void aero_rep_modal_binned_mass_get_dependencies(int *aero_rep_int_data, double *aero_rep_float_data, bool *state_flags)
Flag elements on the state array used by this aerosol representation.
void aero_rep_modal_binned_mass_get_aero_phase_mass__kg_m3(ModelData *model_data, int aero_phase_idx, double *aero_phase_mass, double *partial_deriv, int *aero_rep_int_data, double *aero_rep_float_data, double *aero_rep_env_data)
Get the total mass in an aerosol phase ( )
void aero_rep_modal_binned_mass_get_interface_surface_area__m2(ModelData *model_data, int aero_phase_idx_first, int aero_phase_idx_second, double *surface_area, double *partial_deriv, int *aero_rep_int_data, double *aero_rep_float_data, double *aero_rep_env_data)
Get the effective particle surface area (m)
void aero_rep_modal_binned_mass_get_effective_layer_radius__m(ModelData *model_data, int aero_phase_idx, double *layer_radius, double *partial_deriv, int *aero_rep_int_data, double *aero_rep_float_data, double *aero_rep_env_data)
Get the effective radius of a specified layer (m)
int aero_rep_modal_binned_mass_get_used_jac_elem(ModelData *model_data, int aero_phase_idx, int *aero_rep_int_data, double *aero_rep_float_data, bool *jac_struct)
Flag Jacobian elements used in calcualtions of mass and volume.
int aero_rep_single_particle_get_used_jac_elem(ModelData *model_data, int aero_phase_idx, int *aero_rep_int_data, double *aero_rep_float_data, bool *jac_struct)
Flag Jacobian elements used in calcualtions of mass and volume.
void aero_rep_single_particle_get_aero_phase_avg_MW__kg_mol(ModelData *model_data, int aero_phase_idx, double *aero_phase_avg_MW, double *partial_deriv, int *aero_rep_int_data, double *aero_rep_float_data, double *aero_rep_env_data)
Get the average molecular weight in an aerosol phase ( )
void aero_rep_single_particle_get_effective_radius__m(ModelData *model_data, int aero_phase_idx, double *radius, double *partial_deriv, int *aero_rep_int_data, double *aero_rep_float_data, double *aero_rep_env_data)
Get the effective particle radius (m) Finds the radius of the largest layer in specified particle.
void aero_rep_single_particle_get_aero_conc_type(int aero_phase_idx, int *aero_conc_type, int *aero_rep_int_data, double *aero_rep_float_data, double *aero_rep_env_data)
Get the type of aerosol concentration used.
void aero_rep_single_particle_get_interface_surface_area__m2(ModelData *model_data, int aero_phase_idx_first, int aero_phase_idx_second, double *surface_area, double *partial_deriv, int *aero_rep_int_data, double *aero_rep_float_data, double *aero_rep_env_data)
Get the surface area of specified particle layer (m)
void aero_rep_single_particle_print(int *aero_rep_int_data, double *aero_rep_float_data)
Print the Single Particle reaction parameters.
void aero_rep_single_particle_update_env_state(ModelData *model_data, int *aero_rep_int_data, double *aero_rep_float_data, double *aero_rep_env_data)
Update aerosol representation data for new environmental conditions.
void aero_rep_single_particle_get_layer_thickness__m(ModelData *model_data, int aero_phase_idx, double *layer_thickness, double *partial_deriv, int *aero_rep_int_data, double *aero_rep_float_data, double *aero_rep_env_data)
Get the thickness of a particle layer (m)
bool aero_rep_single_particle_update_data(void *update_data, int *aero_rep_int_data, double *aero_rep_float_data, double *aero_rep_env_data)
Update aerosol representation data.
void aero_rep_single_particle_get_dependencies(int *aero_rep_int_data, double *aero_rep_float_data, bool *state_flags)
Flag elements on the state array used by this aerosol representation.
void aero_rep_single_particle_get_aero_phase_mass__kg_m3(ModelData *model_data, int aero_phase_idx, double *aero_phase_mass, double *partial_deriv, int *aero_rep_int_data, double *aero_rep_float_data, double *aero_rep_env_data)
Get the total mass in an aerosol phase ( )
void aero_rep_single_particle_get_effective_layer_radius__m(ModelData *model_data, int aero_phase_idx, double *layer_radius, double *partial_deriv, int *aero_rep_int_data, double *aero_rep_float_data, double *aero_rep_env_data)
Get the effective radius of a specified layer (m)
void aero_rep_single_particle_get_number_conc__n_m3(ModelData *model_data, int aero_phase_idx, double *number_conc, double *partial_deriv, int *aero_rep_int_data, double *aero_rep_float_data, double *aero_rep_env_data)
Get the particle number concentration ( )
void aero_rep_single_particle_update_state(ModelData *model_data, int *aero_rep_int_data, double *aero_rep_float_data, double *aero_rep_env_data)
Update aerosol representation data for a new state.
int aero_rep_get_aero_conc_type(ModelData *model_data, int aero_rep_idx, int aero_phase_idx)
Check whether aerosol concentrations are per-particle or total for each phase.
int aero_rep_get_used_jac_elem(ModelData *model_data, int aero_rep_idx, int aero_phase_idx, bool *jac_struct)
Flag Jacobian elements used to calculated mass, volume, etc.
void aero_rep_add_condensed_data(int aero_rep_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 aerosol representations.
void aero_rep_get_effective_layer_radius__m(ModelData *model_data, int aero_rep_idx, int aero_phase_idx, double *layer_radius, double *partial_deriv)
Get the effective radius of a specified layer, (m)
void aero_rep_free_update_data(void *update_data)
Free an update data object.
void aero_rep_get_aero_phase_mass__kg_m3(ModelData *model_data, int aero_rep_idx, int aero_phase_idx, double *aero_phase_mass, double *partial_deriv)
Get the total mass of an aerosol phase in this representation ( )
void aero_rep_get_interface_surface_area__m2(ModelData *model_data, int aero_rep_idx, int aero_phase_idx_first, int aero_phase_idx_second, double *surface_area, double *partial_deriv)
Get the surface area of interfacial layer between two phases (m^2)
void aero_rep_update_env_state(ModelData *model_data)
Update the aerosol representations for new environmental conditions.
#define AERO_REP_MODAL_BINNED_MASS
void aero_rep_print_data(void *solver_data)
Print the aerosol representation data.
void aero_rep_update_state(ModelData *model_data)
Update the aerosol representations for a new state.
void aero_rep_get_aero_phase_avg_MW__kg_mol(ModelData *model_data, int aero_rep_idx, int aero_phase_idx, double *aero_phase_avg_MW, double *partial_deriv)
Get the average molecular weight of an aerosol phase in this representation ( )
void aero_rep_update_data(int cell_id, int *aero_rep_id, int update_aero_rep_type, void *update_data, void *solver_data)
Update aerosol representation data.
void aero_rep_get_layer_thickness__m(ModelData *model_data, int aero_rep_idx, int aero_phase_idx, double *layer_thickness, double *partial_deriv)
Get the thickness of a particle layer (m)
void aero_rep_get_number_conc__n_m3(ModelData *model_data, int aero_rep_idx, int aero_phase_idx, double *number_conc, double *partial_deriv)
Get the particle number concentration ( )
void aero_rep_get_effective_radius__m(ModelData *model_data, int aero_rep_idx, int aero_phase_idx, double *radius, double *partial_deriv)
Get the effective particle radius, (m)
#define AERO_REP_SINGLE_PARTICLE
void aero_rep_get_dependencies(ModelData *model_data, bool *state_flags)
Get state array elements used by aerosol representation functions.