Skip to content

Commit

Permalink
🪦Allow both mortalities simultaneously
Browse files Browse the repository at this point in the history
  • Loading branch information
mhesselbarth committed Nov 29, 2022
1 parent a2b7e7f commit 9faff6e
Show file tree
Hide file tree
Showing 9 changed files with 55 additions and 30 deletions.
2 changes: 1 addition & 1 deletion DESCRIPTION
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ BugReports: https://github.com/Allgeier-Lab/arrR/issues
License: GPL (>= 3)
Encoding: UTF-8
LazyData: true
RoxygenNote: 7.2.1
RoxygenNote: 7.2.2
VignetteBuilder: knitr
Depends: R (>= 3.1)
Imports:
Expand Down
8 changes: 4 additions & 4 deletions R/RcppExports.R
Original file line number Diff line number Diff line change
Expand Up @@ -329,13 +329,13 @@ rcpp_modify_degree <- function(x, y) {
#'
#' @param fishpop,fishpop_track Matrix with fishpop and starting fishpop values.
#' @param seafloor Matrix with seafloor values.
#' @param pop_ldie, pop_n_body,pop_reserves_max Numeric with parameters.
#' @param pop_linf,pop_ldie,pop_n_body,pop_reserves_max Numeric with parameters.
#' @param extent Vector with extent (xmin,xmax,ymin,ymax).
#' @param dimensions Vector with dimensions (nrow, ncol).
#'
#' @details
#' Function to simulate background mortality of fish individuals.
#' Fish automatically dies when \code{pop_mean_size} is greater than \code{pop_ldie}.
#' Fish automatically dies when current size is greater than \code{pop_ldie}.
#' If a individual dies, a new individual is created.
#'
#' @return void
Expand All @@ -344,8 +344,8 @@ rcpp_modify_degree <- function(x, y) {
#' @rdname rcpp_mortality
#'
#' @keywords internal
rcpp_mortality <- function(fishpop, fishpop_track, seafloor, pop_ldie, pop_n_body, pop_reserves_max, extent, dimensions) {
invisible(.Call(`_arrR_rcpp_mortality`, fishpop, fishpop_track, seafloor, pop_ldie, pop_n_body, pop_reserves_max, extent, dimensions))
rcpp_mortality <- function(fishpop, fishpop_track, seafloor, pop_linf, pop_ldie, pop_n_body, pop_reserves_max, extent, dimensions) {
invisible(.Call(`_arrR_rcpp_mortality`, fishpop, fishpop_track, seafloor, pop_linf, pop_ldie, pop_n_body, pop_reserves_max, extent, dimensions))
}

#' rcpp_move_behav
Expand Down
3 changes: 2 additions & 1 deletion R/run_simulation.R
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,8 @@ run_simulation <- function(seafloor, fishpop, nutrients_input = 0.0,

}

if (any(fishpop$length > parameters$pop_ldie)) {
# only check if pop_ldie is not equal to zero (default)
if (parameters$pop_ldie > 0.0 & (any(fishpop$length > parameters$pop_ldie))) {

warning("Some individuals are larger than pop_ldie.", call. = FALSE)

Expand Down
8 changes: 4 additions & 4 deletions inst/include/arrR_RcppExports.h
Original file line number Diff line number Diff line change
Expand Up @@ -147,17 +147,17 @@ namespace arrR {
throw Rcpp::exception(Rcpp::as<std::string>(rcpp_result_gen).c_str());
}

inline void rcpp_mortality(Rcpp::NumericMatrix fishpop, Rcpp::NumericMatrix fishpop_track, Rcpp::NumericMatrix seafloor, double pop_ldie, double pop_n_body, double pop_reserves_max, Rcpp::NumericVector extent, Rcpp::IntegerVector dimensions) {
typedef SEXP(*Ptr_rcpp_mortality)(SEXP,SEXP,SEXP,SEXP,SEXP,SEXP,SEXP,SEXP);
inline void rcpp_mortality(Rcpp::NumericMatrix fishpop, Rcpp::NumericMatrix fishpop_track, Rcpp::NumericMatrix seafloor, double pop_linf, double pop_ldie, double pop_n_body, double pop_reserves_max, Rcpp::NumericVector extent, Rcpp::IntegerVector dimensions) {
typedef SEXP(*Ptr_rcpp_mortality)(SEXP,SEXP,SEXP,SEXP,SEXP,SEXP,SEXP,SEXP,SEXP);
static Ptr_rcpp_mortality p_rcpp_mortality = NULL;
if (p_rcpp_mortality == NULL) {
validateSignature("void(*rcpp_mortality)(Rcpp::NumericMatrix,Rcpp::NumericMatrix,Rcpp::NumericMatrix,double,double,double,Rcpp::NumericVector,Rcpp::IntegerVector)");
validateSignature("void(*rcpp_mortality)(Rcpp::NumericMatrix,Rcpp::NumericMatrix,Rcpp::NumericMatrix,double,double,double,double,Rcpp::NumericVector,Rcpp::IntegerVector)");
p_rcpp_mortality = (Ptr_rcpp_mortality)R_GetCCallable("arrR", "_arrR_rcpp_mortality");
}
RObject rcpp_result_gen;
{
RNGScope RCPP_rngScope_gen;
rcpp_result_gen = p_rcpp_mortality(Shield<SEXP>(Rcpp::wrap(fishpop)), Shield<SEXP>(Rcpp::wrap(fishpop_track)), Shield<SEXP>(Rcpp::wrap(seafloor)), Shield<SEXP>(Rcpp::wrap(pop_ldie)), Shield<SEXP>(Rcpp::wrap(pop_n_body)), Shield<SEXP>(Rcpp::wrap(pop_reserves_max)), Shield<SEXP>(Rcpp::wrap(extent)), Shield<SEXP>(Rcpp::wrap(dimensions)));
rcpp_result_gen = p_rcpp_mortality(Shield<SEXP>(Rcpp::wrap(fishpop)), Shield<SEXP>(Rcpp::wrap(fishpop_track)), Shield<SEXP>(Rcpp::wrap(seafloor)), Shield<SEXP>(Rcpp::wrap(pop_linf)), Shield<SEXP>(Rcpp::wrap(pop_ldie)), Shield<SEXP>(Rcpp::wrap(pop_n_body)), Shield<SEXP>(Rcpp::wrap(pop_reserves_max)), Shield<SEXP>(Rcpp::wrap(extent)), Shield<SEXP>(Rcpp::wrap(dimensions)));
}
if (rcpp_result_gen.inherits("interrupted-error"))
throw Rcpp::internal::InterruptedException();
Expand Down
5 changes: 3 additions & 2 deletions man/rcpp_mortality.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 8 additions & 7 deletions src/RcppExports.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -316,26 +316,27 @@ BEGIN_RCPP
END_RCPP
}
// rcpp_mortality
void rcpp_mortality(Rcpp::NumericMatrix fishpop, Rcpp::NumericMatrix fishpop_track, Rcpp::NumericMatrix seafloor, double pop_ldie, double pop_n_body, double pop_reserves_max, Rcpp::NumericVector extent, Rcpp::IntegerVector dimensions);
static SEXP _arrR_rcpp_mortality_try(SEXP fishpopSEXP, SEXP fishpop_trackSEXP, SEXP seafloorSEXP, SEXP pop_ldieSEXP, SEXP pop_n_bodySEXP, SEXP pop_reserves_maxSEXP, SEXP extentSEXP, SEXP dimensionsSEXP) {
void rcpp_mortality(Rcpp::NumericMatrix fishpop, Rcpp::NumericMatrix fishpop_track, Rcpp::NumericMatrix seafloor, double pop_linf, double pop_ldie, double pop_n_body, double pop_reserves_max, Rcpp::NumericVector extent, Rcpp::IntegerVector dimensions);
static SEXP _arrR_rcpp_mortality_try(SEXP fishpopSEXP, SEXP fishpop_trackSEXP, SEXP seafloorSEXP, SEXP pop_linfSEXP, SEXP pop_ldieSEXP, SEXP pop_n_bodySEXP, SEXP pop_reserves_maxSEXP, SEXP extentSEXP, SEXP dimensionsSEXP) {
BEGIN_RCPP
Rcpp::traits::input_parameter< Rcpp::NumericMatrix >::type fishpop(fishpopSEXP);
Rcpp::traits::input_parameter< Rcpp::NumericMatrix >::type fishpop_track(fishpop_trackSEXP);
Rcpp::traits::input_parameter< Rcpp::NumericMatrix >::type seafloor(seafloorSEXP);
Rcpp::traits::input_parameter< double >::type pop_linf(pop_linfSEXP);
Rcpp::traits::input_parameter< double >::type pop_ldie(pop_ldieSEXP);
Rcpp::traits::input_parameter< double >::type pop_n_body(pop_n_bodySEXP);
Rcpp::traits::input_parameter< double >::type pop_reserves_max(pop_reserves_maxSEXP);
Rcpp::traits::input_parameter< Rcpp::NumericVector >::type extent(extentSEXP);
Rcpp::traits::input_parameter< Rcpp::IntegerVector >::type dimensions(dimensionsSEXP);
rcpp_mortality(fishpop, fishpop_track, seafloor, pop_ldie, pop_n_body, pop_reserves_max, extent, dimensions);
rcpp_mortality(fishpop, fishpop_track, seafloor, pop_linf, pop_ldie, pop_n_body, pop_reserves_max, extent, dimensions);
return R_NilValue;
END_RCPP_RETURN_ERROR
}
RcppExport SEXP _arrR_rcpp_mortality(SEXP fishpopSEXP, SEXP fishpop_trackSEXP, SEXP seafloorSEXP, SEXP pop_ldieSEXP, SEXP pop_n_bodySEXP, SEXP pop_reserves_maxSEXP, SEXP extentSEXP, SEXP dimensionsSEXP) {
RcppExport SEXP _arrR_rcpp_mortality(SEXP fishpopSEXP, SEXP fishpop_trackSEXP, SEXP seafloorSEXP, SEXP pop_linfSEXP, SEXP pop_ldieSEXP, SEXP pop_n_bodySEXP, SEXP pop_reserves_maxSEXP, SEXP extentSEXP, SEXP dimensionsSEXP) {
SEXP rcpp_result_gen;
{
Rcpp::RNGScope rcpp_rngScope_gen;
rcpp_result_gen = PROTECT(_arrR_rcpp_mortality_try(fishpopSEXP, fishpop_trackSEXP, seafloorSEXP, pop_ldieSEXP, pop_n_bodySEXP, pop_reserves_maxSEXP, extentSEXP, dimensionsSEXP));
rcpp_result_gen = PROTECT(_arrR_rcpp_mortality_try(fishpopSEXP, fishpop_trackSEXP, seafloorSEXP, pop_linfSEXP, pop_ldieSEXP, pop_n_bodySEXP, pop_reserves_maxSEXP, extentSEXP, dimensionsSEXP));
}
Rboolean rcpp_isInterrupt_gen = Rf_inherits(rcpp_result_gen, "interrupted-error");
if (rcpp_isInterrupt_gen) {
Expand Down Expand Up @@ -835,7 +836,7 @@ static int _arrR_RcppExport_validate(const char* sig) {
signatures.insert("double(*rcpp_get_max_dist)(std::string,Rcpp::List,int)");
signatures.insert("Rcpp::NumericMatrix(*rcpp_get_reef)(Rcpp::NumericMatrix)");
signatures.insert("void(*rcpp_mineralization)(Rcpp::NumericMatrix,double,double)");
signatures.insert("void(*rcpp_mortality)(Rcpp::NumericMatrix,Rcpp::NumericMatrix,Rcpp::NumericMatrix,double,double,double,Rcpp::NumericVector,Rcpp::IntegerVector)");
signatures.insert("void(*rcpp_mortality)(Rcpp::NumericMatrix,Rcpp::NumericMatrix,Rcpp::NumericMatrix,double,double,double,double,Rcpp::NumericVector,Rcpp::IntegerVector)");
signatures.insert("void(*rcpp_move_wrap)(Rcpp::NumericMatrix,Rcpp::NumericMatrix,std::string,double,double,double,double,double,double,Rcpp::NumericMatrix,Rcpp::NumericVector,Rcpp::IntegerVector)");
signatures.insert("void(*rcpp_nutr_input)(Rcpp::NumericMatrix,double)");
signatures.insert("void(*rcpp_nutr_output)(Rcpp::NumericMatrix,double,double)");
Expand Down Expand Up @@ -882,7 +883,7 @@ static const R_CallMethodDef CallEntries[] = {
{"_arrR_rcpp_get_reef", (DL_FUNC) &_arrR_rcpp_get_reef, 1},
{"_arrR_rcpp_mineralization", (DL_FUNC) &_arrR_rcpp_mineralization, 3},
{"_arrR_rcpp_modify_degree", (DL_FUNC) &_arrR_rcpp_modify_degree, 2},
{"_arrR_rcpp_mortality", (DL_FUNC) &_arrR_rcpp_mortality, 8},
{"_arrR_rcpp_mortality", (DL_FUNC) &_arrR_rcpp_mortality, 9},
{"_arrR_rcpp_move_behav", (DL_FUNC) &_arrR_rcpp_move_behav, 11},
{"_arrR_rcpp_move_rand", (DL_FUNC) &_arrR_rcpp_move_rand, 8},
{"_arrR_rcpp_move_wrap", (DL_FUNC) &_arrR_rcpp_move_wrap, 12},
Expand Down
37 changes: 30 additions & 7 deletions src/rcpp_mortality.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

#include "rcpp_mortality.h"
#include "rcpp_shuffle.h"
#include "rcpp_runif.h"
#include "rcpp_reincarnate.h"

using namespace Rcpp;
Expand All @@ -15,13 +16,13 @@ using namespace Rcpp;
//'
//' @param fishpop,fishpop_track Matrix with fishpop and starting fishpop values.
//' @param seafloor Matrix with seafloor values.
//' @param pop_ldie, pop_n_body,pop_reserves_max Numeric with parameters.
//' @param pop_linf,pop_ldie,pop_n_body,pop_reserves_max Numeric with parameters.
//' @param extent Vector with extent (xmin,xmax,ymin,ymax).
//' @param dimensions Vector with dimensions (nrow, ncol).
//'
//' @details
//' Function to simulate background mortality of fish individuals.
//' Fish automatically dies when \code{pop_mean_size} is greater than \code{pop_ldie}.
//' Fish automatically dies when current size is greater than \code{pop_ldie}.
//' If a individual dies, a new individual is created.
//'
//' @return void
Expand All @@ -32,21 +33,43 @@ using namespace Rcpp;
//' @keywords internal
// [[Rcpp::export]]
void rcpp_mortality(Rcpp::NumericMatrix fishpop, Rcpp::NumericMatrix fishpop_track,
Rcpp::NumericMatrix seafloor,
double pop_ldie, double pop_n_body, double pop_reserves_max,
Rcpp::NumericVector extent, Rcpp::IntegerVector dimensions) {
Rcpp::NumericMatrix seafloor, double pop_linf, double pop_ldie, double pop_n_body,
double pop_reserves_max, Rcpp::NumericVector extent, Rcpp::IntegerVector dimensions) {

// create random order if fish id because detritus can run out
Rcpp::NumericVector row_id = rcpp_shuffle(fishpop(_, 0), false);

// loop through all fish ids
for (int i = 0; i < row_id.length(); i++) {

// init flag for mortality
bool flag_die = false;

// use Rcpp indexing counter of current loop iteration
int row_id_temp = row_id[i] - 1;

// individual dies if current size is larger than pop_mean_size + X
if (fishpop(row_id_temp, 5) > pop_ldie) {
// use fixed mortality
if (pop_ldie > 0.0) {

// update mortality flag based on current size and ldie
flag_die = fishpop(row_id_temp, 5) > pop_ldie;

// use probability based mortality
} else {

// create death probability
double death_prob = std::exp(fishpop(row_id_temp, 5) - pop_linf);

// create random number to test death prob against
double random_prob = rcpp_runif(0.0, 1.0);

// update mortality flag based on probability
flag_die = random_prob < death_prob;

}

// individual dies if flag is TRUE
if (flag_die) {

rcpp_reincarnate(fishpop, fishpop_track, row_id_temp,
seafloor, extent, dimensions, pop_n_body, pop_reserves_max,
Expand Down
5 changes: 2 additions & 3 deletions src/rcpp_mortality.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@
//#define RCPP_MORTALITY

void rcpp_mortality(Rcpp::NumericMatrix fishpop, Rcpp::NumericMatrix fishpop_track,
Rcpp::NumericMatrix seafloor,
double pop_ldie, double pop_n_body, double pop_reserves_max,
Rcpp::NumericVector extent, Rcpp::IntegerVector dimensions);
Rcpp::NumericMatrix seafloor, double pop_linf, double pop_ldie, double pop_n_body,
double pop_reserves_max, Rcpp::NumericVector extent, Rcpp::IntegerVector dimensions);

//#endif // RCPP_MORTALITY
2 changes: 1 addition & 1 deletion src/rcpp_simulate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@ void rcpp_simulate(Rcpp::NumericMatrix seafloor, Rcpp::NumericMatrix fishpop, Rc
extent, dimensions, min_per_i);

// simulate mortality
rcpp_mortality(fishpop, fishpop_track[0], seafloor,
rcpp_mortality(fishpop, fishpop_track[0], seafloor, parameters["pop_linf"],
parameters["pop_ldie"], parameters["pop_n_body"],
parameters["pop_reserves_max"], extent, dimensions);

Expand Down

0 comments on commit 9faff6e

Please sign in to comment.