20 cohorts.resize(
J, boundaryCohort);
26 if (!
X.empty())
return *
x.rbegin();
27 else if (cohorts.empty())
return 0;
38 cohorts.resize(
J, boundaryCohort);
39 for (
int i=0; i<
J; ++i) cohorts[i].
x = breaks[i];
49 template <
class Model>
51 std::cout <<
"~~~~~ Species ~~~~~\n";
55 std::cout <<
"xb = " << boundaryCohort.x <<
" / " <<
xb <<
"\n";
56 std::cout <<
"xsize = " <<
J <<
"\n";
62 std::cout <<
"x (" <<
x.size() <<
"): ";
63 for (
auto xx :
x) std::cout << xx <<
" ";
67 std::cout <<
"Cohorts: (" << cohorts.size() <<
")\n";
68 std::cout <<
"t0" <<
"\tx" <<
"\t" <<
"u" <<
"\t";
69 if (!cohorts.empty()){
70 for (
auto s : cohorts[0].varnames) std::cout << s <<
"\t";
73 for (
auto& c : cohorts) {
78 std::cout <<
"- - - - - - - - - - - - - - - - - - - - - - - \n";
80 boundaryCohort.print();
82 std::cout <<
"Max size = " <<
get_maxSize() <<
"\n";
89 std::cout <<
"-------\n\n"; std::cout.flush();
93 template <
class Model>
95 if (i == -1)
return boundaryCohort;
96 else return cohorts[i];
99 template <
class Model>
101 if (i == -1)
return boundaryCohort.x;
102 else return cohorts[i].x;
106 template <
class Model>
112 template <
class Model>
114 return boundaryCohort.u;
118 template <
class Model>
121 boundaryCohort.x = _xb;
122 boundaryCohort.set_size(_xb);
126 template <
class Model>
128 boundaryCohort.u = _ub;
132 template <
class Model>
134 cohorts[i].birth_time = t0;
138 template <
class Model>
141 cohorts[i].set_size(_x);
145 template <
class Model>
151 template <
class Model>
154 boundaryCohort.init_state(t, env);
156 for (
auto& c : cohorts){
157 c.init_state(t, env);
159 it = c.get_state(it);
165 template <
class Model>
167 boundaryCohort.birth_time = t;
168 boundaryCohort.init_state(t, env);
172 template <
class Model>
178 template <
class Model>
180 for (
auto& c : cohorts) c.set_state(it);
184 template <
class Model>
186 for (
auto& c : cohorts) c.get_state(it);
190 template <
class Model>
192 for (
auto& c : cohorts) c.need_precompute =
true;
193 boundaryCohort.need_precompute =
true;
197 template <
class Model>
199 return boundaryCohort.establishmentProbability(t, env);
204 template <
class Model>
206 std::cout <<
"calc_boundary_u\n";
213 return boundaryCohort.u;
217 template <
class Model>
224 template <
class Model>
234 template <
class Model>
245 return {g, (gplus-g)/grad_dx};
249 template <
class Model>
262 double gminus = cminus.
growthRate(cminus.
x, t, env);
264 return {gplus, gminus};
268 template <
class Model>
276 template <
class Model>
287 return {g, (gplus-g)/grad_dx};
291 template <
class Model>
298 template <
class Model>
300 for (
auto& c : cohorts) c.get_rates(it);
304 template <
class Model>
306 cohorts.push_back(boundaryCohort);
314 template <
class Model>
316 cohorts.push_back(bc);
322 template <
class Model>
324 if (cohorts.size() < 3)
return;
326 double dx_min = cohorts[0].x - cohorts[2].x;
327 for (
int i=1; i<
J-1; ++i){
328 double dx = cohorts[i-1].x - cohorts[i+1].x;
335 cohorts.erase(cohorts.begin()+i_min);
340 template <
class Model>
343 for (
int i=1; i<
J-1; i+=2){
344 double dx_lo = cohorts[i-1].x-cohorts[i].x;
345 double dx_hi = cohorts[i].x-cohorts[i+1].x;
347 if (dx_lo < dxcut || dx_hi < dxcut) cohorts[i].remove =
true;
351 auto it_end = std::remove_if(cohorts.begin(), cohorts.end(), [](
Cohort<Model> &c){
return c.remove;});
352 cohorts.erase(it_end, cohorts.end());
359 template <
class Model>
362 for (
int i=0; i<
J-1; ++i){
363 if (cohorts[i].u < ucut) cohorts[i].remove =
true;
367 auto it_end = std::remove_if(cohorts.begin(), cohorts.end(), [](
Cohort<Model> &c){
return c.remove;});
368 cohorts.erase(it_end, cohorts.end());
std::vector< double > mortalityRateGradient(int i, double x, double t, void *env, double grad_dx)
double growthRateOffset(int i, double x, double t, void *env)
virtual double get_maxSize()=0
void removeDeadCohorts(double ucut)
void getExtraRates(std::vector< double >::iterator &it)
std::vector< double > growthRateGradient(int i, double x, double t, void *env, double grad_dx)
void copyCohortsExtraToState(std::vector< double >::iterator &it)
virtual void addCohort()=0
double calc_boundary_u(double gb, double pe)
void removeDensestCohort()
void removeDenseCohorts(double dxcut)
double growthRate(int i, double x, double t, void *env)
double birthRate(int i, double x, double t, void *env)
double establishmentProbability(double t, void *env)
void setU(int i, double _u)
std::vector< double > growthRateGradientCentered(int i, double xplus, double xminus, double t, void *env)
double mortalityRate(int i, double x, double t, void *env)
double birthRate(double x, double t, void *_env)
double growthRate(double x, double t, void *_env)
double init_density(int i, double x, void *env)
Cohort< Model > & getCohort(int i)
void initAndCopyExtraState(double t, void *env, std::vector< double >::iterator &it)
void copyExtraStateToCohorts(std::vector< double >::iterator &it)
void setX(int i, double _x)
double mortalityRate(double x, double t, void *_env)
void set_birthTime(int i, double t0)
void initBoundaryCohort(double t, void *env)
Species(std::vector< double > breaks=std::vector< double >())