From af2cb1d30fa43e66d823e4d9e594c9a6f526e693 Mon Sep 17 00:00:00 2001 From: Andreas Gattringer <gattringera@a772-cvl-ws23.biodiv.univie.ac.at> Date: Wed, 10 May 2023 14:58:07 +0200 Subject: [PATCH] butterflies: misc fixes --- src/modules/butterflies/butterflies_action_helpers.c | 2 +- src/modules/butterflies/butterflies_actions.c | 6 ++++-- src/modules/butterflies/butterflies_dispersal.c | 3 ++- src/modules/butterflies/butterflies_filenames.c | 5 +++-- src/modules/butterflies/butterflies_main.c | 12 ++++++++++++ src/modules/butterflies/butterflies_populations.c | 2 +- src/modules/butterflies/butterflies_stats.c | 5 ----- 7 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/modules/butterflies/butterflies_action_helpers.c b/src/modules/butterflies/butterflies_action_helpers.c index 22db214..9699b49 100644 --- a/src/modules/butterflies/butterflies_action_helpers.c +++ b/src/modules/butterflies/butterflies_action_helpers.c @@ -66,9 +66,9 @@ void bf_add_actions(struct cats_configuration *conf) bf_add_generation_action(conf, bf_action_generation_start, "start generation", generation); bf_add_generation_action(conf, bf_action_maturation, "transition eggs to adults", generation); + bf_add_generation_action(conf, bf_action_save_grid, "output", generation); bf_add_generation_action(conf, bf_action_stats_gather, "gather stats", generation); bf_add_generation_action(conf, bf_action_dispersal, "dispersal", generation); - bf_add_generation_action(conf, bf_action_save_grid, "output", generation); bf_add_generation_action(conf, bf_action_generation_finish, "finish generation", generation); bf_add_generation_action(conf, bf_action_stats_write, "write stats", generation); } diff --git a/src/modules/butterflies/butterflies_actions.c b/src/modules/butterflies/butterflies_actions.c index 0416a21..0c4a2e9 100644 --- a/src/modules/butterflies/butterflies_actions.c +++ b/src/modules/butterflies/butterflies_actions.c @@ -72,7 +72,7 @@ void butterflies_area_dispersal(struct cats_grid *grid, struct cats_thread_info butterflies_cell_dispersal(grid, ts, row, col, false); } } - // if (ts->temp) printf("thread %d: %ld random walks (%ld cells) avg %f\n", ts->id, ts->temp, ts->temp1, (float) ts->temp / (float) ts->temp1); + if (ts->temp) printf("thread %d: %ld random walks (%ld cells) avg %f\n", ts->id, ts->temp, ts->temp1, (float) ts->temp / (float) ts->temp1); } @@ -95,6 +95,8 @@ enum action_status bf_action_save_grid(struct cats_grid *grid, struct cats_confi } + + enum action_status bf_action_dispersal(struct cats_grid *grid, struct cats_configuration *conf) { threaded_action(&butterflies_area_dispersal, grid, conf, TS_DISPERSAL); @@ -105,7 +107,7 @@ enum action_status bf_action_dispersal(struct cats_grid *grid, struct cats_confi printf("%s: %ld\n", bf_get_stats_field_name(which), grid->stats.stats[stat_id]); } - exit_cats(EXIT_SUCCESS); + return ACTION_RUN; } diff --git a/src/modules/butterflies/butterflies_dispersal.c b/src/modules/butterflies/butterflies_dispersal.c index d136ecd..72284eb 100644 --- a/src/modules/butterflies/butterflies_dispersal.c +++ b/src/modules/butterflies/butterflies_dispersal.c @@ -76,9 +76,10 @@ static void inline single_random_walk(struct cats_thread_info *ts, struct cats_g continue; } + int32_t eggs_to_deposit = (int32_t) ceilf((float) (eggs_left * egg_fraction_step)); assert(eggs_to_deposit >= 0); - + //printf("x %d %d -> %d %d: %d of %d / %Lf\n", source_row, source_col, row, col, eggs_to_deposit, eggs, egg_fraction_step); if (eggs_to_deposit > eggs_left) { eggs_to_deposit = eggs_left; } diff --git a/src/modules/butterflies/butterflies_filenames.c b/src/modules/butterflies/butterflies_filenames.c index 56f0323..dd83ebd 100644 --- a/src/modules/butterflies/butterflies_filenames.c +++ b/src/modules/butterflies/butterflies_filenames.c @@ -16,7 +16,8 @@ char *bf_population_filename(struct cats_configuration *conf, struct cats_grid * assert(grid != NULL); assert(conf != NULL); assert(conf->grid_count == 1); - + struct conf_data_butterflies *module_conf = CATS_MODULE_DATA; + int32_t max_generation = module_conf->generations_max; int module_id = CATS_MODULE_ID; struct grid_data_butterflies *data = grid->grid_modules[module_id].module_data; @@ -25,7 +26,7 @@ char *bf_population_filename(struct cats_configuration *conf, struct cats_grid * char *extension = get_extension(conf, "adults"); struct string_array *name = standard_output_file_name(conf, NULL, NULL, NULL); - string_array_add_int(name, data->generation_current, "g%03d"); + string_array_add_int(name, max_generation - data->generation_current, "g%03d"); char *filename = assemble_filename(path, name, "_", extension); diff --git a/src/modules/butterflies/butterflies_main.c b/src/modules/butterflies/butterflies_main.c index 6e8a5b8..9a7aef3 100644 --- a/src/modules/butterflies/butterflies_main.c +++ b/src/modules/butterflies/butterflies_main.c @@ -24,6 +24,7 @@ void *butterfly_grid_init(__attribute__((unused)) struct cats_configuration *con data->info_layer = 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; data->eggs = new_raw_2d_array_from_dimension(grid->dimension, sizeof(float)); @@ -66,6 +67,17 @@ void load_butterflies_species_params(struct cats_configuration *conf, struct cat load_conf_vital_rate(&data->butterfly_egg_to_adult_survival, conf, ini, section_name, param); load_conf_value(true, ini, section_name, "butterflies random walk steps maximum", &data->animal_dispersal_max_radius); + bool l = load_conf_value(false, ini, section_name, "egg fraction step", &data->egg_fraction_step); + + if (! l) { + data->egg_fraction_step = 0.5; + log_message(LOG_INFO, "using default value for egg fraction step: %Lf\n", data->egg_fraction_step); + } + + if (data->egg_fraction_step <= 0.0 || data->egg_fraction_step > 1.0) { + log_message(LOG_ERROR, "egg fraction step must be in (0, 1], is %Lf", data->egg_fraction_step); + exit_cats(EXIT_FAILURE); + } if (data->animal_dispersal_max_radius <= 0) { log_message(LOG_ERROR, "butterflies random walk steps maximum must be > 0, is %d", data->animal_dispersal_max_radius); diff --git a/src/modules/butterflies/butterflies_populations.c b/src/modules/butterflies/butterflies_populations.c index f960967..4919683 100644 --- a/src/modules/butterflies/butterflies_populations.c +++ b/src/modules/butterflies/butterflies_populations.c @@ -68,7 +68,7 @@ void bf_cell_maturation(struct cats_grid *grid, struct cats_thread_info *ts, cat if (eggs > data->eggs[row][col]) { log_message(LOG_ERROR, "Removing more eggs than present: %d %d: %f/%f", row, col, data->eggs[row][col], eggs); - exit(EXIT_FAILURE); + exit_cats(EXIT_FAILURE); } data->eggs[row][col] -= eggs; diff --git a/src/modules/butterflies/butterflies_stats.c b/src/modules/butterflies/butterflies_stats.c index 6fe9fd2..113b880 100644 --- a/src/modules/butterflies/butterflies_stats.c +++ b/src/modules/butterflies/butterflies_stats.c @@ -93,7 +93,6 @@ struct string_array *bf_assemble_stats(struct cats_configuration *conf, struct c } - void bf_stats_write(struct cats_configuration *conf, struct cats_grid *grid) { struct conf_data_butterflies *module_conf = CATS_MODULE_DATA; @@ -116,10 +115,6 @@ void bf_stats_write(struct cats_configuration *conf, struct cats_grid *grid) free_string_array(&data); - exit_cats(EXIT_FAILURE); - - - } -- GitLab