13 #ifndef PSPM_ODE_LSODA_H_ 14 #define PSPM_ODE_LSODA_H_ 44 size_t idamax1(
const std::vector<double> &dx,
const size_t n,
const size_t offset);
46 void dscal1(
const double da, std::vector<double> &dx,
const size_t n,
const size_t offset);
48 double ddot1(
const std::vector<double> &a,
const std::vector<double> &b,
const size_t n,
49 const size_t offsetA,
const size_t offsetB);
51 void daxpy1(
const double da,
const std::vector<double> &dx, std::vector<double> &dy,
52 const size_t n,
const size_t offsetX,
const size_t offsetY);
54 void dgesl(
const std::vector<std::vector<double>> &a,
const size_t n, std::vector<int> &
ipvt,
55 std::vector<double> &b,
const size_t job);
58 std::vector<std::vector<double>> &a,
const size_t n, std::vector<int> &ipvt,
size_t *
const info);
60 template <
class Functor>
61 void prja(
const size_t neq, std::vector<double> &y, Functor &derivs,
void *_data);
63 template <
class Functor,
class AfterStep>
64 void lsoda(Functor &derivs, AfterStep &after_step,
const size_t neq, std::vector<double> &y,
double *t,
65 double tout,
int itask,
int *istate,
int iopt,
int jt, std::array<int, 7> &iworks,
66 std::array<double, 4> &rworks,
void *_data);
68 template <
class Functor>
69 void correction(
const size_t neq, std::vector<double> &y, Functor &derivs,
70 size_t *corflag,
double pnorm,
double *del,
double *delp,
double *told,
71 size_t *ncf,
double *rh,
size_t *m,
void *_data);
73 template <
class Functor>
74 void stoda(
const size_t neq, std::vector<double> &y, Functor &derivs,
void *_data);
77 template <
class Functor,
class AfterStep>
78 void lsoda_update(Functor &derivs, AfterStep &after_step,
const size_t neq, std::vector<double> &y,
79 double *t,
const double tout,
80 void *
const _data,
double rtol = 1e-6,
double atol = 1e-6
83 template<
class AfterStep>
85 std::vector<double> &y,
double *t,
int itask,
int ihit,
double tcrit,
int *istate);
88 void terminate2(std::vector<double> &y,
double *t);
90 void ewset(
const std::vector<double> &ycur);
92 void solsy(std::vector<double> &y);
95 double *rhup,
double dsm,
double *pdh,
double *rh,
size_t *orderflag);
96 void intdy(
double t,
int k, std::vector<double> &dky,
int *iflag);
97 void corfailure(
double *told,
double *rh,
size_t *ncf,
size_t *corflag);
98 void methodswitch(
double dsm,
double pnorm,
double *pdh,
double *rh);
100 void scaleh(
double *rh,
double *pdh);
101 double fnorm(
int n,
const std::vector<std::vector<double>> &a,
const std::vector<double> &w);
102 double vmnorm(
const size_t n,
const std::vector<double> &v,
const std::vector<double> &w);
112 double ETA = 2.2204460492503131e-16;
121 std::array<double, 13>
sm1;
123 std::array<double, 14>
el;
124 std::array<double, 13>
cm1;
125 std::array<double, 6>
cm2;
127 std::array<std::array<double, 14>, 13>
elco;
128 std::array<std::array<double, 4>, 13>
tesco;
130 size_t illin,
init,
ierpj,
iersl,
jcur,
l,
miter,
maxord,
maxcor,
msbp,
mxncf;
154 std::vector<std::vector<double>>
yh_;
155 std::vector<std::vector<double>>
wm_;
174 #include "../src/lsoda.tpp"
void orderswitch(double *rhup, double dsm, double *pdh, double *rh, size_t *orderflag)
std::vector< double > savf
std::array< std::array< double, 14 >, 13 > elco
void prja(const size_t neq, std::vector< double > &y, Functor &derivs, void *_data)
void terminate(int *istate)
static bool abs_compare(double a, double b)
std::vector< std::vector< double > > yh_
std::array< double, 13 > sm1
std::vector< std::vector< double > > wm_
void ewset(const std::vector< double > &ycur)
void scaleh(double *rh, double *pdh)
void correction(const size_t neq, std::vector< double > &y, Functor &derivs, size_t *corflag, double pnorm, double *del, double *delp, double *told, size_t *ncf, double *rh, size_t *m, void *_data)
void solsy(std::vector< double > &y)
std::vector< double > ewt
double vmnorm(const size_t n, const std::vector< double > &v, const std::vector< double > &w)
void lsoda_update(Functor &derivs, AfterStep &after_step, const size_t neq, std::vector< double > &y, double *t, const double tout, void *const _data, double rtol=1e-6, double atol=1e-6)
double fnorm(int n, const std::vector< std::vector< double >> &a, const std::vector< double > &w)
void successreturn(AfterStep &after_step, std::vector< double > &y, double *t, int itask, int ihit, double tcrit, int *istate)
std::array< std::array< double, 4 >, 13 > tesco
std::array< size_t, 3 > mord
std::array< double, 13 > cm1
void dscal1(const double da, std::vector< double > &dx, const size_t n, const size_t offset)
void terminate2(std::vector< double > &y, double *t)
void intdy(double t, int k, std::vector< double > &dky, int *iflag)
void corfailure(double *told, double *rh, size_t *ncf, size_t *corflag)
std::vector< double > acor
size_t idamax1(const std::vector< double > &dx, const size_t n, const size_t offset)
void resize_system(int nyh, int lenyh)
void methodswitch(double dsm, double pnorm, double *pdh, double *rh)
void dgesl(const std::vector< std::vector< double >> &a, const size_t n, std::vector< int > &ipvt, std::vector< double > &b, const size_t job)
void lsoda(Functor &derivs, AfterStep &after_step, const size_t neq, std::vector< double > &y, double *t, double tout, int itask, int *istate, int iopt, int jt, std::array< int, 7 > &iworks, std::array< double, 4 > &rworks, void *_data)
std::vector< double > atol_
void dgefa(std::vector< std::vector< double >> &a, const size_t n, std::vector< int > &ipvt, size_t *const info)
void stoda(const size_t neq, std::vector< double > &y, Functor &derivs, void *_data)
double ddot1(const std::vector< double > &a, const std::vector< double > &b, const size_t n, const size_t offsetA, const size_t offsetB)
void daxpy1(const double da, const std::vector< double > &dx, std::vector< double > &dy, const size_t n, const size_t offsetX, const size_t offsetY)
std::vector< double > yout
std::array< double, 6 > cm2
std::vector< double > rtol_
std::array< double, 14 > el