7 #ifndef KINETX_INTEGRATOR_H_
8 #define KINETX_INTEGRATOR_H_
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;
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;
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);
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);
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;
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);
161 static double fast_pow(
const double& x,
const int& n) {
175 const double tmp = x * x;
178 return std::pow(x, n);
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.
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