LAPACK 3.12.1
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches
dgeevx.f
Go to the documentation of this file.
1*> \brief <b> DGEEVX computes the eigenvalues and, optionally, the left and/or right eigenvectors for GE matrices</b>
2*
3* =========== DOCUMENTATION ===========
4*
5* Online html documentation available at
6* http://www.netlib.org/lapack/explore-html/
7*
8*> Download DGEEVX + dependencies
9*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dgeevx.f">
10*> [TGZ]</a>
11*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dgeevx.f">
12*> [ZIP]</a>
13*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dgeevx.f">
14*> [TXT]</a>
15*
16* Definition:
17* ===========
18*
19* SUBROUTINE DGEEVX( BALANC, JOBVL, JOBVR, SENSE, N, A, LDA, WR, WI,
20* VL, LDVL, VR, LDVR, ILO, IHI, SCALE, ABNRM,
21* RCONDE, RCONDV, WORK, LWORK, IWORK, INFO )
22*
23* .. Scalar Arguments ..
24* CHARACTER BALANC, JOBVL, JOBVR, SENSE
25* INTEGER IHI, ILO, INFO, LDA, LDVL, LDVR, LWORK, N
26* DOUBLE PRECISION ABNRM
27* ..
28* .. Array Arguments ..
29* INTEGER IWORK( * )
30* DOUBLE PRECISION A( LDA, * ), RCONDE( * ), RCONDV( * ),
31* $ SCALE( * ), VL( LDVL, * ), VR( LDVR, * ),
32* $ WI( * ), WORK( * ), WR( * )
33* ..
34*
35*
36*> \par Purpose:
37* =============
38*>
39*> \verbatim
40*>
41*> DGEEVX computes for an N-by-N real nonsymmetric matrix A, the
42*> eigenvalues and, optionally, the left and/or right eigenvectors.
43*>
44*> Optionally also, it computes a balancing transformation to improve
45*> the conditioning of the eigenvalues and eigenvectors (ILO, IHI,
46*> SCALE, and ABNRM), reciprocal condition numbers for the eigenvalues
47*> (RCONDE), and reciprocal condition numbers for the right
48*> eigenvectors (RCONDV).
49*>
50*> The right eigenvector v(j) of A satisfies
51*> A * v(j) = lambda(j) * v(j)
52*> where lambda(j) is its eigenvalue.
53*> The left eigenvector u(j) of A satisfies
54*> u(j)**H * A = lambda(j) * u(j)**H
55*> where u(j)**H denotes the conjugate-transpose of u(j).
56*>
57*> The computed eigenvectors are normalized to have Euclidean norm
58*> equal to 1 and largest component real.
59*>
60*> Balancing a matrix means permuting the rows and columns to make it
61*> more nearly upper triangular, and applying a diagonal similarity
62*> transformation D * A * D**(-1), where D is a diagonal matrix, to
63*> make its rows and columns closer in norm and the condition numbers
64*> of its eigenvalues and eigenvectors smaller. The computed
65*> reciprocal condition numbers correspond to the balanced matrix.
66*> Permuting rows and columns will not change the condition numbers
67*> (in exact arithmetic) but diagonal scaling will. For further
68*> explanation of balancing, see section 4.10.2 of the LAPACK
69*> Users' Guide.
70*> \endverbatim
71*
72* Arguments:
73* ==========
74*
75*> \param[in] BALANC
76*> \verbatim
77*> BALANC is CHARACTER*1
78*> Indicates how the input matrix should be diagonally scaled
79*> and/or permuted to improve the conditioning of its
80*> eigenvalues.
81*> = 'N': Do not diagonally scale or permute;
82*> = 'P': Perform permutations to make the matrix more nearly
83*> upper triangular. Do not diagonally scale;
84*> = 'S': Diagonally scale the matrix, i.e. replace A by
85*> D*A*D**(-1), where D is a diagonal matrix chosen
86*> to make the rows and columns of A more equal in
87*> norm. Do not permute;
88*> = 'B': Both diagonally scale and permute A.
89*>
90*> Computed reciprocal condition numbers will be for the matrix
91*> after balancing and/or permuting. Permuting does not change
92*> condition numbers (in exact arithmetic), but balancing does.
93*> \endverbatim
94*>
95*> \param[in] JOBVL
96*> \verbatim
97*> JOBVL is CHARACTER*1
98*> = 'N': left eigenvectors of A are not computed;
99*> = 'V': left eigenvectors of A are computed.
100*> If SENSE = 'E' or 'B', JOBVL must = 'V'.
101*> \endverbatim
102*>
103*> \param[in] JOBVR
104*> \verbatim
105*> JOBVR is CHARACTER*1
106*> = 'N': right eigenvectors of A are not computed;
107*> = 'V': right eigenvectors of A are computed.
108*> If SENSE = 'E' or 'B', JOBVR must = 'V'.
109*> \endverbatim
110*>
111*> \param[in] SENSE
112*> \verbatim
113*> SENSE is CHARACTER*1
114*> Determines which reciprocal condition numbers are computed.
115*> = 'N': None are computed;
116*> = 'E': Computed for eigenvalues only;
117*> = 'V': Computed for right eigenvectors only;
118*> = 'B': Computed for eigenvalues and right eigenvectors.
119*>
120*> If SENSE = 'E' or 'B', both left and right eigenvectors
121*> must also be computed (JOBVL = 'V' and JOBVR = 'V').
122*> \endverbatim
123*>
124*> \param[in] N
125*> \verbatim
126*> N is INTEGER
127*> The order of the matrix A. N >= 0.
128*> \endverbatim
129*>
130*> \param[in,out] A
131*> \verbatim
132*> A is DOUBLE PRECISION array, dimension (LDA,N)
133*> On entry, the N-by-N matrix A.
134*> On exit, A has been overwritten. If JOBVL = 'V' or
135*> JOBVR = 'V', A contains the real Schur form of the balanced
136*> version of the input matrix A.
137*> \endverbatim
138*>
139*> \param[in] LDA
140*> \verbatim
141*> LDA is INTEGER
142*> The leading dimension of the array A. LDA >= max(1,N).
143*> \endverbatim
144*>
145*> \param[out] WR
146*> \verbatim
147*> WR is DOUBLE PRECISION array, dimension (N)
148*> \endverbatim
149*>
150*> \param[out] WI
151*> \verbatim
152*> WI is DOUBLE PRECISION array, dimension (N)
153*> WR and WI contain the real and imaginary parts,
154*> respectively, of the computed eigenvalues. Complex
155*> conjugate pairs of eigenvalues will appear consecutively
156*> with the eigenvalue having the positive imaginary part
157*> first.
158*> \endverbatim
159*>
160*> \param[out] VL
161*> \verbatim
162*> VL is DOUBLE PRECISION array, dimension (LDVL,N)
163*> If JOBVL = 'V', the left eigenvectors u(j) are stored one
164*> after another in the columns of VL, in the same order
165*> as their eigenvalues.
166*> If JOBVL = 'N', VL is not referenced.
167*> If the j-th eigenvalue is real, then u(j) = VL(:,j),
168*> the j-th column of VL.
169*> If the j-th and (j+1)-st eigenvalues form a complex
170*> conjugate pair, then u(j) = VL(:,j) + i*VL(:,j+1) and
171*> u(j+1) = VL(:,j) - i*VL(:,j+1).
172*> \endverbatim
173*>
174*> \param[in] LDVL
175*> \verbatim
176*> LDVL is INTEGER
177*> The leading dimension of the array VL. LDVL >= 1; if
178*> JOBVL = 'V', LDVL >= N.
179*> \endverbatim
180*>
181*> \param[out] VR
182*> \verbatim
183*> VR is DOUBLE PRECISION array, dimension (LDVR,N)
184*> If JOBVR = 'V', the right eigenvectors v(j) are stored one
185*> after another in the columns of VR, in the same order
186*> as their eigenvalues.
187*> If JOBVR = 'N', VR is not referenced.
188*> If the j-th eigenvalue is real, then v(j) = VR(:,j),
189*> the j-th column of VR.
190*> If the j-th and (j+1)-st eigenvalues form a complex
191*> conjugate pair, then v(j) = VR(:,j) + i*VR(:,j+1) and
192*> v(j+1) = VR(:,j) - i*VR(:,j+1).
193*> \endverbatim
194*>
195*> \param[in] LDVR
196*> \verbatim
197*> LDVR is INTEGER
198*> The leading dimension of the array VR. LDVR >= 1, and if
199*> JOBVR = 'V', LDVR >= N.
200*> \endverbatim
201*>
202*> \param[out] ILO
203*> \verbatim
204*> ILO is INTEGER
205*> \endverbatim
206*>
207*> \param[out] IHI
208*> \verbatim
209*> IHI is INTEGER
210*> ILO and IHI are integer values determined when A was
211*> balanced. The balanced A(i,j) = 0 if I > J and
212*> J = 1,...,ILO-1 or I = IHI+1,...,N.
213*> \endverbatim
214*>
215*> \param[out] SCALE
216*> \verbatim
217*> SCALE is DOUBLE PRECISION array, dimension (N)
218*> Details of the permutations and scaling factors applied
219*> when balancing A. If P(j) is the index of the row and column
220*> interchanged with row and column j, and D(j) is the scaling
221*> factor applied to row and column j, then
222*> SCALE(J) = P(J), for J = 1,...,ILO-1
223*> = D(J), for J = ILO,...,IHI
224*> = P(J) for J = IHI+1,...,N.
225*> The order in which the interchanges are made is N to IHI+1,
226*> then 1 to ILO-1.
227*> \endverbatim
228*>
229*> \param[out] ABNRM
230*> \verbatim
231*> ABNRM is DOUBLE PRECISION
232*> The one-norm of the balanced matrix (the maximum
233*> of the sum of absolute values of elements of any column).
234*> \endverbatim
235*>
236*> \param[out] RCONDE
237*> \verbatim
238*> RCONDE is DOUBLE PRECISION array, dimension (N)
239*> RCONDE(j) is the reciprocal condition number of the j-th
240*> eigenvalue.
241*> \endverbatim
242*>
243*> \param[out] RCONDV
244*> \verbatim
245*> RCONDV is DOUBLE PRECISION array, dimension (N)
246*> RCONDV(j) is the reciprocal condition number of the j-th
247*> right eigenvector.
248*> \endverbatim
249*>
250*> \param[out] WORK
251*> \verbatim
252*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK))
253*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
254*> \endverbatim
255*>
256*> \param[in] LWORK
257*> \verbatim
258*> LWORK is INTEGER
259*> The dimension of the array WORK. If SENSE = 'N' or 'E',
260*> LWORK >= max(1,2*N), and if JOBVL = 'V' or JOBVR = 'V',
261*> LWORK >= 3*N. If SENSE = 'V' or 'B', LWORK >= N*(N+6).
262*> For good performance, LWORK must generally be larger.
263*>
264*> If LWORK = -1, then a workspace query is assumed; the routine
265*> only calculates the optimal size of the WORK array, returns
266*> this value as the first entry of the WORK array, and no error
267*> message related to LWORK is issued by XERBLA.
268*> \endverbatim
269*>
270*> \param[out] IWORK
271*> \verbatim
272*> IWORK is INTEGER array, dimension (2*N-2)
273*> If SENSE = 'N' or 'E', not referenced.
274*> \endverbatim
275*>
276*> \param[out] INFO
277*> \verbatim
278*> INFO is INTEGER
279*> = 0: successful exit
280*> < 0: if INFO = -i, the i-th argument had an illegal value.
281*> > 0: if INFO = i, the QR algorithm failed to compute all the
282*> eigenvalues, and no eigenvectors or condition numbers
283*> have been computed; elements 1:ILO-1 and i+1:N of WR
284*> and WI contain eigenvalues which have converged.
285*> \endverbatim
286*
287* Authors:
288* ========
289*
290*> \author Univ. of Tennessee
291*> \author Univ. of California Berkeley
292*> \author Univ. of Colorado Denver
293*> \author NAG Ltd.
294*
295*
296* @precisions fortran d -> s
297*
298*> \ingroup geevx
299*
300* =====================================================================
301 SUBROUTINE dgeevx( BALANC, JOBVL, JOBVR, SENSE, N, A, LDA, WR,
302 $ WI,
303 $ VL, LDVL, VR, LDVR, ILO, IHI, SCALE, ABNRM,
304 $ RCONDE, RCONDV, WORK, LWORK, IWORK, INFO )
305 implicit none
306*
307* -- LAPACK driver routine --
308* -- LAPACK is a software package provided by Univ. of Tennessee, --
309* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
310*
311* .. Scalar Arguments ..
312 CHARACTER BALANC, JOBVL, JOBVR, SENSE
313 INTEGER IHI, ILO, INFO, LDA, LDVL, LDVR, LWORK, N
314 DOUBLE PRECISION ABNRM
315* ..
316* .. Array Arguments ..
317 INTEGER IWORK( * )
318 DOUBLE PRECISION A( LDA, * ), RCONDE( * ), RCONDV( * ),
319 $ SCALE( * ), VL( LDVL, * ), VR( LDVR, * ),
320 $ wi( * ), work( * ), wr( * )
321* ..
322*
323* =====================================================================
324*
325* .. Parameters ..
326 DOUBLE PRECISION ZERO, ONE
327 PARAMETER ( ZERO = 0.0d0, one = 1.0d0 )
328* ..
329* .. Local Scalars ..
330 LOGICAL LQUERY, SCALEA, WANTVL, WANTVR, WNTSNB, WNTSNE,
331 $ WNTSNN, WNTSNV
332 CHARACTER JOB, SIDE
333 INTEGER HSWORK, I, ICOND, IERR, ITAU, IWRK, K,
334 $ LWORK_TREVC, MAXWRK, MINWRK, NOUT
335 DOUBLE PRECISION ANRM, BIGNUM, CS, CSCALE, EPS, R, SCL, SMLNUM,
336 $ sn
337* ..
338* .. Local Arrays ..
339 LOGICAL SELECT( 1 )
340 DOUBLE PRECISION DUM( 1 )
341* ..
342* .. External Subroutines ..
343 EXTERNAL dgebak, dgebal, dgehrd, dhseqr, dlacpy,
344 $ dlartg,
346 $ xerbla
347* ..
348* .. External Functions ..
349 LOGICAL LSAME
350 INTEGER IDAMAX, ILAENV
351 DOUBLE PRECISION DLAMCH, DLANGE, DLAPY2, DNRM2
352 EXTERNAL lsame, idamax, ilaenv, dlamch, dlange,
353 $ dlapy2,
354 $ dnrm2
355* ..
356* .. Intrinsic Functions ..
357 INTRINSIC max, sqrt
358* ..
359* .. Executable Statements ..
360*
361* Test the input arguments
362*
363 info = 0
364 lquery = ( lwork.EQ.-1 )
365 wantvl = lsame( jobvl, 'V' )
366 wantvr = lsame( jobvr, 'V' )
367 wntsnn = lsame( sense, 'N' )
368 wntsne = lsame( sense, 'E' )
369 wntsnv = lsame( sense, 'V' )
370 wntsnb = lsame( sense, 'B' )
371 IF( .NOT.( lsame( balanc, 'N' ) .OR. lsame( balanc, 'S' )
372 $ .OR.
373 $ lsame( balanc, 'P' ) .OR.
374 $ lsame( balanc, 'B' ) ) )
375 $ THEN
376 info = -1
377 ELSE IF( ( .NOT.wantvl ) .AND.
378 $ ( .NOT.lsame( jobvl, 'N' ) ) ) THEN
379 info = -2
380 ELSE IF( ( .NOT.wantvr ) .AND.
381 $ ( .NOT.lsame( jobvr, 'N' ) ) ) THEN
382 info = -3
383 ELSE IF( .NOT.( wntsnn .OR. wntsne .OR. wntsnb .OR. wntsnv ) .OR.
384 $ ( ( wntsne .OR. wntsnb ) .AND. .NOT.( wantvl .AND.
385 $ wantvr ) ) ) THEN
386 info = -4
387 ELSE IF( n.LT.0 ) THEN
388 info = -5
389 ELSE IF( lda.LT.max( 1, n ) ) THEN
390 info = -7
391 ELSE IF( ldvl.LT.1 .OR. ( wantvl .AND. ldvl.LT.n ) ) THEN
392 info = -11
393 ELSE IF( ldvr.LT.1 .OR. ( wantvr .AND. ldvr.LT.n ) ) THEN
394 info = -13
395 END IF
396*
397* Compute workspace
398* (Note: Comments in the code beginning "Workspace:" describe the
399* minimal amount of workspace needed at that point in the code,
400* as well as the preferred amount for good performance.
401* NB refers to the optimal block size for the immediately
402* following subroutine, as returned by ILAENV.
403* HSWORK refers to the workspace preferred by DHSEQR, as
404* calculated below. HSWORK is computed assuming ILO=1 and IHI=N,
405* the worst case.)
406*
407 IF( info.EQ.0 ) THEN
408 IF( n.EQ.0 ) THEN
409 minwrk = 1
410 maxwrk = 1
411 ELSE
412 maxwrk = n + n*ilaenv( 1, 'DGEHRD', ' ', n, 1, n, 0 )
413*
414 IF( wantvl ) THEN
415 CALL dtrevc3( 'L', 'B', SELECT, n, a, lda,
416 $ vl, ldvl, vr, ldvr,
417 $ n, nout, work, -1, ierr )
418 lwork_trevc = int( work(1) )
419 maxwrk = max( maxwrk, n + lwork_trevc )
420 CALL dhseqr( 'S', 'V', n, 1, n, a, lda, wr, wi, vl,
421 $ ldvl,
422 $ work, -1, info )
423 ELSE IF( wantvr ) THEN
424 CALL dtrevc3( 'R', 'B', SELECT, n, a, lda,
425 $ vl, ldvl, vr, ldvr,
426 $ n, nout, work, -1, ierr )
427 lwork_trevc = int( work(1) )
428 maxwrk = max( maxwrk, n + lwork_trevc )
429 CALL dhseqr( 'S', 'V', n, 1, n, a, lda, wr, wi, vr,
430 $ ldvr,
431 $ work, -1, info )
432 ELSE
433 IF( wntsnn ) THEN
434 CALL dhseqr( 'E', 'N', n, 1, n, a, lda, wr, wi, vr,
435 $ ldvr, work, -1, info )
436 ELSE
437 CALL dhseqr( 'S', 'N', n, 1, n, a, lda, wr, wi, vr,
438 $ ldvr, work, -1, info )
439 END IF
440 END IF
441 hswork = int( work(1) )
442*
443 IF( ( .NOT.wantvl ) .AND. ( .NOT.wantvr ) ) THEN
444 minwrk = 2*n
445 IF( .NOT.wntsnn )
446 $ minwrk = max( minwrk, n*n+6*n )
447 maxwrk = max( maxwrk, hswork )
448 IF( .NOT.wntsnn )
449 $ maxwrk = max( maxwrk, n*n + 6*n )
450 ELSE
451 minwrk = 3*n
452 IF( ( .NOT.wntsnn ) .AND. ( .NOT.wntsne ) )
453 $ minwrk = max( minwrk, n*n + 6*n )
454 maxwrk = max( maxwrk, hswork )
455 maxwrk = max( maxwrk, n + ( n - 1 )*ilaenv( 1,
456 $ 'DORGHR',
457 $ ' ', n, 1, n, -1 ) )
458 IF( ( .NOT.wntsnn ) .AND. ( .NOT.wntsne ) )
459 $ maxwrk = max( maxwrk, n*n + 6*n )
460 maxwrk = max( maxwrk, 3*n )
461 END IF
462 maxwrk = max( maxwrk, minwrk )
463 END IF
464 work( 1 ) = maxwrk
465*
466 IF( lwork.LT.minwrk .AND. .NOT.lquery ) THEN
467 info = -21
468 END IF
469 END IF
470*
471 IF( info.NE.0 ) THEN
472 CALL xerbla( 'DGEEVX', -info )
473 RETURN
474 ELSE IF( lquery ) THEN
475 RETURN
476 END IF
477*
478* Quick return if possible
479*
480 IF( n.EQ.0 )
481 $ RETURN
482*
483* Get machine constants
484*
485 eps = dlamch( 'P' )
486 smlnum = dlamch( 'S' )
487 bignum = one / smlnum
488 smlnum = sqrt( smlnum ) / eps
489 bignum = one / smlnum
490*
491* Scale A if max element outside range [SMLNUM,BIGNUM]
492*
493 icond = 0
494 anrm = dlange( 'M', n, n, a, lda, dum )
495 scalea = .false.
496 IF( anrm.GT.zero .AND. anrm.LT.smlnum ) THEN
497 scalea = .true.
498 cscale = smlnum
499 ELSE IF( anrm.GT.bignum ) THEN
500 scalea = .true.
501 cscale = bignum
502 END IF
503 IF( scalea )
504 $ CALL dlascl( 'G', 0, 0, anrm, cscale, n, n, a, lda, ierr )
505*
506* Balance the matrix and compute ABNRM
507*
508 CALL dgebal( balanc, n, a, lda, ilo, ihi, scale, ierr )
509 abnrm = dlange( '1', n, n, a, lda, dum )
510 IF( scalea ) THEN
511 dum( 1 ) = abnrm
512 CALL dlascl( 'G', 0, 0, cscale, anrm, 1, 1, dum, 1, ierr )
513 abnrm = dum( 1 )
514 END IF
515*
516* Reduce to upper Hessenberg form
517* (Workspace: need 2*N, prefer N+N*NB)
518*
519 itau = 1
520 iwrk = itau + n
521 CALL dgehrd( n, ilo, ihi, a, lda, work( itau ), work( iwrk ),
522 $ lwork-iwrk+1, ierr )
523*
524 IF( wantvl ) THEN
525*
526* Want left eigenvectors
527* Copy Householder vectors to VL
528*
529 side = 'L'
530 CALL dlacpy( 'L', n, n, a, lda, vl, ldvl )
531*
532* Generate orthogonal matrix in VL
533* (Workspace: need 2*N-1, prefer N+(N-1)*NB)
534*
535 CALL dorghr( n, ilo, ihi, vl, ldvl, work( itau ),
536 $ work( iwrk ),
537 $ lwork-iwrk+1, ierr )
538*
539* Perform QR iteration, accumulating Schur vectors in VL
540* (Workspace: need 1, prefer HSWORK (see comments) )
541*
542 iwrk = itau
543 CALL dhseqr( 'S', 'V', n, ilo, ihi, a, lda, wr, wi, vl,
544 $ ldvl,
545 $ work( iwrk ), lwork-iwrk+1, info )
546*
547 IF( wantvr ) THEN
548*
549* Want left and right eigenvectors
550* Copy Schur vectors to VR
551*
552 side = 'B'
553 CALL dlacpy( 'F', n, n, vl, ldvl, vr, ldvr )
554 END IF
555*
556 ELSE IF( wantvr ) THEN
557*
558* Want right eigenvectors
559* Copy Householder vectors to VR
560*
561 side = 'R'
562 CALL dlacpy( 'L', n, n, a, lda, vr, ldvr )
563*
564* Generate orthogonal matrix in VR
565* (Workspace: need 2*N-1, prefer N+(N-1)*NB)
566*
567 CALL dorghr( n, ilo, ihi, vr, ldvr, work( itau ),
568 $ work( iwrk ),
569 $ lwork-iwrk+1, ierr )
570*
571* Perform QR iteration, accumulating Schur vectors in VR
572* (Workspace: need 1, prefer HSWORK (see comments) )
573*
574 iwrk = itau
575 CALL dhseqr( 'S', 'V', n, ilo, ihi, a, lda, wr, wi, vr,
576 $ ldvr,
577 $ work( iwrk ), lwork-iwrk+1, info )
578*
579 ELSE
580*
581* Compute eigenvalues only
582* If condition numbers desired, compute Schur form
583*
584 IF( wntsnn ) THEN
585 job = 'E'
586 ELSE
587 job = 'S'
588 END IF
589*
590* (Workspace: need 1, prefer HSWORK (see comments) )
591*
592 iwrk = itau
593 CALL dhseqr( job, 'N', n, ilo, ihi, a, lda, wr, wi, vr,
594 $ ldvr,
595 $ work( iwrk ), lwork-iwrk+1, info )
596 END IF
597*
598* If INFO .NE. 0 from DHSEQR, then quit
599*
600 IF( info.NE.0 )
601 $ GO TO 50
602*
603 IF( wantvl .OR. wantvr ) THEN
604*
605* Compute left and/or right eigenvectors
606* (Workspace: need 3*N, prefer N + 2*N*NB)
607*
608 CALL dtrevc3( side, 'B', SELECT, n, a, lda, vl, ldvl, vr,
609 $ ldvr,
610 $ n, nout, work( iwrk ), lwork-iwrk+1, ierr )
611 END IF
612*
613* Compute condition numbers if desired
614* (Workspace: need N*N+6*N unless SENSE = 'E')
615*
616 IF( .NOT.wntsnn ) THEN
617 CALL dtrsna( sense, 'A', SELECT, n, a, lda, vl, ldvl, vr,
618 $ ldvr,
619 $ rconde, rcondv, n, nout, work( iwrk ), n, iwork,
620 $ icond )
621 END IF
622*
623 IF( wantvl ) THEN
624*
625* Undo balancing of left eigenvectors
626*
627 CALL dgebak( balanc, 'L', n, ilo, ihi, scale, n, vl, ldvl,
628 $ ierr )
629*
630* Normalize left eigenvectors and make largest component real
631*
632 DO 20 i = 1, n
633 IF( wi( i ).EQ.zero ) THEN
634 scl = one / dnrm2( n, vl( 1, i ), 1 )
635 CALL dscal( n, scl, vl( 1, i ), 1 )
636 ELSE IF( wi( i ).GT.zero ) THEN
637 scl = one / dlapy2( dnrm2( n, vl( 1, i ), 1 ),
638 $ dnrm2( n, vl( 1, i+1 ), 1 ) )
639 CALL dscal( n, scl, vl( 1, i ), 1 )
640 CALL dscal( n, scl, vl( 1, i+1 ), 1 )
641 DO 10 k = 1, n
642 work( k ) = vl( k, i )**2 + vl( k, i+1 )**2
643 10 CONTINUE
644 k = idamax( n, work, 1 )
645 CALL dlartg( vl( k, i ), vl( k, i+1 ), cs, sn, r )
646 CALL drot( n, vl( 1, i ), 1, vl( 1, i+1 ), 1, cs, sn )
647 vl( k, i+1 ) = zero
648 END IF
649 20 CONTINUE
650 END IF
651*
652 IF( wantvr ) THEN
653*
654* Undo balancing of right eigenvectors
655*
656 CALL dgebak( balanc, 'R', n, ilo, ihi, scale, n, vr, ldvr,
657 $ ierr )
658*
659* Normalize right eigenvectors and make largest component real
660*
661 DO 40 i = 1, n
662 IF( wi( i ).EQ.zero ) THEN
663 scl = one / dnrm2( n, vr( 1, i ), 1 )
664 CALL dscal( n, scl, vr( 1, i ), 1 )
665 ELSE IF( wi( i ).GT.zero ) THEN
666 scl = one / dlapy2( dnrm2( n, vr( 1, i ), 1 ),
667 $ dnrm2( n, vr( 1, i+1 ), 1 ) )
668 CALL dscal( n, scl, vr( 1, i ), 1 )
669 CALL dscal( n, scl, vr( 1, i+1 ), 1 )
670 DO 30 k = 1, n
671 work( k ) = vr( k, i )**2 + vr( k, i+1 )**2
672 30 CONTINUE
673 k = idamax( n, work, 1 )
674 CALL dlartg( vr( k, i ), vr( k, i+1 ), cs, sn, r )
675 CALL drot( n, vr( 1, i ), 1, vr( 1, i+1 ), 1, cs, sn )
676 vr( k, i+1 ) = zero
677 END IF
678 40 CONTINUE
679 END IF
680*
681* Undo scaling if necessary
682*
683 50 CONTINUE
684 IF( scalea ) THEN
685 CALL dlascl( 'G', 0, 0, cscale, anrm, n-info, 1,
686 $ wr( info+1 ),
687 $ max( n-info, 1 ), ierr )
688 CALL dlascl( 'G', 0, 0, cscale, anrm, n-info, 1,
689 $ wi( info+1 ),
690 $ max( n-info, 1 ), ierr )
691 IF( info.EQ.0 ) THEN
692 IF( ( wntsnv .OR. wntsnb ) .AND. icond.EQ.0 )
693 $ CALL dlascl( 'G', 0, 0, cscale, anrm, n, 1, rcondv, n,
694 $ ierr )
695 ELSE
696 CALL dlascl( 'G', 0, 0, cscale, anrm, ilo-1, 1, wr, n,
697 $ ierr )
698 CALL dlascl( 'G', 0, 0, cscale, anrm, ilo-1, 1, wi, n,
699 $ ierr )
700 END IF
701 END IF
702*
703 work( 1 ) = maxwrk
704 RETURN
705*
706* End of DGEEVX
707*
708 END
subroutine xerbla(srname, info)
Definition cblat2.f:3285
subroutine dgebak(job, side, n, ilo, ihi, scale, m, v, ldv, info)
DGEBAK
Definition dgebak.f:128
subroutine dgebal(job, n, a, lda, ilo, ihi, scale, info)
DGEBAL
Definition dgebal.f:161
subroutine dgeevx(balanc, jobvl, jobvr, sense, n, a, lda, wr, wi, vl, ldvl, vr, ldvr, ilo, ihi, scale, abnrm, rconde, rcondv, work, lwork, iwork, info)
DGEEVX computes the eigenvalues and, optionally, the left and/or right eigenvectors for GE matrices
Definition dgeevx.f:305
subroutine dgehrd(n, ilo, ihi, a, lda, tau, work, lwork, info)
DGEHRD
Definition dgehrd.f:166
subroutine dhseqr(job, compz, n, ilo, ihi, h, ldh, wr, wi, z, ldz, work, lwork, info)
DHSEQR
Definition dhseqr.f:314
subroutine dlacpy(uplo, m, n, a, lda, b, ldb)
DLACPY copies all or part of one two-dimensional array to another.
Definition dlacpy.f:101
subroutine dlartg(f, g, c, s, r)
DLARTG generates a plane rotation with real cosine and real sine.
Definition dlartg.f90:111
subroutine dlascl(type, kl, ku, cfrom, cto, m, n, a, lda, info)
DLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
Definition dlascl.f:142
subroutine drot(n, dx, incx, dy, incy, c, s)
DROT
Definition drot.f:92
subroutine dscal(n, da, dx, incx)
DSCAL
Definition dscal.f:79
subroutine dtrevc3(side, howmny, select, n, t, ldt, vl, ldvl, vr, ldvr, mm, m, work, lwork, info)
DTREVC3
Definition dtrevc3.f:235
subroutine dtrsna(job, howmny, select, n, t, ldt, vl, ldvl, vr, ldvr, s, sep, mm, m, work, ldwork, iwork, info)
DTRSNA
Definition dtrsna.f:264
subroutine dorghr(n, ilo, ihi, a, lda, tau, work, lwork, info)
DORGHR
Definition dorghr.f:125