Mercurial > hg > octave-nkf
annotate liboctave/numeric/base-de.h @ 20809:ffc6cdcd02c5 stable
Fix segfault when complex double matrix calls ZGETRF (bug #45577).
* CMatrix.cc (finverse, determinant, rcond, fsolve): Calculate norm of matrix
and if it is NaN, skip calling ZGETRF in LAPACK and set info to non-zero value
to signal an error.
author | Rik <rik@octave.org> |
---|---|
date | Sat, 10 Oct 2015 16:46:00 -0700 |
parents | 4197fc428c7d |
children | 5dfaaaae784f |
rev | line source |
---|---|
1843 | 1 /* |
2 | |
19898
4197fc428c7d
maint: Update copyright notices for 2015.
John W. Eaton <jwe@octave.org>
parents:
17769
diff
changeset
|
3 Copyright (C) 1996-2015 John W. Eaton |
1843 | 4 |
5 This file is part of Octave. | |
6 | |
7 Octave is free software; you can redistribute it and/or modify it | |
8 under the terms of the GNU General Public License as published by the | |
7016 | 9 Free Software Foundation; either version 3 of the License, or (at your |
10 option) any later version. | |
1843 | 11 |
12 Octave is distributed in the hope that it will be useful, but WITHOUT | |
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
15 for more details. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
7016 | 18 along with Octave; see the file COPYING. If not, see |
19 <http://www.gnu.org/licenses/>. | |
1843 | 20 |
21 */ | |
22 | |
23 #if !defined (octave_base_de_h) | |
24 #define octave_base_de_h 1 | |
25 | |
3995 | 26 #include <string> |
27 | |
1843 | 28 #include "dColVector.h" |
29 #include "dMatrix.h" | |
30 | |
1879 | 31 class |
32 base_diff_eqn | |
1843 | 33 { |
34 public: | |
35 | |
3995 | 36 base_diff_eqn (void) |
37 : x (), t (0.0), stop_time (0.0), stop_time_set (false), | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
38 restart (true), integration_error (false), istate (0) { } |
1843 | 39 |
3995 | 40 base_diff_eqn (const ColumnVector& xx, double tt) |
41 : x (xx), t (tt), stop_time (0.0), stop_time_set (false), | |
3997 | 42 restart (true), integration_error (false), istate (0) { } |
1843 | 43 |
3995 | 44 base_diff_eqn (const base_diff_eqn& a) |
45 : x (a.x), t (a.t), stop_time (0.0), stop_time_set (false), | |
3997 | 46 restart (true), integration_error (false), istate (0) { } |
1843 | 47 |
48 virtual ~base_diff_eqn (void) { } | |
49 | |
50 base_diff_eqn& operator = (const base_diff_eqn& a) | |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
51 { |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
52 if (this != &a) |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
53 { |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
54 x = a.x; |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
55 t = a.t; |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
56 stop_time = a.stop_time; |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
57 stop_time_set = a.stop_time_set; |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
58 restart = a.restart; |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
59 integration_error = a.integration_error; |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
60 istate = a.istate; |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
61 } |
3995 | 62 |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
63 return *this; |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
64 } |
1843 | 65 |
3984 | 66 void initialize (const ColumnVector& x0, double t0) |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
67 { |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
68 x = x0; |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
69 t = t0; |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
70 integration_error = false; |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
71 istate = 0; |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
72 force_restart (); |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
73 } |
1843 | 74 |
5275 | 75 octave_idx_type size (void) const { return x.capacity (); } |
1843 | 76 |
77 ColumnVector state (void) const { return x; } | |
78 | |
79 double time (void) const { return t; } | |
80 | |
4277 | 81 void set_stop_time (double tt) |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
82 { |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
83 stop_time_set = true; |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
84 stop_time = tt; |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
85 force_restart (); |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
86 } |
3995 | 87 |
4049 | 88 void clear_stop_time (void) |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
89 { |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
90 stop_time_set = false; |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
91 force_restart (); |
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
92 } |
3995 | 93 |
94 virtual void force_restart (void) { restart = true; } | |
95 | |
96 bool integration_ok (void) const { return ! integration_error; } | |
97 | |
5275 | 98 octave_idx_type integration_state (void) const { return istate; } |
3997 | 99 |
3995 | 100 virtual std::string error_message (void) const = 0; |
101 | |
1843 | 102 protected: |
103 | |
104 ColumnVector x; | |
3995 | 105 |
1843 | 106 double t; |
3995 | 107 |
108 double stop_time; | |
109 | |
110 bool stop_time_set; | |
111 | |
112 bool restart; | |
113 | |
114 bool integration_error; | |
3997 | 115 |
5275 | 116 octave_idx_type istate; |
1843 | 117 }; |
118 | |
119 #endif |