From ad359a4a8b187a9aab741f39851242f215c493ee Mon Sep 17 00:00:00 2001 From: Andreas Gattringer <andreas.gattringer@univie.ac.at> Date: Tue, 21 Mar 2023 23:24:26 +0100 Subject: [PATCH] butterflies: updates and cleanups --- .../butterflies/butterflies_generations.c | 23 +++----- .../butterflies/butterflies_generations.h | 2 +- src/modules/butterflies/butterflies_inline.h | 2 +- src/modules/butterflies/butterflies_main.c | 7 ++- src/modules/butterflies/butterflies_main.h | 15 ++++-- .../butterflies/butterflies_overlays.c | 52 +++++++++++++++++++ .../butterflies/butterflies_overlays.h | 10 ++++ .../butterflies/butterflies_vital_rates.c | 3 ++ 8 files changed, 88 insertions(+), 26 deletions(-) create mode 100644 src/modules/butterflies/butterflies_overlays.c create mode 100644 src/modules/butterflies/butterflies_overlays.h diff --git a/src/modules/butterflies/butterflies_generations.c b/src/modules/butterflies/butterflies_generations.c index db756ed..c349f79 100644 --- a/src/modules/butterflies/butterflies_generations.c +++ b/src/modules/butterflies/butterflies_generations.c @@ -7,45 +7,34 @@ #include "butterflies_generations.h" #include "inline.h" -void grid_update_generations(struct cats_grid *grid, struct cats_thread_info *ts) +void area_update_generations(struct cats_grid *grid, struct cats_thread_info *ts) { struct cats_configuration *conf = ts->conf; - - struct conf_data_butterflies *module_conf = CATS_MODULE_DATA; int module_id = CATS_MODULE_ID; struct grid_data_butterflies *data = grid->grid_modules[module_id].module_data; - struct cats_vital_rate *rate = &module_conf->butterfly_generations; - //const bool sim_mode = conf-> + struct cats_vital_rate *rate = &module_conf->butterfly_generations; const cats_dt_coord start_row = ts->area.start_row; const cats_dt_coord end_row = ts->area.end_row; - const cats_dt_coord start_col = ts->area.start_col; const cats_dt_coord end_col = ts->area.end_col; + for (cats_dt_coord row = start_row; row < end_row; row++) { for (cats_dt_coord col = start_col; col < end_col; col++) { if (cell_excluded_by_overlay(conf, row, col)) { + data->eggs[row][col] = 0.0f; + set_population_ignore_cc(grid, row, col, 0); + data->generations[row][col] = 0.0f; continue; } cats_dt_rates gen = calculate_rate(rate, 0, conf->param, grid, row, col, NULL); - - - - cats_dt_environment suitability = get_suitability(grid, row, col); - if (suitability < grid->param.ZT) { - gen = 0.0; - } else if (suitability > grid->param.OT) { - gen = min_rates(1.0, gen); - } - data->generations[row][col] = (float) gen; - //printf("GENERATIONS::thread %03d:: %d %d %f\n", ts->id ,row, col, (float) gen); } } } \ No newline at end of file diff --git a/src/modules/butterflies/butterflies_generations.h b/src/modules/butterflies/butterflies_generations.h index 312421c..343d78e 100644 --- a/src/modules/butterflies/butterflies_generations.h +++ b/src/modules/butterflies/butterflies_generations.h @@ -2,5 +2,5 @@ #define CATS_BUTTERFLIES_GENERATIONS_H #include "data/cats_grid.h" #include "threading/threading.h" -void grid_update_generations(struct cats_grid *grid, struct cats_thread_info *ts); +void area_update_generations(struct cats_grid *grid, struct cats_thread_info *ts); #endif //CATS_BUTTERFLIES_GENERATIONS_H diff --git a/src/modules/butterflies/butterflies_inline.h b/src/modules/butterflies/butterflies_inline.h index 40f9ac7..2574b22 100644 --- a/src/modules/butterflies/butterflies_inline.h +++ b/src/modules/butterflies/butterflies_inline.h @@ -12,7 +12,7 @@ static inline bool cell_excluded_by_generation (const struct cats_grid *grid, cats_dt_coord row, cats_dt_coord col) { const int module_id = CATS_MODULE_ID; - struct grid_data_butterflies *data = grid->grid_modules[module_id].module_data; + const struct grid_data_butterflies *data = grid->grid_modules[module_id].module_data; if (data->generation_current > (int32_t) ceilf(data->generations[row][col])) return true; return false; } diff --git a/src/modules/butterflies/butterflies_main.c b/src/modules/butterflies/butterflies_main.c index 3da5d2a..91809b7 100644 --- a/src/modules/butterflies/butterflies_main.c +++ b/src/modules/butterflies/butterflies_main.c @@ -52,15 +52,17 @@ void *butterfly_grid_cleanup(struct cats_configuration *conf, struct cats_grid * } + void load_butterflies_species_params(struct cats_configuration *conf, struct cats_ini *ini, const char *section_name, struct cats_species_param *param) { struct conf_data_butterflies *data = CATS_MODULE_DATA; + + load_conf_vital_rate(&data->eggs_per_female, conf, ini, section_name, param); load_conf_vital_rate(&data->butterfly_generations, conf, ini, section_name, param); load_conf_vital_rate(&data->butterfly_egg_to_adult_survival, conf, ini, section_name, param); - //bool _get_int32_config_value(const struct cats_ini *ini, const char *section, const char *key, bool required, int32_t *value); cats_dt_rates female_percentage; load_conf_value(true, ini, section_name, "butterflies random walk steps maximum", &data->animal_dispersal_max_radius); @@ -97,8 +99,5 @@ void cats_module_init(struct cats_configuration *conf) for (enum butterfly_stats which = BF_STAT_MIN; which < BF_STAT_MAX; which++) { data->stat_ids[which] = add_custom_stat(&conf->stats_registry, get_butterfly_stats_name(which)); } - - - } diff --git a/src/modules/butterflies/butterflies_main.h b/src/modules/butterflies/butterflies_main.h index 2a6b1c0..3e9496e 100644 --- a/src/modules/butterflies/butterflies_main.h +++ b/src/modules/butterflies/butterflies_main.h @@ -19,9 +19,11 @@ struct grid_data_butterflies { enum butterfly_cell_info { BF_CELL_CLEAR = 0, - BF_CELL_EXCLUDED = 1 << 0, - BF_CELL_HABITAT_OK = 1 << 1, - BF_CELL_RESOURCE_AVAILABLE = 1 << 2 + BF_CELL_EXCLUDED = 1 << 1, + BF_CELL_HABITAT_OK = 1 << 2, + BF_CELL_RESOURCE_AVAILABLE = 1 << 3, + BF_CELL_VALID_DISPERSAL_TARGET = 1 << 4 + }; @@ -36,7 +38,14 @@ struct conf_data_butterflies { int32_t animal_dispersal_max_radius; ///< maximal flight/dispersal distance cats_dt_rates egg_to_adult_survival_rate_maximum; cats_dt_rates egg_per_female_maximum; + cats_dt_rates probability_to_stay; + cats_dt_rates egg_fraction_source; + cats_dt_rates egg_fraction_step; + + + bool actions_added; + cats_dt_rates stationary_females; struct cats_vital_rate eggs_per_female; struct cats_vital_rate butterfly_egg_to_adult_survival; struct cats_vital_rate butterfly_generations; diff --git a/src/modules/butterflies/butterflies_overlays.c b/src/modules/butterflies/butterflies_overlays.c new file mode 100644 index 0000000..050de1a --- /dev/null +++ b/src/modules/butterflies/butterflies_overlays.c @@ -0,0 +1,52 @@ + + + +#include "modules/module_header.h" +#include "actions/cats_actions.h" +#include "butterflies_main.h" +#include "inline_overlays.h" + + +enum action_status butterflies_update_overlays(struct cats_configuration *conf, struct cats_grid *grid) +{ + + + if (conf->overlays.have_overlays == false) { + return ACTION_NOT_RUN; + } + + int module_id = CATS_MODULE_ID; + struct grid_data_butterflies *data = grid->grid_modules[module_id].module_data; + + const cats_dt_coord rows = grid->dimension.rows; + const cats_dt_coord cols = grid->dimension.cols; + + for (cats_dt_coord row = 0; row < rows; row++) { + for (cats_dt_coord col = 0; col < cols; col++) { + + data->info_layer[row][col] = BF_CELL_CLEAR; + + if (cell_excluded_by_overlay(conf, row, col)) { + data->info_layer[row][col] |= BF_CELL_EXCLUDED; + } + + if (conf->overlays.overlay[OL_HABITAT_TYPE_CC].enabled && + conf->overlays.habitat_cc->data[row][col] > 0) { + data->info_layer[row][col] |= BF_CELL_HABITAT_OK; + } + + if (conf->overlays.overlay[OL_RESOURCE].enabled && + conf->overlays.resources->data[row][col] > 0) { + data->info_layer[row][col] |= BF_CELL_RESOURCE_AVAILABLE; + } + + if (data->info_layer[row][col] & BF_CELL_HABITAT_OK && + data->info_layer[row][col] & BF_CELL_RESOURCE_AVAILABLE) { + data->info_layer[row][col] |= BF_CELL_VALID_DISPERSAL_TARGET; + + } + } + } + + return ACTION_RUN; +} \ No newline at end of file diff --git a/src/modules/butterflies/butterflies_overlays.h b/src/modules/butterflies/butterflies_overlays.h new file mode 100644 index 0000000..f1e3f26 --- /dev/null +++ b/src/modules/butterflies/butterflies_overlays.h @@ -0,0 +1,10 @@ +// +// Created by andreas on 20/03/23. +// + +#ifndef CATS_BUTTERFLIES_OVERLAYS_H +#define CATS_BUTTERFLIES_OVERLAYS_H +#include "configuration/configuration.h" + +enum action_status butterflies_update_overlays(struct cats_configuration *conf, struct cats_grid *grid); +#endif //CATS_BUTTERFLIES_OVERLAYS_H diff --git a/src/modules/butterflies/butterflies_vital_rates.c b/src/modules/butterflies/butterflies_vital_rates.c index 36c604c..5af6b76 100644 --- a/src/modules/butterflies/butterflies_vital_rates.c +++ b/src/modules/butterflies/butterflies_vital_rates.c @@ -7,8 +7,11 @@ void add_vital_rates(struct cats_configuration *conf, struct conf_data_butterfl // generations register_module_vital_rate(conf, &data->butterfly_generations,"butterflies generations"); set_vital_rate_name(&data->butterfly_generations, "butterflies generations"); + set_vital_rate_suitability_cutoff_hint(&data->butterfly_generations, HYBRID_SUIT_TS_ZT); set_vital_rate_link_hybrid_function(&data->butterfly_generations, conf, LINK_SUITABILITY_SIGMOID); + set_vital_density(&data->butterfly_generations, NO_DENSITY_DEP); + // eggs register_module_vital_rate(conf, &data->eggs_per_female, "butterflies eggs per female"); -- GitLab