GNU Octave  9.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
DASPK.cc
Go to the documentation of this file.
1 ////////////////////////////////////////////////////////////////////////
2 //
3 // Copyright (C) 1996-2024 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 
39 typedef F77_INT (*daspk_fcn_ptr) (const double&, const double *, const double *,
40  const double&, double *, F77_INT&, double *,
41  F77_INT *);
42 
43 typedef F77_INT (*daspk_jac_ptr) (const double&, const double *, const double *,
44  double *, const double&, double *, F77_INT *);
45 
46 typedef 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 
53 extern "C"
54 {
55  F77_RET_T
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 
64 static DAEFunc::DAERHSFunc user_fcn;
65 static DAEFunc::DAEJacFunc user_jac;
66 static F77_INT nn;
67 
68 static F77_INT
69 ddaspk_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 
105 static F77_INT
106 ddaspk_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 
116 static F77_INT
117 ddaspk_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 
141 DASPK::do_integrate (double tout)
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
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 
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  {
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 
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 
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 
410  {
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 
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.fortran_vec ();
459  double *pxdot = m_xdot.fortran_vec ();
460 
461  F77_INT *pinfo = m_info.fortran_vec ();
462 
463  double *prel_tol = m_rel_tol.fortran_vec ();
464  double *pabs_tol = m_abs_tol.fortran_vec ();
465 
466  double *prwork = m_rwork.fortran_vec ();
467  F77_INT *piwork = m_iwork.fortran_vec ();
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 
539 Matrix
541 {
542  Matrix dummy;
543  return integrate (tout, dummy);
544 }
545 
546 Matrix
547 DASPK::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 
583 Matrix
584 DASPK::do_integrate (const ColumnVector& tout, const ColumnVector& tcrit)
585 {
586  Matrix dummy;
587  return integrate (tout, dummy, tcrit);
588 }
589 
590 Matrix
591 DASPK::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  {
650  clear_stop_time ();
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 
694 std::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
T & elem(octave_idx_type n)
Size of the specified dimension.
Definition: Array.h:562
T * fortran_vec()
Size of the specified dimension.
Definition: Array-base.cc:1764
void resize(const dim_vector &dv, const T &rfv)
Size of the specified dimension.
Definition: Array-base.cc:1023
bool isempty() const
Size of the specified dimension.
Definition: Array.h:651
octave_idx_type numel() const
Number of elements in the array.
Definition: Array.h:414
DAEJacFunc jacobian_function() const
Definition: DAEFunc.h:84
Matrix(* DAEJacFunc)(const ColumnVector &x, const ColumnVector &xdot, double t, double cj)
Definition: DAEFunc.h:46
bool m_reset
Definition: DAEFunc.h:103
DAERHSFunc function() const
Definition: DAEFunc.h:75
ColumnVector(* DAERHSFunc)(const ColumnVector &x, const ColumnVector &xdot, double t, octave_idx_type &ires)
Definition: DAEFunc.h:38
octave_idx_type enforce_inequality_constraints() const
Definition: DASPK-opts.h:218
double initial_step_size() const
Definition: DASPK-opts.h:224
octave_idx_type maximum_order() const
Definition: DASPK-opts.h:227
Array< double > absolute_tolerance() const
Definition: DASPK-opts.h:194
Array< octave_idx_type > inequality_constraint_types() const
Definition: DASPK-opts.h:221
octave_idx_type use_initial_condition_heuristics() const
Definition: DASPK-opts.h:203
octave_idx_type compute_consistent_initial_condition() const
Definition: DASPK-opts.h:200
double maximum_step_size() const
Definition: DASPK-opts.h:230
Array< octave_idx_type > algebraic_variables() const
Definition: DASPK-opts.h:215
Array< double > relative_tolerance() const
Definition: DASPK-opts.h:197
Array< double > initial_condition_heuristics() const
Definition: DASPK-opts.h:206
octave_idx_type exclude_algebraic_variables_from_error_test() const
Definition: DASPK-opts.h:212
octave_idx_type print_initial_condition_info() const
Definition: DASPK-opts.h:209
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
Definition: dMatrix.h:42
void resize(octave_idx_type nr, octave_idx_type nc, double rfv=0)
Definition: dMatrix.h:158
ColumnVector m_xdot
Definition: base-dae.h:80
double m_stop_time
Definition: base-de.h:112
bool m_restart
Definition: base-de.h:116
double m_t
Definition: base-de.h:110
octave_idx_type m_istate
Definition: base-de.h:120
virtual void force_restart()
Definition: base-de.h:98
void clear_stop_time()
Definition: base-de.h:92
bool m_stop_time_set
Definition: base-de.h:114
octave_idx_type size() const
Definition: base-de.h:79
bool m_integration_error
Definition: base-de.h:118
ColumnVector m_x
Definition: base-de.h:108
void set_stop_time(double tt)
Definition: base-de.h:85
Vector representing the dimensions (size) of an Array.
Definition: dim-vector.h:94
Definition: oct-time.h:64
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)
octave_idx_type nint_big(double x)
Definition: lo-mappers.cc:188
octave_idx_type n
Definition: mx-inlines.cc:761