Loading [MathJax]/extensions/tex2jax.js
libpspm
All Classes Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
lsoda.h
Go to the documentation of this file.
1 /***
2  * Created: 2018-08-14
3 
4  * Author: Dilawar Singh <dilawars@ncbs.res.in>
5  * Organization: NCBS Bangalore
6  * License: MIT License
7  *
8  * Modified: 2021-10-05
9  * Author: Jaideep Joshi <jaideep777@gmail.com>
10  * Organization: IIASA Vienna
11  */
12 
13 #ifndef PSPM_ODE_LSODA_H_
14 #define PSPM_ODE_LSODA_H_
15 
16 #include <array>
17 #include <cmath>
18 #include <memory>
19 #include <vector>
20 
21 //using namespace std;
22 
23 /* --------------------------------------------------------------------------*/
35 /* ----------------------------------------------------------------------------*/
36 //typedef void (*LSODA_ODE_SYSTEM_TYPE)(double t, double *y, double *dydt, void *);
37 
38 class LSODA {
39 
40 public:
41  LSODA();
42  ~LSODA();
43 
44  size_t idamax1(const std::vector<double> &dx, const size_t n, const size_t offset);
45 
46  void dscal1(const double da, std::vector<double> &dx, const size_t n, const size_t offset);
47 
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);
50 
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);
53 
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);
56 
57  void dgefa(
58  std::vector<std::vector<double>> &a, const size_t n, std::vector<int> &ipvt, size_t *const info);
59 
60  template <class Functor>
61  void prja(const size_t neq, std::vector<double> &y, Functor &derivs, void *_data);
62 
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);
67 
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);
72 
73  template <class Functor>
74  void stoda(const size_t neq, std::vector<double> &y, Functor &derivs, void *_data);
75 
76  // We call this function in VoxelPools::
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 // Tolerance
81  );
82 
83  template<class AfterStep>
84  void successreturn(AfterStep &after_step,
85  std::vector<double> &y, double *t, int itask, int ihit, double tcrit, int *istate);
86 
87  void terminate(int *istate);
88  void terminate2(std::vector<double> &y, double *t);
89  void _freevectors(void);
90  void ewset(const std::vector<double> &ycur);
91  void resetcoeff(void);
92  void solsy(std::vector<double> &y);
93  void endstoda(void);
94  void orderswitch(
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);
99  void cfode(int meth_);
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);
103 
104  static bool abs_compare(double a, double b);
105 
106  void resize_system(int nyh, int lenyh);
107  void set_istate(int n);
108  int get_istate() const;
109  int get_fncalls();
110 
111 private:
112  double ETA = 2.2204460492503131e-16;
113 
114  size_t ml, mu, imxer;
115  double sqrteta;
116 
117  // NOTE: initialize in default constructor. Older compiler e.g. 4.8.4 would
118  // produce error if these are initialized here. With newer compiler,
119  // initialization can be done here.
120  std::array<size_t, 3> mord;
121  std::array<double, 13> sm1;
122 
123  std::array<double, 14> el; // = {0};
124  std::array<double, 13> cm1; // = {0};
125  std::array<double, 6> cm2; // = {0};
126 
127  std::array<std::array<double, 14>, 13> elco;
128  std::array<std::array<double, 4>, 13> tesco;
129 
131 
132  int kflag, jstart;
133 
134  size_t ixpr = 0, jtyp, mused, mxordn, mxords = 12;
135  size_t meth_;
136 
137  size_t n, nq, nst, nfe, nje, nqu;
138  size_t mxstep, mxhnil;
139  size_t nslast, nhnil, ntrep, nyh;
140 
141  double ccmax, el0, h_ = .0;
142  double hmin, hmxi, hu, rc, tn_ = 0.0;
143  double tsw, pdnorm;
144  double conit, crate, hold, rmax;
145 
146  size_t ialth, ipup, lmax;
147  size_t nslp;
148  double pdest, pdlast, ratio;
150 
151  std::vector<double> ewt;
152  std::vector<double> savf;
153  std::vector<double> acor;
154  std::vector<std::vector<double>> yh_;
155  std::vector<std::vector<double>> wm_;
156 
157  std::vector<int> ipvt;
158 
159 private:
160  int itol_ = 2;
161  std::vector<double> rtol_;
162  std::vector<double> atol_;
163 
164 private: // convenience members so that LSODA class is entirely standalone
165  int iState = 1; // LSODA should always be started with istate=1
166  //int nEq; // number of ODEs
167  std::vector<double> yout;
168 
169 public:
170  void *param = nullptr;
171 };
172 
173 
174 #include "../src/lsoda.tpp"
175 
176 #endif /* end of include guard: LSODE_H */
size_t nje
Definition: lsoda.h:137
size_t nyh
Definition: lsoda.h:139
void orderswitch(double *rhup, double dsm, double *pdh, double *rh, size_t *orderflag)
Definition: lsoda.cpp:716
size_t mxstep
Definition: lsoda.h:138
double hu
Definition: lsoda.h:142
size_t nst
Definition: lsoda.h:137
double ETA
Definition: lsoda.h:112
int iState
Definition: lsoda.h:165
double pdlast
Definition: lsoda.h:148
size_t mu
Definition: lsoda.h:114
double ratio
Definition: lsoda.h:148
std::vector< double > savf
Definition: lsoda.h:152
size_t ipup
Definition: lsoda.h:146
std::array< std::array< double, 14 >, 13 > elco
Definition: lsoda.h:127
void prja(const size_t neq, std::vector< double > &y, Functor &derivs, void *_data)
Definition: lsoda.tpp:6
double crate
Definition: lsoda.h:144
double rc
Definition: lsoda.h:142
size_t miter
Definition: lsoda.h:130
void terminate(int *istate)
Definition: lsoda.cpp:217
static bool abs_compare(double a, double b)
Definition: lsoda.cpp:48
std::vector< std::vector< double > > yh_
Definition: lsoda.h:154
std::array< double, 13 > sm1
Definition: lsoda.h:121
size_t jcur
Definition: lsoda.h:130
double el0
Definition: lsoda.h:141
double ccmax
Definition: lsoda.h:141
std::vector< std::vector< double > > wm_
Definition: lsoda.h:155
double conit
Definition: lsoda.h:144
double tn_
Definition: lsoda.h:142
void ewset(const std::vector< double > &ycur)
Definition: lsoda.cpp:241
void scaleh(double *rh, double *pdh)
Definition: lsoda.cpp:458
size_t meth_
Definition: lsoda.h:135
double hmin
Definition: lsoda.h:142
size_t ierpj
Definition: lsoda.h:130
size_t iersl
Definition: lsoda.h:130
size_t nfe
Definition: lsoda.h:137
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)
Definition: lsoda.tpp:78
void solsy(std::vector< double > &y)
Definition: lsoda.cpp:560
void _freevectors(void)
Definition: lsoda.cpp:831
std::vector< double > ewt
Definition: lsoda.h:151
size_t nqu
Definition: lsoda.h:137
size_t n
Definition: lsoda.h:137
int get_fncalls()
Definition: lsoda.cpp:848
double vmnorm(const size_t n, const std::vector< double > &v, const std::vector< double > &w)
Definition: lsoda.cpp:501
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)
Definition: lsoda.tpp:1257
int irflag
Definition: lsoda.h:149
double pdest
Definition: lsoda.h:148
size_t ml
Definition: lsoda.h:114
size_t ialth
Definition: lsoda.h:146
double fnorm(int n, const std::vector< std::vector< double >> &a, const std::vector< double > &w)
Definition: lsoda.cpp:509
void successreturn(AfterStep &after_step, std::vector< double > &y, double *t, int itask, int ihit, double tcrit, int *istate)
Definition: lsoda.tpp:578
int icount
Definition: lsoda.h:149
std::array< std::array< double, 4 >, 13 > tesco
Definition: lsoda.h:128
std::array< size_t, 3 > mord
Definition: lsoda.h:120
std::array< double, 13 > cm1
Definition: lsoda.h:124
int itol_
Definition: lsoda.h:160
size_t ntrep
Definition: lsoda.h:139
size_t mused
Definition: lsoda.h:134
int jstart
Definition: lsoda.h:132
void * param
Definition: lsoda.h:170
size_t nslp
Definition: lsoda.h:147
void cfode(int meth_)
Definition: lsoda.cpp:331
size_t illin
Definition: lsoda.h:130
size_t ixpr
Definition: lsoda.h:134
int kflag
Definition: lsoda.h:132
double h_
Definition: lsoda.h:141
size_t nslast
Definition: lsoda.h:139
~LSODA()
Definition: lsoda.cpp:44
double pdnorm
Definition: lsoda.h:143
void dscal1(const double da, std::vector< double > &dx, const size_t n, const size_t offset)
Definition: lsoda.cpp:76
size_t nq
Definition: lsoda.h:137
void terminate2(std::vector< double > &y, double *t)
Definition: lsoda.cpp:230
void intdy(double t, int k, std::vector< double > &dky, int *iflag)
Definition: lsoda.cpp:286
void corfailure(double *told, double *rh, size_t *ncf, size_t *corflag)
Definition: lsoda.cpp:532
void endstoda(void)
Definition: lsoda.cpp:694
size_t maxcor
Definition: lsoda.h:130
std::vector< double > acor
Definition: lsoda.h:153
size_t mxhnil
Definition: lsoda.h:138
double tsw
Definition: lsoda.h:143
double sqrteta
Definition: lsoda.h:115
double hmxi
Definition: lsoda.h:142
size_t idamax1(const std::vector< double > &dx, const size_t n, const size_t offset)
Definition: lsoda.cpp:54
size_t mxordn
Definition: lsoda.h:134
size_t init
Definition: lsoda.h:130
void resetcoeff(void)
Definition: lsoda.cpp:815
void resize_system(int nyh, int lenyh)
Definition: lsoda.cpp:837
Definition: lsoda.h:38
void methodswitch(double dsm, double pnorm, double *pdh, double *rh)
Definition: lsoda.cpp:572
size_t lmax
Definition: lsoda.h:146
size_t nhnil
Definition: lsoda.h:139
size_t msbp
Definition: lsoda.h:130
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)
Definition: lsoda.cpp:105
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)
Definition: lsoda.tpp:606
std::vector< double > atol_
Definition: lsoda.h:162
double hold
Definition: lsoda.h:144
size_t l
Definition: lsoda.h:130
void dgefa(std::vector< std::vector< double >> &a, const size_t n, std::vector< int > &ipvt, size_t *const info)
Definition: lsoda.cpp:161
std::vector< int > ipvt
Definition: lsoda.h:157
void stoda(const size_t neq, std::vector< double > &y, Functor &derivs, void *_data)
Definition: lsoda.tpp:225
size_t maxord
Definition: lsoda.h:130
double ddot1(const std::vector< double > &a, const std::vector< double > &b, const size_t n, const size_t offsetA, const size_t offsetB)
Definition: lsoda.cpp:87
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)
Definition: lsoda.cpp:96
std::vector< double > yout
Definition: lsoda.h:167
size_t mxncf
Definition: lsoda.h:130
size_t imxer
Definition: lsoda.h:114
size_t mxords
Definition: lsoda.h:134
std::array< double, 6 > cm2
Definition: lsoda.h:125
size_t jtyp
Definition: lsoda.h:134
std::vector< double > rtol_
Definition: lsoda.h:161
std::array< double, 14 > el
Definition: lsoda.h:123
LSODA()
Definition: lsoda.cpp:34
void set_istate(int n)
Definition: lsoda.cpp:857
int get_istate() const
Definition: lsoda.cpp:853
double rmax
Definition: lsoda.h:144