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;
378 if (first_call ||
ne_ > 0) {
381 N_VConst(0.0, m->v_xzdot);
385 THROWING(IDAReInit, m->mem, m->t, m->v_xz, m->v_xzdot);
388 if (
nq1_ > 0) THROWING(IDAQuadReInit, m->mem, m->v_q);
392 THROWING(IDACalcIC, m->mem, IDA_YA_YDP_INIT ,
first_time_);
393 THROWING(IDAGetConsistentIC, m->mem, m->v_xz, m->v_xzdot);
398 if (first_call &&
nadj_ > 0) THROWING(IDAAdjReInit, m->mem);
407 if (m->t_stop >= m->tcur) {
408 THROWING(IDASetStopTime, m->mem, m->t_stop);
413 if (fabs(m->t - m->t_next) >= ttol) {
417 THROWING(IDASolveF, m->mem, m->t_next, &tret, m->v_xz, m->v_xzdot, IDA_NORMAL, &m->ncheck);
419 THROWING(IDASolve, m->mem, m->t_next, &tret, m->v_xz, m->v_xzdot, IDA_NORMAL);
422 if (
nq1_ > 0) THROWING(IDAGetQuad, m->mem, &tret, m->v_q);
430 THROWING(IDAGetIntegratorStats, m->mem, &m->nsteps, &m->nfevals, &m->nlinsetups,
431 &m->netfails, &m->qlast, &m->qcur, &m->hinused, &m->hlast, &m->hcur, &m->tcur);
432 THROWING(IDAGetNonlinSolvStats, m->mem, &m->nniters, &m->nncfails);
442 N_VConst(0.0, m->v_adj_xz);
448 N_VConst(0.0, m->v_adj_xzdot);
468 casadi_error(
"Linear system factorization for backwards initial conditions failed");
474 casadi_error(
"Linear system solve for backwards initial conditions failed");
480 casadi_error(
"Adjoint seed propagation for backwards initial conditions failed");
487 for (
double s : {-1., 1.}) {
490 casadi_error(
"Adjoint seed propagation for backwards initial conditions failed");
498 const double* adj_x,
const double* adj_z,
const double* adj_q)
const {
507 if (m->first_callB) {
509 THROWING(IDACreateB, m->mem, &m->whichB);
510 THROWING(IDAInitB, m->mem, m->whichB,
resB, m->t, m->v_adj_xz, m->v_adj_xzdot);
512 THROWING(IDASetUserDataB, m->mem, m->whichB, m);
517 N_Vector
id = N_VNew_Serial(
nrx_+
nrz_);
518 std::fill_n(NV_DATA_S(
id),
nrx_, 1);
519 std::fill_n(NV_DATA_S(
id)+
nrx_,
nrz_, 0);
520 THROWING(IDASetIdB, m->mem, m->whichB,
id);
521 N_VDestroy_Serial(
id);
526 IDAMem IDA_mem = IDAMem(m->mem);
527 IDAadjMem IDAADJ_mem = IDA_mem->ida_adj_mem;
528 IDABMem IDAB_mem = IDAADJ_mem->IDAB_mem;
529 IDAB_mem->ida_lmem = m;
530 IDAB_mem->IDA_mem->ida_lmem = m;
531 IDAB_mem->IDA_mem->ida_lsetup =
lsetupB;
532 IDAB_mem->IDA_mem->ida_lsolve =
lsolveB;
533 IDAB_mem->IDA_mem->ida_setupNonNull = TRUE;
542 THROWING(IDASpilsSetJacTimesVecFnB, m->mem, m->whichB,
jtimesB);
548 THROWING(IDAQuadInitB, m->mem, m->whichB,
rhsQB, m->v_adj_pu);
550 THROWING(IDASetQuadErrConB, m->mem, m->whichB,
true);
551 THROWING(IDAQuadSStolerancesB, m->mem, m->whichB,
reltol_,
abstol_);
556 m->first_callB =
false;
559 THROWING(IDAReInitB, m->mem, m->whichB, m->t, m->v_adj_xz, m->v_adj_xzdot);
563 void* memB = IDAGetAdjIDABmem(m->mem, m->whichB);
564 THROWING(IDAQuadReInit, memB, m->v_adj_pu);
570 THROWING(IDACalcICB, m->mem, m->whichB,
t0_, m->v_xz, m->v_xzdot);
571 THROWING(IDAGetConsistentICB, m->mem, m->whichB, m->v_adj_xz, m->v_adj_xzdot);
576 double* adj_x,
double* adj_p,
double* adj_u)
const {
583 if (m->t_next < m->t) {
585 THROWING(IDASolveB, m->mem, m->t_next, IDA_NORMAL);
586 THROWING(IDAGetB, m->mem, m->whichB, &tret, m->v_adj_xz, m->v_adj_xzdot);
588 THROWING(IDAGetQuadB, m->mem, m->whichB, &tret, m->v_adj_pu);
591 THROWING(IDAGetAdjY, m->mem, m->t_next, m->v_xz, m->v_xzdot);
600 IDAMem IDA_mem = IDAMem(m->mem);
601 IDAadjMem IDAADJ_mem = IDA_mem->ida_adj_mem;
602 IDABMem IDAB_mem = IDAADJ_mem->IDAB_mem;
603 THROWING(IDAGetIntegratorStats, IDAB_mem->IDA_mem, &m->nstepsB, &m->nfevalsB,
604 &m->nlinsetupsB, &m->netfailsB, &m->qlastB, &m->qcurB, &m->hinusedB,
605 &m->hlastB, &m->hcurB, &m->tcurB);
606 THROWING(IDAGetNonlinSolvStats, IDAB_mem->IDA_mem, &m->nnitersB, &m->nncfailsB);
614 if (flag>=IDA_SUCCESS)
return;
616 char* flagname = IDAGetReturnFlagName(flag);
617 std::stringstream ss;
618 ss << module <<
" returned \"" << flagname <<
"\". Consult IDAS documentation.";
620 casadi_error(ss.str());
625 auto m =
to_mem(user_data);
627 if (s.calc_quadF(m, t, NV_DATA_S(xz), NV_DATA_S(xz) + s.nx_, NV_DATA_S(qdot)))
return 1;
630 }
catch(std::exception& e) {
631 uerr() <<
"rhsQ failed: " << e.what() << std::endl;
637 N_Vector rxzdot, N_Vector rr,
void *user_data) {
639 auto m =
to_mem(user_data);
641 if (s.calc_daeB(m, t, NV_DATA_S(xz), NV_DATA_S(xz) + s.nx_,
642 NV_DATA_S(rxz), NV_DATA_S(rxz) + s.nrx_, m->adj_q,
643 NV_DATA_S(rr), NV_DATA_S(rr) + s.nrx_))
return 1;
646 casadi_axpy(s.nrx_, 1., NV_DATA_S(rxzdot), NV_DATA_S(rr));
649 }
catch(std::exception& e) {
650 uerr() <<
"resB failed: " << e.what() << std::endl;
656 N_Vector rxzdot, N_Vector ruqdot,
void *user_data) {
658 auto m =
to_mem(user_data);
660 if (s.calc_quadB(m, t, NV_DATA_S(xz), NV_DATA_S(xz) + s.nx_,
661 NV_DATA_S(rxz), NV_DATA_S(rxz) + s.nrx_,
662 NV_DATA_S(ruqdot), NV_DATA_S(ruqdot) + s.nrq_))
return 1;
665 casadi_scal(s.nrq_ + s.nuq_, -1., NV_DATA_S(ruqdot));
668 }
catch(std::exception& e) {
669 uerr() <<
"resQB failed: " << e.what() << std::endl;
675 N_Vector rvec, N_Vector zvec,
double cj,
double delta,
void *user_data, N_Vector tmp) {
677 auto m =
to_mem(user_data);
681 double* vx = NV_DATA_S(rvec);
682 double* vz = vx + s.nx_;
683 double* v_it = m->tmp1;
684 for (
int d = 0; d <= s.nfwd_; ++d) {
692 if (s.linsolF_.solve(m->jacF, m->tmp1, 1,
false, m->mem_linsolF))
694 vx = NV_DATA_S(zvec);
702 if (s.second_order_correction_) {
706 if (s.calc_jtimesF(m, t, NV_DATA_S(xz), NV_DATA_S(xz) + s.nx_,
707 vx, vz, m->tmp2, m->tmp2 + s.nx_))
return 1;
710 v_it = m->tmp1 + s.nx1_ + s.nz1_;
711 for (
int d = 1; d <= s.nfwd_; ++d) {
712 casadi_axpy(s.nx1_, -1., m->tmp2 + d*s.nx1_, v_it);
714 casadi_axpy(s.nz1_, -1., m->tmp2 + s.nx_ + d*s.nz1_, v_it);
720 if (s.linsolF_.solve(m->jacF, m->tmp1 + s.nx1_ + s.nz1_, s.nfwd_,
721 false, m->mem_linsolF))
return 1;
724 v_it = m->tmp1 + s.nx1_ + s.nz1_;
725 for (
int d = 1; d <= s.nfwd_; ++d) {
734 }
catch(std::exception& e) {
735 uerr() <<
"psolve failed: " << e.what() << std::endl;
741 const double* rhs,
double* sol)
const {
743 double* v_it = m->
tmp1;
744 for (
int d = 0; d <=
nfwd_; ++d) {
745 for (
int a = 0; a <
nadj_; ++a) {
755 for (
int a = 0; a <
nadj_; ++a) {
774 for (
int d = 1; d <=
nfwd_; ++d) {
775 for (
int a = 0; a <
nadj_; ++a) {
790 for (
int d = 1; d <=
nfwd_; ++d) {
791 for (
int a = 0; a <
nadj_; ++a) {
804 N_Vector xzdotB, N_Vector resvalB, N_Vector rvecB,
805 N_Vector zvecB,
double cjB,
double deltaB,
806 void *user_data, N_Vector tmpB) {
808 auto m =
to_mem(user_data);
810 return s.solve_transposed(m, t, NV_DATA_S(xz), NV_DATA_S(xzB),
811 NV_DATA_S(rvecB), NV_DATA_S(zvecB));
813 }
catch(std::exception& e) {
814 uerr() <<
"psolveB failed: " << e.what() << std::endl;
819 template<
typename T1>
821 casadi_int r_begin, casadi_int c_begin, T1* w) {
823 casadi_int nrow_x, ncol_x, ncol_y, i_x, i_y, j, el, r_end;
824 const casadi_int *colind_x, *row_x, *colind_y, *row_y;
827 colind_x = sp_x+2; row_x = sp_x + 2 + ncol_x+1;
829 colind_y = sp_y+2; row_y = sp_y + 2 + ncol_y+1;
831 r_end = r_begin + nrow_x;
835 for (i_x = 0; i_x < ncol_x; ++i_x) {
839 for (el=colind_x[i_x]; el<colind_x[i_x + 1]; ++el) w[row_x[el]] = x[el];
841 for (el=colind_y[i_y]; el<colind_y[i_y + 1]; ++el) {
843 if (j >= r_begin && j < r_end) y[el] = w[j - r_begin];
846 for (el=colind_x[i_x]; el<colind_x[i_x + 1]; ++el) w[row_x[el]] = 0;
851 double cj,
void* user_data, N_Vector tmp1, N_Vector tmp2, N_Vector tmp3) {
853 auto m =
to_mem(user_data);
862 const Sparsity& sp_jacF = s.linsolF_.sparsity();
865 if (s.calc_jacF(m, t, NV_DATA_S(xz), NV_DATA_S(xz) + s.nx_,
866 m->jac_ode_x, m->jac_alg_x, m->jac_ode_z, m->jac_alg_z))
return 1;
869 casadi_int nx_jac = sp_jac_ode_x.
size1();
871 casadi_copy_block(m->jac_alg_x, sp_jac_alg_x, m->jacF, sp_jacF, nx_jac, 0, m->w);
872 casadi_copy_block(m->jac_ode_z, sp_jac_ode_z, m->jacF, sp_jacF, 0, nx_jac, m->w);
873 casadi_copy_block(m->jac_alg_z, sp_jac_alg_z, m->jacF, sp_jacF, nx_jac, nx_jac, m->w);
876 const casadi_int *colind = sp_jacF.
colind(), *row = sp_jacF.
row();
877 for (casadi_int c = 0; c < nx_jac; ++c) {
878 for (casadi_int k = colind[c]; k < colind[c + 1]; ++k) {
879 if (row[k] == c) m->jacF[k] -= cj;
884 if (s.linsolF_.nfact(m->jacF, m->mem_linsolF))
return 1;
888 }
catch(std::exception& e) {
889 uerr() <<
"psetup failed: " << e.what() << std::endl;
895 N_Vector rresval,
double cj,
void *user_data, N_Vector tmp1B, N_Vector tmp2B, N_Vector tmp3B) {
898 return psetupF(t, xz,
nullptr,
nullptr, -cj, user_data, tmp1B, tmp2B, tmp3B);
900 }
catch(std::exception& e) {
901 uerr() <<
"psetupB failed: " << e.what() << std::endl;
907 N_Vector vtemp1, N_Vector vtemp2, N_Vector vtemp3) {
909 double t = IDA_mem->ida_tn;
912 double cj = IDA_mem->ida_cj;
915 return psetupF(t, xz, xzdot,
nullptr, cj, IDA_mem->ida_lmem,
916 vtemp1, vtemp1, vtemp3);
920 N_Vector vtemp1B, N_Vector vtemp2B, N_Vector vtemp3B) {
922 auto m =
to_mem(IDA_mem->ida_lmem);
924 IDAadjMem IDAADJ_mem;
928 double t = IDA_mem->ida_tn;
930 double cj = IDA_mem->ida_cj;
932 IDA_mem =
static_cast<IDAMem
>(IDA_mem->ida_user_data);
934 IDAADJ_mem = IDA_mem->ida_adj_mem;
938 if (IDAADJ_mem->ia_noInterp==FALSE) {
939 int flag = IDAADJ_mem->ia_getY(IDA_mem, t, IDAADJ_mem->ia_yyTmp, IDAADJ_mem->ia_ypTmp,
941 if (flag != IDA_SUCCESS) casadi_error(
"Could not interpolate forward states");
944 return psetupB(t, IDAADJ_mem->ia_yyTmp, IDAADJ_mem->ia_ypTmp,
945 xzB, xzdotB,
nullptr, cj,
static_cast<void*
>(m), vtemp1B, vtemp1B, vtemp3B);
947 }
catch(std::exception& e) {
948 uerr() <<
"lsetupB failed: " << e.what() << std::endl;
954 N_Vector xzdot, N_Vector rr) {
956 auto m =
to_mem(IDA_mem->ida_lmem);
960 double t = IDA_mem->ida_tn;
963 double cj = IDA_mem->ida_cj;
969 int flag =
psolveF(t, xz, xzdot, rr, b, b, cj,
970 delta,
static_cast<void*
>(m),
nullptr);
971 if (flag)
return flag;
975 double cjratio = IDA_mem->ida_cjratio;
976 if (cjratio != 1.0) N_VScale(2.0/(1.0 + cjratio), b, b);
980 }
catch(std::exception& e) {
981 uerr() <<
"lsolve failed: " << e.what() << std::endl;
987 N_Vector xzdotB, N_Vector rrB) {
989 auto m =
to_mem(IDA_mem->ida_lmem);
991 IDAadjMem IDAADJ_mem;
996 double t = IDA_mem->ida_tn;
998 double cj = IDA_mem->ida_cj;
999 double cjratio = IDA_mem->ida_cjratio;
1001 IDA_mem = (IDAMem) IDA_mem->ida_user_data;
1002 IDAADJ_mem = IDA_mem->ida_adj_mem;
1006 if (IDAADJ_mem->ia_noInterp==FALSE) {
1007 flag = IDAADJ_mem->ia_getY(IDA_mem, t, IDAADJ_mem->ia_yyTmp, IDAADJ_mem->ia_ypTmp,
1009 if (flag != IDA_SUCCESS) casadi_error(
"Could not interpolate forward states");
1016 flag =
psolveB(t, IDAADJ_mem->ia_yyTmp, IDAADJ_mem->ia_ypTmp, xzB, xzdotB,
1017 rrB, b, b, cj, delta,
static_cast<void*
>(m),
nullptr);
1018 if (flag)
return flag;
1021 if (s.cj_scaling_) {
1022 if (cjratio != 1.0) N_VScale(2.0/(1.0 + cjratio), b, b);
1025 }
catch(std::exception& e) {
1026 uerr() <<
"lsolveB failed: " << e.what() << std::endl;
1032 this->
mem =
nullptr;
1042 if (this->
mem) IDAFree(&this->
mem);
1049 int version = s.
version(
"IdasInterface", 1, 2);
1068 s.
version(
"IdasInterface", 2);
1077 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 the names of the functions this function directly owns.
const Sparsity & sparsity_out(casadi_int ind) const
Get the sparsity pattern of an output, by index or name.
'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.
casadi_int ne_
Number of of zero-crossing functions.
DM solve(const DM &A, const DM &B, bool tr=false) const
Solve the linear system A*X = B (or A'*X = B with tr true)
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
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.
int calc_quadB(SundialsMemory *m, double t, const double *x, const double *z, const double *adj_ode, const double *adj_alg, double *adj_p, double *adj_u) const
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