ECOGEN 4.0
Evolutive, Compressible, Open, Genuine, Easy, N-phase
Loading...
Searching...
No Matches
LSODA.h
Go to the documentation of this file.
1/*
2 * HISTORY:
3 * This is the header of a CPP version of the LSODA library slightly modified by
4 * Kevin Schmidmayer.
5 * The original header version was aquired from
6 * https://github.com/dilawar/libsoda.
7*/
8/***
9 * Created: 2018-08-14
10
11 * Author: Dilawar Singh <dilawars@ncbs.res.in>
12 * Organization: NCBS Bangalore
13 * License: MIT License
14 */
15
16#ifndef LSODE_H
17#define LSODE_H
18
19#include <array>
20#include <memory>
21#include <numeric>
22#include "../Errors.h"
23
24using namespace std;
25
26/* --------------------------------------------------------------------------*/
37/* ----------------------------------------------------------------------------*/
38typedef void (*LSODA_ODE_SYSTEM_TYPE)(double t, double *y, double *dydt, void *);
39
40class LSODA
41{
42
43public:
44 LSODA();
45 ~LSODA();
46
47 size_t idamax1(const vector<double> &dx, const size_t n, const size_t offset);
48
49 void dscal1(const double da, vector<double> &dx, const size_t n,
50 const size_t offset);
51
52 double ddot1(const vector<double> &a, const vector<double> &b, const size_t n,
53 const size_t offsetA, const size_t offsetB);
54
55 void daxpy1(const double da, const vector<double> &dx, vector<double> &dy,
56 const size_t n, const size_t offsetX,
57 const size_t offsetY);
58
59 void dgesl(const vector<vector<double>> &a, const size_t n, vector<int> &ipvt,
60 vector<double> &b, const size_t job);
61
62 void dgefa(vector<vector<double>> &a, const size_t n, vector<int> &ipvt,
63 size_t *const info);
64
65 void prja(const size_t neq, vector<double> &y, LSODA_ODE_SYSTEM_TYPE f,
66 void *_data);
67
68 void lsoda(LSODA_ODE_SYSTEM_TYPE f, const size_t neq, vector<double> &y,
69 double *t, double tout, int itask, int *istate, int iopt, int jt,
70 array<int, 7> &iworks, array<double, 4> &rworks, void *_data);
71
72 void correction(const size_t neq, vector<double> &y, LSODA_ODE_SYSTEM_TYPE f,
73 size_t *corflag, double pnorm, double *del, double *delp,
74 double *told, size_t *ncf, double *rh, size_t *m,
75 void *_data);
76
77 void stoda(const size_t neq, vector<double> &y, LSODA_ODE_SYSTEM_TYPE f,
78 void *_data);
79
80 // We call this function in VoxelPools::
81 void lsoda_update(LSODA_ODE_SYSTEM_TYPE f, const size_t neq,
82 vector<double> &y, double *t,
83 const double tout, int *istate, void *const _data,
84 double rtol = 1.e-6, double atol = 0. // Tolerance
85 );
86
87 void terminate(int *istate);
88 void terminate2(vector<double> &y, double *t);
89 void successreturn(vector<double> &y, double *t, int itask, int ihit,
90 double tcrit, int *istate);
91 void _freevectors(void);
92 void ewset(const vector<double> &ycur);
93 void resetcoeff(void);
94 void solsy(vector<double> &y);
95 void endstoda(void);
96 void orderswitch(double *rhup, double dsm, double *pdh, double *rh,
97 size_t *orderflag);
98 void intdy(double t, int k, vector<double> &dky, int *iflag);
99 void corfailure(double *told, double *rh, size_t *ncf, size_t *corflag);
100 void methodswitch(double dsm, double pnorm, double *pdh, double *rh);
101 void cfode(int meth_);
102 void scaleh(double *rh, double *pdh);
103 double fnorm(int n, const vector<vector<double>> &a, const vector<double> &w);
104 double vmnorm(const size_t n, const vector<double> &v,
105 const vector<double> &w);
106
107 static bool abs_compare(double a, double b);
108
109private:
110 size_t ml, mu, imxer;
111 double sqrteta;
112
113 // NOTE: initialize in default constructor. Older compiler e.g. 4.8.4 would
114 // produce error if these are initialized here. With newer compiler,
115 // initialization can be done here.
116 array<size_t, 3> mord;
117 array<double, 13> sm1;
118
119 array<double, 14> el; // = {0};
120 array<double, 13> cm1; // = {0};
121 array<double, 6> cm2; // = {0};
122
123 array<array<double, 14>, 13> elco;
124 array<array<double, 4>, 13> tesco;
125
127
129
130 size_t ixpr = 0, jtyp, mused, mxordn, mxords = 12;
131 size_t meth_;
132
133 size_t n, nq, nst, nfe, nje, nqu;
134 size_t mxstep, mxhnil;
136
137 double ccmax, el0, h_ = .0;
138 double hmin, hmxi, hu, rc, tn_ = 0.0;
139 double tsw, pdnorm;
140 double conit, crate, hold, rmax;
141
142 size_t ialth, ipup, lmax;
143 size_t nslp;
146
147 vector<double> ewt;
148 vector<double> savf;
149 vector<double> acor;
150 vector<vector<double>> yh_;
151 vector<vector<double>> wm_;
152
153 vector<int> ipvt;
154
155private:
156 int itol_ = 2;
157 std::vector<double> rtol_;
158 std::vector<double> atol_;
159
160public:
161 void *param = nullptr;
162};
163
164#endif /* end of include guard: LSODE_H */
void(* LSODA_ODE_SYSTEM_TYPE)(double t, double *y, double *dydt, void *)
Definition LSODA.h:38
Definition LSODA.h:41
std::vector< double > rtol_
Definition LSODA.h:157
size_t illin
Definition LSODA.h:126
array< double, 13 > cm1
Definition LSODA.h:120
size_t n
Definition LSODA.h:133
double vmnorm(const size_t n, const vector< double > &v, const vector< double > &w)
Definition LSODA.cpp:1773
double ddot1(const vector< double > &a, const vector< double > &b, const size_t n, const size_t offsetA, const size_t offsetB)
Definition LSODA.cpp:78
array< size_t, 3 > mord
Definition LSODA.h:116
void dscal1(const double da, vector< double > &dx, const size_t n, const size_t offset)
Definition LSODA.cpp:70
void cfode(int meth_)
Definition LSODA.cpp:1531
void orderswitch(double *rhup, double dsm, double *pdh, double *rh, size_t *orderflag)
Definition LSODA.cpp:2165
size_t maxcor
Definition LSODA.h:126
size_t imxer
Definition LSODA.h:110
void dgefa(vector< vector< double > > &a, const size_t n, vector< int > &ipvt, size_t *const info)
Definition LSODA.cpp:161
double hmin
Definition LSODA.h:138
double hmxi
Definition LSODA.h:138
std::vector< double > atol_
Definition LSODA.h:158
void endstoda(void)
Definition LSODA.cpp:2143
size_t miter
Definition LSODA.h:126
int irflag
Definition LSODA.h:145
void lsoda(LSODA_ODE_SYSTEM_TYPE f, const size_t neq, vector< double > &y, double *t, double tout, int itask, int *istate, int iopt, int jt, array< int, 7 > &iworks, array< double, 4 > &rworks, void *_data)
Definition LSODA.cpp:383
size_t nyh
Definition LSODA.h:135
size_t ialth
Definition LSODA.h:142
void lsoda_update(LSODA_ODE_SYSTEM_TYPE f, const size_t neq, vector< double > &y, double *t, const double tout, int *istate, void *const _data, double rtol=1.e-6, double atol=0.)
Definition LSODA.cpp:2315
size_t mxhnil
Definition LSODA.h:134
size_t meth_
Definition LSODA.h:131
void intdy(double t, int k, vector< double > &dky, int *iflag)
Definition LSODA.cpp:1484
vector< vector< double > > yh_
Definition LSODA.h:150
double tn_
Definition LSODA.h:138
double sqrteta
Definition LSODA.h:111
double fnorm(int n, const vector< vector< double > > &a, const vector< double > &w)
Definition LSODA.cpp:1782
array< double, 6 > cm2
Definition LSODA.h:121
void resetcoeff(void)
Definition LSODA.cpp:2279
int icount
Definition LSODA.h:145
size_t iersl
Definition LSODA.h:126
size_t ierpj
Definition LSODA.h:126
void ewset(const vector< double > &ycur)
Definition LSODA.cpp:1438
vector< double > savf
Definition LSODA.h:148
void daxpy1(const double da, const vector< double > &dx, vector< double > &dy, const size_t n, const size_t offsetX, const size_t offsetY)
Definition LSODA.cpp:88
double hold
Definition LSODA.h:140
size_t msbp
Definition LSODA.h:126
size_t mu
Definition LSODA.h:110
void dgesl(const vector< vector< double > > &a, const size_t n, vector< int > &ipvt, vector< double > &b, const size_t job)
Definition LSODA.cpp:98
double tsw
Definition LSODA.h:139
array< array< double, 14 >, 13 > elco
Definition LSODA.h:123
size_t nslp
Definition LSODA.h:143
double ratio
Definition LSODA.h:144
array< double, 14 > el
Definition LSODA.h:119
void stoda(const size_t neq, vector< double > &y, LSODA_ODE_SYSTEM_TYPE f, void *_data)
Definition LSODA.cpp:1065
array< array< double, 4 >, 13 > tesco
Definition LSODA.h:124
static bool abs_compare(double a, double b)
Definition LSODA.cpp:41
size_t nhnil
Definition LSODA.h:135
size_t ixpr
Definition LSODA.h:130
array< double, 13 > sm1
Definition LSODA.h:117
double pdnorm
Definition LSODA.h:139
size_t nslast
Definition LSODA.h:135
void successreturn(vector< double > &y, double *t, int itask, int ihit, double tcrit, int *istate)
Definition LSODA.cpp:251
void solsy(vector< double > &y)
Definition LSODA.cpp:2001
size_t nqu
Definition LSODA.h:133
size_t ntrep
Definition LSODA.h:135
size_t init
Definition LSODA.h:126
void correction(const size_t neq, vector< double > &y, LSODA_ODE_SYSTEM_TYPE f, size_t *corflag, double pnorm, double *del, double *delp, double *told, size_t *ncf, double *rh, size_t *m, void *_data)
Definition LSODA.cpp:1811
size_t mxords
Definition LSODA.h:130
size_t lmax
Definition LSODA.h:142
size_t jcur
Definition LSODA.h:126
void terminate2(vector< double > &y, double *t)
Definition LSODA.cpp:235
size_t jtyp
Definition LSODA.h:130
size_t nq
Definition LSODA.h:133
double ccmax
Definition LSODA.h:137
void prja(const size_t neq, vector< double > &y, LSODA_ODE_SYSTEM_TYPE f, void *_data)
Definition LSODA.cpp:1701
void methodswitch(double dsm, double pnorm, double *pdh, double *rh)
Definition LSODA.cpp:2014
vector< vector< double > > wm_
Definition LSODA.h:151
size_t mxstep
Definition LSODA.h:134
size_t mxncf
Definition LSODA.h:126
int itol_
Definition LSODA.h:156
vector< double > acor
Definition LSODA.h:149
double el0
Definition LSODA.h:137
double hu
Definition LSODA.h:138
double pdlast
Definition LSODA.h:144
int kflag
Definition LSODA.h:128
size_t mused
Definition LSODA.h:130
size_t ml
Definition LSODA.h:110
int jstart
Definition LSODA.h:128
LSODA()
Definition LSODA.cpp:25
vector< int > ipvt
Definition LSODA.h:153
void corfailure(double *told, double *rh, size_t *ncf, size_t *corflag)
Definition LSODA.cpp:1972
size_t idamax1(const vector< double > &dx, const size_t n, const size_t offset)
Definition LSODA.cpp:47
void scaleh(double *rh, double *pdh)
Definition LSODA.cpp:1662
double rmax
Definition LSODA.h:140
double rc
Definition LSODA.h:138
double crate
Definition LSODA.h:140
size_t l
Definition LSODA.h:126
double h_
Definition LSODA.h:137
void * param
Definition LSODA.h:161
size_t nst
Definition LSODA.h:133
double pdest
Definition LSODA.h:144
void terminate(int *istate)
Definition LSODA.cpp:222
vector< double > ewt
Definition LSODA.h:147
void _freevectors(void)
Definition LSODA.cpp:2295
size_t nje
Definition LSODA.h:133
size_t mxordn
Definition LSODA.h:130
double conit
Definition LSODA.h:140
~LSODA()
Definition LSODA.cpp:39
size_t nfe
Definition LSODA.h:133
size_t maxord
Definition LSODA.h:126
size_t ipup
Definition LSODA.h:142