libpspm
solver.h
Go to the documentation of this file.
1 #ifndef PSPM_PSPM_SOLVER_H_
2 #define PSPM_PSPM_SOLVER_H_
3 
4 #include <vector>
5 #include <list>
6 #include <map>
7 #include <string>
8 
9 #include "environment_base.h"
10 #include "species.h"
11 #include "ode_solver.h"
12 
14 
15 class Solver{
16  private:
18 
19  int n_statevars_internal = 0; // number of internal i-state variables (x and/or u)
20  int n_statevars_system = 0; // number of s-state variables
21 
22  public:
25 
26  // The current state of the system, {t, S, dS/dt}
27  double current_time; // these are synced with ODE solver only after a successful step
28  std::vector <double> state; // +-- They are NOT synced during the ODE solver's internal steps
29  std::vector <double> rates;
30 
31  std::vector<Species_Base*> species_vec;
32 
33  struct{
34  double ode_eps = 1e-6; // FIXME: Need a function to set these params, so ODE solver can be reset
35  double ode_initial_step_size = 1e-6;
36  double convergence_eps = 1e-6;
37  double cm_grad_dx = 1e-6;
38  bool update_cohorts = true;
39  int max_cohorts = 500;
40  double ebt_ucut = 1e-10;
41  double ebt_grad_dx = 1e-6;
42  //std::string ode_method = "lsoda";
43  double ode_rk4_stepsize = 0.1;
44  double ode_ifmu_stepsize = 0.1;
45  bool ifmu_centered_grids = true;
46  bool integral_interpolate = true;
47  } control;
48 
49  bool use_log_densities = true;
50 
51  public:
52  Solver(PSPM_SolverType _method, std::string ode_method = "rk45ck");
53 
54  void addSystemVariables(int _s);
55  void addSpecies(int _J, double _xb, double _xm, bool log_breaks, Species_Base* _mod, int n_extra_vars, double input_birth_flux = -1);
56  void addSpecies(std::vector<double> xbreaks, Species_Base* _mod, int n_extra_vars, double input_birth_flux = -1);
57 
58  //Species<Model>* get_species(int id);
59  int n_species();
60 
61  void setEnvironment(EnvironmentBase * _env);
62 
63  void resetState(double t0 = 0);
65 
66  void initialize();
67 
68  void copyStateToCohorts(std::vector<double>::iterator state_begin);
69  void copyCohortsToState();
70 
71  double maxSize();
72 
73  void updateEnv(double t, std::vector<double>::iterator S, std::vector<double>::iterator dSdt);
74 
75  void calcRates_FMU(double t, std::vector<double>::iterator S, std::vector<double>::iterator dSdt);
76 
77  void calcRates_iFMU(double t, std::vector<double>::iterator S, std::vector<double>::iterator dSdt);
78  void stepU_iFMU(double t, std::vector<double> &S, std::vector<double> &dSdt, double dt);
79 
80  void calcRates_EBT(double t, std::vector<double>::iterator S, std::vector<double>::iterator dSdt);
81  void addCohort_EBT();
82  void removeDeadCohorts_EBT();
83 
84  void calcRates_CM(double t, std::vector<double>::iterator S, std::vector<double>::iterator dSdt);
85  //double calc_u0_CM();
86  void addCohort_CM();
87  void removeCohort_CM();
88 
89  template<typename AfterStepFunc>
90  void step_to(double tstop, AfterStepFunc &afterStep_user);
91 
92  void step_to(double tstop);
93 
94  double calcSpeciesBirthFlux(int k, double t);
95  std::vector<double> newborns_out(double t); // This is the actual system reproduction (fitness) hence biologically relevant
96  std::vector<double> u0_out(double t); // This is used for equilibrium solving, because in general, u0 rather than birthFlux, will approach a constant value
97 
98  void print();
99 
100  // integrals over size and density
102  template<typename wFunc>
103  double integrate_x(wFunc w, double t, int species_id);
104 
106  template<typename wFunc>
107  double integrate_wudx_above(wFunc w, double t, double xlow, int species_id);
108 
109 
110  std::vector<double> getDensitySpecies_EBT(int k, std::vector<double> breaks);
111 };
112 
113 #include "../src/solver.tpp"
114 #include "../src/size_integrals.tpp"
115 
116 
117 #endif
118 
119 
120 
PSPM_SolverType
Definition: solver.h:13
bool ifmu_centered_grids
Definition: solver.h:45
void calcRates_FMU(double t, std::vector< double >::iterator S, std::vector< double >::iterator dSdt)
Definition: fmu.cpp:11
double cm_grad_dx
Definition: solver.h:37
void removeCohort_CM()
Definition: cm.cpp:85
std::vector< double > state
Definition: solver.h:28
int n_species()
Definition: solver.cpp:153
int n_statevars_internal
Definition: solver.h:19
void print()
Definition: solver.cpp:167
double ode_eps
Definition: solver.h:34
int max_cohorts
Definition: solver.h:39
double ode_rk4_stepsize
Definition: solver.h:43
bool integral_interpolate
Definition: solver.h:46
double ebt_ucut
Definition: solver.h:40
void removeDeadCohorts_EBT()
Definition: ebt.cpp:99
double maxSize()
Definition: solver.cpp:158
double ebt_grad_dx
Definition: solver.h:41
void stepU_iFMU(double t, std::vector< double > &S, std::vector< double > &dSdt, double dt)
Definition: ifmu.cpp:25
double ode_ifmu_stepsize
Definition: solver.h:44
double current_time
Definition: solver.h:27
int n_statevars_system
Definition: solver.h:20
void copyStateToCohorts(std::vector< double >::iterator state_begin)
Definition: solver.cpp:256
void calcRates_iFMU(double t, std::vector< double >::iterator S, std::vector< double >::iterator dSdt)
Definition: ifmu.cpp:5
double integrate_wudx_above(wFunc w, double t, double xlow, int species_id)
Computes the partial integral for the specified species.
bool update_cohorts
Definition: solver.h:38
EnvironmentBase * env
Definition: solver.h:24
std::vector< double > newborns_out(double t)
Definition: solver.cpp:364
double integrate_x(wFunc w, double t, int species_id)
Computes the integral for the specified species. For details, see integrate_wudx_above.
std::vector< double > rates
Definition: solver.h:29
void addSpecies(int _J, double _xb, double _xm, bool log_breaks, Species_Base *_mod, int n_extra_vars, double input_birth_flux=-1)
Definition: solver.cpp:106
void setEnvironment(EnvironmentBase *_env)
Definition: solver.cpp:143
void initialize()
Definition: solver.cpp:194
double ode_initial_step_size
Definition: solver.h:35
OdeSolver odeStepper
Definition: solver.h:23
PSPM_SolverType method
Definition: solver.h:17
double convergence_eps
Definition: solver.h:36
bool use_log_densities
Definition: solver.h:49
void copyCohortsToState()
Definition: solver.cpp:297
Definition: solver.h:15
void updateEnv(double t, std::vector< double >::iterator S, std::vector< double >::iterator dSdt)
Definition: solver.cpp:344
void resizeStateFromSpecies()
Definition: solver.cpp:132
void resetState(double t0=0)
Definition: solver.cpp:123
std::vector< Species_Base * > species_vec
Definition: solver.h:31
void calcRates_EBT(double t, std::vector< double >::iterator S, std::vector< double >::iterator dSdt)
Definition: ebt.cpp:8
Solver(PSPM_SolverType _method, std::string ode_method="rk45ck")
Definition: solver.cpp:37
void addCohort_EBT()
Definition: ebt.cpp:70
std::vector< double > getDensitySpecies_EBT(int k, std::vector< double > breaks)
Definition: solver.cpp:430
void step_to(double tstop, AfterStepFunc &afterStep_user)
Definition: solver.tpp:15
void calcRates_CM(double t, std::vector< double >::iterator S, std::vector< double >::iterator dSdt)
Definition: cm.cpp:9
void addSystemVariables(int _s)
Definition: solver.cpp:116
struct Solver::@1 control
void addCohort_CM()
Definition: cm.cpp:58
double calcSpeciesBirthFlux(int k, double t)
Definition: solver.cpp:352
std::vector< double > u0_out(double t)
Definition: solver.cpp:391