diff --git a/src/modules/butterflies/butterflies_actions.c b/src/modules/butterflies/butterflies_actions.c index 9ae122262f298e669f601a976340181f6df72dcd..0416a212ba48138a4d11780c5905389d7f88524c 100644 --- a/src/modules/butterflies/butterflies_actions.c +++ b/src/modules/butterflies/butterflies_actions.c @@ -14,6 +14,7 @@ #include "butterflies_dispersal.h" #include "butterflies_overlays.h" #include "butterflies_filenames.h" +#include "inline.h" enum action_status bf_action_stats_reset(struct cats_grid *grid, struct cats_configuration *conf) @@ -116,13 +117,65 @@ enum action_status bf_action_stats_gather(struct cats_grid *grid, struct cats_co } -enum action_status bf_action_stats_write(__attribute__((unused)) struct cats_grid *grid, __attribute__((unused)) struct cats_configuration *conf) +enum action_status bf_action_stats_write(__attribute__((unused)) struct cats_grid *grid, + __attribute__((unused)) struct cats_configuration *conf) { bf_stats_write(conf, grid); return ACTION_RUN; } +int64_t count_populated_cells(const struct cats_grid *grid) +{ + int64_t cells = 0; + cats_dt_coord rows = grid->dimension.rows; + 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++) { + if (get_adult_population(grid, row, col)) { + cells += 1; + } + + } + } + return cells; +} + +int64_t butterflies_prune_invalid_cells(struct cats_grid *grid) +{ + int64_t invalid_habitat = 0; + int module_id = CATS_MODULE_ID; + struct grid_data_butterflies *data = grid->grid_modules[module_id].module_data; + cats_dt_coord rows = grid->dimension.rows; + 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++) { + if (!(data->info_layer[row][col] & BF_CELL_VALID_DISPERSAL_TARGET)) { + set_population_ignore_cc(grid, row, col, 0); + invalid_habitat += 1; + } + } + } + return invalid_habitat; +} + +void initial_population_adjustment(struct cats_configuration *conf, struct cats_grid *grid) +{ + int64_t init_populated_cells = count_populated_cells(grid); + int64_t invalid_habitat = butterflies_prune_invalid_cells(grid); + + if (grid->param.initial_population.set_to_cc == true) increase_initial_population_to_cc(grid, conf); + if (grid->param.initial_population.suitability_threshold > 0.0) { + prune_initial_population_under_threshold(conf, grid); + } + + int64_t after_populated_cells = count_populated_cells(grid); + + log_message(LOG_IMPORTANT, "Pruned initial populations from %ld cells to %ld, (%ld wrong habitat)", + init_populated_cells, after_populated_cells, invalid_habitat); + grid->param.initial_population.adjusted = true; +} + // only run at the start of the year enum action_status bf_action_generation_update(struct cats_grid *grid, struct cats_configuration *conf) { @@ -132,11 +185,9 @@ enum action_status bf_action_generation_update(struct cats_grid *grid, struct ca data->generation_current = module_conf->generations_max; log_message(LOG_IMPORTANT, "resetting generation to %d", module_conf->generations_max); + if (grid->param.initial_population.adjusted == false) { - if (grid->param.initial_population.set_to_cc == true) increase_initial_population_to_cc(grid, conf); - if (grid->param.initial_population.suitability_threshold > 0.0) { - prune_initial_population_under_threshold(conf, grid); - } + initial_population_adjustment(conf, grid); grid->param.initial_population.adjusted = true; } @@ -166,7 +217,8 @@ enum action_status bf_action_generation_finish(struct cats_grid *grid, struct ca return ACTION_RUN; } -enum action_status bf_action_generation_start(struct cats_grid *grid, __attribute__((unused)) struct cats_configuration *conf) +enum action_status +bf_action_generation_start(struct cats_grid *grid, __attribute__((unused)) struct cats_configuration *conf) { int module_id = CATS_MODULE_ID; diff --git a/src/modules/butterflies/butterflies_generations.c b/src/modules/butterflies/butterflies_generations.c index f466eb2266da7aef766c7869b975051d7dd8d19f..c2267e7ad3459850f73670d5f2eb55c1a1bab46a 100644 --- a/src/modules/butterflies/butterflies_generations.c +++ b/src/modules/butterflies/butterflies_generations.c @@ -26,7 +26,7 @@ void bf_area_generation_update(struct cats_grid *grid, struct cats_thread_info * for (cats_dt_coord col = start_col; col < end_col; col++) { if (cell_excluded_by_overlay(conf, row, col) - || (data->info_layer[row][col] & BF_CELL_VALID_DISPERSAL_TARGET) == false) { + || ! (data->info_layer[row][col] & BF_CELL_VALID_DISPERSAL_TARGET)) { data->eggs[row][col] = 0.0f; data->generations[row][col] = 0.0f; set_population_ignore_cc(grid, row, col, 0); diff --git a/src/modules/butterflies/butterflies_main.c b/src/modules/butterflies/butterflies_main.c index 108f378e35185a53360a3d9249069c15cf5d21fc..6e8a5b81dda81680b6c2cc91754896b703b3c834 100644 --- a/src/modules/butterflies/butterflies_main.c +++ b/src/modules/butterflies/butterflies_main.c @@ -100,6 +100,7 @@ void cats_module_init(struct cats_configuration *conf) register_cats_grid_init_function(conf, butterfly_grid_init, butterfly_grid_cleanup); register_load_species_param_config_func(conf, load_butterflies_species_params); bf_add_vital_rates(conf, data); + log_message(LOG_INFO, "Hello from %s (id: %d)\n", module_name, id);