32 IVP_ODE_X, IVP_ALG_X, IVP_QUAD_X,
33 IVP_ODE_Z, IVP_ALG_Z, IVP_QUAD_Z,
34 IVP_ODE_T, IVP_ALG_T, IVP_QUAD_T,
74 } casadi_ivp_control_t;
106 } casadi_ivp_record_t;
109 template<
typename T1>
145 casadi_int
nx,
nz,
nq,
nu,
nrx,
nrz,
nrq,
nrp,
nru,
ny,
nr;
154 casadi_int casadi_ivp_nnz(
const casadi_int* sp) {
156 return sp ? sp[2 + sp[1]] : 0;
160 template<
typename T1>
178 for (k = 0; k < IVP_NUM_JAC; ++k) {
186 template<
typename T1>
271 template<
typename T1>
273 casadi_int* sz_res, casadi_int* sz_iw, casadi_int* sz_w) {
279 *sz_w += p->
nu + p->
nru;
287 if (p->
ne > 0) *sz_w += 8 * p->
ne + p->
ny;
291 template<
typename T1>
293 casadi_int** iw, T1** w) {
295 d->
y = *w; *w += p->
ny;
297 d->
y0 = *w; *w += p->
ny;
301 d->
ry = *w; *w += p->
nr;
303 d->
ry0 = *w; *w += p->
nr;
304 d->
seed = *w; *w += p->
nr;
319 d->
e0 = *w; *w += p->
ne;
320 d->
e1 = *w; *w += p->
ne;
321 d->
em = *w; *w += p->
ne;
325 d->
edot = *w; *w += p->
ne;
326 d->
ev_w = *w; *w += p->
ne;
327 d->
ydot = *w; *w += p->
ny;
351 template<
typename T1>
357 template<
typename T1>
370 casadi_ivp_clear_stats(d);
381 casadi_copy(d->
y, pn->
nx, d->
nom->y);
382 casadi_copy(d->
y + p->
nx, pn->
nz, d->
nom->y + pn->
nx);
383 casadi_copy(d->
y + p->
nx + p->
nz, pn->
nq, d->
nom->y + pn->
nx + pn->
nz);
385 casadi_ivp_reset(d->
nom, t, u, first_call);
390 template<
typename T1>
391 casadi_int casadi_ivp_steps(T1 len, T1 step_size) {
393 casadi_int n =
static_cast<casadi_int
>(ceil(len / step_size - 1e-9));
394 return n < 1 ? 1 : n;
398 template<
typename T1>
414 template<
typename T1>
422 d->
next = IVP_ADVANCE;
426 casadi_ivp_advance(d->
nom, t_out, t_stop, 0);
432 template<
typename T1>
435 casadi_clear(d->
ry, p->
nr);
443 template<
typename T1>
449 d->
next = IVP_RETREAT;
453 template<
typename T1>
458 d->
next = IVP_IMPULSE;
462 template<
typename T1>
473 template<
typename T1>
478 return casadi_ivp_request(d, IVP_STEP_CONTROL, next);
482 template<
typename T1>
490 template<
typename T1>
492 casadi_int ndir, casadi_int dir) {
494 const casadi_int* off = d->
prob->jac_off;
495 return jac + ndir * off[k] + dir * (off[k + 1] - off[k]);
499 template<
typename T1>
501 casadi_int dir,
const T1* v, T1* r,
int tr) {
504 const T1* nz = dir < 0 ? casadi_ivp_jac_nz(d, d->
jac, k, 1, 0)
505 : casadi_ivp_jac_nz(d, d->jac_fwd, k, p->nfwd, dir);
506 casadi_mv(nz, p->
sp_jac[k], v, r, tr);
510 template<
typename T1>
515 casadi_axpy(p->
nrx, 1., d->
vjp_x, r);
523 template<
typename T1>
537 template<
typename T1>
542 casadi_int n = (record == IVP_RECORD_STEP ? p->
ny * p->
n_stages : 0) + p->
ny + p->
nu + 5;
543 if (record == IVP_RECORD_STEP && p->
ne > 0) n += p->
ny + p->
nu + 5;
549 template<
typename T1>
550 int casadi_ivp_reserve(
casadi_ivp_data<T1>* d, casadi_ivp_record_t record, casadi_int next) {
552 if (!d->
taping || !casadi_ivp_tape_full(d, record))
return -1;
553 if (d->
prob->tape_size > 0)
return casadi_ivp_stop(d, IVP_TAPE_FAILED);
554 return casadi_ivp_request(d, IVP_TAPE_RESERVE, next);
558 template<
typename T1>
564 casadi_copy(d->
U, n_u, rec);
566 casadi_copy(y0, p->
ny, rec);
568 rec += p->
ny + p->
nu;
578 template<
typename T1>
586 d->
record =
static_cast<casadi_ivp_record_t
>(
static_cast<int>(rec[-1]));
592 rec -= p->
ny + p->
nu + 5;
593 casadi_copy(rec, p->
ny, d->
y0);
595 casadi_copy(rec - n_u, n_u, d->
U);
598 casadi_clear(d->
ry0, p->
nr);
608 template<
typename T1>
615 for (j = 0; j < i; ++j)
if (a[j] != 0) casadi_axpy(p->
ny, a[j], d->
U + j * p->
ny, d->
y_stage);
619 template<
typename T1>
626 for (q = 0; q < p->
n_dense; ++q) {
633 template<
typename T1>
637 casadi_ivp_dense_weights(d, (t - d->
t0) / d->
h);
638 casadi_copy(d->
y0, p->
ny, y);
643 template<
typename T1>
659 template<
typename T1>
660 int casadi_ivp_isfinite(T1 x) {
666 template<
typename T1>
675 template<
typename T1>
678 return d->
prob->step_size > 0 || d->
nom != 0;
686 template<
typename T1>
694 casadi_ivp_interpolate(d, d->
t_out, d->
y_out);
699 template<
typename T1>
714 d->
record = IVP_RECORD_STEP;
715 casadi_ivp_tape_push(d, d->
y0, d->
h, d->
t0, d->
t);
721 template<
typename T1>
727 if (d->
status != IVP_SUCCESS)
return casadi_ivp_stop(d, d->
status);
729 if (!d->
record_pending && casadi_ivp_tape_pop(d))
return casadi_ivp_stop(d, IVP_SUCCESS);
736 if (d->
record == IVP_RECORD_EVENT ? r <= d->t_out : r < d->t_start) {
739 return casadi_ivp_stop(d, IVP_SUCCESS);
747 template<
typename T1>
752 for (i = 0; i < p->
n_stages; ++i) casadi_axpy(p->
nr, p->
m[i], d->
ry, d->
rU + i * p->
nr);
753 casadi_axpy(p->
nr, 1., d->
ry0, d->
ry);
759 template<
typename T1>
769 casadi_axpy(p->
nr, 1., d->
seed, d->
ry);
770 return casadi_ivp_stop(d, IVP_SUCCESS);
casadi_ivp_data< T1 > * active
casadi_ivp_record_t record
const casadi_ivp_prob< T1 > * prob
casadi_ivp_control_t control
casadi_int n_steps_interval
casadi_ivp_data< T1 > * nom
const casadi_int * sp_jac[IVP_NUM_JAC]
casadi_int max_event_iter
casadi_int jac_off[IVP_NUM_JAC+1]