4#ifndef LSODA_FUNCTIONS_H
5#define LSODA_FUNCTIONS_H
6#define ETA 2.2204460492503131e-16
10 if(value !=0)
iopt = 1;
15 if(value !=0)
iopt = 1;
26 if(value!=0)
iopt = 1;
31 if(value!=0)
iopt = 1;
35 Rcpp::NumericVector xatol_ = Rcpp::as<Rcpp::NumericVector>(mod.slot(
"vec_atol"));
36 Rcpp::NumericVector xrtol_ = Rcpp::as<Rcpp::NumericVector>(mod.slot(
"vec_rtol"));
37 bool size_error =
false;
38 if(
static_cast<int>(xatol_.size()) !=
Neq) {
39 std::string size = std::to_string(xatol_.size());
40 std::string expect = std::to_string(
Neq);
41 Rcpp::CharacterVector text =
42 "[lsoda] expecting atol vector with size " + expect +
", but got size " + size +
".";
46 if(
static_cast<int>(xrtol_.size()) !=
Neq) {
47 std::string size = std::to_string(xrtol_.size());
48 std::string expect = std::to_string(
Neq);
49 Rcpp::CharacterVector text =
50 "[lsoda] expecting rtol vector with size " + expect +
", but got size " + size +
".";
55 Rcpp::stop(
"itol is > 1, but atol/rtol vector(s) are not the expected size.");
60 for(
int i = 0; i <
Neq; ++i) {
62 atol_[i+1] = xatol_[i];
63 rtol_[i+1] = xrtol_[i];
69 return (std::abs(a) < std::abs(b));
73size_t LSODA::idamax1(
const vector<double> &dx,
const size_t n,
const size_t offset = 0)
76 double v = 0, vmax = 0;
78 for (
size_t i = 1; i <=
n; ++i)
80 v = std::fabs(dx[i + offset]);
97 const size_t offset = 0)
99 std::transform(dx.begin() + 1 + offset, dx.end(), dx.begin() + 1 + offset,
100 [&da](
double x) ->
double { return da * x; });
105 const size_t n,
const size_t offsetA = 0,
106 const size_t offsetB = 0)
109 for (
size_t i = 1; i <=
n; ++i)
110 sum += a[i + offsetA] * b[i + offsetB];
115 vector<double> &dy,
const size_t n,
const size_t offsetX = 0,
116 const size_t offsetY = 0)
119 for (
size_t i = 1; i <=
n; ++i)
120 dy[i + offsetY] = da * dx[i + offsetX] + dy[i + offsetY];
125 vector<int> &
ipvt, vector<double> &b,
const size_t job)
138 for (k = 1; k <=
n; ++k)
140 t =
ddot1(a[k], b, k - 1);
141 b[k] = (b[k] - t) / a[k][k];
146 for (k =
n - 1; k >= 1; k--)
148 b[k] = b[k] +
ddot1(a[k], b,
n - k, k, k);
164 for (k = 1; k <=
n - 1; ++k)
173 daxpy1(t, a[k], b,
n - k, k, k);
178 for (k =
n; k >= 1; k--)
180 b[k] = b[k] / a[k][k];
182 daxpy1(t, a[k], b, k - 1);
190 size_t j = 0, k = 0, i = 0;
196 for (k = 1; k <=
n - 1; ++k)
202 j =
idamax1(a[k],
n - k + 1, k - 1) + k - 1;
230 for (i = k + 1; i <=
n; ++i)
238 daxpy1(t, a[k], a[i],
n - k, k, k);
254 REprintf(
"[lsoda] repeated occurrence of illegal input. run aborted;\n");
255 REprintf(
" apparent infinite loop.\n");
267 for (
size_t i = 1; i <=
n; ++i)
282 double tcrit,
int *istate)
284 for (
size_t i = 1; i <=
n; ++i)
309 if((neq+1) != y.size()) {
310 Rcpp::stop(
"[lsoda] y is not the right size in stoda.");
313 size_t corflag = 0, orderflag = 0;
314 size_t i = 0, i1 = 0, j = 0, m = 0, ncf = 0;
315 double del = 0.0, delp = 0.0, dsm = 0.0, dup = 0.0, exup = 0.0, r = 0.0,
316 rh = 0.0, rhup = 0.0, told = 0.0;
317 double pdh = 0.0, pnorm = 0.0;
389 for (i = 1; i <= 5; ++i)
392 for (i = 1; i <= 12; ++i)
454 for (
size_t j =
nq; j >= 1; j--)
455 for (
size_t i1 = j; i1 <=
nq; ++i1)
456 for (i = 1; i <=
n; ++i)
457 yh_[i1][i] +=
yh_[i1 + 1][i];
460 correction(neq, y, f, &corflag, pnorm, &del, &delp, &told, &ncf, &rh, &m,
466 rh = max(rh,
hmin / fabs(
h_));
510 for (
size_t j = 1; j <=
l; ++j)
513 for (i = 1; i <=
n; ++i)
522 rh = max(rh,
hmin / fabs(
h_));
538 for (i = 1; i <=
n; ++i)
541 exup = 1. / (double)(
l + 1);
542 rhup = 1. / (1.4 * pow(dup, exup) + 0.0000014);
560 rh = max(rh,
hmin / fabs(
h_));
572 rh = max(rh,
hmin / fabs(
h_));
585 for (
size_t i = 1; i <=
n; ++i)
603 for (j =
nq; j >= 1; j--)
605 for (i1 = j; i1 <=
nq; ++i1)
606 for (i = 1; i <=
n; ++i)
607 yh_[i1][i] -=
yh_[i1 + 1][i];
610 if (fabs(
h_) <=
hmin * 1.00001)
621 if (orderflag == 1 || orderflag == 0)
625 rh = max(rh,
hmin / fabs(
h_));
631 rh = max(rh,
hmin / fabs(
h_));
658 rh = max(
hmin / fabs(
h_), rh);
660 for (i = 1; i <=
n; ++i)
662 (*f)(
tn_, &y[1], &
savf[1], _data);
664 for (i = 1; i <=
n; ++i)
686 for (
size_t i = 1; i <=
n; ++i)
690 for (
size_t i = 1; i <=
n; ++i)
694 for (
size_t i = 1; i <=
n; ++i)
698 for (
size_t i = 1; i <=
n; ++i)
733 if (k < 0 || k > (
int)
nq)
736 REprintf(
"[intdy] k = %d illegal.\n", k);
741 if ((t - tp) * (t -
tn_) > 0.)
746 REprintf(
"[intdy] t = %g illegal. t not in interval tcur - hu to tcur.\n\n",t);
752 for (
size_t jj =
l - k; jj <=
nq; ++jj)
755 for (
size_t i = 1; i <=
n; ++i)
756 dky[i] = c *
yh_[
l][i];
758 for (
int j =
nq - 1; j >= k; j--)
762 for (
int jj = jp1 - k; jj <= j; ++jj)
766 for (
size_t i = 1; i <=
n; ++i)
767 dky[i] = c *
yh_[jp1][i] + s * dky[i];
771 r = pow(
h_, (
double)(-k));
773 for (
size_t i = 1; i <=
n; ++i)
780 int i,
nq, nqm1, nqp1;
781 double agamq, fnq, fnqm1, pc[13], pint, ragq, rqfac, rq1fac, tsign, xpin;
824 for (
nq = 2;
nq <= 12;
nq++)
834 rqfac = rqfac / (double)
nq;
836 fnqm1 = (double)nqm1;
842 for (i =
nq; i >= 2; i--)
843 pc[i] = pc[i - 1] + fnqm1 * pc[i];
844 pc[1] = fnqm1 * pc[1];
851 for (i = 2; i <=
nq; ++i)
854 pint += tsign * pc[i] / (double)i;
855 xpin += tsign * pc[i] / (double)(i + 1);
860 elco[
nq][1] = pint * rq1fac;
862 for (i = 2; i <=
nq; ++i)
863 elco[
nq][i + 1] = rq1fac * pc[i] / (
double)i;
864 agamq = rqfac * xpin;
868 tesco[nqp1][1] = ragq * rqfac / (double)nqp1;
869 tesco[nqm1][3] = ragq;
883 for (
nq = 1;
nq <= 5; ++
nq)
891 for (i =
nq + 1; i >= 2; i--)
892 pc[i] = pc[i - 1] + fnq * pc[i];
897 for (i = 1; i <= nqp1; ++i)
898 elco[
nq][i] = pc[i] / pc[2];
918 *rh = min(*rh,
rmax);
919 *rh = *rh / max(1., fabs(
h_) *
hmxi * *rh);
928 *pdh = max(fabs(
h_) *
pdlast, 0.000001);
929 if ((*rh * *pdh * 1.00001) >=
sm1[
nq])
931 *rh =
sm1[
nq] / *pdh;
936 for (
size_t j = 2; j <=
l; ++j)
939 for (
size_t i = 1; i <=
n; ++i)
951 size_t i = 0, ier = 0, j = 0;
952 double fac = 0.0, hl0 = 0.0, r = 0.0, r0 = 0.0, yj = 0.0;
974 REprintf(
"[prja] miter != 2.\n");
980 r0 = 1000. * fabs(
h_) *
ETA * ((double)
n) * fac;
983 for (j = 1; j <=
n; ++j)
989 (*f)(
tn_, &y[1], &
acor[1], _data);
990 for (i = 1; i <=
n; ++i)
1002 for (i = 1; i <=
n; ++i)
1022 const vector<double> &w)
1025 for (
size_t i = 1; i <=
n; ++i)
1026 vm = max(vm, fabs(v[i]) * w[i]);
1031 const vector<double> &w)
1042 double an = 0, sum = 0;
1044 for (
size_t i = 1; i <= (size_t)
n; ++i)
1047 for (
size_t j = 1; j <= (size_t)
n; ++j)
1048 sum += fabs(a[i][j]) / w[j];
1049 an = max(an, sum * w[i]);
1061 double *del,
double *delp,
double *told,
size_t *ncf,
1062 double *rh,
size_t *m,
dtype _data)
1064 double rm = 0.0, rate = 0.0, dcon = 0.0;
1077 for (
size_t i = 1; i <=
n; ++i)
1080 (*f)(
tn_, &y[1], &
savf[1], _data);
1094 prja(neq, y, f, _data);
1105 for (
size_t i = 1; i <=
n; ++i)
1114 for (
size_t i = 1; i <=
n; ++i)
1120 for (
size_t i = 1; i <=
n; ++i)
1134 for (
size_t i = 1; i <=
n; ++i)
1140 for (
size_t i = 1; i <=
n; ++i)
1158 if (*del <= 100. * pnorm *
ETA)
1160 if (*m != 0 ||
meth_ != 1)
1165 if (*del <= (1024. * *delp))
1167 rate = max(rate, rm);
1187 if (*m ==
maxcor || (*m >= 2 && *del > 2. * *delp))
1201 for (
size_t i = 1; i <=
n; ++i)
1204 (*f)(
tn_, &y[1], &
savf[1], _data);
1214 (*f)(
tn_, &y[1], &
savf[1], _data);
1225 for (
size_t j =
nq; j >= 1; j--)
1226 for (
size_t i1 = j; i1 <=
nq; ++i1)
1227 for (
size_t i = 1; i <=
n; ++i)
1228 yh_[i1][i] -=
yh_[i1 + 1][i];
1255 REprintf(
"solsy -- miter != 2.\n");
1265 int lm1, lm1p1, lm2, lm2p1, nqm1, nqm2;
1266 double rh1, rh2, rh1it, exm2, dm2, exm1, dm1, alpha, exsm;
1290 if (dsm <= (100. * pnorm *
ETA) ||
pdest == 0.)
1299 exsm = 1. / (double)
l;
1300 rh1 = 1. / (1.2 * pow(dsm, exsm) + 0.0000012);
1303 if ((*pdh * rh1) > 0.00001)
1304 rh1it =
sm1[
nq] / *pdh;
1305 rh1 = min(rh1, rh1it);
1310 exm2 = 1. / (double)lm2;
1313 rh2 = 1. / (1.2 * pow(dm2, exm2) + 0.0000012);
1318 rh2 = 1. / (1.2 * pow(dm2, exsm) + 0.0000012);
1321 if (rh2 <
ratio * rh1)
1347 exsm = 1. / (double)
l;
1352 exm1 = 1. / (double)lm1;
1355 rh1 = 1. / (1.2 * pow(dm1, exm1) + 0.0000012);
1360 rh1 = 1. / (1.2 * pow(dm1, exsm) + 0.0000012);
1366 if ((*pdh * rh1) > 0.00001)
1367 rh1it =
sm1[nqm1] / *pdh;
1368 rh1 = min(rh1, rh1it);
1369 rh2 = 1. / (1.2 * pow(dsm, exsm) + 0.0000012);
1370 if ((rh1 *
ratio) < (5. * rh2))
1372 alpha = max(0.001, rh1);
1373 dm1 *= pow(alpha, exm1);
1374 if (dm1 <= 1000. *
ETA * pnorm)
1395 for (
size_t i = 1; i <=
n; ++i)
1418 double exsm, rhdn, rhsm, ddn, exdn, r;
1422 exsm = 1. / (double)
l;
1423 rhsm = 1. / (1.2 * pow(dsm, exsm) + 0.0000012);
1429 exdn = 1. / (double)
nq;
1430 rhdn = 1. / (1.3 * pow(ddn, exdn) + 0.0000013);
1437 *pdh = max(fabs(
h_) *
pdlast, 0.000001);
1439 *rhup = min(*rhup,
sm1[
l] / *pdh);
1440 rhsm = min(rhsm,
sm1[
nq] / *pdh);
1442 rhdn = min(rhdn,
sm1[
nq - 1] / *pdh);
1474 r =
el[
l] / (double)
l;
1477 for (
size_t i = 1; i <=
n; ++i)
1495 if ((*rh * *pdh * 1.00001) <
sm1[newq])
1496 if (
kflag == 0 && *rh < 1.1)
1504 if (
kflag == 0 && *rh < 1.1)
1511 *rh = min(*rh, 0.2);
1534 array<double, 14> ep1;
1537 for (
size_t i = 1; i <=
l; ++i)
1541 conit = 0.5 / (double)(
nq + 2);
#define ETA
Definition LSODA.cpp:54
void(* LSODA_ODE_SYSTEM_TYPE)(double t, double *y, double *dydt, dtype _data)
Definition LSODA.h:36
odeproblem * dtype
Definition LSODA.h:19
std::vector< double > rtol_
Definition LSODA.h:184
size_t illin
Definition LSODA.h:164
array< double, 13 > cm1
Definition LSODA.h:151
size_t n
Definition LSODA.h:170
double vmnorm(const size_t n, const vector< double > &v, const vector< double > &w)
Definition lsoda_functions.h:1021
double ddot1(const vector< double > &a, const vector< double > &b, const size_t n, const size_t offsetA, const size_t offsetB)
Definition lsoda_functions.h:104
void dscal1(const double da, vector< double > &dx, const size_t n, const size_t offset)
Definition lsoda_functions.h:96
void cfode(int meth_)
Definition lsoda_functions.h:778
void orderswitch(double *rhup, double dsm, double *pdh, double *rh, size_t *orderflag)
Definition lsoda_functions.h:1414
size_t maxcor
Definition LSODA.h:165
double hmin
Definition LSODA.h:175
double hmxi
Definition LSODA.h:175
std::vector< double > atol_
Definition LSODA.h:185
void endstoda(void)
Definition lsoda_functions.h:1392
size_t miter
Definition LSODA.h:165
int irflag
Definition LSODA.h:182
size_t ialth
Definition LSODA.h:179
int itol
Definition LSODA.h:54
size_t meth_
Definition LSODA.h:168
void intdy(double t, int k, vector< double > &dky, int *iflag)
Definition lsoda_functions.h:727
vector< vector< double > > yh_
Definition LSODA.h:160
double tn_
Definition LSODA.h:175
double sqrteta
Definition LSODA.h:142
double fnorm(int n, const vector< vector< double > > &a, const vector< double > &w)
Definition lsoda_functions.h:1030
array< double, 6 > cm2
Definition LSODA.h:152
void resetcoeff(void)
Definition lsoda_functions.h:1528
int icount
Definition LSODA.h:182
size_t iersl
Definition LSODA.h:164
int Neq
Definition LSODA.h:58
size_t ierpj
Definition LSODA.h:164
void ewset(const vector< double > &ycur)
Definition lsoda_functions.h:681
vector< double > savf
Definition LSODA.h:158
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_functions.h:114
double hold
Definition LSODA.h:177
size_t msbp
Definition LSODA.h:165
int itask
Definition LSODA.h:53
void prja(const size_t neq, vector< double > &y, LSODA_ODE_SYSTEM_TYPE f, dtype _data)
Definition lsoda_functions.h:948
array< array< double, 14 >, 13 > elco
Definition LSODA.h:154
size_t nslp
Definition LSODA.h:180
double ratio
Definition LSODA.h:181
void maxsteps_(const int value)
Definition lsoda_functions.h:18
array< double, 14 > el
Definition LSODA.h:150
array< array< double, 4 >, 13 > tesco
Definition LSODA.h:155
void dgefa1(vector< vector< double > > &a, const size_t n, vector< int > &ipvt, size_t *const info)
Definition lsoda_functions.h:187
int Maxsteps
Definition LSODA.h:57
static bool abs_compare(double a, double b)
Definition lsoda_functions.h:67
array< double, 13 > sm1
Definition LSODA.h:148
double pdnorm
Definition LSODA.h:176
void successreturn(vector< double > &y, double *t, int itask, int ihit, double tcrit, int *istate)
Definition lsoda_functions.h:281
void solsy(vector< double > &y)
Definition lsoda_functions.h:1249
size_t nqu
Definition LSODA.h:170
array< int, 7 > iworks
Definition LSODA.h:67
size_t mxords
Definition LSODA.h:167
void ixpr_(const int value)
Definition lsoda_functions.h:24
size_t lmax
Definition LSODA.h:179
size_t jcur
Definition LSODA.h:164
void terminate2(vector< double > &y, double *t)
Definition lsoda_functions.h:265
size_t jtyp
Definition LSODA.h:167
size_t nq
Definition LSODA.h:170
double ccmax
Definition LSODA.h:174
void hmax_(const double value)
Definition lsoda_functions.h:8
void hmin_(const double value)
Definition lsoda_functions.h:13
void methodswitch(double dsm, double pnorm, double *pdh, double *rh)
Definition lsoda_functions.h:1263
vector< vector< double > > wm_
Definition LSODA.h:161
void mxhnil_(const int value)
Definition lsoda_functions.h:29
void stoda(const size_t neq, vector< double > &y, LSODA_ODE_SYSTEM_TYPE f, dtype _data)
Definition lsoda_functions.h:305
size_t mxncf
Definition LSODA.h:165
vector< double > acor
Definition LSODA.h:159
double el0
Definition LSODA.h:174
double hu
Definition LSODA.h:175
void setup_tol_vectors(const Rcpp::S4 &mod)
Definition lsoda_functions.h:34
double pdlast
Definition LSODA.h:181
int kflag
Definition LSODA.h:139
void dgesl1(const vector< vector< double > > &a, const size_t n, vector< int > &ipvt, vector< double > &b, const size_t job)
Definition lsoda_functions.h:124
size_t mused
Definition LSODA.h:167
array< double, 4 > rworks
Definition LSODA.h:68
int jstart
Definition LSODA.h:139
vector< int > ipvt
Definition LSODA.h:162
void corfailure(double *told, double *rh, size_t *ncf, size_t *corflag)
Definition lsoda_functions.h:1220
size_t idamax1(const vector< double > &dx, const size_t n, const size_t offset)
Definition lsoda_functions.h:73
void scaleh(double *rh, double *pdh)
Definition lsoda_functions.h:909
double rmax
Definition LSODA.h:177
double rc
Definition LSODA.h:175
double crate
Definition LSODA.h:177
size_t l
Definition LSODA.h:165
double h_
Definition LSODA.h:174
size_t nst
Definition LSODA.h:170
double pdest
Definition LSODA.h:181
void terminate(int *istate)
Definition lsoda_functions.h:248
vector< double > ewt
Definition LSODA.h:157
size_t nje
Definition LSODA.h:170
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, dtype _data)
Definition lsoda_functions.h:1059
size_t mxordn
Definition LSODA.h:167
double conit
Definition LSODA.h:177
size_t nfe
Definition LSODA.h:170
size_t maxord
Definition LSODA.h:165
int iopt
Definition LSODA.h:51
size_t ipup
Definition LSODA.h:179
Definition odeproblem.h:100