From cda212dff2ca05af7f09187fad23334b144434d8 Mon Sep 17 00:00:00 2001
From: Andreas Gattringer <andreas.gattringer@univie.ac.at>
Date: Thu, 23 Feb 2023 09:12:13 +0100
Subject: [PATCH] butterflies: added layer to potentially speed up dispersal

---
 src/modules/butterflies/butterflies_main.c  |  9 +++--
 src/modules/butterflies/butterflies_main.h  |  1 +
 src/modules/butterflies/butterfly_actions.c | 39 +++++++++++++++++++++
 3 files changed, 47 insertions(+), 2 deletions(-)

diff --git a/src/modules/butterflies/butterflies_main.c b/src/modules/butterflies/butterflies_main.c
index 62f7e3a..912acab 100644
--- a/src/modules/butterflies/butterflies_main.c
+++ b/src/modules/butterflies/butterflies_main.c
@@ -20,6 +20,7 @@ void *butterfly_grid_init(struct cats_configuration *conf, struct cats_grid *gri
         struct grid_data_butterflies *data = malloc_or_die(sizeof(struct grid_data_butterflies));
         log_message(LOG_INFO, "allocating data for generations");
         data->generations = new_raw_2d_array_from_dimension(grid->dimension, sizeof(float));
+        data->food = new_raw_2d_array_from_dimension(grid->dimension, sizeof(int32_t));
         log_message(LOG_INFO, "done allocating data for generations");
         data->generation_current = 0;
         //struct conf_data_butterflies *conf_data = CATS_MODULE_DATA;
@@ -30,13 +31,17 @@ void *butterfly_grid_init(struct cats_configuration *conf, struct cats_grid *gri
 }
 
 
-void *grid_cleanup(struct cats_configuration *conf, struct cats_grid *grid, void *data)
+void *butterfly_grid_cleanup(struct cats_configuration *conf, struct cats_grid *grid, void *data)
 {
         log_message(LOG_INFO, "%s: grid cleanup", module_name);
         assert(grid != NULL);
         struct grid_data_butterflies *grid_data = data;
         free_grid(&grid_data->generations, grid->dimension.rows);
         free(grid_data->generations);
+        grid_data->generations = NULL;
+        free_grid(&grid_data->food, grid->dimension.rows);
+        free(grid_data->food);
+        grid_data->food = NULL;
         grid_data->generation_current = -1;
         return NULL;
 }
@@ -78,7 +83,7 @@ void cats_module_init(struct cats_configuration *conf)
         struct conf_data_butterflies *data = calloc_or_die(1,sizeof(struct conf_data_butterflies));
         enum cats_module_flags flags = MODULE_ALTERNATE_DEMOGRAPHIC | MODULE_OVERRIDE_ACTIONS;
         int32_t id = register_module(conf, module_name, data, flags);
-        register_cats_grid_init_function(conf, butterfly_grid_init, grid_cleanup);
+        register_cats_grid_init_function(conf, butterfly_grid_init, butterfly_grid_cleanup);
         register_load_species_param_config_func(conf, load_butterflies_species_params);
         add_vital_rates(conf, data);
 
diff --git a/src/modules/butterflies/butterflies_main.h b/src/modules/butterflies/butterflies_main.h
index 3971330..cdc8ccf 100644
--- a/src/modules/butterflies/butterflies_main.h
+++ b/src/modules/butterflies/butterflies_main.h
@@ -9,6 +9,7 @@ struct grid_data_butterflies {
         float **generations;
         int32_t generation_current;
         float **eggs;
+        int32_t **food;
 
 
 };
diff --git a/src/modules/butterflies/butterfly_actions.c b/src/modules/butterflies/butterfly_actions.c
index 9baac04..3422cdf 100644
--- a/src/modules/butterflies/butterfly_actions.c
+++ b/src/modules/butterflies/butterfly_actions.c
@@ -230,6 +230,41 @@ enum action_status action_butterfly_update_generations(struct cats_grid *grid, s
 }
 
 
+void reset_food_layer(const struct cats_grid *grid, struct grid_data_butterflies *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->food[row][col] = 0;
+                }
+        }
+}
+
+
+enum action_status action_butterflies_update_overlays(struct cats_grid *grid, struct  cats_configuration *conf)
+{
+        bool run = false;
+
+        int module_id = CATS_MODULE_ID;
+        struct grid_data_butterflies *data = grid->grid_modules[module_id].module_data;
+
+        if (! run) {
+               reset_food_layer(grid, data);
+        }
+
+        if (conf->overlays.overlay[OL_EXCLUSION].enabled) {
+
+                run = true;
+        }
+
+
+        if (!run) return ACTION_NOT_RUN;
+        return ACTION_RUN;
+}
+
+
 enum action_status action_finish_generation(struct cats_grid *grid, struct cats_configuration *conf)
 {
         int module_id = CATS_MODULE_ID;
@@ -287,6 +322,9 @@ void add_actions(struct cats_configuration *conf)
         register_action_function(conf, action_butterflies_maturation, "butterfly_action_egg_to_adult",
                                  "transition eggs to adults");
 
+        register_action_function(conf, action_butterflies_update_overlays, "butterfly_action_overlay_update",
+                                 "updating resource layer");
+
         register_action_function(conf, action_butterflies_dispersal, "butterfly_action_dispersal", "egg dispersal");
         register_action_function(conf, action_butterflies_kill_adults, "butterfly_kill_adults", "kill adults");
         register_action_function(conf, action_butterflies_save_grid, "action_butterflies_save_grid", "output");
@@ -295,6 +333,7 @@ void add_actions(struct cats_configuration *conf)
 
 
         append_action(conf, action_butterfly_stats_reset, ALL_STAGES, "resetting butterfly statistics", module_name);
+        append_action(conf, action_butterflies_update_overlays, ALL_STAGES, "updating resource layer", module_name);
         append_action_by_name(conf, "action_load_environments", ALL_STAGES, "environment update", module_name);
         append_action_by_name(conf, "action_overlay_update", ALL_STAGES, "overlay update", module_name);
         append_action(conf, action_butterfly_update_generations, ALL_STAGES, "update generations", module_name);
-- 
GitLab