diff --git a/src/cats/actions/setup_actions.c b/src/cats/actions/setup_actions.c index 478dc9c9e61211e5195cc79ddd8fddb955b965af..5902def2fe0ca9b9d66fab8a3e208f9ab20c34ca 100644 --- a/src/cats/actions/setup_actions.c +++ b/src/cats/actions/setup_actions.c @@ -52,7 +52,7 @@ const char *ACTION_DEFAULT = "_default"; void add_default_actions(struct cats_configuration *conf) { assert(conf != NULL); - register_default_functions(conf); + //register_default_action_functions(conf); log_message(LOG_INFO, "setting up default actions"); append_action(conf, action_grid_stats_reset, ALL_STAGES, "statistics reset", ACTION_ALWAYS); @@ -158,6 +158,41 @@ append_action(struct cats_configuration *conf, action_function action, enum cats return conf->cycle.num_actions; } +void list_actions_full(struct cats_configuration *conf) +{ + log_message(LOG_INFO, "Action functions: %d", conf->action_functions.count); + for (int32_t i = 0; i < conf->action_functions.count; i++) { + log_message(LOG_INFO, "%d: %s %p ", i, conf->action_functions.names[i], + conf->action_functions.functions[i]); + } +} + + +action_function get_action_by_name(struct cats_configuration *conf, const char *name) +{ + for (int32_t i = 0; i < conf->action_functions.count; i++) { + if (!strcmp(conf->action_functions.names[i], name)) return conf->action_functions.functions[i]; + } + return NULL; +} + +int32_t +append_action_by_name(struct cats_configuration *conf, const char *action_name, enum cats_simulation_stages when, + const char *name, const char *module_name) +{ + int32_t n = conf->cycle.num_actions; + conf->cycle.actions = realloc_or_die(conf->cycle.actions, (n + 1) * sizeof(struct cats_action)); + conf->cycle.num_actions++; + action_function action = get_action_by_name(conf, action_name); + if (action == NULL) { + log_message(LOG_ERROR, "%s: could not find action '%s'", __func__, action_name); + exit_cats(EXIT_FAILURE); + } + add_action_at(conf, n, action, when, name, module_name); + + return conf->cycle.num_actions; +} + void shift_action_functions_down_by_one(struct cats_configuration *conf, int32_t from) { @@ -258,7 +293,7 @@ bool action_is_registered(const struct cats_configuration *conf, const action_fu const struct action_function_registry *registry = &conf->action_functions; for (int32_t i = 0; i < registry->count; i++) { - if (registry->functions[i] == function) return true; + if (*(registry->functions[i]) == function) return true; } return false; @@ -266,7 +301,7 @@ bool action_is_registered(const struct cats_configuration *conf, const action_fu } -void register_default_functions(struct cats_configuration *conf) +void register_default_action_functions(struct cats_configuration *conf) { register_action_function(conf, action_grid_stats_reset, "action_reset_grid_stats", "resetting stats"); diff --git a/src/cats/actions/setup_actions.h b/src/cats/actions/setup_actions.h index 6712074330c6d3717f3b3a666bd4fcabdf5ae26a..242c4746268403c9eb661d8dad5f40c336aee79d 100644 --- a/src/cats/actions/setup_actions.h +++ b/src/cats/actions/setup_actions.h @@ -41,7 +41,7 @@ int32_t append_action(struct cats_configuration *conf, action_function action, e action_function get_action_function(const struct cats_configuration *conf, const char *name); -void register_default_functions(struct cats_configuration *conf); +void register_default_action_functions(struct cats_configuration *conf); int32_t add_action_after_function(struct cats_configuration *conf, action_function function, enum cats_simulation_stages when, @@ -54,4 +54,14 @@ void replace_function(struct cats_configuration *conf, action_function function, void cleanup_action_functions(struct action_function_registry *registry); +void list_actions(const struct cats_configuration *conf); + +void list_actions_full(struct cats_configuration *conf); + +void register_action_function(struct cats_configuration *conf, action_function function, const char *name, + const char *message); + +int32_t append_action_by_name(struct cats_configuration *conf, const char *action_name, enum cats_simulation_stages when, + const char *name, const char *module_name); + #endif //CATS_SETUP_ACTIONS_H diff --git a/src/cats/cats.c b/src/cats/cats.c index be52637b132cd097f9e68f31f8ca0ccb726e3372..9cbc75a925df860a35ab8e5cf8adb37a3d5a9bb0 100644 --- a/src/cats/cats.c +++ b/src/cats/cats.c @@ -163,6 +163,13 @@ void load_modules(struct cats_configuration *conf) } + + printf("%s: %d\n", __func__, j); + if (p->module_data[j].load_species_param_function) { + p->module_data[j].load_species_param_function(conf, conf->ini, p->species_config_section, p); + } + + } } @@ -177,6 +184,7 @@ struct cats_configuration *load_main_configuration(const struct program_options setup_directories(conf); post_process_configuration(conf); //print_config_summary(conf); + register_default_action_functions(conf); load_modules(conf); diff --git a/src/cats/configuration/load_configuration_species_params.c b/src/cats/configuration/load_configuration_species_params.c index 4ec6390101780148741cfb181e2b67b371f6b6f4..6480603f9cefefe6791eb551c4d7a3e0fb1ab827 100644 --- a/src/cats/configuration/load_configuration_species_params.c +++ b/src/cats/configuration/load_configuration_species_params.c @@ -101,7 +101,9 @@ void load_conf_vital_rate(struct cats_vital_rate *vr, struct cats_configuration char *vr_name = vr->name; char *vital_rate_maximum = compound_string(vr_name, "maximum", " "); - bool req = vr->preset.have_maximum; + bool req = !vr->preset.have_maximum; + printf("%s: %s required %d\n", __func__, vr->name, req); + if (vr == &p->carrying_capacity) req = true; bool have_max = load_conf_value(req, ini, species_section, vital_rate_maximum, &vr->max_rate); if (vr->is_integer_quantity) { vr->max_rate = roundl(vr->max_rate); @@ -278,6 +280,7 @@ void load_config_species_parameter(struct cats_configuration *conf, struct cats_ for (int32_t i = 0; i < conf->modules.count; i++) { + printf("%s: %d\n", __func__, i); if (p->module_data[i].load_species_param_function) { p->module_data[i].load_species_param_function(conf, ini, species_section, p); } diff --git a/src/cats/grids/cats_grid.c b/src/cats/grids/cats_grid.c index 413161ac37dff339df7d018c042c39bc4f15cc2e..292eb16619080c0cdcd840443ca6812e89544f81 100644 --- a/src/cats/grids/cats_grid.c +++ b/src/cats/grids/cats_grid.c @@ -251,17 +251,27 @@ void cleanup_grid_seeds_and_juveniles(struct cats_grid *grid) free_grid(&grid->seeds_produced, grid->dimension.rows); free_grid(&grid->dispersed_seeds, grid->dimension.rows); + if (grid->seed_bank) { + for (cats_dt_coord row = 0; row < grid->dimension.rows; row++) { + for (cats_dt_coord col = 0; col < grid->dimension.cols; col++) { + destroy_seed_structure(grid, row, col); + } - for (cats_dt_coord row = 0; row < grid->dimension.rows; row++) { - for (cats_dt_coord col = 0; col < grid->dimension.cols; col++) { - destroy_seed_structure(grid, row, col); - destroy_juveniles(grid, row, col); + free(grid->juveniles[row]); } + } + + if (grid->seed_bank) { + for (cats_dt_coord row = 0; row < grid->dimension.rows; row++) { + for (cats_dt_coord col = 0; col < grid->dimension.cols; col++) { + destroy_juveniles(grid, row, col); + } - free(grid->seed_bank[row]); - free(grid->juveniles[row]); + free(grid->juveniles[row]); + } } + free(grid->seed_bank); free(grid->juveniles); free(grid->seeds_produced); diff --git a/src/cats/modules/load_module.c b/src/cats/modules/load_module.c index 65bc4cb7090b25ce7edeb1c7b6746e37b49235ac..ad1f8c20dd602e18cb9dead2bf6f0e59a9994e77 100644 --- a/src/cats/modules/load_module.c +++ b/src/cats/modules/load_module.c @@ -164,7 +164,7 @@ void register_module_vital_rate(struct cats_configuration *conf, struct cats_vit m->vital_rate_required = realloc_or_die(m->vital_rate_required, sizeof(bool) * (vr_count + 1)); m->vr[vr_count] = vr; m->vital_rate_name[vr_count] = strdup(name); - + vr->is_carrying_capacity = false; strncpy(vr->name, name, MAX_VITAL_NAME_LEN + 1); diff --git a/src/cats/stats/write_stats.c b/src/cats/stats/write_stats.c index 11844db7fe9eae9c3d75961b9e67eebf48e823c7..b4e440dad9041af9531419b56420ff0d82a75fd9 100644 --- a/src/cats/stats/write_stats.c +++ b/src/cats/stats/write_stats.c @@ -189,6 +189,7 @@ void write_grid_stats(struct cats_configuration *conf, struct cats_grid *grid, b for (int32_t module_id = 0; module_id < conf->modules.count; module_id++) { struct string_array *module_stats = add_module_stats(conf, grid, header, module_id); + if (module_stats == NULL) continue; write_to_file(file, module_stats, ","); if (conf->modules.module[module_id].stats_header == NULL) { conf->modules.module[module_id].stats_header = copy_string_array(module_stats); diff --git a/src/cats/vital_rates/default_vital_rates.c b/src/cats/vital_rates/default_vital_rates.c index 83b6de11b4edd9e6675e033dcd0599243e94021f..270c657e830de8e4000e8b49bb7d3070900d603b 100644 --- a/src/cats/vital_rates/default_vital_rates.c +++ b/src/cats/vital_rates/default_vital_rates.c @@ -285,12 +285,15 @@ void postprocess_vital_rates(struct cats_configuration *conf) post_process_vital_rate(conf, ¶m->carrying_capacity, set, param); - for (enum cats_vital_rate_id vr_idx = VR_MIN + 1; vr_idx < VR_MAX; vr_idx++) { - struct cats_vital_rate *vr = ¶m->vital_rates[vr_idx]; - vr->default_rate_id = vr_idx; - post_process_vital_rate(conf, vr, set, param); + if (param->demographic_module == NULL) { + for (enum cats_vital_rate_id vr_idx = VR_MIN + 1; vr_idx < VR_MAX; vr_idx++) { + struct cats_vital_rate *vr = ¶m->vital_rates[vr_idx]; + vr->default_rate_id = vr_idx; + post_process_vital_rate(conf, vr, set, param); + } } + for (int32_t i = 0; i < conf->modules.count; i++) { for (int32_t j = 0; j < param->module_data[i].vital_rate_count; j++) { post_process_vital_rate(conf, param->module_data[i].vr[j], set, param); diff --git a/src/cats/vital_rates/setup_rates.c b/src/cats/vital_rates/setup_rates.c index 9bdace81841818765b64b25bd4a417263bb5ee6e..2f167f5fda18e9eef694a1763e7ba8962f917acd 100644 --- a/src/cats/vital_rates/setup_rates.c +++ b/src/cats/vital_rates/setup_rates.c @@ -113,7 +113,7 @@ void set_vital_density(struct cats_vital_rate *vital, enum cats_density_dependen { assert(vital != NULL); if (vital->is_carrying_capacity && density != NO_DENSITY_DEP) { - log_message(LOG_ERROR, "%s: carrying capacity may never depend on population density", __func__); + log_message(LOG_ERROR, "%s (%s): carrying capacity may never depend on population density", __func__, vital->name); exit_cats(EXIT_FAILURE); } vital->density = density; diff --git a/src/cats/vital_rates/setup_rates.h b/src/cats/vital_rates/setup_rates.h index f48091952685e1e37672d039c0322442127b4688..f700b88f70d11d30e091675888ada24763859c03 100644 --- a/src/cats/vital_rates/setup_rates.h +++ b/src/cats/vital_rates/setup_rates.h @@ -33,10 +33,6 @@ void set_vital_rate_suitability_cutoff_hint(struct cats_vital_rate *vital, void set_vital_density_ts(struct cats_vital_rate *vital, cats_dt_rates ts); -void set_vital_rate(struct cats_vital_rate *vital, const char *name, cats_dt_rates max_rate, cats_dt_rates cutoff, - struct cats_environment *set, enum cats_density_dependence density, - const struct cats_species_param *param); - void set_vital_rate_name(struct cats_vital_rate *vital, const char *name); int32_t setup_default_links(struct cats_vital_rate_hybrid_function *vital_dependency_registry); diff --git a/src/cats/vital_rates/vital_rates.h b/src/cats/vital_rates/vital_rates.h index 21d9cc011687cebd30fb786b66f7408f868f4f85..aa9690935d07061b6bcc13b1c84f1d2c7fecf9d0 100644 --- a/src/cats/vital_rates/vital_rates.h +++ b/src/cats/vital_rates/vital_rates.h @@ -26,6 +26,7 @@ #define CATS_VITAL_RATES_H #include "data/cats_datatypes.h" +#include "defaults.h" struct cats_species_param; struct cats_grid;