1
*> \brief <b> DGEEV computes the eigenvalues and, optionally, the left and/or right eigenvectors for GE matrices</b>
3
* =========== DOCUMENTATION ===========
5
* Online html documentation available at
6
* http://www.netlib.org/lapack/explore-html/
9
*> Download DGEEV + dependencies
10
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dgeev.f">
12
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dgeev.f">
14
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dgeev.f">
21
* SUBROUTINE DGEEV( JOBVL, JOBVR, N, A, LDA, WR, WI, VL, LDVL, VR,
22
* LDVR, WORK, LWORK, INFO )
24
* .. Scalar Arguments ..
25
* CHARACTER JOBVL, JOBVR
26
* INTEGER INFO, LDA, LDVL, LDVR, LWORK, N
28
* .. Array Arguments ..
29
* DOUBLE PRECISION A( LDA, * ), VL( LDVL, * ), VR( LDVR, * ),
30
* $ WI( * ), WORK( * ), WR( * )
39
*> DGEEV computes for an N-by-N real nonsymmetric matrix A, the
40
*> eigenvalues and, optionally, the left and/or right eigenvectors.
42
*> The right eigenvector v(j) of A satisfies
43
*> A * v(j) = lambda(j) * v(j)
44
*> where lambda(j) is its eigenvalue.
45
*> The left eigenvector u(j) of A satisfies
46
*> u(j)**H * A = lambda(j) * u(j)**H
47
*> where u(j)**H denotes the conjugate-transpose of u(j).
49
*> The computed eigenvectors are normalized to have Euclidean norm
50
*> equal to 1 and largest component real.
58
*> JOBVL is CHARACTER*1
59
*> = 'N': left eigenvectors of A are not computed;
60
*> = 'V': left eigenvectors of A are computed.
65
*> JOBVR is CHARACTER*1
66
*> = 'N': right eigenvectors of A are not computed;
67
*> = 'V': right eigenvectors of A are computed.
73
*> The order of the matrix A. N >= 0.
78
*> A is DOUBLE PRECISION array, dimension (LDA,N)
79
*> On entry, the N-by-N matrix A.
80
*> On exit, A has been overwritten.
86
*> The leading dimension of the array A. LDA >= max(1,N).
91
*> WR is DOUBLE PRECISION array, dimension (N)
96
*> WI is DOUBLE PRECISION array, dimension (N)
97
*> WR and WI contain the real and imaginary parts,
98
*> respectively, of the computed eigenvalues. Complex
99
*> conjugate pairs of eigenvalues appear consecutively
100
*> with the eigenvalue having the positive imaginary part
106
*> VL is DOUBLE PRECISION array, dimension (LDVL,N)
107
*> If JOBVL = 'V', the left eigenvectors u(j) are stored one
108
*> after another in the columns of VL, in the same order
109
*> as their eigenvalues.
110
*> If JOBVL = 'N', VL is not referenced.
111
*> If the j-th eigenvalue is real, then u(j) = VL(:,j),
112
*> the j-th column of VL.
113
*> If the j-th and (j+1)-st eigenvalues form a complex
114
*> conjugate pair, then u(j) = VL(:,j) + i*VL(:,j+1) and
115
*> u(j+1) = VL(:,j) - i*VL(:,j+1).
121
*> The leading dimension of the array VL. LDVL >= 1; if
122
*> JOBVL = 'V', LDVL >= N.
127
*> VR is DOUBLE PRECISION array, dimension (LDVR,N)
128
*> If JOBVR = 'V', the right eigenvectors v(j) are stored one
129
*> after another in the columns of VR, in the same order
130
*> as their eigenvalues.
131
*> If JOBVR = 'N', VR is not referenced.
132
*> If the j-th eigenvalue is real, then v(j) = VR(:,j),
133
*> the j-th column of VR.
134
*> If the j-th and (j+1)-st eigenvalues form a complex
135
*> conjugate pair, then v(j) = VR(:,j) + i*VR(:,j+1) and
136
*> v(j+1) = VR(:,j) - i*VR(:,j+1).
142
*> The leading dimension of the array VR. LDVR >= 1; if
143
*> JOBVR = 'V', LDVR >= N.
148
*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK))
149
*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
155
*> The dimension of the array WORK. LWORK >= max(1,3*N), and
156
*> if JOBVL = 'V' or JOBVR = 'V', LWORK >= 4*N. For good
157
*> performance, LWORK must generally be larger.
159
*> If LWORK = -1, then a workspace query is assumed; the routine
160
*> only calculates the optimal size of the WORK array, returns
161
*> this value as the first entry of the WORK array, and no error
162
*> message related to LWORK is issued by XERBLA.
168
*> = 0: successful exit
169
*> < 0: if INFO = -i, the i-th argument had an illegal value.
170
*> > 0: if INFO = i, the QR algorithm failed to compute all the
171
*> eigenvalues, and no eigenvectors have been computed;
172
*> elements i+1:N of WR and WI contain eigenvalues which
179
*> \author Univ. of Tennessee
180
*> \author Univ. of California Berkeley
181
*> \author Univ. of Colorado Denver
184
*> \date September 2012
186
*> \ingroup doubleGEeigen
188
* =====================================================================
1
189
SUBROUTINE DGEEV( JOBVL, JOBVR, N, A, LDA, WR, WI, VL, LDVL, VR,
2
190
$ LDVR, WORK, LWORK, INFO )
3
c $Id: dgeev.f 19697 2010-10-29 16:57:34Z d3y133 $
5
* -- LAPACK driver routine (version 2.0) --
6
* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
7
* Courant Institute, Argonne National Lab, and Rice University
192
* -- LAPACK driver routine (version 3.4.2) --
193
* -- LAPACK is a software package provided by Univ. of Tennessee, --
194
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
10
197
* .. Scalar Arguments ..
11
198
CHARACTER JOBVL, JOBVR
16
203
$ WI( * ), WORK( * ), WR( * )
22
* DGEEV computes for an N-by-N real nonsymmetric matrix A, the
23
* eigenvalues and, optionally, the left and/or right eigenvectors.
25
* The right eigenvector v(j) of A satisfies
26
* A * v(j) = lambda(j) * v(j)
27
* where lambda(j) is its eigenvalue.
28
* The left eigenvector u(j) of A satisfies
29
* u(j)**H * A = lambda(j) * u(j)**H
30
* where u(j)**H denotes the conjugate transpose of u(j).
32
* The computed eigenvectors are normalized to have Euclidean norm
33
* equal to 1 and largest component real.
38
* JOBVL (input) CHARACTER*1
39
* = 'N': left eigenvectors of A are not computed;
40
* = 'V': left eigenvectors of A are computed.
42
* JOBVR (input) CHARACTER*1
43
* = 'N': right eigenvectors of A are not computed;
44
* = 'V': right eigenvectors of A are computed.
47
* The order of the matrix A. N >= 0.
49
* A (input/output) DOUBLE PRECISION array, dimension (LDA,N)
50
* On entry, the N-by-N matrix A.
51
* On exit, A has been overwritten.
54
* The leading dimension of the array A. LDA >= max(1,N).
56
* WR (output) DOUBLE PRECISION array, dimension (N)
57
* WI (output) DOUBLE PRECISION array, dimension (N)
58
* WR and WI contain the real and imaginary parts,
59
* respectively, of the computed eigenvalues. Complex
60
* conjugate pairs of eigenvalues appear consecutively
61
* with the eigenvalue having the positive imaginary part
64
* VL (output) DOUBLE PRECISION array, dimension (LDVL,N)
65
* If JOBVL = 'V', the left eigenvectors u(j) are stored one
66
* after another in the columns of VL, in the same order
67
* as their eigenvalues.
68
* If JOBVL = 'N', VL is not referenced.
69
* If the j-th eigenvalue is real, then u(j) = VL(:,j),
70
* the j-th column of VL.
71
* If the j-th and (j+1)-st eigenvalues form a complex
72
* conjugate pair, then u(j) = VL(:,j) + i*VL(:,j+1) and
73
* u(j+1) = VL(:,j) - i*VL(:,j+1).
75
* LDVL (input) INTEGER
76
* The leading dimension of the array VL. LDVL >= 1; if
77
* JOBVL = 'V', LDVL >= N.
79
* VR (output) DOUBLE PRECISION array, dimension (LDVR,N)
80
* If JOBVR = 'V', the right eigenvectors v(j) are stored one
81
* after another in the columns of VR, in the same order
82
* as their eigenvalues.
83
* If JOBVR = 'N', VR is not referenced.
84
* If the j-th eigenvalue is real, then v(j) = VR(:,j),
85
* the j-th column of VR.
86
* If the j-th and (j+1)-st eigenvalues form a complex
87
* conjugate pair, then v(j) = VR(:,j) + i*VR(:,j+1) and
88
* v(j+1) = VR(:,j) - i*VR(:,j+1).
90
* LDVR (input) INTEGER
91
* The leading dimension of the array VR. LDVR >= 1; if
92
* JOBVR = 'V', LDVR >= N.
94
* WORK (workspace/output) DOUBLE PRECISION array, dimension (LWORK)
95
* On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
97
* LWORK (input) INTEGER
98
* The dimension of the array WORK. LWORK >= max(1,3*N), and
99
* if JOBVL = 'V' or JOBVR = 'V', LWORK >= 4*N. For good
100
* performance, LWORK must generally be larger.
102
* INFO (output) INTEGER
103
* = 0: successful exit
104
* < 0: if INFO = -i, the i-th argument had an illegal value.
105
* > 0: if INFO = i, the QR algorithm failed to compute all the
106
* eigenvalues, and no eigenvectors have been computed;
107
* elements i+1:N of WR and WI contain eigenvalues which
110
206
* =====================================================================
112
208
* .. Parameters ..
171
268
* calculated below. HSWORK is computed assuming ILO=1 and IHI=N,
172
269
* the worst case.)
175
IF( INFO.EQ.0 .AND. LWORK.GE.1 ) THEN
176
MAXWRK = 2*N + N*ILAENV( 1, 'DGEHRD', ' ', N, 1, N, 0 )
177
IF( ( .NOT.WANTVL ) .AND. ( .NOT.WANTVR ) ) THEN
178
MINWRK = MAX( 1, 3*N )
179
MAXB = MAX( ILAENV( 8, 'DHSEQR', 'EN', N, 1, N, -1 ), 2 )
180
K = MIN( MAXB, N, MAX( 2, ILAENV( 4, 'DHSEQR', 'EN', N, 1,
182
HSWORK = MAX( K*( K+2 ), 2*N )
183
MAXWRK = MAX( MAXWRK, N+1, N+HSWORK )
185
MINWRK = MAX( 1, 4*N )
186
MAXWRK = MAX( MAXWRK, 2*N+( N-1 )*
187
$ ILAENV( 1, 'DORGHR', ' ', N, 1, N, -1 ) )
188
MAXB = MAX( ILAENV( 8, 'DHSEQR', 'SV', N, 1, N, -1 ), 2 )
189
K = MIN( MAXB, N, MAX( 2, ILAENV( 4, 'DHSEQR', 'SV', N, 1,
191
HSWORK = MAX( K*( K+2 ), 2*N )
192
MAXWRK = MAX( MAXWRK, N+1, N+HSWORK )
193
MAXWRK = MAX( MAXWRK, 4*N )
276
MAXWRK = 2*N + N*ILAENV( 1, 'DGEHRD', ' ', N, 1, N, 0 )
279
MAXWRK = MAX( MAXWRK, 2*N + ( N - 1 )*ILAENV( 1,
280
$ 'DORGHR', ' ', N, 1, N, -1 ) )
281
CALL DHSEQR( 'S', 'V', N, 1, N, A, LDA, WR, WI, VL, LDVL,
284
MAXWRK = MAX( MAXWRK, N + 1, N + HSWORK )
285
MAXWRK = MAX( MAXWRK, 4*N )
286
ELSE IF( WANTVR ) THEN
288
MAXWRK = MAX( MAXWRK, 2*N + ( N - 1 )*ILAENV( 1,
289
$ 'DORGHR', ' ', N, 1, N, -1 ) )
290
CALL DHSEQR( 'S', 'V', N, 1, N, A, LDA, WR, WI, VR, LDVR,
293
MAXWRK = MAX( MAXWRK, N + 1, N + HSWORK )
294
MAXWRK = MAX( MAXWRK, 4*N )
297
CALL DHSEQR( 'E', 'N', N, 1, N, A, LDA, WR, WI, VR, LDVR,
300
MAXWRK = MAX( MAXWRK, N + 1, N + HSWORK )
302
MAXWRK = MAX( MAXWRK, MINWRK )
195
304
WORK( 1 ) = MAXWRK
197
IF( LWORK.LT.MINWRK ) THEN
306
IF( LWORK.LT.MINWRK .AND. .NOT.LQUERY ) THEN
200
311
IF( INFO.NE.0 ) THEN
201
312
CALL XERBLA( 'DGEEV ', -INFO )
314
ELSE IF( LQUERY ) THEN
205
318
* Quick return if possible