Scine::Kinetx  3.0.0
Kinetic models for reaction networks.
 All Classes Files Functions Variables Enumerations Pages
Integrator.h
Go to the documentation of this file.
1 
7 #ifndef KINETX_INTEGRATOR_H_
8 #define KINETX_INTEGRATOR_H_
9 
10 #include "Kinetx/Network.h"
11 
12 namespace Scine {
13 namespace Kinetx {
17 class Integrator {
18  public:
19  Integrator() = default;
20 
32  virtual void propagate(Eigen::VectorXd& concentrations, Eigen::VectorXd& yFlux, Eigen::VectorXd& rFlux,
33  Eigen::VectorXd& rForwardFlux, Eigen::VectorXd& rBackwardFlux, double& t, double& dt) const = 0;
48  virtual Eigen::MatrixXd runIntegration(Eigen::VectorXd y, double tStart, double dt, Eigen::VectorXd& rFlux,
49  Eigen::VectorXd& rForwardFlux, Eigen::VectorXd& rBackwardFlux,
50  const unsigned int batchInterval = 1000, const unsigned int nBatches = 100000,
51  const double convergenceConcentrationChange = 1e-10) = 0;
66  virtual Eigen::MatrixXd runIntegrationByTime(Eigen::VectorXd y, double tStart, double dt, Eigen::VectorXd& rFlux,
67  Eigen::VectorXd& rForwardFlux, Eigen::VectorXd& rBackwardFlux,
68  const double tMax, const unsigned int batchInterval = 1000,
69  const double convergenceConcentrationChange = 1e-10) = 0;
70 };
71 
72 class IntegratorBase : public Integrator {
73  public:
78  IntegratorBase(Network& net);
79 
80  virtual void propagate(Eigen::VectorXd& concentrations, Eigen::VectorXd& yFlux, Eigen::VectorXd& rFlux,
81  Eigen::VectorXd& rForwardFlux, Eigen::VectorXd& rBackwardFlux, double& t, double& dt) const = 0;
82 
83  virtual Eigen::MatrixXd runIntegration(Eigen::VectorXd y, double tStart, double dt, Eigen::VectorXd& rFlux,
84  Eigen::VectorXd& rForwardFlux, Eigen::VectorXd& rBackwardFlux,
85  const unsigned int batchInterval = 1000, const unsigned int nBatches = 100000,
86  const double convergenceConcentrationChange = 1e-10);
87 
88  virtual Eigen::MatrixXd runIntegrationByTime(Eigen::VectorXd y, double tStart, double dt, Eigen::VectorXd& rFlux,
89  Eigen::VectorXd& rForwardFlux, Eigen::VectorXd& rBackwardFlux,
90  const double tMax, const unsigned int batchInterval = 1000,
91  const double convergenceConcentrationChange = 1e-10);
92 
93  protected:
104  void trackVertexAndEdgeFluxes(const Eigen::VectorXd& y, const Eigen::VectorXd& yInitial, Eigen::VectorXd& yFlux,
105  Eigen::VectorXd& rFlux, Eigen::VectorXd& rForwardFlux, Eigen::VectorXd& rBackwardFlux,
106  const double& dt) const;
112  Eigen::VectorXd g(const Eigen::VectorXd& concentrations) const;
122  Eigen::VectorXd gFlux(const Eigen::VectorXd& concentrationsT0, const Eigen::VectorXd& concentrationsT1,
123  Eigen::VectorXd& flux, Eigen::VectorXd& forwardFlux, Eigen::VectorXd& backwardFlux) const;
130  Eigen::MatrixXd fFlux(const Eigen::VectorXd& concentrationsT0, const Eigen::VectorXd& concentrationsT1) const;
137  std::tuple<Eigen::MatrixXd, Eigen::MatrixXd, Eigen::MatrixXd> fFluxDirected(const Eigen::VectorXd& concentrationsT0,
138  const Eigen::VectorXd& concentrationsT1) const;
146  Eigen::MatrixXd f(const Eigen::VectorXd& concentrations) const;
152  std::pair<Eigen::MatrixXd, Eigen::MatrixXd> fDirected(const Eigen::VectorXd& concentrations) const;
153  Eigen::SparseMatrix<double> jacobi(const Eigen::VectorXd& concentrations) const;
154  Network& _net;
155 
156  void printHeader(const Eigen::VectorXd& y, const double dt, const double t);
157  bool printTimeAndCheckConvergenceStep(const Eigen::VectorXd& y, const Eigen::VectorXd& yOld, Eigen::VectorXd& yMax,
158  const unsigned int batchInterval, const unsigned int iBatch, const double dt,
159  const double t, const double convergenceConcentrationChange);
160 
161  static double fast_pow(const double& x, const int& n) {
162  if (n == 0) {
163  return 1.0;
164  }
165  if (n == 1) {
166  return x;
167  }
168  if (n == 2) {
169  return x * x;
170  }
171  if (n == 3) {
172  return x * x * x;
173  }
174  if (n == 4) {
175  const double tmp = x * x;
176  return tmp * tmp;
177  }
178  return std::pow(x, n);
179  }
180 };
181 
182 } /* namespace Kinetx */
183 } /* namespace Scine */
184 
185 #endif // KINETX_INTEGRATOR_H_
Eigen::MatrixXd fFlux(const Eigen::VectorXd &concentrationsT0, const Eigen::VectorXd &concentrationsT1) const
Calculate the total edge flux gradient.
Definition: Integrator.cpp:134
virtual Eigen::MatrixXd runIntegrationByTime(Eigen::VectorXd y, double tStart, double dt, Eigen::VectorXd &rFlux, Eigen::VectorXd &rForwardFlux, Eigen::VectorXd &rBackwardFlux, const double tMax, const unsigned int batchInterval=1000, const double convergenceConcentrationChange=1e-10)=0
Run the numerical integration until a maximum time or convergence is reached.
Definition: Integrator.h:72
virtual void propagate(Eigen::VectorXd &concentrations, Eigen::VectorXd &yFlux, Eigen::VectorXd &rFlux, Eigen::VectorXd &rForwardFlux, Eigen::VectorXd &rBackwardFlux, double &t, double &dt) const =0
Propagate the numerical integration by one time step.
IntegratorBase(Network &net)
Constructor.
Definition: Integrator.cpp:19
virtual Eigen::MatrixXd runIntegration(Eigen::VectorXd y, double tStart, double dt, Eigen::VectorXd &rFlux, Eigen::VectorXd &rForwardFlux, Eigen::VectorXd &rBackwardFlux, const unsigned int batchInterval=1000, const unsigned int nBatches=100000, const double convergenceConcentrationChange=1e-10)=0
Run the numerical integration until a maximum number of steps or convergence is reached.
Definition: Network.h:17
std::pair< Eigen::MatrixXd, Eigen::MatrixXd > fDirected(const Eigen::VectorXd &concentrations) const
The same as f(..) but keeping track on the directions.
Definition: Integrator.cpp:76
std::tuple< Eigen::MatrixXd, Eigen::MatrixXd, Eigen::MatrixXd > fFluxDirected(const Eigen::VectorXd &concentrationsT0, const Eigen::VectorXd &concentrationsT1) const
Calculate the edge flux while keeping track on the direction.
Definition: Integrator.cpp:126
virtual void propagate(Eigen::VectorXd &concentrations, Eigen::VectorXd &yFlux, Eigen::VectorXd &rFlux, Eigen::VectorXd &rForwardFlux, Eigen::VectorXd &rBackwardFlux, double &t, double &dt) const =0
Propagate the numerical integration by one time step.
Eigen::VectorXd g(const Eigen::VectorXd &concentrations) const
Calculate the concentration gradient.
Definition: Integrator.cpp:142
Eigen::VectorXd gFlux(const Eigen::VectorXd &concentrationsT0, const Eigen::VectorXd &concentrationsT1, Eigen::VectorXd &flux, Eigen::VectorXd &forwardFlux, Eigen::VectorXd &backwardFlux) const
Calculate the concentration flux gradient.
Definition: Integrator.cpp:113
Base class for all Runge-Kutta methods/implementations.
Definition: Integrator.h:17
virtual Eigen::MatrixXd runIntegrationByTime(Eigen::VectorXd y, double tStart, double dt, Eigen::VectorXd &rFlux, Eigen::VectorXd &rForwardFlux, Eigen::VectorXd &rBackwardFlux, const double tMax, const unsigned int batchInterval=1000, const double convergenceConcentrationChange=1e-10)
Run the numerical integration until a maximum time or convergence is reached.
Definition: Integrator.cpp:48
void trackVertexAndEdgeFluxes(const Eigen::VectorXd &y, const Eigen::VectorXd &yInitial, Eigen::VectorXd &yFlux, Eigen::VectorXd &rFlux, Eigen::VectorXd &rForwardFlux, Eigen::VectorXd &rBackwardFlux, const double &dt) const
Keep track on the vertex and edge fluxes.
Definition: Integrator.cpp:232
virtual Eigen::MatrixXd runIntegration(Eigen::VectorXd y, double tStart, double dt, Eigen::VectorXd &rFlux, Eigen::VectorXd &rForwardFlux, Eigen::VectorXd &rBackwardFlux, const unsigned int batchInterval=1000, const unsigned int nBatches=100000, const double convergenceConcentrationChange=1e-10)
Run the numerical integration until a maximum number of steps or convergence is reached.
Definition: Integrator.cpp:22
Eigen::MatrixXd f(const Eigen::VectorXd &concentrations) const
Definition: Integrator.cpp:107