Mercurial > octave
annotate liboctave/numeric/LSODE.cc @ 31249:de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
* liboctave/numeric/LSODE-opts.in: Add options "jacobian type", "lower jacobian
subdiagonals", and "upper jacobian subdiagonals".
* liboctave/numeric/LSODE.cc (file scope, lsode_j,
LSODE::do_integrate (double)): Handle new configurable Jacobian types.
* build-aux/mk-opts.pl: Don't implicitly convert to integer in condition.
author | Olaf Till <olaf.till@uni-jena.de> |
---|---|
date | Fri, 12 Nov 2010 08:53:05 +0100 |
parents | 51a3d3a69193 |
children | a40c0b7aa376 |
rev | line source |
---|---|
27923
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
1 //////////////////////////////////////////////////////////////////////// |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
2 // |
30564
796f54d4ddbf
update Octave Project Developers copyright for the new year
John W. Eaton <jwe@octave.org>
parents:
30394
diff
changeset
|
3 // Copyright (C) 1993-2022 The Octave Project Developers |
27923
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
4 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
5 // See the file COPYRIGHT.md in the top-level directory of this |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
6 // distribution or <https://octave.org/copyright/>. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
7 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
8 // This file is part of Octave. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
9 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
10 // Octave is free software: you can redistribute it and/or modify it |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
11 // under the terms of the GNU General Public License as published by |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
12 // the Free Software Foundation, either version 3 of the License, or |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
13 // (at your option) any later version. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
14 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
15 // Octave is distributed in the hope that it will be useful, but |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
16 // WITHOUT ANY WARRANTY; without even the implied warranty of |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
18 // GNU General Public License for more details. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
19 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
20 // You should have received a copy of the GNU General Public License |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
21 // along with Octave; see the file COPYING. If not, see |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
22 // <https://www.gnu.org/licenses/>. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
23 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
24 //////////////////////////////////////////////////////////////////////// |
3 | 25 |
21724
aba2e6293dd8
use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents:
21301
diff
changeset
|
26 #if defined (HAVE_CONFIG_H) |
21301
40de9f8f23a6
Use '#include "config.h"' rather than <config.h>.
Rik <rik@octave.org>
parents:
21202
diff
changeset
|
27 # include "config.h" |
3 | 28 #endif |
29 | |
26569
0e77df67b522
Add static compile-time checking of printf functions in liboctave.
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
30 #include <cinttypes> |
5765 | 31 #include <sstream> |
32 | |
1842 | 33 #include "LSODE.h" |
1847 | 34 #include "f77-fcn.h" |
227 | 35 #include "lo-error.h" |
4180 | 36 #include "quit.h" |
3 | 37 |
30394
f3f3e3793fb5
maint: style check C++ files in liboctave/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
30067
diff
changeset
|
38 typedef F77_INT (*lsode_fcn_ptr) (const F77_INT&, const double&, double *, |
f3f3e3793fb5
maint: style check C++ files in liboctave/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
30067
diff
changeset
|
39 double *, F77_INT&); |
3507 | 40 |
30394
f3f3e3793fb5
maint: style check C++ files in liboctave/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
30067
diff
changeset
|
41 typedef F77_INT (*lsode_jac_ptr) (const F77_INT&, const double&, double *, |
f3f3e3793fb5
maint: style check C++ files in liboctave/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
30067
diff
changeset
|
42 const F77_INT&, const F77_INT&, double *, |
22960
0d1422cb7e93
use F77_INT instead of octave_idx_type for liboctave ODE and DAE classes
John W. Eaton <jwe@octave.org>
parents:
22755
diff
changeset
|
43 const F77_INT&); |
3507 | 44 |
3 | 45 extern "C" |
4552 | 46 { |
47 F77_RET_T | |
30394
f3f3e3793fb5
maint: style check C++ files in liboctave/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
30067
diff
changeset
|
48 F77_FUNC (dlsode, DLSODE) (lsode_fcn_ptr, F77_INT&, F77_DBLE *, F77_DBLE&, |
f3f3e3793fb5
maint: style check C++ files in liboctave/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
30067
diff
changeset
|
49 F77_DBLE&, F77_INT&, F77_DBLE&, const F77_DBLE *, |
f3f3e3793fb5
maint: style check C++ files in liboctave/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
30067
diff
changeset
|
50 F77_INT&, F77_INT&, F77_INT&, F77_DBLE *, |
f3f3e3793fb5
maint: style check C++ files in liboctave/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
30067
diff
changeset
|
51 F77_INT&, F77_INT *, F77_INT&, lsode_jac_ptr, |
22133
59cadee1c74b
new macros for F77 data types
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
52 F77_INT&); |
4552 | 53 } |
3 | 54 |
30898
51a3d3a69193
maint: Use "fcn" as preferred abbreviation for "function" in liboctave/.
Rik <rik@octave.org>
parents:
30564
diff
changeset
|
55 static ODEFunc::ODERHSFunc user_fcn; |
532 | 56 static ODEFunc::ODEJacFunc user_jac; |
3 | 57 static ColumnVector *tmp_x; |
31249
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
58 static bool user_jac_ignore_ml_mu; |
3 | 59 |
22960
0d1422cb7e93
use F77_INT instead of octave_idx_type for liboctave ODE and DAE classes
John W. Eaton <jwe@octave.org>
parents:
22755
diff
changeset
|
60 static F77_INT |
0d1422cb7e93
use F77_INT instead of octave_idx_type for liboctave ODE and DAE classes
John W. Eaton <jwe@octave.org>
parents:
22755
diff
changeset
|
61 lsode_f (const F77_INT& neq, const double& time, double *, double *deriv, |
0d1422cb7e93
use F77_INT instead of octave_idx_type for liboctave ODE and DAE classes
John W. Eaton <jwe@octave.org>
parents:
22755
diff
changeset
|
62 F77_INT& ierr) |
3 | 63 { |
2343 | 64 ColumnVector tmp_deriv; |
3 | 65 |
1360 | 66 // NOTE: this won't work if LSODE passes copies of the state vector. |
67 // In that case we have to create a temporary vector object | |
68 // and copy. | |
69 | |
30898
51a3d3a69193
maint: Use "fcn" as preferred abbreviation for "function" in liboctave/.
Rik <rik@octave.org>
parents:
30564
diff
changeset
|
70 tmp_deriv = (*user_fcn) (*tmp_x, time); |
3 | 71 |
23577
80c42f4cca13
maint: Deprecate is_empty and replace with isempty.
Rik <rik@octave.org>
parents:
23475
diff
changeset
|
72 if (tmp_deriv.isempty ()) |
1251 | 73 ierr = -1; |
258 | 74 else |
75 { | |
22960
0d1422cb7e93
use F77_INT instead of octave_idx_type for liboctave ODE and DAE classes
John W. Eaton <jwe@octave.org>
parents:
22755
diff
changeset
|
76 for (F77_INT i = 0; i < neq; i++) |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14138
diff
changeset
|
77 deriv[i] = tmp_deriv.elem (i); |
258 | 78 } |
3 | 79 |
80 return 0; | |
81 } | |
82 | |
22960
0d1422cb7e93
use F77_INT instead of octave_idx_type for liboctave ODE and DAE classes
John W. Eaton <jwe@octave.org>
parents:
22755
diff
changeset
|
83 static F77_INT |
31249
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
84 lsode_j (const F77_INT& neq, const double& time, double *, |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
85 const F77_INT& ml, const F77_INT& mu, |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
86 double *pd, const F77_INT& nrowpd) |
3 | 87 { |
1251 | 88 Matrix tmp_jac (neq, neq); |
3 | 89 |
1360 | 90 // NOTE: this won't work if LSODE passes copies of the state vector. |
91 // In that case we have to create a temporary vector object | |
92 // and copy. | |
93 | |
1251 | 94 tmp_jac = (*user_jac) (*tmp_x, time); |
3 | 95 |
31249
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
96 if (user_jac_ignore_ml_mu) |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
97 for (F77_INT j = 0; j < neq; j++) |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
98 for (F77_INT i = 0; i < neq; i++) |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
99 pd[nrowpd * j + i] = tmp_jac (i, j); |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
100 else |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
101 // upper left ends of subdiagonals in tmp_jac |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
102 for (F77_INT i = 0, j = mu; i <= ml; j == 0 ? i++ : j--) |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
103 // walk down the subdiagonal in tmp_jac |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
104 for (F77_INT k = i, l = j; k < neq && l < neq; k++, l++) |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
105 pd[nrowpd * l + k + mu - l] = tmp_jac (k, l); |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
106 |
3 | 107 return 0; |
108 } | |
109 | |
110 ColumnVector | |
1842 | 111 LSODE::do_integrate (double tout) |
3 | 112 { |
1945 | 113 ColumnVector retval; |
114 | |
22960
0d1422cb7e93
use F77_INT instead of octave_idx_type for liboctave ODE and DAE classes
John W. Eaton <jwe@octave.org>
parents:
22755
diff
changeset
|
115 static F77_INT nn = 0; |
4049 | 116 |
30067
fc509c3c445a
maint: use "m_" prefix for member variables in base-de.h and base-dae.h
Rik <rik@octave.org>
parents:
30047
diff
changeset
|
117 if (! m_initialized || m_restart || ODEFunc::m_reset |
fc509c3c445a
maint: use "m_" prefix for member variables in base-de.h and base-dae.h
Rik <rik@octave.org>
parents:
30047
diff
changeset
|
118 || LSODE_options::m_reset) |
1945 | 119 { |
30067
fc509c3c445a
maint: use "m_" prefix for member variables in base-de.h and base-dae.h
Rik <rik@octave.org>
parents:
30047
diff
changeset
|
120 m_integration_error = false; |
1945 | 121 |
30046
b3717fd85e49
maint: use "m_" prefix for member variables ODE/DAE classes in liboctave/numeric.
Rik <rik@octave.org>
parents:
29358
diff
changeset
|
122 m_initialized = true; |
4049 | 123 |
30067
fc509c3c445a
maint: use "m_" prefix for member variables in base-de.h and base-dae.h
Rik <rik@octave.org>
parents:
30047
diff
changeset
|
124 m_istate = 1; |
4049 | 125 |
22988
cd33c785e80e
put to_f77_int inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
22960
diff
changeset
|
126 F77_INT n = octave::to_f77_int (size ()); |
4049 | 127 |
128 nn = n; | |
3955 | 129 |
5275 | 130 octave_idx_type max_maxord = 0; |
4231 | 131 |
31249
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
132 user_jac_ignore_ml_mu = true; |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
133 |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
134 m_iwork(0) = lower_jacobian_subdiagonals (); // 'ML' in dlsode.f |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
135 |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
136 m_iwork(1) = upper_jacobian_subdiagonals (); // 'MU' in dlsode.f |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
137 |
4049 | 138 if (integration_method () == "stiff") |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
139 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
140 max_maxord = 5; |
4231 | 141 |
30047
02e28f7e4d04
maint: use "m_" prefix for member variables DAERTFunc/ODEFunc classes in liboctave/numeric.
Rik <rik@octave.org>
parents:
30046
diff
changeset
|
142 if (m_jac) |
31249
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
143 { |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
144 if (jacobian_type () == "banded") |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
145 { |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
146 m_method_flag = 24; |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
147 user_jac_ignore_ml_mu = false; |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
148 } |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
149 else |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
150 m_method_flag = 21; |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
151 } |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
152 else |
31249
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
153 { |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
154 if (jacobian_type () == "full") |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
155 m_method_flag = 22; |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
156 else if (jacobian_type () == "banded") |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
157 m_method_flag = 25; |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
158 else if (jacobian_type () == "diagonal") |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
159 m_method_flag = 23; |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
160 else |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
161 { |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
162 // should be prevented by lsode_options |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
163 (*current_liboctave_error_handler) |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
164 ("lsode: internal error, wrong jacobian type"); |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
165 m_integration_error = true; |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
166 return retval; |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
167 } |
de6fc38c78c6
Make Jacobian types offered by dlsode.f accessible by lsode (bug #31626).
Olaf Till <olaf.till@uni-jena.de>
parents:
30898
diff
changeset
|
168 } |
3955 | 169 |
30046
b3717fd85e49
maint: use "m_" prefix for member variables ODE/DAE classes in liboctave/numeric.
Rik <rik@octave.org>
parents:
29358
diff
changeset
|
170 m_liw = 20 + n; |
b3717fd85e49
maint: use "m_" prefix for member variables ODE/DAE classes in liboctave/numeric.
Rik <rik@octave.org>
parents:
29358
diff
changeset
|
171 m_lrw = 22 + n * (9 + n); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
172 } |
4049 | 173 else |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
174 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
175 max_maxord = 12; |
4231 | 176 |
30046
b3717fd85e49
maint: use "m_" prefix for member variables ODE/DAE classes in liboctave/numeric.
Rik <rik@octave.org>
parents:
29358
diff
changeset
|
177 m_method_flag = 10; |
3955 | 178 |
30046
b3717fd85e49
maint: use "m_" prefix for member variables ODE/DAE classes in liboctave/numeric.
Rik <rik@octave.org>
parents:
29358
diff
changeset
|
179 m_liw = 20; |
b3717fd85e49
maint: use "m_" prefix for member variables ODE/DAE classes in liboctave/numeric.
Rik <rik@octave.org>
parents:
29358
diff
changeset
|
180 m_lrw = 22 + 16 * n; |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
181 } |
4049 | 182 |
30046
b3717fd85e49
maint: use "m_" prefix for member variables ODE/DAE classes in liboctave/numeric.
Rik <rik@octave.org>
parents:
29358
diff
changeset
|
183 m_iwork.resize (dim_vector (m_liw, 1)); |
5552 | 184 |
22960
0d1422cb7e93
use F77_INT instead of octave_idx_type for liboctave ODE and DAE classes
John W. Eaton <jwe@octave.org>
parents:
22755
diff
changeset
|
185 for (F77_INT i = 4; i < 9; i++) |
30046
b3717fd85e49
maint: use "m_" prefix for member variables ODE/DAE classes in liboctave/numeric.
Rik <rik@octave.org>
parents:
29358
diff
changeset
|
186 m_iwork(i) = 0; |
5552 | 187 |
30046
b3717fd85e49
maint: use "m_" prefix for member variables ODE/DAE classes in liboctave/numeric.
Rik <rik@octave.org>
parents:
29358
diff
changeset
|
188 m_rwork.resize (dim_vector (m_lrw, 1)); |
5552 | 189 |
22960
0d1422cb7e93
use F77_INT instead of octave_idx_type for liboctave ODE and DAE classes
John W. Eaton <jwe@octave.org>
parents:
22755
diff
changeset
|
190 for (F77_INT i = 4; i < 9; i++) |
30046
b3717fd85e49
maint: use "m_" prefix for member variables ODE/DAE classes in liboctave/numeric.
Rik <rik@octave.org>
parents:
29358
diff
changeset
|
191 m_rwork(i) = 0; |
5552 | 192 |
22960
0d1422cb7e93
use F77_INT instead of octave_idx_type for liboctave ODE and DAE classes
John W. Eaton <jwe@octave.org>
parents:
22755
diff
changeset
|
193 octave_idx_type maxord = maximum_order (); |
0d1422cb7e93
use F77_INT instead of octave_idx_type for liboctave ODE and DAE classes
John W. Eaton <jwe@octave.org>
parents:
22755
diff
changeset
|
194 |
4231 | 195 if (maxord >= 0) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
196 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
197 if (maxord > 0 && maxord <= max_maxord) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
198 { |
30046
b3717fd85e49
maint: use "m_" prefix for member variables ODE/DAE classes in liboctave/numeric.
Rik <rik@octave.org>
parents:
29358
diff
changeset
|
199 m_iwork(4) = octave::to_f77_int (maxord); |
b3717fd85e49
maint: use "m_" prefix for member variables ODE/DAE classes in liboctave/numeric.
Rik <rik@octave.org>
parents:
29358
diff
changeset
|
200 m_iopt = 1; |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
201 } |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
202 else |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
203 { |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
20974
diff
changeset
|
204 // FIXME: Should this be a warning? |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
205 (*current_liboctave_error_handler) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
206 ("lsode: invalid value for maximum order"); |
30067
fc509c3c445a
maint: use "m_" prefix for member variables in base-de.h and base-dae.h
Rik <rik@octave.org>
parents:
30047
diff
changeset
|
207 m_integration_error = true; |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
208 return retval; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
209 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
210 } |
4231 | 211 |
30067
fc509c3c445a
maint: use "m_" prefix for member variables in base-de.h and base-dae.h
Rik <rik@octave.org>
parents:
30047
diff
changeset
|
212 if (m_stop_time_set) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
213 { |
30046
b3717fd85e49
maint: use "m_" prefix for member variables ODE/DAE classes in liboctave/numeric.
Rik <rik@octave.org>
parents:
29358
diff
changeset
|
214 m_itask = 4; |
30067
fc509c3c445a
maint: use "m_" prefix for member variables in base-de.h and base-dae.h
Rik <rik@octave.org>
parents:
30047
diff
changeset
|
215 m_rwork(0) = m_stop_time; |
30046
b3717fd85e49
maint: use "m_" prefix for member variables ODE/DAE classes in liboctave/numeric.
Rik <rik@octave.org>
parents:
29358
diff
changeset
|
216 m_iopt = 1; |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
217 } |
4049 | 218 else |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
219 { |
30046
b3717fd85e49
maint: use "m_" prefix for member variables ODE/DAE classes in liboctave/numeric.
Rik <rik@octave.org>
parents:
29358
diff
changeset
|
220 m_itask = 1; |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
221 } |
258 | 222 |
30067
fc509c3c445a
maint: use "m_" prefix for member variables in base-de.h and base-dae.h
Rik <rik@octave.org>
parents:
30047
diff
changeset
|
223 m_restart = false; |
4049 | 224 |
225 // ODEFunc | |
3 | 226 |
4049 | 227 // NOTE: this won't work if LSODE passes copies of the state vector. |
228 // In that case we have to create a temporary vector object | |
229 // and copy. | |
3 | 230 |
30067
fc509c3c445a
maint: use "m_" prefix for member variables in base-de.h and base-dae.h
Rik <rik@octave.org>
parents:
30047
diff
changeset
|
231 tmp_x = &m_x; |
4049 | 232 |
30898
51a3d3a69193
maint: Use "fcn" as preferred abbreviation for "function" in liboctave/.
Rik <rik@octave.org>
parents:
30564
diff
changeset
|
233 user_fcn = function (); |
4049 | 234 user_jac = jacobian_function (); |
235 | |
30898
51a3d3a69193
maint: Use "fcn" as preferred abbreviation for "function" in liboctave/.
Rik <rik@octave.org>
parents:
30564
diff
changeset
|
236 ColumnVector m_xdot = (*user_fcn) (m_x, m_t); |
2343 | 237 |
30067
fc509c3c445a
maint: use "m_" prefix for member variables in base-de.h and base-dae.h
Rik <rik@octave.org>
parents:
30047
diff
changeset
|
238 if (m_x.numel () != m_xdot.numel ()) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
239 { |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
20974
diff
changeset
|
240 // FIXME: Should this be a warning? |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
241 (*current_liboctave_error_handler) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
242 ("lsode: inconsistent sizes for state and derivative vectors"); |
2343 | 243 |
30067
fc509c3c445a
maint: use "m_" prefix for member variables in base-de.h and base-dae.h
Rik <rik@octave.org>
parents:
30047
diff
changeset
|
244 m_integration_error = true; |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
245 return retval; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
246 } |
2343 | 247 |
30047
02e28f7e4d04
maint: use "m_" prefix for member variables DAERTFunc/ODEFunc classes in liboctave/numeric.
Rik <rik@octave.org>
parents:
30046
diff
changeset
|
248 ODEFunc::m_reset = false; |
4049 | 249 |
250 // LSODE_options | |
251 | |
30046
b3717fd85e49
maint: use "m_" prefix for member variables ODE/DAE classes in liboctave/numeric.
Rik <rik@octave.org>
parents:
29358
diff
changeset
|
252 m_rel_tol = relative_tolerance (); |
b3717fd85e49
maint: use "m_" prefix for member variables ODE/DAE classes in liboctave/numeric.
Rik <rik@octave.org>
parents:
29358
diff
changeset
|
253 m_abs_tol = absolute_tolerance (); |
4049 | 254 |
30046
b3717fd85e49
maint: use "m_" prefix for member variables ODE/DAE classes in liboctave/numeric.
Rik <rik@octave.org>
parents:
29358
diff
changeset
|
255 F77_INT abs_tol_len = octave::to_f77_int (m_abs_tol.numel ()); |
4049 | 256 |
257 if (abs_tol_len == 1) | |
30046
b3717fd85e49
maint: use "m_" prefix for member variables ODE/DAE classes in liboctave/numeric.
Rik <rik@octave.org>
parents:
29358
diff
changeset
|
258 m_itol = 1; |
4049 | 259 else if (abs_tol_len == n) |
30046
b3717fd85e49
maint: use "m_" prefix for member variables ODE/DAE classes in liboctave/numeric.
Rik <rik@octave.org>
parents:
29358
diff
changeset
|
260 m_itol = 2; |
4049 | 261 else |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
262 { |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
20974
diff
changeset
|
263 // FIXME: Should this be a warning? |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
264 (*current_liboctave_error_handler) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
265 ("lsode: inconsistent sizes for state and absolute tolerance vectors"); |
4049 | 266 |
30067
fc509c3c445a
maint: use "m_" prefix for member variables in base-de.h and base-dae.h
Rik <rik@octave.org>
parents:
30047
diff
changeset
|
267 m_integration_error = true; |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
268 return retval; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
269 } |
2343 | 270 |
4049 | 271 double iss = initial_step_size (); |
272 if (iss >= 0.0) | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
273 { |
30046
b3717fd85e49
maint: use "m_" prefix for member variables ODE/DAE classes in liboctave/numeric.
Rik <rik@octave.org>
parents:
29358
diff
changeset
|
274 m_rwork(4) = iss; |
b3717fd85e49
maint: use "m_" prefix for member variables ODE/DAE classes in liboctave/numeric.
Rik <rik@octave.org>
parents:
29358
diff
changeset
|
275 m_iopt = 1; |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
276 } |
4049 | 277 |
278 double maxss = maximum_step_size (); | |
279 if (maxss >= 0.0) | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
280 { |
30046
b3717fd85e49
maint: use "m_" prefix for member variables ODE/DAE classes in liboctave/numeric.
Rik <rik@octave.org>
parents:
29358
diff
changeset
|
281 m_rwork(5) = maxss; |
b3717fd85e49
maint: use "m_" prefix for member variables ODE/DAE classes in liboctave/numeric.
Rik <rik@octave.org>
parents:
29358
diff
changeset
|
282 m_iopt = 1; |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
283 } |
4049 | 284 |
285 double minss = minimum_step_size (); | |
286 if (minss >= 0.0) | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
287 { |
30046
b3717fd85e49
maint: use "m_" prefix for member variables ODE/DAE classes in liboctave/numeric.
Rik <rik@octave.org>
parents:
29358
diff
changeset
|
288 m_rwork(6) = minss; |
b3717fd85e49
maint: use "m_" prefix for member variables ODE/DAE classes in liboctave/numeric.
Rik <rik@octave.org>
parents:
29358
diff
changeset
|
289 m_iopt = 1; |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
290 } |
4049 | 291 |
22988
cd33c785e80e
put to_f77_int inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
22960
diff
changeset
|
292 F77_INT sl = octave::to_f77_int (step_limit ()); |
4049 | 293 if (sl > 0) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
294 { |
30046
b3717fd85e49
maint: use "m_" prefix for member variables ODE/DAE classes in liboctave/numeric.
Rik <rik@octave.org>
parents:
29358
diff
changeset
|
295 m_iwork(5) = sl; |
b3717fd85e49
maint: use "m_" prefix for member variables ODE/DAE classes in liboctave/numeric.
Rik <rik@octave.org>
parents:
29358
diff
changeset
|
296 m_iopt = 1; |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
297 } |
4049 | 298 |
30046
b3717fd85e49
maint: use "m_" prefix for member variables ODE/DAE classes in liboctave/numeric.
Rik <rik@octave.org>
parents:
29358
diff
changeset
|
299 LSODE_options::m_reset = false; |
3 | 300 } |
301 | |
30067
fc509c3c445a
maint: use "m_" prefix for member variables in base-de.h and base-dae.h
Rik <rik@octave.org>
parents:
30047
diff
changeset
|
302 double *px = m_x.fortran_vec (); |
11502
4638800cd660
delete data pointer members from liboctave ODE/DAE classes; make destuctors virtual in ODE/DAE base classes
John W. Eaton <jwe@octave.org>
parents:
11495
diff
changeset
|
303 |
30046
b3717fd85e49
maint: use "m_" prefix for member variables ODE/DAE classes in liboctave/numeric.
Rik <rik@octave.org>
parents:
29358
diff
changeset
|
304 double *pabs_tol = m_abs_tol.fortran_vec (); |
11502
4638800cd660
delete data pointer members from liboctave ODE/DAE classes; make destuctors virtual in ODE/DAE base classes
John W. Eaton <jwe@octave.org>
parents:
11495
diff
changeset
|
305 |
30046
b3717fd85e49
maint: use "m_" prefix for member variables ODE/DAE classes in liboctave/numeric.
Rik <rik@octave.org>
parents:
29358
diff
changeset
|
306 F77_INT *piwork = m_iwork.fortran_vec (); |
b3717fd85e49
maint: use "m_" prefix for member variables ODE/DAE classes in liboctave/numeric.
Rik <rik@octave.org>
parents:
29358
diff
changeset
|
307 double *prwork = m_rwork.fortran_vec (); |
11502
4638800cd660
delete data pointer members from liboctave ODE/DAE classes; make destuctors virtual in ODE/DAE base classes
John W. Eaton <jwe@octave.org>
parents:
11495
diff
changeset
|
308 |
30067
fc509c3c445a
maint: use "m_" prefix for member variables in base-de.h and base-dae.h
Rik <rik@octave.org>
parents:
30047
diff
changeset
|
309 F77_INT tmp_istate = octave::to_f77_int (m_istate); |
22960
0d1422cb7e93
use F77_INT instead of octave_idx_type for liboctave ODE and DAE classes
John W. Eaton <jwe@octave.org>
parents:
22755
diff
changeset
|
310 |
30067
fc509c3c445a
maint: use "m_" prefix for member variables in base-de.h and base-dae.h
Rik <rik@octave.org>
parents:
30047
diff
changeset
|
311 F77_XFCN (dlsode, DLSODE, (lsode_f, nn, px, m_t, tout, m_itol, m_rel_tol, |
30046
b3717fd85e49
maint: use "m_" prefix for member variables ODE/DAE classes in liboctave/numeric.
Rik <rik@octave.org>
parents:
29358
diff
changeset
|
312 pabs_tol, m_itask, tmp_istate, m_iopt, prwork, |
b3717fd85e49
maint: use "m_" prefix for member variables ODE/DAE classes in liboctave/numeric.
Rik <rik@octave.org>
parents:
29358
diff
changeset
|
313 m_lrw, piwork, m_liw, lsode_j, m_method_flag)); |
3 | 314 |
30067
fc509c3c445a
maint: use "m_" prefix for member variables in base-de.h and base-dae.h
Rik <rik@octave.org>
parents:
30047
diff
changeset
|
315 m_istate = tmp_istate; |
22960
0d1422cb7e93
use F77_INT instead of octave_idx_type for liboctave ODE and DAE classes
John W. Eaton <jwe@octave.org>
parents:
22755
diff
changeset
|
316 |
30067
fc509c3c445a
maint: use "m_" prefix for member variables in base-de.h and base-dae.h
Rik <rik@octave.org>
parents:
30047
diff
changeset
|
317 switch (m_istate) |
3 | 318 { |
7482
29980c6b8604
don't check f77_exception_encountered
John W. Eaton <jwe@octave.org>
parents:
7231
diff
changeset
|
319 case 1: // prior to initial integration step. |
29980c6b8604
don't check f77_exception_encountered
John W. Eaton <jwe@octave.org>
parents:
7231
diff
changeset
|
320 case 2: // lsode was successful. |
30067
fc509c3c445a
maint: use "m_" prefix for member variables in base-de.h and base-dae.h
Rik <rik@octave.org>
parents:
30047
diff
changeset
|
321 retval = m_x; |
fc509c3c445a
maint: use "m_" prefix for member variables in base-de.h and base-dae.h
Rik <rik@octave.org>
parents:
30047
diff
changeset
|
322 m_t = tout; |
7482
29980c6b8604
don't check f77_exception_encountered
John W. Eaton <jwe@octave.org>
parents:
7231
diff
changeset
|
323 break; |
3996 | 324 |
7482
29980c6b8604
don't check f77_exception_encountered
John W. Eaton <jwe@octave.org>
parents:
7231
diff
changeset
|
325 case -1: // excess work done on this call (perhaps wrong mf). |
29980c6b8604
don't check f77_exception_encountered
John W. Eaton <jwe@octave.org>
parents:
7231
diff
changeset
|
326 case -2: // excess accuracy requested (tolerances too small). |
8807
401d54a83690
use 'invalid', not 'illegal'
John W. Eaton <jwe@octave.org>
parents:
7482
diff
changeset
|
327 case -3: // invalid input detected (see printed message). |
7482
29980c6b8604
don't check f77_exception_encountered
John W. Eaton <jwe@octave.org>
parents:
7231
diff
changeset
|
328 case -4: // repeated error test failures (check all inputs). |
12600
7c000c70f873
LSODE.cc: Add semicolon to error messages to prevent run-together text.
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
329 case -5: // repeated convergence failures (perhaps bad Jacobian |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
330 // supplied or wrong choice of mf or tolerances). |
7482
29980c6b8604
don't check f77_exception_encountered
John W. Eaton <jwe@octave.org>
parents:
7231
diff
changeset
|
331 case -6: // error weight became zero during problem. (solution |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
332 // component i vanished, and atol or atol(i) = 0.) |
7482
29980c6b8604
don't check f77_exception_encountered
John W. Eaton <jwe@octave.org>
parents:
7231
diff
changeset
|
333 case -13: // return requested in user-supplied function. |
30067
fc509c3c445a
maint: use "m_" prefix for member variables in base-de.h and base-dae.h
Rik <rik@octave.org>
parents:
30047
diff
changeset
|
334 m_integration_error = true; |
7482
29980c6b8604
don't check f77_exception_encountered
John W. Eaton <jwe@octave.org>
parents:
7231
diff
changeset
|
335 break; |
29980c6b8604
don't check f77_exception_encountered
John W. Eaton <jwe@octave.org>
parents:
7231
diff
changeset
|
336 |
29980c6b8604
don't check f77_exception_encountered
John W. Eaton <jwe@octave.org>
parents:
7231
diff
changeset
|
337 default: |
30067
fc509c3c445a
maint: use "m_" prefix for member variables in base-de.h and base-dae.h
Rik <rik@octave.org>
parents:
30047
diff
changeset
|
338 m_integration_error = true; |
7482
29980c6b8604
don't check f77_exception_encountered
John W. Eaton <jwe@octave.org>
parents:
7231
diff
changeset
|
339 (*current_liboctave_error_handler) |
26569
0e77df67b522
Add static compile-time checking of printf functions in liboctave.
Markus Mützel <markus.muetzel@gmx.de>
parents:
26376
diff
changeset
|
340 ("unrecognized value of istate (= %" OCTAVE_IDX_TYPE_FORMAT ") " |
30067
fc509c3c445a
maint: use "m_" prefix for member variables in base-de.h and base-dae.h
Rik <rik@octave.org>
parents:
30047
diff
changeset
|
341 "returned from lsode", m_istate); |
7482
29980c6b8604
don't check f77_exception_encountered
John W. Eaton <jwe@octave.org>
parents:
7231
diff
changeset
|
342 break; |
3 | 343 } |
344 | |
1945 | 345 return retval; |
3 | 346 } |
347 | |
3959 | 348 std::string |
349 LSODE::error_message (void) const | |
350 { | |
351 std::string retval; | |
352 | |
5765 | 353 std::ostringstream buf; |
30067
fc509c3c445a
maint: use "m_" prefix for member variables in base-de.h and base-dae.h
Rik <rik@octave.org>
parents:
30047
diff
changeset
|
354 buf << m_t; |
5765 | 355 std::string t_curr = buf.str (); |
4042 | 356 |
30067
fc509c3c445a
maint: use "m_" prefix for member variables in base-de.h and base-dae.h
Rik <rik@octave.org>
parents:
30047
diff
changeset
|
357 switch (m_istate) |
3959 | 358 { |
359 case 1: | |
3996 | 360 retval = "prior to initial integration step"; |
3959 | 361 break; |
362 | |
363 case 2: | |
364 retval = "successful exit"; | |
365 break; | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
366 |
3959 | 367 case 3: |
368 retval = "prior to continuation call with modified parameters"; | |
369 break; | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11574
diff
changeset
|
370 |
3996 | 371 case -1: |
23829
01899bdd2a3a
Eliminate unnecessary std::string ("...") constructor calls when "..." suffices.
Rik <rik@octave.org>
parents:
23807
diff
changeset
|
372 retval = "excess work on this call (t = " + t_curr + |
01899bdd2a3a
Eliminate unnecessary std::string ("...") constructor calls when "..." suffices.
Rik <rik@octave.org>
parents:
23807
diff
changeset
|
373 "; perhaps wrong integration method)"; |
3996 | 374 break; |
375 | |
376 case -2: | |
377 retval = "excess accuracy requested (tolerances too small)"; | |
378 break; | |
379 | |
380 case -3: | |
381 retval = "invalid input detected (see printed message)"; | |
382 break; | |
383 | |
384 case -4: | |
23829
01899bdd2a3a
Eliminate unnecessary std::string ("...") constructor calls when "..." suffices.
Rik <rik@octave.org>
parents:
23807
diff
changeset
|
385 retval = "repeated error test failures (t = " + t_curr + |
01899bdd2a3a
Eliminate unnecessary std::string ("...") constructor calls when "..." suffices.
Rik <rik@octave.org>
parents:
23807
diff
changeset
|
386 "; check all inputs)"; |
3996 | 387 break; |
388 | |
389 case -5: | |
23829
01899bdd2a3a
Eliminate unnecessary std::string ("...") constructor calls when "..." suffices.
Rik <rik@octave.org>
parents:
23807
diff
changeset
|
390 retval = "repeated convergence failures (t = " + t_curr + |
01899bdd2a3a
Eliminate unnecessary std::string ("...") constructor calls when "..." suffices.
Rik <rik@octave.org>
parents:
23807
diff
changeset
|
391 "; perhaps bad Jacobian supplied or wrong choice of integration method or tolerances)"; |
3996 | 392 break; |
393 | |
394 case -6: | |
23829
01899bdd2a3a
Eliminate unnecessary std::string ("...") constructor calls when "..." suffices.
Rik <rik@octave.org>
parents:
23807
diff
changeset
|
395 retval = "error weight became zero during problem. (t = " + t_curr + |
01899bdd2a3a
Eliminate unnecessary std::string ("...") constructor calls when "..." suffices.
Rik <rik@octave.org>
parents:
23807
diff
changeset
|
396 "; solution component i vanished, and atol or atol(i) == 0)"; |
3996 | 397 break; |
398 | |
399 case -13: | |
4042 | 400 retval = "return requested in user-supplied function (t = " |
23807
336f89b6208b
Use character literals 'c' rather than string literals "c" when possible.
Rik <rik@octave.org>
parents:
23577
diff
changeset
|
401 + t_curr + ')'; |
3996 | 402 break; |
403 | |
3959 | 404 default: |
405 retval = "unknown error state"; | |
406 break; | |
407 } | |
408 | |
409 return retval; | |
410 } | |
411 | |
3 | 412 Matrix |
1842 | 413 LSODE::do_integrate (const ColumnVector& tout) |
3 | 414 { |
415 Matrix retval; | |
4049 | 416 |
20229
5dfaaaae784f
Deprecate Array::capacity() and Sparse::capacity() for numel() and nzmax().
Carnë Draug <carandraug@octave.org>
parents:
19697
diff
changeset
|
417 octave_idx_type n_out = tout.numel (); |
22988
cd33c785e80e
put to_f77_int inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
22960
diff
changeset
|
418 F77_INT n = octave::to_f77_int (size ()); |
3 | 419 |
420 if (n_out > 0 && n > 0) | |
421 { | |
422 retval.resize (n_out, n); | |
423 | |
22960
0d1422cb7e93
use F77_INT instead of octave_idx_type for liboctave ODE and DAE classes
John W. Eaton <jwe@octave.org>
parents:
22755
diff
changeset
|
424 for (F77_INT i = 0; i < n; i++) |
30067
fc509c3c445a
maint: use "m_" prefix for member variables in base-de.h and base-dae.h
Rik <rik@octave.org>
parents:
30047
diff
changeset
|
425 retval.elem (0, i) = m_x.elem (i); |
3 | 426 |
5275 | 427 for (octave_idx_type j = 1; j < n_out; j++) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
428 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
429 ColumnVector x_next = do_integrate (tout.elem (j)); |
258 | 430 |
30067
fc509c3c445a
maint: use "m_" prefix for member variables in base-de.h and base-dae.h
Rik <rik@octave.org>
parents:
30047
diff
changeset
|
431 if (m_integration_error) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
432 return retval; |
258 | 433 |
22960
0d1422cb7e93
use F77_INT instead of octave_idx_type for liboctave ODE and DAE classes
John W. Eaton <jwe@octave.org>
parents:
22755
diff
changeset
|
434 for (F77_INT i = 0; i < n; i++) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
435 retval.elem (j, i) = x_next.elem (i); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
436 } |
3 | 437 } |
438 | |
439 return retval; | |
440 } | |
441 | |
442 Matrix | |
3511 | 443 LSODE::do_integrate (const ColumnVector& tout, const ColumnVector& tcrit) |
3 | 444 { |
445 Matrix retval; | |
4049 | 446 |
20229
5dfaaaae784f
Deprecate Array::capacity() and Sparse::capacity() for numel() and nzmax().
Carnë Draug <carandraug@octave.org>
parents:
19697
diff
changeset
|
447 octave_idx_type n_out = tout.numel (); |
22988
cd33c785e80e
put to_f77_int inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
22960
diff
changeset
|
448 F77_INT n = octave::to_f77_int (size ()); |
3 | 449 |
450 if (n_out > 0 && n > 0) | |
451 { | |
452 retval.resize (n_out, n); | |
453 | |
22960
0d1422cb7e93
use F77_INT instead of octave_idx_type for liboctave ODE and DAE classes
John W. Eaton <jwe@octave.org>
parents:
22755
diff
changeset
|
454 for (F77_INT i = 0; i < n; i++) |
30067
fc509c3c445a
maint: use "m_" prefix for member variables in base-de.h and base-dae.h
Rik <rik@octave.org>
parents:
30047
diff
changeset
|
455 retval.elem (0, i) = m_x.elem (i); |
3 | 456 |
20229
5dfaaaae784f
Deprecate Array::capacity() and Sparse::capacity() for numel() and nzmax().
Carnë Draug <carandraug@octave.org>
parents:
19697
diff
changeset
|
457 octave_idx_type n_crit = tcrit.numel (); |
3 | 458 |
459 if (n_crit > 0) | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
460 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
461 octave_idx_type i_crit = 0; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
462 octave_idx_type i_out = 1; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
463 double next_crit = tcrit.elem (0); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
464 double next_out; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
465 while (i_out < n_out) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
466 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
467 bool do_restart = false; |
3 | 468 |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
469 next_out = tout.elem (i_out); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
470 if (i_crit < n_crit) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
471 next_crit = tcrit.elem (i_crit); |
3 | 472 |
22960
0d1422cb7e93
use F77_INT instead of octave_idx_type for liboctave ODE and DAE classes
John W. Eaton <jwe@octave.org>
parents:
22755
diff
changeset
|
473 bool save_output = false; |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
474 double t_out; |
3 | 475 |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
476 if (next_crit == next_out) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
477 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
478 set_stop_time (next_crit); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
479 t_out = next_out; |
22960
0d1422cb7e93
use F77_INT instead of octave_idx_type for liboctave ODE and DAE classes
John W. Eaton <jwe@octave.org>
parents:
22755
diff
changeset
|
480 save_output = true; |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
481 i_out++; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
482 i_crit++; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
483 do_restart = true; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
484 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
485 else if (next_crit < next_out) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
486 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
487 if (i_crit < n_crit) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
488 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
489 set_stop_time (next_crit); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
490 t_out = next_crit; |
22960
0d1422cb7e93
use F77_INT instead of octave_idx_type for liboctave ODE and DAE classes
John W. Eaton <jwe@octave.org>
parents:
22755
diff
changeset
|
491 save_output = false; |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
492 i_crit++; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
493 do_restart = true; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
494 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
495 else |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
496 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
497 clear_stop_time (); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
498 t_out = next_out; |
22960
0d1422cb7e93
use F77_INT instead of octave_idx_type for liboctave ODE and DAE classes
John W. Eaton <jwe@octave.org>
parents:
22755
diff
changeset
|
499 save_output = true; |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
500 i_out++; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
501 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
502 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
503 else |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
504 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
505 set_stop_time (next_crit); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
506 t_out = next_out; |
22960
0d1422cb7e93
use F77_INT instead of octave_idx_type for liboctave ODE and DAE classes
John W. Eaton <jwe@octave.org>
parents:
22755
diff
changeset
|
507 save_output = true; |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
508 i_out++; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
509 } |
3 | 510 |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
511 ColumnVector x_next = do_integrate (t_out); |
3 | 512 |
30067
fc509c3c445a
maint: use "m_" prefix for member variables in base-de.h and base-dae.h
Rik <rik@octave.org>
parents:
30047
diff
changeset
|
513 if (m_integration_error) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
514 return retval; |
258 | 515 |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
516 if (save_output) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
517 { |
22960
0d1422cb7e93
use F77_INT instead of octave_idx_type for liboctave ODE and DAE classes
John W. Eaton <jwe@octave.org>
parents:
22755
diff
changeset
|
518 for (F77_INT i = 0; i < n; i++) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
519 retval.elem (i_out-1, i) = x_next.elem (i); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
520 } |
3 | 521 |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
522 if (do_restart) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
523 force_restart (); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
524 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
525 } |
3 | 526 else |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
527 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
528 retval = do_integrate (tout); |
258 | 529 |
30067
fc509c3c445a
maint: use "m_" prefix for member variables in base-de.h and base-dae.h
Rik <rik@octave.org>
parents:
30047
diff
changeset
|
530 if (m_integration_error) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
531 return retval; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
532 } |
3 | 533 } |
534 | |
535 return retval; | |
536 } |