39 ERK_STEP_BEGIN = IVP_NUM_ENTRY,
41 ERK_STEP_INITIAL_SIZE,
72 casadi_ivp_stage_argument(d, d->
stage);
76 return casadi_ivp_request(d, IVP_EVAL_RHS, ERK_STAGE);
85 casadi_copy(d->
y, p->
ny, d->
y0);
93 return casadi_erk_stage_request(d);
106 casadi_ivp_begin_run(d);
109 d->
next = ERK_STEP_BEGIN;
110 return casadi_erk_forward(d, e);
112 if (d->
fail)
return casadi_ivp_stop(d, IVP_TAPE_FAILED);
114 if (!d->
pause) casadi_ivp_output(d);
115 return casadi_ivp_stop(d, IVP_SUCCESS);
120 d->
next = IVP_ADVANCE;
121 return casadi_erk_forward(d, e);
123 if (casadi_ivp_step_limit(d))
return casadi_ivp_stop(d, IVP_MAX_NUM_STEPS);
124 if ((ret = casadi_ivp_reserve(d, IVP_RECORD_STEP, ERK_STEP_BEGIN)) >= 0)
return ret;
128 d->
next = ERK_STEP_REPLAY;
129 return casadi_erk_forward(d, e);
131 if (d->
prob->step_size > 0) {
133 return casadi_erk_step_start(d, e);
135 return casadi_ivp_request_control(d, IVP_CONTROL_SIZE, ERK_STEP_SIZE);
137 if (d->
h > 0)
return casadi_erk_step_start(d, e);
142 return casadi_ivp_request(d, IVP_EVAL_RHS, ERK_STEP_INITIAL_SIZE);
143 case ERK_STEP_INITIAL_SIZE:
144 if (d->
fail)
return casadi_ivp_stop(d, IVP_EVAL_FAILED);
148 return casadi_ivp_request_control(d, IVP_CONTROL_INIT, ERK_STEP_SIZE);
149 case ERK_STEP_REPLAY:
151 if (casadi_erk(d->
nom, e->
nom)) {
156 if (d->
nom->status != IVP_SUCCESS)
return casadi_ivp_stop(d, d->
nom->status);
157 if (d->
nom->next == IVP_DONE)
return casadi_ivp_stop(d, IVP_EVAL_FAILED);
159 return casadi_erk_step_start(d, e);
166 if (casadi_ivp_prescribed(d))
return casadi_ivp_stop(d, IVP_EVAL_FAILED);
167 return casadi_ivp_request_control(d, IVP_CONTROL_FAIL, ERK_STEP_CHECK);
171 if (++d->
stage < p->
n_stages)
return casadi_erk_stage_request(d);
177 casadi_copy(d->
y0, p->
ny, d->
y);
180 if (!casadi_ivp_prescribed(d)) {
181 return casadi_ivp_request_control(d, IVP_CONTROL_TEST, ERK_STEP_CHECK);
184 d->
next = ERK_STEP_CHECK;
185 return casadi_erk_forward(d, e);
187 if (d->
status != IVP_SUCCESS)
return casadi_ivp_stop(d, d->
status);
190 d->
next = ERK_STEP_BEGIN;
191 return casadi_erk_forward(d, e);
194 casadi_ivp_accept(d);
195 if (p->
ne > 0)
return casadi_ivp_request(d, IVP_EVENT, ERK_STEP_EVENT);
196 d->
next = ERK_STEP_EVENT;
197 return casadi_erk_forward(d, e);
199 if (d->
status != IVP_SUCCESS)
return casadi_ivp_stop(d, d->
status);
200 d->
next = ERK_STEP_BEGIN;
206 return casadi_erk_forward(d, e);
213 template<
typename T1>
221 if (!casadi_ivp_back_begin(d))
return 0;
222 if (d->
record == IVP_RECORD_EVENT)
return casadi_ivp_request(d, IVP_EVENT_ADJ, IVP_RETREAT);
223 casadi_ivp_back_step_begin(d);
224 d->
next = ERK_BACK_STAGE;
225 return casadi_erk_backward(d, e);
230 d->
next = IVP_RETREAT;
231 return casadi_erk_backward(d, e);
235 rUi = d->
rU + i * p->
nr;
237 casadi_ivp_stage_argument(d, i);
238 casadi_ivp_clear_vjp(d);
242 return casadi_ivp_request(d, IVP_EVAL_VJP, ERK_BACK_SPREAD);
243 case ERK_BACK_SPREAD:
245 if (d->
fail)
return casadi_ivp_stop(d, IVP_EVAL_FAILED);
248 casadi_ivp_add_vjp(d, d->
ry);
249 for (j = 0; j < i; ++j) {
250 if (p->
a[i * s + j] != 0) casadi_axpy(p->
nrx, p->
a[i * s + j], d->
vjp_x, d->
rU + j * p->
nr);
252 d->
next = ERK_BACK_STAGE;
253 return casadi_erk_backward(d, e);
256 if (casadi_ivp_impulse_begin(d)) {
257 casadi_ivp_seed_stages(d);
258 return casadi_ivp_stop(d, IVP_SUCCESS);
266 template<
typename T1>
269 if (d->
next == IVP_IMPULSE || d->
next == IVP_RETREAT || d->
next >= ERK_BACK_STAGE) {
270 return casadi_erk_backward(d, e);
272 return casadi_erk_forward(d, e);
void casadi_scal(casadi_int n, T1 alpha, T1 *x)
SCAL: x <- alpha*x.
casadi_erk_data< T1 > * nom
const casadi_erk_prob< T1 > * prob
casadi_ivp_data< T1 > * active
casadi_ivp_record_t record
const casadi_ivp_prob< T1 > * prob
casadi_ivp_data< T1 > * nom