GNU Octave 10.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 
Loading...
Searching...
No Matches
DASPK.cc
Go to the documentation of this file.
1////////////////////////////////////////////////////////////////////////
2//
3// Copyright (C) 1996-2025 The Octave Project Developers
4//
5// See the file COPYRIGHT.md in the top-level directory of this
6// distribution or <https://octave.org/copyright/>.
7//
8// This file is part of Octave.
9//
10// Octave is free software: you can redistribute it and/or modify it
11// under the terms of the GNU General Public License as published by
12// the Free Software Foundation, either version 3 of the License, or
13// (at your option) any later version.
14//
15// Octave is distributed in the hope that it will be useful, but
16// WITHOUT ANY WARRANTY; without even the implied warranty of
17// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18// GNU General Public License for more details.
19//
20// You should have received a copy of the GNU General Public License
21// along with Octave; see the file COPYING. If not, see
22// <https://www.gnu.org/licenses/>.
23//
24////////////////////////////////////////////////////////////////////////
25
26#if defined (HAVE_CONFIG_H)
27# include "config.h"
28#endif
29
30#include <cinttypes>
31#include <sstream>
32
33#include "DASPK.h"
34#include "dMatrix.h"
35#include "f77-fcn.h"
36#include "lo-error.h"
37#include "quit.h"
38
39typedef F77_INT (*daspk_fcn_ptr) (const double&, const double *, const double *,
40 const double&, double *, F77_INT&, double *,
41 F77_INT *);
42
43typedef F77_INT (*daspk_jac_ptr) (const double&, const double *, const double *,
44 double *, const double&, double *, F77_INT *);
45
46typedef F77_INT (*daspk_psol_ptr) (const F77_INT&, const double&,
47 const double *, const double *,
48 const double *, const double&,
49 const double *, double *, F77_INT *,
50 double *, const double&, F77_INT&,
51 double *, F77_INT *);
52
53extern "C"
54{
57 F77_DBLE *, F77_DBLE *, F77_DBLE&, const F77_INT *,
58 const F77_DBLE *, const F77_DBLE *, F77_INT&,
59 F77_DBLE *, const F77_INT&, F77_INT *,
60 const F77_INT&, const F77_DBLE *, const F77_INT *,
62}
63
64static DAEFunc::DAERHSFunc user_fcn;
65static DAEFunc::DAEJacFunc user_jac;
66static F77_INT nn;
67
68static F77_INT
69ddaspk_f (const double& time, const double *state, const double *deriv,
70 const double&, double *delta, F77_INT& ires, double *, F77_INT *)
71{
72 ColumnVector tmp_deriv (nn);
73 ColumnVector tmp_state (nn);
74 ColumnVector tmp_delta (nn);
75
76 for (F77_INT i = 0; i < nn; i++)
77 {
78 tmp_deriv.elem (i) = deriv[i];
79 tmp_state.elem (i) = state[i];
80 }
81
82 octave_idx_type tmp_ires = ires;
83
84 tmp_delta = user_fcn (tmp_state, tmp_deriv, time, tmp_ires);
85
86 ires = octave::to_f77_int (tmp_ires);
87
88 if (ires >= 0)
89 {
90 if (tmp_delta.isempty ())
91 ires = -2;
92 else
93 {
94 for (F77_INT i = 0; i < nn; i++)
95 delta[i] = tmp_delta.elem (i);
96 }
97 }
98
99 return 0;
100}
101
102//NEQ, T, Y, YPRIME, SAVR, WK, CJ, WGHT,
103//C WP, IWP, B, EPLIN, IER, RPAR, IPAR)
104
105static F77_INT
106ddaspk_psol (const F77_INT&, const double&, const double *,
107 const double *, const double *, const double&,
108 const double *, double *, F77_INT *, double *,
109 const double&, F77_INT&, double *, F77_INT *)
110{
111 (*current_liboctave_error_handler) ("daspk: PSOL is not implemented");
112
113 return 0;
114}
115
116static F77_INT
117ddaspk_j (const double& time, const double *state, const double *deriv,
118 double *pd, const double& cj, double *, F77_INT *)
119{
120 // FIXME: would be nice to avoid copying the data.
121
122 ColumnVector tmp_state (nn);
123 ColumnVector tmp_deriv (nn);
124
125 for (F77_INT i = 0; i < nn; i++)
126 {
127 tmp_deriv.elem (i) = deriv[i];
128 tmp_state.elem (i) = state[i];
129 }
130
131 Matrix tmp_pd = user_jac (tmp_state, tmp_deriv, time, cj);
132
133 for (F77_INT j = 0; j < nn; j++)
134 for (F77_INT i = 0; i < nn; i++)
135 pd[nn * j + i] = tmp_pd.elem (i, j);
136
137 return 0;
138}
139
142{
143 // FIXME: should handle all this option stuff just once for each new problem.
144
145 ColumnVector retval;
146
147 if (! m_initialized || m_restart || DAEFunc::m_reset
148 || DASPK_options::m_reset)
149 {
150 m_integration_error = false;
151
152 m_initialized = true;
153
154 m_info.resize (dim_vector (20, 1));
155
156 for (F77_INT i = 0; i < 20; i++)
157 m_info(i) = 0;
158
159 F77_INT n = octave::to_f77_int (size ());
160
161 nn = n;
162
163 m_info(0) = 0;
164
165 if (m_stop_time_set)
166 {
167 m_rwork(0) = m_stop_time;
168 m_info(3) = 1;
169 }
170 else
171 m_info(3) = 0;
172
173 // DAEFunc
174
175 user_fcn = DAEFunc::function ();
176 user_jac = DAEFunc::jacobian_function ();
177
178 if (user_fcn)
179 {
180 octave_idx_type ires = 0;
181
182 ColumnVector res = (*user_fcn) (m_x, m_xdot, m_t, ires);
183
184 if (res.numel () != m_x.numel ())
185 {
186 // FIXME: Should this be a warning?
187 (*current_liboctave_error_handler)
188 ("daspk: inconsistent sizes for state and residual vectors");
189
190 m_integration_error = true;
191 return retval;
192 }
193 }
194 else
195 {
196 // FIXME: Should this be a warning?
197 (*current_liboctave_error_handler)
198 ("daspk: no user supplied RHS subroutine!");
199
200 m_integration_error = true;
201 return retval;
202 }
203
204 m_info(4) = (user_jac ? 1 : 0);
205
206 DAEFunc::m_reset = false;
207
208 octave_idx_type eiq = enforce_inequality_constraints ();
209 octave_idx_type ccic = compute_consistent_initial_condition ();
210 octave_idx_type eavfet = exclude_algebraic_variables_from_error_test ();
211
212 m_liw = 40 + n;
213 if (eiq == 1 || eiq == 3)
214 m_liw += n;
215 if (ccic == 1 || eavfet == 1)
216 m_liw += n;
217
218 m_lrw = 50 + 9*n + n*n;
219 if (eavfet == 1)
220 m_lrw += n;
221
222 m_iwork.resize (dim_vector (m_liw, 1));
223 m_rwork.resize (dim_vector (m_lrw, 1));
224
225 // DASPK_options
226
227 m_abs_tol = absolute_tolerance ();
228 m_rel_tol = relative_tolerance ();
229
230 F77_INT abs_tol_len = octave::to_f77_int (m_abs_tol.numel ());
231 F77_INT rel_tol_len = octave::to_f77_int (m_rel_tol.numel ());
232
233 if (abs_tol_len == 1 && rel_tol_len == 1)
234 {
235 m_info(1) = 0;
236 }
237 else if (abs_tol_len == n && rel_tol_len == n)
238 {
239 m_info(1) = 1;
240 }
241 else
242 {
243 // FIXME: Should this be a warning?
244 (*current_liboctave_error_handler)
245 ("daspk: inconsistent sizes for tolerance arrays");
246
247 m_integration_error = true;
248 return retval;
249 }
250
251 double hmax = maximum_step_size ();
252 if (hmax >= 0.0)
253 {
254 m_rwork(1) = hmax;
255 m_info(6) = 1;
256 }
257 else
258 m_info(6) = 0;
259
260 double h0 = initial_step_size ();
261 if (h0 >= 0.0)
262 {
263 m_rwork(2) = h0;
264 m_info(7) = 1;
265 }
266 else
267 m_info(7) = 0;
268
269 octave_idx_type maxord = maximum_order ();
270 if (maxord >= 0)
271 {
272 if (maxord > 0 && maxord < 6)
273 {
274 m_info(8) = 1;
275 m_iwork(2) = octave::to_f77_int (maxord);
276 }
277 else
278 {
279 // FIXME: Should this be a warning?
280 (*current_liboctave_error_handler)
281 ("daspk: invalid value for maximum order");
282 m_integration_error = true;
283 return retval;
284 }
285 }
286
287 switch (eiq)
288 {
289 case 1:
290 case 3:
291 {
292 Array<octave_idx_type> ict = inequality_constraint_types ();
293
294 F77_INT ict_nel = octave::to_f77_int (ict.numel ());
295
296 if (ict_nel == n)
297 {
298 for (F77_INT i = 0; i < n; i++)
299 {
300 F77_INT val = octave::to_f77_int (ict(i));
301 if (val < -2 || val > 2)
302 {
303 // FIXME: Should this be a warning?
304 (*current_liboctave_error_handler)
305 ("daspk: invalid value for inequality constraint type");
306 m_integration_error = true;
307 return retval;
308 }
309 m_iwork(40+i) = val;
310 }
311 }
312 else
313 {
314 // FIXME: Should this be a warning?
315 (*current_liboctave_error_handler)
316 ("daspk: inequality constraint types size mismatch");
317 m_integration_error = true;
318 return retval;
319 }
320 }
321 OCTAVE_FALLTHROUGH;
322
323 case 0:
324 case 2:
325 m_info(9) = octave::to_f77_int (eiq);
326 break;
327
328 default:
329 // FIXME: Should this be a warning?
330 (*current_liboctave_error_handler)
331 ("daspk: invalid value for enforce inequality constraints option");
332 m_integration_error = true;
333 return retval;
334 }
335
336 if (ccic)
337 {
338 if (ccic == 1)
339 {
340 // FIXME: this code is duplicated below.
341
342 Array<octave_idx_type> av = algebraic_variables ();
343
344 F77_INT av_nel = octave::to_f77_int (av.numel ());
345
346 if (av_nel == n)
347 {
348 F77_INT lid;
349 if (eiq == 0 || eiq == 2)
350 lid = 40;
351 else if (eiq == 1 || eiq == 3)
352 lid = 40 + n;
353 else
355 ("daspk: invalid value for eiq: "
356 "%" OCTAVE_IDX_TYPE_FORMAT, eiq);
357
358 for (F77_INT i = 0; i < n; i++)
359 m_iwork(lid+i) = (av(i) ? -1 : 1);
360 }
361 else
362 {
363 // FIXME: Should this be a warning?
364 (*current_liboctave_error_handler)
365 ("daspk: algebraic variables size mismatch");
366 m_integration_error = true;
367 return retval;
368 }
369 }
370 else if (ccic != 2)
371 {
372 // FIXME: Should this be a warning?
373 (*current_liboctave_error_handler)
374 ("daspk: invalid value for compute consistent initial condition option");
375 m_integration_error = true;
376 return retval;
377 }
378
379 m_info(10) = octave::to_f77_int (ccic);
380 }
381
382 if (eavfet)
383 {
384 m_info(15) = 1;
385
386 // FIXME: this code is duplicated above.
387
388 Array<octave_idx_type> av = algebraic_variables ();
389
390 F77_INT av_nel = octave::to_f77_int (av.numel ());
391
392 if (av_nel == n)
393 {
394 F77_INT lid;
395 if (eiq == 0 || eiq == 2)
396 lid = 40;
397 else if (eiq == 1 || eiq == 3)
398 lid = 40 + n;
399 else
401 ("daspk: invalid value for eiq: %" OCTAVE_IDX_TYPE_FORMAT,
402 eiq);
403
404 for (F77_INT i = 0; i < n; i++)
405 m_iwork(lid+i) = (av(i) ? -1 : 1);
406 }
407 }
408
409 if (use_initial_condition_heuristics ())
410 {
411 Array<double> ich = initial_condition_heuristics ();
412
413 if (ich.numel () == 6)
414 {
415 m_iwork(31) = octave::to_f77_int (octave::math::nint_big (ich(0)));
416 m_iwork(32) = octave::to_f77_int (octave::math::nint_big (ich(1)));
417 m_iwork(33) = octave::to_f77_int (octave::math::nint_big (ich(2)));
418 m_iwork(34) = octave::to_f77_int (octave::math::nint_big (ich(3)));
419
420 m_rwork(13) = ich(4);
421 m_rwork(14) = ich(5);
422 }
423 else
424 {
425 // FIXME: Should this be a warning?
426 (*current_liboctave_error_handler)
427 ("daspk: invalid initial condition heuristics option");
428 m_integration_error = true;
429 return retval;
430 }
431
432 m_info(16) = 1;
433 }
434
435 octave_idx_type pici = print_initial_condition_info ();
436 switch (pici)
437 {
438 case 0:
439 case 1:
440 case 2:
441 m_info(17) = octave::to_f77_int (pici);
442 break;
443
444 default:
445 // FIXME: Should this be a warning?
446 (*current_liboctave_error_handler)
447 ("daspk: invalid value for print initial condition info option");
448 m_integration_error = true;
449 return retval;
450 break;
451 }
452
453 DASPK_options::m_reset = false;
454
455 m_restart = false;
456 }
457
458 double *px = m_x.rwdata ();
459 double *pxdot = m_xdot.rwdata ();
460
461 F77_INT *pinfo = m_info.rwdata ();
462
463 double *prel_tol = m_rel_tol.rwdata ();
464 double *pabs_tol = m_abs_tol.rwdata ();
465
466 double *prwork = m_rwork.rwdata ();
467 F77_INT *piwork = m_iwork.rwdata ();
468
469 double *dummy = nullptr;
470 F77_INT *idummy = nullptr;
471
472 F77_INT tmp_istate = octave::to_f77_int (m_istate);
473
474 F77_XFCN (ddaspk, DDASPK, (ddaspk_f, nn, m_t, px, pxdot, tout, pinfo,
475 prel_tol, pabs_tol, tmp_istate, prwork, m_lrw,
476 piwork, m_liw, dummy, idummy, ddaspk_j,
477 ddaspk_psol));
478
479 m_istate = tmp_istate;
480
481 switch (m_istate)
482 {
483 case 1: // A step was successfully taken in intermediate-output
484 // mode. The code has not yet reached TOUT.
485 case 2: // The integration to TSTOP was successfully completed
486 // (T=TSTOP) by stepping exactly to TSTOP.
487 case 3: // The integration to TOUT was successfully completed
488 // (T=TOUT) by stepping past TOUT. Y(*) is obtained by
489 // interpolation. YPRIME(*) is obtained by interpolation.
490 case 4: // The initial condition calculation, with
491 // INFO(11) > 0, was successful, and INFO(14) = 1.
492 // No integration steps were taken, and the solution
493 // is not considered to have been started.
494 retval = m_x;
495 m_t = tout;
496 break;
497
498 case -1: // A large amount of work has been expended. (~500 steps).
499 case -2: // The error tolerances are too stringent.
500 case -3: // The local error test cannot be satisfied because you
501 // specified a zero component in ATOL and the
502 // corresponding computed solution component is zero.
503 // Thus, a pure relative error test is impossible for
504 // this component.
505 case -6: // DDASPK had repeated error test failures on the last
506 // attempted step.
507 case -7: // The corrector could not converge.
508 case -8: // The matrix of partial derivatives is singular.
509 case -9: // The corrector could not converge. There were repeated
510 // error test failures in this step.
511 case -10: // The corrector could not converge because IRES was
512 // equal to minus one.
513 case -11: // IRES equal to -2 was encountered and control is being
514 // returned to the calling program.
515 case -12: // DDASPK failed to compute the initial YPRIME.
516 case -13: // Unrecoverable error encountered inside user's
517 // PSOL routine, and control is being returned to
518 // the calling program.
519 case -14: // The Krylov linear system solver could not
520 // achieve convergence.
521 case -33: // The code has encountered trouble from which it cannot
522 // recover. A message is printed explaining the trouble
523 // and control is returned to the calling program. For
524 // example, this occurs when invalid input is detected.
525 m_integration_error = true;
526 break;
527
528 default:
529 m_integration_error = true;
530 (*current_liboctave_error_handler)
531 ("unrecognized value of m_istate (= %" OCTAVE_IDX_TYPE_FORMAT ") "
532 "returned from ddaspk", m_istate);
533 break;
534 }
535
536 return retval;
537}
538
539Matrix
541{
542 Matrix dummy;
543 return integrate (tout, dummy);
544}
545
546Matrix
547DASPK::integrate (const ColumnVector& tout, Matrix& xdot_out)
548{
549 Matrix retval;
550
551 octave_idx_type n_out = tout.numel ();
552 F77_INT n = octave::to_f77_int (size ());
553
554 if (n_out > 0 && n > 0)
555 {
556 retval.resize (n_out, n);
557 xdot_out.resize (n_out, n);
558
559 for (F77_INT i = 0; i < n; i++)
560 {
561 retval.elem (0, i) = m_x.elem (i);
562 xdot_out.elem (0, i) = m_xdot.elem (i);
563 }
564
565 for (octave_idx_type j = 1; j < n_out; j++)
566 {
567 ColumnVector x_next = do_integrate (tout.elem (j));
568
570 return retval;
571
572 for (F77_INT i = 0; i < n; i++)
573 {
574 retval.elem (j, i) = x_next.elem (i);
575 xdot_out.elem (j, i) = m_xdot.elem (i);
576 }
577 }
578 }
579
580 return retval;
581}
582
583Matrix
585{
586 Matrix dummy;
587 return integrate (tout, dummy, tcrit);
588}
589
590Matrix
591DASPK::integrate (const ColumnVector& tout, Matrix& xdot_out,
592 const ColumnVector& tcrit)
593{
594 Matrix retval;
595
596 octave_idx_type n_out = tout.numel ();
597 F77_INT n = octave::to_f77_int (size ());
598
599 if (n_out > 0 && n > 0)
600 {
601 retval.resize (n_out, n);
602 xdot_out.resize (n_out, n);
603
604 for (F77_INT i = 0; i < n; i++)
605 {
606 retval.elem (0, i) = m_x.elem (i);
607 xdot_out.elem (0, i) = m_xdot.elem (i);
608 }
609
610 octave_idx_type n_crit = tcrit.numel ();
611
612 if (n_crit > 0)
613 {
614 octave_idx_type i_crit = 0;
615 octave_idx_type i_out = 1;
616 double next_crit = tcrit.elem (0);
617 double next_out;
618 while (i_out < n_out)
619 {
620 bool do_restart = false;
621
622 next_out = tout.elem (i_out);
623 if (i_crit < n_crit)
624 next_crit = tcrit.elem (i_crit);
625
626 bool save_output;
627 double t_out;
628
629 if (next_crit == next_out)
630 {
631 set_stop_time (next_crit);
632 t_out = next_out;
633 save_output = true;
634 i_out++;
635 i_crit++;
636 do_restart = true;
637 }
638 else if (next_crit < next_out)
639 {
640 if (i_crit < n_crit)
641 {
642 set_stop_time (next_crit);
643 t_out = next_crit;
644 save_output = false;
645 i_crit++;
646 do_restart = true;
647 }
648 else
649 {
651 t_out = next_out;
652 save_output = true;
653 i_out++;
654 }
655 }
656 else
657 {
658 set_stop_time (next_crit);
659 t_out = next_out;
660 save_output = true;
661 i_out++;
662 }
663
664 ColumnVector x_next = do_integrate (t_out);
665
667 return retval;
668
669 if (save_output)
670 {
671 for (F77_INT i = 0; i < n; i++)
672 {
673 retval.elem (i_out-1, i) = x_next.elem (i);
674 xdot_out.elem (i_out-1, i) = m_xdot.elem (i);
675 }
676 }
677
678 if (do_restart)
679 force_restart ();
680 }
681 }
682 else
683 {
684 retval = integrate (tout, xdot_out);
685
687 return retval;
688 }
689 }
690
691 return retval;
692}
693
694std::string
696{
697 std::string retval;
698
699 std::ostringstream buf;
700 buf << m_t;
701 std::string t_curr = buf.str ();
702
703 switch (m_istate)
704 {
705 case 1:
706 retval = "a step was successfully taken in intermediate-output mode.";
707 break;
708
709 case 2:
710 retval = "integration completed by stepping exactly to TOUT";
711 break;
712
713 case 3:
714 retval = "integration to tout completed by stepping past TOUT";
715 break;
716
717 case 4:
718 retval = "initial condition calculation completed successfully";
719 break;
720
721 case -1:
722 retval = "a large amount of work has been expended (t =" + t_curr + ')';
723 break;
724
725 case -2:
726 retval = "the error tolerances are too stringent";
727 break;
728
729 case -3:
730 retval = "error weight became zero during problem. (t = " + t_curr +
731 "; solution component i vanished, and atol or atol(i) == 0)";
732 break;
733
734 case -6:
735 retval = "repeated error test failures on the last attempted step (t = "
736 + t_curr + ')';
737 break;
738
739 case -7:
740 retval = "the corrector could not converge (t = " + t_curr + ')';
741 break;
742
743 case -8:
744 retval = "the matrix of partial derivatives is singular (t = " + t_curr +
745 ')';
746 break;
747
748 case -9:
749 retval = "the corrector could not converge (t = " + t_curr +
750 "; repeated test failures)";
751 break;
752
753 case -10:
754 retval = "corrector could not converge because IRES was -1 (t = "
755 + t_curr + ')';
756 break;
757
758 case -11:
759 retval = "return requested in user-supplied function (t = " + t_curr +
760 ')';
761 break;
762
763 case -12:
764 retval = "failed to compute consistent initial conditions";
765 break;
766
767 case -13:
768 retval = "unrecoverable error encountered inside user's PSOL function (t = "
769 + t_curr + ')';
770 break;
771
772 case -14:
773 retval = "the Krylov linear system solver failed to converge (t = "
774 + t_curr + ')';
775 break;
776
777 case -33:
778 retval = "unrecoverable error (see printed message)";
779 break;
780
781 default:
782 retval = "unknown error state";
783 break;
784 }
785
786 return retval;
787}
F77_INT(* daspk_fcn_ptr)(const double &, const double *, const double *, const double &, double *, F77_INT &, double *, F77_INT *)
Definition DASPK.cc:39
F77_RET_T F77_FUNC(ddaspk, DDASPK)(daspk_fcn_ptr
F77_INT(* daspk_psol_ptr)(const F77_INT &, const double &, const double *, const double *, const double *, const double &, const double *, double *, F77_INT *, double *, const double &, F77_INT &, double *, F77_INT *)
Definition DASPK.cc:46
F77_INT(* daspk_jac_ptr)(const double &, const double *, const double *, double *, const double &, double *, F77_INT *)
Definition DASPK.cc:43
N Dimensional Array with copy-on-write semantics.
Definition Array.h:130
T & elem(octave_idx_type n)
Size of the specified dimension.
Definition Array.h:563
void resize(const dim_vector &dv, const T &rfv)
Size of the specified dimension.
bool isempty() const
Size of the specified dimension.
Definition Array.h:652
T * rwdata()
Size of the specified dimension.
octave_idx_type numel() const
Number of elements in the array.
Definition Array.h:418
DAEJacFunc jacobian_function() const
Definition DAEFunc.h:83
Matrix(* DAEJacFunc)(const ColumnVector &x, const ColumnVector &xdot, double t, double cj)
Definition DAEFunc.h:45
bool m_reset
Definition DAEFunc.h:102
DAERHSFunc function() const
Definition DAEFunc.h:74
ColumnVector(* DAERHSFunc)(const ColumnVector &x, const ColumnVector &xdot, double t, octave_idx_type &ires)
Definition DAEFunc.h:37
std::string error_message() const
Definition DASPK.cc:695
Matrix integrate(const ColumnVector &tout, Matrix &xdot_out)
Definition DASPK.cc:547
ColumnVector do_integrate(double t)
Definition DASPK.cc:141
void resize(octave_idx_type nr, octave_idx_type nc, double rfv=0)
Definition dMatrix.h:156
ColumnVector m_xdot
Definition base-dae.h:79
double m_stop_time
Definition base-de.h:111
bool m_restart
Definition base-de.h:115
double m_t
Definition base-de.h:109
octave_idx_type m_istate
Definition base-de.h:119
virtual void force_restart()
Definition base-de.h:97
void clear_stop_time()
Definition base-de.h:91
bool m_stop_time_set
Definition base-de.h:113
octave_idx_type size() const
Definition base-de.h:78
bool m_integration_error
Definition base-de.h:117
ColumnVector m_x
Definition base-de.h:107
void set_stop_time(double tt)
Definition base-de.h:84
Vector representing the dimensions (size) of an Array.
Definition dim-vector.h:90
subroutine ddaspk(res, neq, t, y, yprime, tout, info, rtol, atol, idid, rwork, lrw, iwork, liw, rpar, ipar, jac, psol)
Definition ddaspk.f:7
#define F77_XFCN(f, F, args)
Definition f77-fcn.h:45
double F77_DBLE
Definition f77-fcn.h:302
octave_f77_int_type F77_INT
Definition f77-fcn.h:306
OCTAVE_NORETURN liboctave_error_handler current_liboctave_error_handler
Definition lo-error.c:41
F77_RET_T(F77_CONST_CHAR_ARG_DECL, F77_CONST_CHAR_ARG_DECL, F77_CONST_CHAR_ARG_DECL, const F77_INT &, const F77_INT &, const F77_INT &, F77_INT &, F77_INT &, F77_DBLE *, const F77_INT &, F77_DBLE *, const F77_INT &, F77_DBLE *, F77_DBLE *, F77_DBLE *, const F77_INT &, F77_DBLE *, const F77_INT &, F77_DBLE *, const F77_INT &, F77_DBLE *, F77_INT *, F77_INT &F77_CHAR_ARG_LEN_DECL F77_CHAR_ARG_LEN_DECL F77_CHAR_ARG_LEN_DECL)