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,
62 return num_flagged_elem;
72 int n_aero_rep = model_data->n_aero_rep;
76 for (
int i_aero_rep = 0; i_aero_rep < n_aero_rep; i_aero_rep++) {
78 int *aero_rep_int_data = &(
80 ->aero_rep_int_data[model_data->aero_rep_int_indices[i_aero_rep]]);
81 double *aero_rep_float_data =
82 &(model_data->aero_rep_float_data
83 [model_data->aero_rep_float_indices[i_aero_rep]]);
86 int aero_rep_type = *(aero_rep_int_data++);
89 switch (aero_rep_type) {
92 aero_rep_int_data, aero_rep_float_data, state_flags);
96 aero_rep_int_data, aero_rep_float_data, state_flags);
108 int n_aero_rep = model_data->n_aero_rep;
112 for (
int i_aero_rep = 0; i_aero_rep < n_aero_rep; i_aero_rep++) {
114 int *aero_rep_int_data = &(
116 ->aero_rep_int_data[model_data->aero_rep_int_indices[i_aero_rep]]);
117 double *aero_rep_float_data =
118 &(model_data->aero_rep_float_data
119 [model_data->aero_rep_float_indices[i_aero_rep]]);
120 double *aero_rep_env_data =
121 &(model_data->grid_cell_aero_rep_env_data
122 [model_data->aero_rep_env_idx[i_aero_rep]]);
125 int aero_rep_type = *(aero_rep_int_data++);
128 switch (aero_rep_type) {
131 model_data, aero_rep_int_data, aero_rep_float_data,
149 int n_aero_rep = model_data->n_aero_rep;
153 for (
int i_aero_rep = 0; i_aero_rep < n_aero_rep; i_aero_rep++) {
155 int *aero_rep_int_data = &(
157 ->aero_rep_int_data[model_data->aero_rep_int_indices[i_aero_rep]]);
158 double *aero_rep_float_data =
159 &(model_data->aero_rep_float_data
160 [model_data->aero_rep_float_indices[i_aero_rep]]);
161 double *aero_rep_env_data =
162 &(model_data->grid_cell_aero_rep_env_data
163 [model_data->aero_rep_env_idx[i_aero_rep]]);
166 int aero_rep_type = *(aero_rep_int_data++);
169 switch (aero_rep_type) {
200 int aero_phase_idx,
double *radius,
201 double *partial_deriv) {
203 int *aero_rep_int_data = &(
205 ->aero_rep_int_data[model_data->aero_rep_int_indices[aero_rep_idx]]);
206 double *aero_rep_float_data =
207 &(model_data->aero_rep_float_data
208 [model_data->aero_rep_float_indices[aero_rep_idx]]);
209 double *aero_rep_env_data =
210 &(model_data->grid_cell_aero_rep_env_data
211 [model_data->aero_rep_env_idx[aero_rep_idx]]);
214 int aero_rep_type = *(aero_rep_int_data++);
217 switch (aero_rep_type) {
220 model_data, aero_phase_idx, radius, partial_deriv, aero_rep_int_data,
221 aero_rep_float_data, aero_rep_env_data);
225 model_data, aero_phase_idx, radius, partial_deriv, aero_rep_int_data,
226 aero_rep_float_data, aero_rep_env_data);
250 int aero_phase_idx_first,
int aero_phase_idx_second,
251 double *surface_area,
double *partial_deriv) {
253 int *aero_rep_int_data = &(
255 ->aero_rep_int_data[model_data->aero_rep_int_indices[aero_rep_idx]]);
256 double *aero_rep_float_data =
257 &(model_data->aero_rep_float_data
258 [model_data->aero_rep_float_indices[aero_rep_idx]]);
259 double *aero_rep_env_data =
260 &(model_data->grid_cell_aero_rep_env_data
261 [model_data->aero_rep_env_idx[aero_rep_idx]]);
264 int aero_rep_type = *(aero_rep_int_data++);
267 switch (aero_rep_type) {
270 model_data, aero_phase_idx_first, aero_phase_idx_second, surface_area,
271 partial_deriv, aero_rep_int_data, aero_rep_float_data, aero_rep_env_data);
275 model_data, aero_phase_idx_first, aero_phase_idx_second, surface_area,
276 partial_deriv, aero_rep_int_data, aero_rep_float_data, aero_rep_env_data);
301 int aero_phase_idx,
double *number_conc,
302 double *partial_deriv) {
304 int *aero_rep_int_data = &(
306 ->aero_rep_int_data[model_data->aero_rep_int_indices[aero_rep_idx]]);
307 double *aero_rep_float_data =
308 &(model_data->aero_rep_float_data
309 [model_data->aero_rep_float_indices[aero_rep_idx]]);
310 double *aero_rep_env_data =
311 &(model_data->grid_cell_aero_rep_env_data
312 [model_data->aero_rep_env_idx[aero_rep_idx]]);
315 int aero_rep_type = *(aero_rep_int_data++);
318 switch (aero_rep_type) {
321 model_data, aero_phase_idx, number_conc, partial_deriv,
322 aero_rep_int_data, aero_rep_float_data, aero_rep_env_data);
326 model_data, aero_phase_idx, number_conc, partial_deriv,
327 aero_rep_int_data, aero_rep_float_data, aero_rep_env_data);
343 int aero_phase_idx) {
345 int aero_conc_type = 0;
348 int *aero_rep_int_data = &(
350 ->aero_rep_int_data[model_data->aero_rep_int_indices[aero_rep_idx]]);
351 double *aero_rep_float_data =
352 &(model_data->aero_rep_float_data
353 [model_data->aero_rep_float_indices[aero_rep_idx]]);
354 double *aero_rep_env_data =
355 &(model_data->grid_cell_aero_rep_env_data
356 [model_data->aero_rep_env_idx[aero_rep_idx]]);
359 int aero_rep_type = *(aero_rep_int_data++);
362 switch (aero_rep_type) {
365 aero_phase_idx, &aero_conc_type, aero_rep_int_data,
366 aero_rep_float_data, aero_rep_env_data);
370 aero_phase_idx, &aero_conc_type, aero_rep_int_data,
371 aero_rep_float_data, aero_rep_env_data);
374 return aero_conc_type;
397 int aero_rep_idx,
int aero_phase_idx,
398 double *aero_phase_mass,
399 double *partial_deriv) {
401 int *aero_rep_int_data = &(
403 ->aero_rep_int_data[model_data->aero_rep_int_indices[aero_rep_idx]]);
404 double *aero_rep_float_data =
405 &(model_data->aero_rep_float_data
406 [model_data->aero_rep_float_indices[aero_rep_idx]]);
407 double *aero_rep_env_data =
408 &(model_data->grid_cell_aero_rep_env_data
409 [model_data->aero_rep_env_idx[aero_rep_idx]]);
412 int aero_rep_type = *(aero_rep_int_data++);
415 switch (aero_rep_type) {
418 model_data, aero_phase_idx, aero_phase_mass, partial_deriv,
419 aero_rep_int_data, aero_rep_float_data, aero_rep_env_data);
423 model_data, aero_phase_idx, aero_phase_mass, partial_deriv,
424 aero_rep_int_data, aero_rep_float_data, aero_rep_env_data);
451 double *aero_phase_avg_MW,
452 double *partial_deriv) {
454 int *aero_rep_int_data = &(
456 ->aero_rep_int_data[model_data->aero_rep_int_indices[aero_rep_idx]]);
457 double *aero_rep_float_data =
458 &(model_data->aero_rep_float_data
459 [model_data->aero_rep_float_indices[aero_rep_idx]]);
460 double *aero_rep_env_data =
461 &(model_data->grid_cell_aero_rep_env_data
462 [model_data->aero_rep_env_idx[aero_rep_idx]]);
465 int aero_rep_type = *(aero_rep_int_data++);
468 switch (aero_rep_type) {
471 model_data, aero_phase_idx, aero_phase_avg_MW, partial_deriv,
472 aero_rep_int_data, aero_rep_float_data, aero_rep_env_data);
476 model_data, aero_phase_idx, aero_phase_avg_MW, partial_deriv,
477 aero_rep_int_data, aero_rep_float_data, aero_rep_env_data);
494 int n_float_param,
int n_env_param,
495 int *int_param,
double *float_param,
497 ModelData *model_data =
498 (ModelData *)&(((SolverData *)solver_data)->model_data);
501 int *aero_rep_int_data =
502 &(model_data->aero_rep_int_data
503 [model_data->aero_rep_int_indices[model_data->n_added_aero_reps]]);
504 double *aero_rep_float_data = &(
505 model_data->aero_rep_float_data
506 [model_data->aero_rep_float_indices[model_data->n_added_aero_reps]]);
509 model_data->aero_rep_int_indices[model_data->n_added_aero_reps + 1] =
512 ->aero_rep_int_indices[model_data->n_added_aero_reps];
513 model_data->aero_rep_float_indices[model_data->n_added_aero_reps + 1] =
515 model_data->aero_rep_float_indices[model_data->n_added_aero_reps];
516 model_data->aero_rep_env_idx[model_data->n_added_aero_reps + 1] =
517 model_data->aero_rep_env_idx[model_data->n_added_aero_reps] + n_env_param;
518 ++(model_data->n_added_aero_reps);
521 *(aero_rep_int_data++) = aero_rep_type;
524 for (; n_int_param > 0; --n_int_param)
525 *(aero_rep_int_data++) = *(int_param++);
528 for (; n_float_param > 0; --n_float_param)
529 *(aero_rep_float_data++) = (double)*(float_param++);
531 model_data->n_aero_rep_env_data += n_env_param;
543 int update_aero_rep_type,
void *update_data,
545 ModelData *model_data =
546 (ModelData *)&(((SolverData *)solver_data)->model_data);
549 model_data->grid_cell_aero_rep_env_data = &(
550 model_data->aero_rep_env_data[cell_id * model_data->n_aero_rep_env_data]);
553 int n_aero_rep = model_data->n_aero_rep;
556 for (; (*aero_rep_id) < n_aero_rep; (*aero_rep_id)++) {
558 int *aero_rep_int_data =
559 &(model_data->aero_rep_int_data
560 [model_data->aero_rep_int_indices[*aero_rep_id]]);
561 double *aero_rep_float_data =
562 &(model_data->aero_rep_float_data
563 [model_data->aero_rep_float_indices[*aero_rep_id]]);
564 double *aero_rep_env_data =
565 &(model_data->grid_cell_aero_rep_env_data
566 [model_data->aero_rep_env_idx[*aero_rep_id]]);
569 int aero_rep_type = *(aero_rep_int_data++);
574 if (aero_rep_type == update_aero_rep_type) {
575 switch (aero_rep_type) {
578 (
void *)update_data, aero_rep_int_data, aero_rep_float_data,
583 (
void *)update_data, aero_rep_int_data, aero_rep_float_data,
597 ModelData *model_data =
598 (ModelData *)&(((SolverData *)solver_data)->model_data);
601 int n_aero_rep = model_data->n_aero_rep;
604 "\n\nAerosol representation data\n\nnumber of aerosol "
605 "representations: %d\n\n",
609 for (
int i_aero_rep = 0; i_aero_rep < n_aero_rep; i_aero_rep++) {
611 int *aero_rep_int_data = &(
613 ->aero_rep_int_data[model_data->aero_rep_int_indices[i_aero_rep]]);
614 double *aero_rep_float_data =
615 &(model_data->aero_rep_float_data
616 [model_data->aero_rep_float_indices[i_aero_rep]]);
619 int aero_rep_type = *(aero_rep_int_data++);
622 switch (aero_rep_type) {
625 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_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)
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)
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.
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_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_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_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.