diff --git a/src/modules/butterflies/butterflies_dispersal.c b/src/modules/butterflies/butterflies_dispersal.c index 00958cb878460b8da7e03aae3e900fdd75e4c87a..6cd103477c7baac8e1d4542fb1b13f63a8f00bc8 100644 --- a/src/modules/butterflies/butterflies_dispersal.c +++ b/src/modules/butterflies/butterflies_dispersal.c @@ -45,7 +45,7 @@ static void inline single_random_walk(struct cats_thread_info *ts, struct cats_g int32_t eggs_left = eggs; const cats_dt_coord max_steps = module_conf->animal_dispersal_max_radius; - cats_dt_coord steps = 0; + cats_dt_coord row = source_row; cats_dt_coord col = source_col; @@ -53,7 +53,7 @@ static void inline single_random_walk(struct cats_thread_info *ts, struct cats_g const cats_dt_coord cols = grid->dimension.cols; - while (steps < max_steps) { + for (cats_dt_coord step = 0; step < max_steps; step++){ const unsigned long int direction = gsl_rng_uniform_int(ts->rng, N_DIRECTIONS); @@ -74,8 +74,8 @@ static void inline single_random_walk(struct cats_thread_info *ts, struct cats_g // is the cell a valid dispersal target location? if (!(data->info_layer[row][col] & BF_CELL_VALID_DISPERSAL_TARGET)) { if (debug_rw) { - fprintf(module_conf->debug_rw_file, "%d,%d,%d,%d,%d,%d,%d\n", rw_num, row, col, steps + 1, - module_conf->animal_dispersal_max_radius - steps - 1, 0, eggs_left); + fprintf(module_conf->debug_rw_file, "%d,%d,%d,%d,%d,%d,%d\n", rw_num, row, col, step + 1, + module_conf->animal_dispersal_max_radius - step - 1, 0, eggs_left); } continue; @@ -93,13 +93,13 @@ static void inline single_random_walk(struct cats_thread_info *ts, struct cats_g data->eggs[row][col] += (float) eggs_to_deposit; ts->temp2++; if (debug_rw) { - fprintf(module_conf->debug_rw_file, "%d,%d,%d,%d,%d,%d,%d\n", rw_num, row, col, steps + 1, - module_conf->animal_dispersal_max_radius - steps - 1, eggs_to_deposit, eggs_left); + fprintf(module_conf->debug_rw_file, "%d,%d,%d,%d,%d,%d,%d\n", rw_num, row, col, step + 1, + module_conf->animal_dispersal_max_radius - step - 1, eggs_to_deposit, eggs_left); } if (eggs_left == 0) break; - steps++; + } assert(eggs_left >= 0); @@ -206,6 +206,12 @@ butterflies_cell_dispersal(struct cats_grid *grid, struct cats_thread_info *ts, //printf("thread %d: row %d col %d: doing %d rws\n", ts->id, row, col, wandering_females); if (debug_rw) { + fprintf(module_conf->debug_rw_file, "# total source cell eggs = %d\n", (int)ceill(source_cell_eggs)); + fprintf(module_conf->debug_rw_file, "# stationary females = %d\n", stationary_females); + fprintf(module_conf->debug_rw_file, "# wandering females = %d\n", wandering_females); + fprintf(module_conf->debug_rw_file, "# total females = %d\n", wandering_females + stationary_females); + fprintf(module_conf->debug_rw_file, "# wandering females source cell eggs = %d\n", (int) (wandering_females * (eggs_per_female - eggs_to_disperse_per_female))); + fprintf(module_conf->debug_rw_file, "# stationary females source cell eggs = %d\n", (int) (stationary_females * eggs_per_female)); fprintf(module_conf->debug_rw_file, "id,row,col,step,steps left,eggs deposited,eggs left\n"); @@ -215,7 +221,7 @@ butterflies_cell_dispersal(struct cats_grid *grid, struct cats_thread_info *ts, for (int32_t rw_number = 0; rw_number < wandering_females; rw_number++) { if (debug_rw) { - fprintf(module_conf->debug_rw_file, "%d,%d,%d,%d,0,%d,%d\n", rw_number, row, col, + fprintf(module_conf->debug_rw_file, "%d,%d,%d,0,%d,%d,%d\n", rw_number, row, col, module_conf->animal_dispersal_max_radius, (int) ceill(eggs_per_female * module_conf->egg_fraction_source), (int) ceill(eggs_to_disperse_per_female)); diff --git a/src/modules/butterflies/butterflies_main.c b/src/modules/butterflies/butterflies_main.c index a69fbaf606b8fbea2ead2175a1bbd3f29ba12c69..2676f665eaa032338f51a47e3ee40d3f1db72129 100644 --- a/src/modules/butterflies/butterflies_main.c +++ b/src/modules/butterflies/butterflies_main.c @@ -10,10 +10,39 @@ #include "butterflies_action_helpers.h" #include "paths/output_paths.h" #include "paths/directory_helper.h" - +#include "butterflies_populations.h" struct cats_global global; struct cats_debug_options cats_debug; +#include "lambda/leslie_matrix.h" + + +double *butterflies_matrix(struct cats_configuration *conf, struct lambda_parameters *l_param, + bool silent, int32_t *N_out){ + bool print_rate = !silent; + + struct conf_data_butterflies *module_conf = CATS_MODULE_DATA; + cats_dt_rates eggs_per_female = calculate_rate_for_matrix(&module_conf->eggs_per_female, l_param, print_rate); + cats_dt_rates adults_per_female = calculate_rate_for_matrix(&module_conf->adults_per_female, l_param, print_rate); + cats_dt_rates female_fraction = module_conf->female_fraction; + cats_dt_rates stationary = module_conf->probability_to_stay; + cats_dt_rates mobile = 1.0 - stationary; + cats_dt_rates egg_fraction_source = module_conf->egg_fraction_source; + cats_dt_rates max_eggs = module_conf->eggs_per_female.max_rate; + + cats_dt_rates eggs_to_adults_rate = bf_egg_to_adult_survival_rate(adults_per_female, max_eggs); + cats_dt_rates local_eggs = (stationary + mobile * egg_fraction_source ) * eggs_per_female; + // female -> female; + cats_dt_rates result = local_eggs * eggs_to_adults_rate * female_fraction; + + double *matrix = calloc_or_die(1, sizeof(double)); + + *matrix = (double) result; + *N_out = 1; + return matrix; + +} + void *butterfly_grid_init(__attribute__((unused)) struct cats_configuration *conf, struct cats_grid *grid, __attribute__((unused)) void *ignored) @@ -65,9 +94,10 @@ void load_butterflies_species_params(struct cats_configuration *conf, struct cat 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->adults_per_female, conf, ini, section_name, param); - load_conf_vital_rate(&data->butterfly_egg_to_adult_survival, conf, ini, section_name, param); + //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); @@ -151,6 +181,7 @@ void cats_module_init(struct cats_configuration *conf) int32_t id = register_module(conf, module_name, data, flags); register_cats_grid_init_function(conf, butterfly_grid_init, butterfly_grid_cleanup); register_load_species_param_config_func(conf, load_butterflies_species_params); + register_create_leslie_matrix_func(conf, butterflies_matrix); bf_add_vital_rates(conf, data); log_message(LOG_INFO, "Hello from %s (id: %d)\n", module_name, id); diff --git a/src/modules/butterflies/butterflies_main.h b/src/modules/butterflies/butterflies_main.h index 8654e6779da3c08e7f22bc8cb1bfc70fe521e826..9da1de6ae803e82add89a27542452ffb0749d277 100644 --- a/src/modules/butterflies/butterflies_main.h +++ b/src/modules/butterflies/butterflies_main.h @@ -47,6 +47,7 @@ struct conf_data_butterflies { struct cats_vital_rate eggs_per_female; struct cats_vital_rate butterfly_egg_to_adult_survival; struct cats_vital_rate butterfly_generations; + struct cats_vital_rate adults_per_female; cats_dt_rates female_fraction; bool actions_added; diff --git a/src/modules/butterflies/butterflies_populations.c b/src/modules/butterflies/butterflies_populations.c index 4919683f52c9978c478b82bccb7b8988b59f5a66..4431f0772c80338d630b98504325efdde1922ff4 100644 --- a/src/modules/butterflies/butterflies_populations.c +++ b/src/modules/butterflies/butterflies_populations.c @@ -13,8 +13,17 @@ #include "butterflies_main.h" #include "butterflies_inline.h" #include "inline_population.h" +#include "inline.h" +cats_dt_rates bf_egg_to_adult_survival_rate(cats_dt_rates adults_per_female, cats_dt_rates max_eggs) +{ + + + return adults_per_female/max_eggs; + +} + void bf_cell_maturation(struct cats_grid *grid, struct cats_thread_info *ts, cats_dt_coord row, cats_dt_coord col, bool check_exclusion) { @@ -37,7 +46,7 @@ void bf_cell_maturation(struct cats_grid *grid, struct cats_thread_info *ts, cat exit(EXIT_FAILURE); } - + int orig_eggs = data->eggs[row][col]; // the number of generations per cell is usually not an integer value // the non-integer part of the number of generations is used in the generation which is // one greater than the integer part of the number of generations @@ -62,7 +71,7 @@ void bf_cell_maturation(struct cats_grid *grid, struct cats_thread_info *ts, cat assert(this_generation_fraction <= 1.0); } - + cats_dt_population max_cc = (cats_dt_population) grid->param.carrying_capacity.max_rate; float eggs = this_generation_fraction * data->eggs[row][col]; if (eggs > data->eggs[row][col]) { @@ -75,14 +84,26 @@ void bf_cell_maturation(struct cats_grid *grid, struct cats_thread_info *ts, cat assert(data->eggs[row][col] >= 0); - struct conf_data_butterflies *module_conf = CATS_MODULE_DATA; - cats_dt_rates maturation_rate = calculate_rate(&module_conf->butterfly_egg_to_adult_survival, NAN, &grid->param, - grid, row, col, NULL); // not capped, we can have more adults than CC - cats_dt_population adults = poisson(ts->rng, eggs * maturation_rate); + struct conf_data_butterflies *module_conf = CATS_MODULE_DATA; + cats_dt_rates adults_per_female = calculate_rate(&module_conf->adults_per_female, NAN, &grid->param, + grid, row, col, NULL); + + cats_dt_rates max_eggs = module_conf->eggs_per_female.max_rate; + cats_dt_rates survival = bf_egg_to_adult_survival_rate(adults_per_female, max_eggs); + cats_dt_population adults = poisson(ts->rng, eggs * survival); assert(adults >= 0); + cats_dt_environment suit = get_suitability(grid, row, col); + printf("ABCD,%d,%d,%0.3f\n", (int) orig_eggs, adults, suit); set_population_ignore_cc(grid, row, col, adults); + + if (adults > max_cc * 10) { + + log_message(LOG_ERROR, "row %d col %d: number of adults %d exceeds %d time smaximum carrying capacity %d (maturation %Lf, eggs %f, max adults per f %Lf), suit %f, OT %Lf, survival %Lf", row, col, adults, 10, max_cc, + survival, eggs, module_conf->adults_per_female.max_rate, suit, grid->param.OT, survival); + exit_cats(EXIT_FAILURE); + } } diff --git a/src/modules/butterflies/butterflies_populations.h b/src/modules/butterflies/butterflies_populations.h index 20c6488a39ad28bf14b9280ae1283d6871591e1b..eed6c107c2b9b37990c1374bdb8458cab9863297 100644 --- a/src/modules/butterflies/butterflies_populations.h +++ b/src/modules/butterflies/butterflies_populations.h @@ -7,4 +7,6 @@ #include "data/cats_grid.h" void bf_cell_maturation(struct cats_grid *grid, struct cats_thread_info *ts, cats_dt_coord row, cats_dt_coord col, bool check_exclusion); void bf_area_kill_adults(struct cats_grid *grid, struct cats_thread_info *ts); +cats_dt_rates bf_egg_to_adult_survival_rate(cats_dt_rates adults_per_female, cats_dt_rates max_eggs); + #endif //CATS_BUTTERFLIES_POPULATIONS_H diff --git a/src/modules/butterflies/butterflies_vital_rates.c b/src/modules/butterflies/butterflies_vital_rates.c index 3f0e67855a1f147e366ada43fe052b730399862c..7d548f6eb125f9a4b05f792d2dbc29d76f76a168 100644 --- a/src/modules/butterflies/butterflies_vital_rates.c +++ b/src/modules/butterflies/butterflies_vital_rates.c @@ -16,11 +16,18 @@ void bf_add_vital_rates(struct cats_configuration *conf, struct conf_data_butter set_vital_rate_suitability_cutoff_hint(&data->eggs_per_female, HYBRID_SUIT_TS_ZT); set_vital_rate_link_hybrid_function(&data->eggs_per_female, conf, LINK_SUITABILITY_SIGMOID); + // eggs to adults + register_module_vital_rate(conf, &data->adults_per_female, "butterflies adults per female"); + set_vital_rate_name(&data->adults_per_female, "butterflies adults per female"); + set_vital_rate_suitability_cutoff_hint(&data->adults_per_female, HYBRID_SUIT_TS_ZT); + set_vital_rate_link_hybrid_function(&data->adults_per_female, conf, LINK_SUITABILITY_SIGMOID); // egg to adult survival + /* register_module_vital_rate(conf, &data->butterfly_egg_to_adult_survival,"butterflies egg to adult survival rate"); set_vital_rate_name(&data->butterfly_egg_to_adult_survival, "butterflies eggs to adult survival rate"); set_vital_rate_suitability_cutoff_hint(&data->butterfly_egg_to_adult_survival, HYBRID_SUIT_TS_ZT); set_vital_rate_link_hybrid_function(&data->butterfly_egg_to_adult_survival, conf, LINK_SUITABILITY_SIGMOID); set_vital_density(&data->butterfly_egg_to_adult_survival, NO_DENSITY_DEP); + */ }