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);
339 int aero_phase_idx,
double *layer_thickness,
340 double *partial_deriv) {
342 int *aero_rep_int_data = &(
344 ->aero_rep_int_data[model_data->aero_rep_int_indices[aero_rep_idx]]);
345 double *aero_rep_float_data =
346 &(model_data->aero_rep_float_data
347 [model_data->aero_rep_float_indices[aero_rep_idx]]);
348 double *aero_rep_env_data =
349 &(model_data->grid_cell_aero_rep_env_data
350 [model_data->aero_rep_env_idx[aero_rep_idx]]);
353 int aero_rep_type = *(aero_rep_int_data++);
356 switch (aero_rep_type) {
359 model_data, aero_phase_idx, layer_thickness, partial_deriv, aero_rep_int_data,
360 aero_rep_float_data, aero_rep_env_data);
364 model_data, aero_phase_idx, layer_thickness, partial_deriv, aero_rep_int_data,
365 aero_rep_float_data, aero_rep_env_data);
390 int aero_phase_idx,
double *number_conc,
391 double *partial_deriv) {
393 int *aero_rep_int_data = &(
395 ->aero_rep_int_data[model_data->aero_rep_int_indices[aero_rep_idx]]);
396 double *aero_rep_float_data =
397 &(model_data->aero_rep_float_data
398 [model_data->aero_rep_float_indices[aero_rep_idx]]);
399 double *aero_rep_env_data =
400 &(model_data->grid_cell_aero_rep_env_data
401 [model_data->aero_rep_env_idx[aero_rep_idx]]);
404 int aero_rep_type = *(aero_rep_int_data++);
407 switch (aero_rep_type) {
410 model_data, aero_phase_idx, number_conc, partial_deriv,
411 aero_rep_int_data, aero_rep_float_data, aero_rep_env_data);
415 model_data, aero_phase_idx, number_conc, partial_deriv,
416 aero_rep_int_data, aero_rep_float_data, aero_rep_env_data);
432 int aero_phase_idx) {
434 int aero_conc_type = 0;
437 int *aero_rep_int_data = &(
439 ->aero_rep_int_data[model_data->aero_rep_int_indices[aero_rep_idx]]);
440 double *aero_rep_float_data =
441 &(model_data->aero_rep_float_data
442 [model_data->aero_rep_float_indices[aero_rep_idx]]);
443 double *aero_rep_env_data =
444 &(model_data->grid_cell_aero_rep_env_data
445 [model_data->aero_rep_env_idx[aero_rep_idx]]);
448 int aero_rep_type = *(aero_rep_int_data++);
451 switch (aero_rep_type) {
454 aero_phase_idx, &aero_conc_type, aero_rep_int_data,
455 aero_rep_float_data, aero_rep_env_data);
459 aero_phase_idx, &aero_conc_type, aero_rep_int_data,
460 aero_rep_float_data, aero_rep_env_data);
463 return aero_conc_type;
486 int aero_rep_idx,
int aero_phase_idx,
487 double *aero_phase_mass,
488 double *partial_deriv) {
490 int *aero_rep_int_data = &(
492 ->aero_rep_int_data[model_data->aero_rep_int_indices[aero_rep_idx]]);
493 double *aero_rep_float_data =
494 &(model_data->aero_rep_float_data
495 [model_data->aero_rep_float_indices[aero_rep_idx]]);
496 double *aero_rep_env_data =
497 &(model_data->grid_cell_aero_rep_env_data
498 [model_data->aero_rep_env_idx[aero_rep_idx]]);
501 int aero_rep_type = *(aero_rep_int_data++);
504 switch (aero_rep_type) {
507 model_data, aero_phase_idx, aero_phase_mass, partial_deriv,
508 aero_rep_int_data, aero_rep_float_data, aero_rep_env_data);
512 model_data, aero_phase_idx, aero_phase_mass, partial_deriv,
513 aero_rep_int_data, aero_rep_float_data, aero_rep_env_data);
540 double *aero_phase_avg_MW,
541 double *partial_deriv) {
543 int *aero_rep_int_data = &(
545 ->aero_rep_int_data[model_data->aero_rep_int_indices[aero_rep_idx]]);
546 double *aero_rep_float_data =
547 &(model_data->aero_rep_float_data
548 [model_data->aero_rep_float_indices[aero_rep_idx]]);
549 double *aero_rep_env_data =
550 &(model_data->grid_cell_aero_rep_env_data
551 [model_data->aero_rep_env_idx[aero_rep_idx]]);
554 int aero_rep_type = *(aero_rep_int_data++);
557 switch (aero_rep_type) {
560 model_data, aero_phase_idx, aero_phase_avg_MW, partial_deriv,
561 aero_rep_int_data, aero_rep_float_data, aero_rep_env_data);
565 model_data, aero_phase_idx, aero_phase_avg_MW, partial_deriv,
566 aero_rep_int_data, aero_rep_float_data, aero_rep_env_data);
583 int n_float_param,
int n_env_param,
584 int *int_param,
double *float_param,
586 ModelData *model_data =
587 (ModelData *)&(((SolverData *)solver_data)->model_data);
590 int *aero_rep_int_data =
591 &(model_data->aero_rep_int_data
592 [model_data->aero_rep_int_indices[model_data->n_added_aero_reps]]);
593 double *aero_rep_float_data = &(
594 model_data->aero_rep_float_data
595 [model_data->aero_rep_float_indices[model_data->n_added_aero_reps]]);
598 model_data->aero_rep_int_indices[model_data->n_added_aero_reps + 1] =
601 ->aero_rep_int_indices[model_data->n_added_aero_reps];
602 model_data->aero_rep_float_indices[model_data->n_added_aero_reps + 1] =
604 model_data->aero_rep_float_indices[model_data->n_added_aero_reps];
605 model_data->aero_rep_env_idx[model_data->n_added_aero_reps + 1] =
606 model_data->aero_rep_env_idx[model_data->n_added_aero_reps] + n_env_param;
607 ++(model_data->n_added_aero_reps);
610 *(aero_rep_int_data++) = aero_rep_type;
613 for (; n_int_param > 0; --n_int_param)
614 *(aero_rep_int_data++) = *(int_param++);
617 for (; n_float_param > 0; --n_float_param)
618 *(aero_rep_float_data++) = (double)*(float_param++);
620 model_data->n_aero_rep_env_data += n_env_param;
632 int update_aero_rep_type,
void *update_data,
634 ModelData *model_data =
635 (ModelData *)&(((SolverData *)solver_data)->model_data);
638 model_data->grid_cell_aero_rep_env_data = &(
639 model_data->aero_rep_env_data[cell_id * model_data->n_aero_rep_env_data]);
642 int n_aero_rep = model_data->n_aero_rep;
645 for (; (*aero_rep_id) < n_aero_rep; (*aero_rep_id)++) {
647 int *aero_rep_int_data =
648 &(model_data->aero_rep_int_data
649 [model_data->aero_rep_int_indices[*aero_rep_id]]);
650 double *aero_rep_float_data =
651 &(model_data->aero_rep_float_data
652 [model_data->aero_rep_float_indices[*aero_rep_id]]);
653 double *aero_rep_env_data =
654 &(model_data->grid_cell_aero_rep_env_data
655 [model_data->aero_rep_env_idx[*aero_rep_id]]);
658 int aero_rep_type = *(aero_rep_int_data++);
663 if (aero_rep_type == update_aero_rep_type) {
664 switch (aero_rep_type) {
667 (
void *)update_data, aero_rep_int_data, aero_rep_float_data,
672 (
void *)update_data, aero_rep_int_data, aero_rep_float_data,
686 ModelData *model_data =
687 (ModelData *)&(((SolverData *)solver_data)->model_data);
690 int n_aero_rep = model_data->n_aero_rep;
693 "\n\nAerosol representation data\n\nnumber of aerosol "
694 "representations: %d\n\n",
698 for (
int i_aero_rep = 0; i_aero_rep < n_aero_rep; i_aero_rep++) {
700 int *aero_rep_int_data = &(
702 ->aero_rep_int_data[model_data->aero_rep_int_indices[i_aero_rep]]);
703 double *aero_rep_float_data =
704 &(model_data->aero_rep_float_data
705 [model_data->aero_rep_float_indices[i_aero_rep]]);
708 int aero_rep_type = *(aero_rep_int_data++);
711 switch (aero_rep_type) {
714 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.