26 #include "idas_interface.hpp"
27 #include "casadi/core/casadi_misc.hpp"
30 #define THROWING(fcn, ...) \
31 idas_error(CASADI_STR(fcn), fcn(__VA_ARGS__))
36 int CASADI_INTEGRATOR_IDAS_EXPORT
39 plugin->name =
"idas";
41 plugin->version = CASADI_VERSION;
53 double t0,
const std::vector<double>& tout) :
SundialsInterface(name, dae, t0, tout) {
62 {{
"suppress_algebraic",
64 "Suppress algebraic variables in the error testing"}},
67 "Use IDACalcIC to get consistent initial conditions."}},
70 "Constrain the solution y=[x,z]. 0 (default): no constraint on yi, "
71 "1: yi >= 0.0, -1: yi <= 0.0, 2: yi > 0.0, -2: yi < 0.0."}},
74 "Use IDACalcIC to get consistent initial conditions for "
75 "backwards system [default: equal to calc_ic]."}},
78 "Absolute tolerarance for each component"}},
81 "Maximim step size"}},
84 "First requested time as a fraction of the time interval"}},
87 "IDAS scaling on cj for the user-defined linear solver module"}},
90 "Initial values for the state derivatives"}}
106 for (
auto&& op : opts) {
107 if (op.first==
"init_xdot") {
109 }
else if (op.first==
"cj_scaling") {
111 }
else if (op.first==
"calc_ic") {
113 }
else if (op.first==
"suppress_algebraic") {
115 }
else if (op.first==
"constraints") {
117 }
else if (op.first==
"abstolv") {
127 for (
auto&& op : opts) {
128 if (op.first==
"calc_icB") {
130 }
else if (op.first==
"first_time") {
141 "Option \"init_xdot\" has incorrect length. Expecting " +
str(
nx_) +
", "
143 "Note that this message may actually be generated by the augmented integrator. "
144 "In that case, make use of the 'augmented_options' options "
145 "to correct 'init_xdot' for the augmented integrator.");
157 "Constraint vector if supplied, must be of length nx+nz, but got "
166 auto m =
to_mem(user_data);
168 if (s.calc_daeF(m, t, NV_DATA_S(xz), NV_DATA_S(xz) + s.nx_,
169 NV_DATA_S(rr), NV_DATA_S(rr) + s.nx_))
return 1;
172 casadi_axpy(s.nx_, -1., NV_DATA_S(xzdot), NV_DATA_S(rr));
174 }
catch(std::exception& e) {
175 uerr() <<
"res failed: " << e.what() << std::endl;
181 char *msg,
void *eh_data) {
185 uerr() << msg << std::endl;
186 }
catch(std::exception& e) {
187 uerr() <<
"ehfun failed: " << e.what() << std::endl;
192 N_Vector Jv,
double cj,
void *user_data, N_Vector tmp1, N_Vector tmp2) {
194 auto m =
to_mem(user_data);
196 if (s.calc_jtimesF(m, t, NV_DATA_S(xz), NV_DATA_S(xz) + s.nx_,
197 NV_DATA_S(v), NV_DATA_S(v) + s.nx_,
198 NV_DATA_S(Jv), NV_DATA_S(Jv) + s.nx_))
return 1;
201 casadi_axpy(s.nx_, -cj, NV_DATA_S(v), NV_DATA_S(Jv));
204 }
catch(std::exception& e) {
205 uerr() <<
"jtimesF failed: " << e.what() << std::endl;
211 N_Vector rxzdot, N_Vector resvalB, N_Vector v, N_Vector Jv,
212 double cjB,
void *user_data, N_Vector tmp1B, N_Vector tmp2B) {
214 auto m =
to_mem(user_data);
217 if (s.calc_daeB(m, t, NV_DATA_S(xz), NV_DATA_S(xz) + s.nx_,
218 NV_DATA_S(v), NV_DATA_S(v) + s.nrx_,
nullptr,
219 NV_DATA_S(Jv), NV_DATA_S(Jv) + s.nrx_))
return 1;
221 casadi_axpy(s.nrx_, cjB, NV_DATA_S(v), NV_DATA_S(Jv));
224 }
catch(std::exception& e) {
225 uerr() <<
"jtimesB failed: " << e.what() << std::endl;
235 m->mem = IDACreate();
236 casadi_assert(m->mem!=
nullptr,
"IDACreate: Creation failed");
239 THROWING(IDASetErrHandlerFn, m->mem,
ehfun, m);
242 THROWING(IDASetUserData, m->mem, m);
245 m->v_xzdot = N_VNew_Serial(
nx_+
nz_);
249 N_VConst(0.0, m->v_xz);
250 N_VConst(0.0, m->v_xzdot);
251 IDAInit(m->mem,
resF, t0, m->v_xz, m->v_xzdot);
252 if (
verbose_) casadi_message(
"IDA initialized");
261 if (
step0_!=0) THROWING(IDASetInitStep, m->mem,
step0_);
268 N_Vector domain = N_VNew_Serial(
nx_+
nz_);
269 std::copy(
y_c_.begin(),
y_c_.end(), NV_DATA_S(domain));
272 int flag = IDASetConstraints(m->mem, domain);
273 casadi_assert_dev(flag==IDA_SUCCESS);
276 N_VDestroy_Serial(domain);
288 N_Vector nv_abstol = N_VNew_Serial(
static_cast<long>(
abstolv_.size()));
290 THROWING(IDASVtolerances, m->mem,
reltol_, nv_abstol);
291 N_VDestroy_Serial(nv_abstol);
294 THROWING(IDASVtolerances, m->mem,
reltol_, m->abstolv);
304 N_Vector
id = N_VNew_Serial(
nx_+
nz_);
305 std::fill_n(NV_DATA_S(
id),
nx_, 1);
306 std::fill_n(NV_DATA_S(
id)+
nx_,
nz_, 0);
309 THROWING(IDASetId, m->mem,
id);
312 N_VDestroy_Serial(
id);
317 IDAMem IDA_mem = IDAMem(m->mem);
318 IDA_mem->ida_lmem = m;
321 IDA_mem->ida_setupNonNull = TRUE;
330 THROWING(IDASpilsSetJacTimesVecFn, m->mem,
jtimesF);
338 THROWING(IDAQuadInit, m->mem,
rhsQF, m->v_q);
342 THROWING(IDASetQuadErrCon, m->mem,
true);
350 if (
verbose_) casadi_message(
"Attached linear solver");
354 m->v_adj_xzdot = N_VNew_Serial(
nrx_+
nrz_);
355 N_VConst(0.0, m->v_adj_xz);
356 N_VConst(0.0, m->v_adj_xzdot);
358 if (
verbose_) casadi_message(
"Initialized adjoint sensitivities");
366 m->first_callB =
true;
381 N_VConst(0.0, m->v_xzdot);
384 THROWING(IDAReInit, m->mem, m->t, m->v_xz, m->v_xzdot);
387 if (
nq1_ > 0) THROWING(IDAQuadReInit, m->mem, m->v_q);
391 THROWING(IDACalcIC, m->mem, IDA_YA_YDP_INIT ,
first_time_);
392 THROWING(IDAGetConsistentIC, m->mem, m->v_xz, m->v_xzdot);
396 if (
nadj_ > 0) THROWING(IDAAdjReInit, m->mem);
406 if (m->t_stop >= m->tcur) {
407 THROWING(IDASetStopTime, m->mem, m->t_stop);
412 if (fabs(m->t - m->t_next) >= ttol) {
416 THROWING(IDASolveF, m->mem, m->t_next, &tret, m->v_xz, m->v_xzdot, IDA_NORMAL, &m->ncheck);
418 THROWING(IDASolve, m->mem, m->t_next, &tret, m->v_xz, m->v_xzdot, IDA_NORMAL);
421 if (
nq1_ > 0) THROWING(IDAGetQuad, m->mem, &tret, m->v_q);
429 THROWING(IDAGetIntegratorStats, m->mem, &m->nsteps, &m->nfevals, &m->nlinsetups,
430 &m->netfails, &m->qlast, &m->qcur, &m->hinused, &m->hlast, &m->hcur, &m->tcur);
431 THROWING(IDAGetNonlinSolvStats, m->mem, &m->nniters, &m->nncfails);
441 N_VConst(0.0, m->v_adj_xz);
447 N_VConst(0.0, m->v_adj_xzdot);
467 casadi_error(
"Linear system factorization for backwards initial conditions failed");
473 casadi_error(
"Linear system solve for backwards initial conditions failed");
479 casadi_error(
"Adjoint seed propagation for backwards initial conditions failed");
486 const double* adj_x,
const double* adj_z,
const double* adj_q)
const {
495 if (m->first_callB) {
497 THROWING(IDACreateB, m->mem, &m->whichB);
498 THROWING(IDAInitB, m->mem, m->whichB,
resB, m->t, m->v_adj_xz, m->v_adj_xzdot);
500 THROWING(IDASetUserDataB, m->mem, m->whichB, m);
505 N_Vector
id = N_VNew_Serial(
nrx_+
nrz_);
506 std::fill_n(NV_DATA_S(
id),
nrx_, 1);
507 std::fill_n(NV_DATA_S(
id)+
nrx_,
nrz_, 0);
508 THROWING(IDASetIdB, m->mem, m->whichB,
id);
509 N_VDestroy_Serial(
id);
514 IDAMem IDA_mem = IDAMem(m->mem);
515 IDAadjMem IDAADJ_mem = IDA_mem->ida_adj_mem;
516 IDABMem IDAB_mem = IDAADJ_mem->IDAB_mem;
517 IDAB_mem->ida_lmem = m;
518 IDAB_mem->IDA_mem->ida_lmem = m;
519 IDAB_mem->IDA_mem->ida_lsetup =
lsetupB;
520 IDAB_mem->IDA_mem->ida_lsolve =
lsolveB;
521 IDAB_mem->IDA_mem->ida_setupNonNull = TRUE;
530 THROWING(IDASpilsSetJacTimesVecFnB, m->mem, m->whichB,
jtimesB);
536 THROWING(IDAQuadInitB, m->mem, m->whichB,
rhsQB, m->v_adj_pu);
538 THROWING(IDASetQuadErrConB, m->mem, m->whichB,
true);
539 THROWING(IDAQuadSStolerancesB, m->mem, m->whichB,
reltol_,
abstol_);
544 m->first_callB =
false;
547 THROWING(IDAReInitB, m->mem, m->whichB, m->t, m->v_adj_xz, m->v_adj_xzdot);
551 void* memB = IDAGetAdjIDABmem(m->mem, m->whichB);
552 THROWING(IDAQuadReInit, memB, m->v_adj_pu);
558 THROWING(IDACalcICB, m->mem, m->whichB,
t0_, m->v_xz, m->v_xzdot);
559 THROWING(IDAGetConsistentICB, m->mem, m->whichB, m->v_adj_xz, m->v_adj_xzdot);
564 double* adj_x,
double* adj_p,
double* adj_u)
const {
571 if (m->t_next < m->t) {
573 THROWING(IDASolveB, m->mem, m->t_next, IDA_NORMAL);
574 THROWING(IDAGetB, m->mem, m->whichB, &tret, m->v_adj_xz, m->v_adj_xzdot);
576 THROWING(IDAGetQuadB, m->mem, m->whichB, &tret, m->v_adj_pu);
579 THROWING(IDAGetAdjY, m->mem, m->t_next, m->v_xz, m->v_xzdot);
588 IDAMem IDA_mem = IDAMem(m->mem);
589 IDAadjMem IDAADJ_mem = IDA_mem->ida_adj_mem;
590 IDABMem IDAB_mem = IDAADJ_mem->IDAB_mem;
591 THROWING(IDAGetIntegratorStats, IDAB_mem->IDA_mem, &m->nstepsB, &m->nfevalsB,
592 &m->nlinsetupsB, &m->netfailsB, &m->qlastB, &m->qcurB, &m->hinusedB,
593 &m->hlastB, &m->hcurB, &m->tcurB);
594 THROWING(IDAGetNonlinSolvStats, IDAB_mem->IDA_mem, &m->nnitersB, &m->nncfailsB);
602 if (flag>=IDA_SUCCESS)
return;
604 char* flagname = IDAGetReturnFlagName(flag);
605 std::stringstream ss;
606 ss << module <<
" returned \"" << flagname <<
"\". Consult IDAS documentation.";
608 casadi_error(ss.str());
613 auto m =
to_mem(user_data);
615 if (s.calc_quadF(m, t, NV_DATA_S(xz), NV_DATA_S(xz) + s.nx_, NV_DATA_S(qdot)))
return 1;
618 }
catch(std::exception& e) {
619 uerr() <<
"rhsQ failed: " << e.what() << std::endl;
625 N_Vector rxzdot, N_Vector rr,
void *user_data) {
627 auto m =
to_mem(user_data);
629 if (s.calc_daeB(m, t, NV_DATA_S(xz), NV_DATA_S(xz) + s.nx_,
630 NV_DATA_S(rxz), NV_DATA_S(rxz) + s.nrx_, m->adj_q,
631 NV_DATA_S(rr), NV_DATA_S(rr) + s.nrx_))
return 1;
634 casadi_axpy(s.nrx_, 1., NV_DATA_S(rxzdot), NV_DATA_S(rr));
637 }
catch(std::exception& e) {
638 uerr() <<
"resB failed: " << e.what() << std::endl;
644 N_Vector rxzdot, N_Vector ruqdot,
void *user_data) {
646 auto m =
to_mem(user_data);
648 if (s.calc_quadB(m, t, NV_DATA_S(xz), NV_DATA_S(xz) + s.nx_,
649 NV_DATA_S(rxz), NV_DATA_S(rxz) + s.nrx_,
650 NV_DATA_S(ruqdot), NV_DATA_S(ruqdot) + s.nrq_))
return 1;
653 casadi_scal(s.nrq_ + s.nuq_, -1., NV_DATA_S(ruqdot));
656 }
catch(std::exception& e) {
657 uerr() <<
"resQB failed: " << e.what() << std::endl;
663 N_Vector rvec, N_Vector zvec,
double cj,
double delta,
void *user_data, N_Vector tmp) {
665 auto m =
to_mem(user_data);
669 double* vx = NV_DATA_S(rvec);
670 double* vz = vx + s.nx_;
671 double* v_it = m->tmp1;
672 for (
int d = 0; d <= s.nfwd_; ++d) {
680 if (s.linsolF_.solve(m->jacF, m->tmp1, 1,
false, m->mem_linsolF))
682 vx = NV_DATA_S(zvec);
690 if (s.second_order_correction_) {
694 if (s.calc_jtimesF(m, t, NV_DATA_S(xz), NV_DATA_S(xz) + s.nx_,
695 vx, vz, m->tmp2, m->tmp2 + s.nx_))
return 1;
698 v_it = m->tmp1 + s.nx1_ + s.nz1_;
699 for (
int d = 1; d <= s.nfwd_; ++d) {
700 casadi_axpy(s.nx1_, -1., m->tmp2 + d*s.nx1_, v_it);
702 casadi_axpy(s.nz1_, -1., m->tmp2 + s.nx_ + d*s.nz1_, v_it);
708 if (s.linsolF_.solve(m->jacF, m->tmp1 + s.nx1_ + s.nz1_, s.nfwd_,
709 false, m->mem_linsolF))
return 1;
712 v_it = m->tmp1 + s.nx1_ + s.nz1_;
713 for (
int d = 1; d <= s.nfwd_; ++d) {
722 }
catch(std::exception& e) {
723 uerr() <<
"psolve failed: " << e.what() << std::endl;
729 const double* rhs,
double* sol)
const {
731 double* v_it = m->
tmp1;
732 for (
int d = 0; d <=
nfwd_; ++d) {
733 for (
int a = 0; a <
nadj_; ++a) {
743 for (
int a = 0; a <
nadj_; ++a) {
762 for (
int d = 1; d <=
nfwd_; ++d) {
763 for (
int a = 0; a <
nadj_; ++a) {
778 for (
int d = 1; d <=
nfwd_; ++d) {
779 for (
int a = 0; a <
nadj_; ++a) {
792 N_Vector xzdotB, N_Vector resvalB, N_Vector rvecB,
793 N_Vector zvecB,
double cjB,
double deltaB,
794 void *user_data, N_Vector tmpB) {
796 auto m =
to_mem(user_data);
798 return s.solve_transposed(m, t, NV_DATA_S(xz), NV_DATA_S(xzB),
799 NV_DATA_S(rvecB), NV_DATA_S(zvecB));
801 }
catch(std::exception& e) {
802 uerr() <<
"psolveB failed: " << e.what() << std::endl;
807 template<
typename T1>
809 casadi_int r_begin, casadi_int c_begin, T1* w) {
811 casadi_int nrow_x, ncol_x, ncol_y, i_x, i_y, j, el, r_end;
812 const casadi_int *colind_x, *row_x, *colind_y, *row_y;
815 colind_x = sp_x+2; row_x = sp_x + 2 + ncol_x+1;
817 colind_y = sp_y+2; row_y = sp_y + 2 + ncol_y+1;
819 r_end = r_begin + nrow_x;
823 for (i_x = 0; i_x < ncol_x; ++i_x) {
827 for (el=colind_x[i_x]; el<colind_x[i_x + 1]; ++el) w[row_x[el]] = x[el];
829 for (el=colind_y[i_y]; el<colind_y[i_y + 1]; ++el) {
831 if (j >= r_begin && j < r_end) y[el] = w[j - r_begin];
834 for (el=colind_x[i_x]; el<colind_x[i_x + 1]; ++el) w[row_x[el]] = 0;
839 double cj,
void* user_data, N_Vector tmp1, N_Vector tmp2, N_Vector tmp3) {
841 auto m =
to_mem(user_data);
850 const Sparsity& sp_jacF = s.linsolF_.sparsity();
853 if (s.calc_jacF(m, t, NV_DATA_S(xz), NV_DATA_S(xz) + s.nx_,
854 m->jac_ode_x, m->jac_alg_x, m->jac_ode_z, m->jac_alg_z))
return 1;
857 casadi_int nx_jac = sp_jac_ode_x.
size1();
859 casadi_copy_block(m->jac_alg_x, sp_jac_alg_x, m->jacF, sp_jacF, nx_jac, 0, m->w);
860 casadi_copy_block(m->jac_ode_z, sp_jac_ode_z, m->jacF, sp_jacF, 0, nx_jac, m->w);
861 casadi_copy_block(m->jac_alg_z, sp_jac_alg_z, m->jacF, sp_jacF, nx_jac, nx_jac, m->w);
864 const casadi_int *colind = sp_jacF.
colind(), *row = sp_jacF.
row();
865 for (casadi_int c = 0; c < nx_jac; ++c) {
866 for (casadi_int k = colind[c]; k < colind[c + 1]; ++k) {
867 if (row[k] == c) m->jacF[k] -= cj;
872 if (s.linsolF_.nfact(m->jacF, m->mem_linsolF))
return 1;
876 }
catch(std::exception& e) {
877 uerr() <<
"psetup failed: " << e.what() << std::endl;
883 N_Vector rresval,
double cj,
void *user_data, N_Vector tmp1B, N_Vector tmp2B, N_Vector tmp3B) {
886 return psetupF(t, xz,
nullptr,
nullptr, -cj, user_data, tmp1B, tmp2B, tmp3B);
888 }
catch(std::exception& e) {
889 uerr() <<
"psetupB failed: " << e.what() << std::endl;
895 N_Vector vtemp1, N_Vector vtemp2, N_Vector vtemp3) {
897 double t = IDA_mem->ida_tn;
900 double cj = IDA_mem->ida_cj;
903 return psetupF(t, xz, xzdot,
nullptr, cj, IDA_mem->ida_lmem,
904 vtemp1, vtemp1, vtemp3);
908 N_Vector vtemp1B, N_Vector vtemp2B, N_Vector vtemp3B) {
910 auto m =
to_mem(IDA_mem->ida_lmem);
912 IDAadjMem IDAADJ_mem;
916 double t = IDA_mem->ida_tn;
918 double cj = IDA_mem->ida_cj;
920 IDA_mem =
static_cast<IDAMem
>(IDA_mem->ida_user_data);
922 IDAADJ_mem = IDA_mem->ida_adj_mem;
926 if (IDAADJ_mem->ia_noInterp==FALSE) {
927 int flag = IDAADJ_mem->ia_getY(IDA_mem, t, IDAADJ_mem->ia_yyTmp, IDAADJ_mem->ia_ypTmp,
929 if (flag != IDA_SUCCESS) casadi_error(
"Could not interpolate forward states");
932 return psetupB(t, IDAADJ_mem->ia_yyTmp, IDAADJ_mem->ia_ypTmp,
933 xzB, xzdotB,
nullptr, cj,
static_cast<void*
>(m), vtemp1B, vtemp1B, vtemp3B);
935 }
catch(std::exception& e) {
936 uerr() <<
"lsetupB failed: " << e.what() << std::endl;
942 N_Vector xzdot, N_Vector rr) {
944 auto m =
to_mem(IDA_mem->ida_lmem);
948 double t = IDA_mem->ida_tn;
951 double cj = IDA_mem->ida_cj;
957 int flag =
psolveF(t, xz, xzdot, rr, b, b, cj,
958 delta,
static_cast<void*
>(m),
nullptr);
959 if (flag)
return flag;
963 double cjratio = IDA_mem->ida_cjratio;
964 if (cjratio != 1.0) N_VScale(2.0/(1.0 + cjratio), b, b);
968 }
catch(std::exception& e) {
969 uerr() <<
"lsolve failed: " << e.what() << std::endl;
975 N_Vector xzdotB, N_Vector rrB) {
977 auto m =
to_mem(IDA_mem->ida_lmem);
979 IDAadjMem IDAADJ_mem;
984 double t = IDA_mem->ida_tn;
986 double cj = IDA_mem->ida_cj;
987 double cjratio = IDA_mem->ida_cjratio;
989 IDA_mem = (IDAMem) IDA_mem->ida_user_data;
990 IDAADJ_mem = IDA_mem->ida_adj_mem;
994 if (IDAADJ_mem->ia_noInterp==FALSE) {
995 flag = IDAADJ_mem->ia_getY(IDA_mem, t, IDAADJ_mem->ia_yyTmp, IDAADJ_mem->ia_ypTmp,
997 if (flag != IDA_SUCCESS) casadi_error(
"Could not interpolate forward states");
1004 flag =
psolveB(t, IDAADJ_mem->ia_yyTmp, IDAADJ_mem->ia_ypTmp, xzB, xzdotB,
1005 rrB, b, b, cj, delta,
static_cast<void*
>(m),
nullptr);
1006 if (flag)
return flag;
1009 if (s.cj_scaling_) {
1010 if (cjratio != 1.0) N_VScale(2.0/(1.0 + cjratio), b, b);
1013 }
catch(std::exception& e) {
1014 uerr() <<
"lsolveB failed: " << e.what() << std::endl;
1020 this->
mem =
nullptr;
1030 if (this->
mem) IDAFree(&this->
mem);
1037 int version = s.
version(
"IdasInterface", 1, 2);
1056 s.
version(
"IdasInterface", 2);
1065 s.
pack(
"IdasInterface::y_c",
y_c_);
Helper class for Serialization.
void unpack(Sparsity &e)
Reconstruct an object from the input stream.
void version(const std::string &name, int v)
void alloc_w(size_t sz_w, bool persistent=false)
Ensure required length of w field.
std::vector< std::string > get_function() const
Get a list of all functions.
const Sparsity & sparsity_out(casadi_int ind) const
Get sparsity of a given output.
'idas' plugin for Integrator
static int rhsQF(double t, N_Vector xz, N_Vector xzdot, N_Vector qdot, void *user_data)
static int jtimesB(double t, N_Vector xz, N_Vector xzdot, N_Vector xzB, N_Vector xzdotB, N_Vector resvalB, N_Vector vB, N_Vector JvB, double cjB, void *user_data, N_Vector tmp1B, N_Vector tmp2B)
int init_mem(void *mem) const override
Initalize memory block.
static int resF(double t, N_Vector xz, N_Vector xzdot, N_Vector rr, void *user_data)
void retreat(IntegratorMemory *mem, const double *u, double *adj_x, double *adj_p, double *adj_u) const override
Retreat solution in time.
void resetB(IntegratorMemory *mem) const override
Reset the backward problem and take time to tf.
void serialize_body(SerializingStream &s) const override
Serialize an object without type information.
int solve_transposed(IdasMemory *m, double t, const double *xz, const double *rxz, const double *rhs, double *sol) const
Solve transposed linear system.
void impulseB(IntegratorMemory *mem, const double *adj_x, const double *adj_z, const double *adj_q) const override
Introduce an impulse into the backwards integration at the current time.
static void idas_error(const char *module, int flag)
std::vector< double > init_xdot_
static int psetupB(double t, N_Vector xz, N_Vector xzdot, N_Vector rxz, N_Vector rxzdot, N_Vector resvalB, double cjB, void *user_dataB, N_Vector tmp1B, N_Vector tmp2B, N_Vector tmp3B)
static int lsolveB(IDAMem IDA_mem, N_Vector b, N_Vector weight, N_Vector ycur, N_Vector xzdotcur, N_Vector rescur)
static int lsetupF(IDAMem IDA_mem, N_Vector xz, N_Vector xzdot, N_Vector resp, N_Vector vtemp1, N_Vector vtemp2, N_Vector vtemp3)
static const std::string meta_doc
A documentation string.
static int lsolveF(IDAMem IDA_mem, N_Vector b, N_Vector weight, N_Vector ycur, N_Vector xzdotcur, N_Vector rescur)
static int resB(double t, N_Vector xz, N_Vector xzdot, N_Vector rxz, N_Vector rxzdot, N_Vector rr, void *user_data)
IdasInterface(const std::string &name, const Function &dae, double t0, const std::vector< double > &tout)
Constructor.
static int rhsQB(double t, N_Vector xz, N_Vector xzdot, N_Vector rxz, N_Vector rxzdot, N_Vector ruqdot, void *user_data)
std::vector< double > abstolv_
static const Options options_
Options.
void reset(IntegratorMemory *mem, bool first_call) const override
Reset the forward solver at the start or after an event.
static int psolveF(double t, N_Vector xz, N_Vector xzdot, N_Vector rr, N_Vector rvec, N_Vector zvec, double cj, double delta, void *user_data, N_Vector tmp)
static Integrator * creator(const std::string &name, const Function &dae, double t0, const std::vector< double > &tout)
Create a new integrator.
void init(const Dict &opts) override
Initialize.
static int psetupF(double t, N_Vector xz, N_Vector xzdot, N_Vector rr, double cj, void *user_data, N_Vector tmp1, N_Vector tmp2, N_Vector tmp3)
static void ehfun(int error_code, const char *module, const char *function, char *msg, void *eh_data)
~IdasInterface() override
Destructor.
static int lsetupB(IDAMem IDA_mem, N_Vector xz, N_Vector xzdot, N_Vector resp, N_Vector vtemp1, N_Vector vtemp2, N_Vector vtemp3)
static IdasMemory * to_mem(void *mem)
Cast to memory object.
static int psolveB(double t, N_Vector xz, N_Vector xzdot, N_Vector rxz, N_Vector rxzdot, N_Vector resvalB, N_Vector rvecB, N_Vector zvecB, double cjB, double deltaB, void *user_dataB, N_Vector tmpB)
void z_impulseB(IdasMemory *m, const double *adj_z) const
Propagate impulse from adj_z to adj_x.
std::vector< casadi_int > y_c_
int advance_noevent(IntegratorMemory *mem) const override
Advance solution in time.
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize into MX.
static int jtimesF(double t, N_Vector xz, N_Vector xzdot, N_Vector rr, N_Vector v, N_Vector Jv, double cj, void *user_data, N_Vector tmp1, N_Vector tmp2)
casadi_int nfwd_
Number of sensitivities.
casadi_int nrx_
Number of states for the backward integration.
casadi_int nt() const
Number of output times.
Dict opts_
Copy of the options.
static bool all_zero(const double *v, casadi_int n)
Helper function: Vector has only zeros?
std::vector< double > tout_
Output time grid.
casadi_int nu_
Number of controls.
casadi_int nx_
Number of states for the forward integration.
DM solve(const DM &A, const DM &B, bool tr=false) const
static void registerPlugin(const Plugin &plugin, bool needs_lock=true)
Register an integrator in the factory.
bool verbose_
Verbose printout.
void clear_mem()
Clear all memory (called from destructor)
Helper class for Serialization.
void version(const std::string &name, int v)
void pack(const Sparsity &e)
Serializes an object to the output stream.
casadi_int size1() const
Get the number of rows.
const casadi_int * row() const
Get a reference to row-vector,.
const casadi_int * colind() const
Get a reference to the colindex of all column element (see class description)
Linsol linsolF_
Linear solver.
enum casadi::SundialsInterface::InterpType interp_
void impulseB(IntegratorMemory *mem, const double *adj_x, const double *adj_z, const double *adj_q) const override
Introduce an impulse into the backwards integration at the current time.
double nonlin_conv_coeff_
void serialize_body(SerializingStream &s) const override
Serialize an object without type information.
enum casadi::SundialsInterface::NewtonScheme newton_scheme_
void reset(IntegratorMemory *mem, bool first_call) const override
Reset the forward solver at the start or after an event.
casadi_int max_multistep_order_
int init_mem(void *mem) const override
Initalize memory block.
void add_offsets(SundialsMemory *m) const
Add stats offsets to stats.
casadi_int max_num_steps_
bool second_order_correction_
void init(const Dict &opts) override
Initialize.
void resetB(IntegratorMemory *mem) const override
Reset the backward problem and take time to tf.
casadi_int steps_per_checkpoint_
int calc_daeB(SundialsMemory *m, double t, const double *x, const double *z, const double *adj_ode, const double *adj_alg, const double *adj_quad, double *adj_x, double *adj_z) const
static const Options options_
Options.
int CASADI_INTEGRATOR_IDAS_EXPORT casadi_register_integrator_idas(Integrator::Plugin *plugin)
void CASADI_INTEGRATOR_IDAS_EXPORT casadi_load_integrator_idas()
void casadi_copy(const T1 *x, casadi_int n, T1 *y)
COPY: y <-x.
std::string str(const T &v)
String representation, any type.
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.
void casadi_copy_block(const T1 *x, const casadi_int *sp_x, T1 *y, const casadi_int *sp_y, casadi_int r_begin, casadi_int c_begin, T1 *w)
const double nan
Not a number.
void casadi_scal(casadi_int n, T1 alpha, T1 *x)
SCAL: x <- alpha*x.
void casadi_axpy(casadi_int n, T1 alpha, const T1 *x, T1 *y)
AXPY: y <- a*x + y.
void casadi_clear(T1 *x, casadi_int n)
CLEAR: x <- 0.
void * mem
Idas memory block.
double cj_last
cj used in the last factorization
IdasMemory(const IdasInterface &s)
Constructor.
Options metadata for a class.
int mem_linsolF
Linear solver memory objects.
int ncheck
number of checkpoints stored so far