224 SUBROUTINE dggev( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHAR, ALPHAI,
225 $ BETA, VL, LDVL, VR, LDVR, WORK, LWORK, INFO )
232 CHARACTER JOBVL, JOBVR
233 INTEGER INFO, LDA, LDB, LDVL, LDVR, LWORK, N
236 DOUBLE PRECISION A( LDA, * ), ALPHAI( * ), ALPHAR( * ),
237 $ b( ldb, * ), beta( * ), vl( ldvl, * ),
238 $ vr( ldvr, * ), work( * )
244 DOUBLE PRECISION ZERO, ONE
245 parameter( zero = 0.0d+0, one
248 LOGICAL ILASCL, ILBSCL, ILV, ILVL, ILVR, LQUERY
250 INTEGER ICOLS, IERR, IHI, , IJOBVR, ILEFT, ILO,
251 $ in, iright, irows, itau, iwrk,
jc, jr, maxwrk,
253 DOUBLE PRECISION ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, EPS,
267 DOUBLE PRECISION DLAMCH, DLANGE
268 EXTERNAL lsame, ilaenv, dlamch, dlange
271 INTRINSIC abs,
max, sqrt
277 IF( lsame( jobvl,
'N' ) )
THEN
280 ELSE IF( lsame( jobvl,
'V' ) )
THEN
288 IF( lsame( jobvr,
'N' ) )
THEN
291 ELSE IF( lsame( jobvr,
'V' ) )
THEN
303 lquery = ( lwork.EQ.-1 )
304 IF( ijobvl.LE.0 )
THEN
306 ELSE IF( ijobvr.LE.0 )
THEN
308 ELSE IF( n.LT.0 )
THEN
310 ELSE IF( lda.LT.
max( 1, n ) )
THEN
312 ELSE IF( ldb.LT.
max( 1, n ) )
THEN
314 ELSE IF( ldvl.LT.1 .OR. ( ilvl .AND. ldvl.LT.n ) )
THEN
316 ELSE IF( ldvr.LT.1 .OR. ( ilvr .AND. ldvr.LT.n ) )
THEN
330 maxwrk =
max( 1, n*( 7 +
331 $ ilaenv( 1,
'DGEQRF',
' ', n, 1, n, 0 ) ) )
332 maxwrk =
max( maxwrk, n*( 7 +
333 $ ilaenv( 1,
'DORMQR',
' ', n, 1, n, 0 ) ) )
335 maxwrk =
max( maxwrk, n*( 7 +
336 $ ilaenv( 1,
'DORGQR',
' ', n, 1, n, -1 ) ) )
340 IF( lwork.LT.minwrk .AND. .NOT.lquery )
345 CALL xerbla(
'DGGEV ', -info )
347 ELSE IF( lquery )
THEN
359 smlnum = dlamch(
'S' )
360 bignum = one / smlnum
361 CALL dlabad( smlnum, bignum )
362 smlnum = sqrt( smlnum ) / eps
363 bignum = one / smlnum
367 anrm = dlange(
'M', n, n, a, lda, work )
369 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
372 ELSE IF( anrm.GT.bignum )
THEN
377 $
CALL dlascl(
'G', 0, 0, anrm, anrmto, n, n, a, lda, ierr )
381 bnrm = dlange(
'M', n, n, b, ldb, work )
383 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN
386 ELSE IF( bnrm.GT.bignum )
THEN
391 $
CALL dlascl(
'G', 0, 0, bnrm, bnrmto, n, n, b, ldb, ierr )
399 CALL dggbal(
'P', n, a, lda, b, ldb, ilo, ihi, work( ileft ),
400 $ work( iright ), work( iwrk ), ierr )
405 irows = ihi + 1 - ilo
413 CALL dgeqrf( irows, icols, b( ilo, ilo ), ldb, work( itau ),
414 $ work( iwrk ), lwork+1-iwrk, ierr )
419 CALL dormqr(
'L',
'T', irows, icols, irows, b( ilo, ilo ), ldb,
420 $ work( itau ), a( ilo, ilo ), lda, work( iwrk ),
421 $ lwork+1-iwrk, ierr )
427 CALL dlaset(
'Full', n, n, zero, one, vl, ldvl )
428 IF( irows.GT.1 )
THEN
429 CALL dlacpy(
'L', irows-1, irows-1, b( ilo+1, ilo ), ldb,
430 $ vl( ilo+1, ilo ), ldvl )
432 CALL dorgqr( irows, irows, irows, vl( ilo, ilo ), ldvl,
433 $ work( itau ), work( iwrk ), lwork+1-iwrk, ierr )
439 $
CALL dlaset(
'Full', n, n, zero, one, vr, ldvr )
448 CALL dgghrd( jobvl, jobvr, n, ilo, ihi, a, lda, b, ldb, vl,
449 $ ldvl, vr, ldvr, ierr )
451 CALL dgghrd(
'N',
'N', irows, 1, irows, a( ilo, ilo ), lda,
452 $ b( ilo, ilo ), ldb, vl, ldvl, vr, ldvr, ierr )
465 CALL DHGEQZ( CHTEMP, JOBVL, JOBVR, N, ILO, IHI, A, LDA, B, LDB,
466 $ ALPHAR, ALPHAI, BETA, VL, LDVL, VR, LDVR,
467 $ WORK( IWRK ), LWORK+1-IWRK, IERR )
469.GT..AND..LE.
IF( IERR0 IERRN ) THEN
471.GT..AND..LE.
ELSE IF( IERRN IERR2*N ) THEN
492 CALL DTGEVC( CHTEMP, 'b
', LDUMMA, N, A, LDA, B, LDB, VL, LDVL,
493 $ VR, LDVR, N, IN, WORK( IWRK ), IERR )
503 CALL DGGBAK( 'p
', 'l
', N, ILO, IHI, WORK( ILEFT ),
504 $ WORK( IRIGHT ), N, VL, LDVL, IERR )
506.LT.
IF( ALPHAI( JC )ZERO )
509.EQ.
IF( ALPHAI( JC )ZERO ) THEN
511 TEMP = MAX( TEMP, ABS( VL( JR, JC ) ) )
515 TEMP = MAX( TEMP, ABS( VL( JR, JC ) )+
516 $ ABS( VL( JR, JC+1 ) ) )
522.EQ.
IF( ALPHAI( JC )ZERO ) THEN
524 VL( JR, JC ) = VL( JR, JC )*TEMP
528 VL( JR, JC ) = VL( JR, JC )*TEMP
529 VL( JR, JC+1 ) = VL( JR, JC+1 )*TEMP
535 CALL DGGBAK( 'p
', 'r
', N, ILO, IHI, WORK( ILEFT ),
536 $ WORK( IRIGHT ), N, VR, LDVR, IERR )
538.LT.
IF( ALPHAI( JC )ZERO )
541.EQ.
IF( ALPHAI( JC )ZERO ) THEN
543 TEMP = MAX( TEMP, ABS( VR( JR, JC ) ) )
547 TEMP = MAX( TEMP, ABS( VR( JR, JC ) )+
548 $ ABS( VR( JR, JC+1 ) ) )
554.EQ.
IF( ALPHAI( JC )ZERO ) THEN
556 VR( JR, JC ) = VR( JR, JC )*TEMP
560 VR( JR, JC ) = VR( JR, JC )*TEMP
561 VR( JR, JC+1 ) = VR( JR, JC+1 )*TEMP
576 CALL DLASCL( 'g
', 0, 0, ANRMTO, ANRM, N, 1, ALPHAR, N, IERR )
577 CALL DLASCL( 'g
', 0, 0, ANRMTO, ANRM, N, 1, ALPHAI, N, IERR )
581 CALL DLASCL( 'g
', 0, 0, BNRMTO, BNRM, N, 1, BETA, N, IERR )
subroutine dggev(jobvl, jobvr, n, a, lda, b, ldb, alphar, alphai, beta, vl, ldvl, vr, ldvr, work, lwork, info)
DGGEV computes the eigenvalues and, optionally, the left and/or right eigenvectors for GE matrices