223 SUBROUTINE dggev3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHAR,
224 $ ALPHAI, BETA, VL, LDVL, VR, LDVR, WORK, LWORK,
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 = 1.0d+0 )
248 LOGICAL ILASCL, ILBSCL, ILV, ILVL, ILVR, LQUERY
250 INTEGER ICOLS, IERR, IHI, IJOBVL, IJOBVR, ILEFT, ILO,
251 $ in, iright, irows, itau, iwrk, jc, jr, lwkopt
252 DOUBLE PRECISION ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, EPS,
265 DOUBLE PRECISION DLAMCH, DLANGE
266 EXTERNAL lsame, dlamch, dlange
269 INTRINSIC abs, max, sqrt
275 IF( lsame( jobvl,
'N' ) )
THEN
278 ELSE IF( lsame( jobvl,
'V' ) )
THEN
286 IF( lsame( jobvr,
'N' ) )
THEN
289 ELSE IF( lsame( jobvr,
'V' ) )
THEN
301 lquery = ( lwork.EQ.-1 )
302 IF( ijobvl.LE.0 )
THEN
304 ELSE IF( ijobvr.LE.0 )
THEN
306 ELSE IF( n.LT.0 )
THEN
308 ELSE IF( lda.LT.max( 1, n ) )
THEN
310 ELSE IF( ldb.LT.max( 1, n ) )
THEN
312 ELSE IF( ldvl.LT.1 .OR. ( ilvl .AND. ldvl.LT.n ) )
THEN
314 ELSE IF( ldvr.LT.1 .OR. ( ilvr .AND. ldvr.LT.n ) )
THEN
316 ELSE IF( lwork.LT.max( 1, 8*n ) .AND. .NOT.lquery )
THEN
323 CALL dgeqrf( n, n, b, ldb, work, work, -1, ierr )
324 lwkopt = max(1, 8*n, 3*n+int( work( 1 ) ) )
325 CALL dormqr(
'L',
'T', n, n, n, b, ldb, work, a, lda, work, -1,
327 lwkopt = max( lwkopt, 3*n+int( work( 1 ) ) )
329 CALL dorgqr( n, n, n, vl, ldvl, work, work, -1, ierr )
330 lwkopt = max( lwkopt, 3*n+int( work( 1 ) ) )
333 CALL dgghd3( jobvl, jobvr, n, 1, n, a, lda, b, ldb, vl,
334 $ ldvl, vr, ldvr, work, -1, ierr )
335 lwkopt = max( lwkopt, 3*n+int( work( 1 ) ) )
336 CALL dlaqz0(
'S', jobvl, jobvr, n, 1, n, a, lda, b, ldb,
337 $ alphar, alphai, beta, vl, ldvl, vr, ldvr,
338 $ work, -1, 0, ierr )
339 lwkopt = max( lwkopt, 2*n+int( work( 1 ) ) )
341 CALL dgghd3(
'N',
'N', n, 1, n, a, lda, b, ldb, vl, ldvl,
342 $ vr, ldvr, work, -1, ierr )
343 lwkopt = max( lwkopt, 3*n+int( work( 1 ) ) )
344 CALL dlaqz0(
'E', jobvl, jobvr, n, 1, n, a, lda, b, ldb,
345 $ alphar, alphai, beta, vl, ldvl, vr, ldvr,
346 $ work, -1, 0, ierr )
347 lwkopt = max( lwkopt, 2*n+int( work( 1 ) ) )
354 CALL xerbla(
'DGGEV3 ', -info )
356 ELSE IF( lquery )
THEN
368 smlnum = dlamch(
'S' )
369 bignum = one / smlnum
370 CALL dlabad( smlnum, bignum )
371 smlnum = sqrt( smlnum ) / eps
372 bignum = one / smlnum
376 anrm = dlange(
'M', n, n, a, lda, work )
378 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
381 ELSE IF( anrm.GT.bignum )
THEN
386 $
CALL dlascl(
'G', 0, 0, anrm, anrmto, n, n, a, lda, ierr )
390 bnrm = dlange(
'M', n, n, b, ldb, work )
392 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN
395 ELSE IF( bnrm.GT.bignum )
THEN
400 $
CALL dlascl(
'G', 0, 0, bnrm, bnrmto, n, n, b, ldb, ierr )
407 CALL dggbal(
'P', n, a, lda, b, ldb, ilo, ihi, work( ileft ),
408 $ work( iright ), work( iwrk ), ierr )
412 irows = ihi + 1 - ilo
420 CALL dgeqrf( irows, icols, b( ilo, ilo ), ldb, work( itau ),
421 $ work( iwrk ), lwork+1-iwrk, ierr )
425 CALL dormqr(
'L',
'T', irows, icols, irows, b( ilo, ilo ), ldb,
426 $ work( itau ), a( ilo, ilo ), lda, work( iwrk ),
427 $ lwork+1-iwrk, ierr )
432 CALL dlaset(
'Full', n, n, zero, one, vl, ldvl )
433 IF( irows.GT.1 )
THEN
434 CALL dlacpy(
'L', irows-1, irows-1, b( ilo+1, ilo ), ldb,
435 $ vl( ilo+1, ilo ), ldvl )
437 CALL dorgqr( irows, irows, irows, vl( ilo, ilo ), ldvl,
438 $ work( itau ), work( iwrk ), lwork+1-iwrk, ierr )
444 $
CALL dlaset(
'Full', n, n, zero, one, vr, ldvr )
452 CALL dgghd3( jobvl, jobvr, n, ilo, ihi, a, lda, b, ldb, vl,
453 $ ldvl, vr, ldvr, work( iwrk ), lwork+1-iwrk, ierr )
455 CALL dgghd3(
'N',
'N', irows, 1, irows, a( ilo, ilo ), lda,
456 $ b( ilo, ilo ), ldb, vl, ldvl, vr, ldvr,
457 $ work( iwrk ), lwork+1-iwrk, ierr )
469 CALL dlaqz0( chtemp, jobvl, jobvr, n, ilo, ihi, a, lda, b, ldb,
470 $ alphar, alphai, beta, vl, ldvl, vr, ldvr,
471 $ work( iwrk ), lwork+1-iwrk, 0, ierr )
473 IF( ierr.GT.0 .AND. ierr.LE.n )
THEN
475 ELSE IF( ierr.GT.n .AND. ierr.LE.2*n )
THEN
495 CALL dtgevc( chtemp,
'B', ldumma, n, a, lda, b, ldb, vl, ldvl,
496 $ vr, ldvr, n, in, work( iwrk ), ierr )
505 CALL dggbak(
'P',
'L', n, ilo, ihi, work( ileft ),
506 $ work( iright ), n, vl, ldvl, ierr )
508 IF( alphai( jc ).LT.zero )
511 IF( alphai( jc ).EQ.zero )
THEN
513 temp = max( temp, abs( vl( jr, jc ) ) )
517 temp = max( temp, abs( vl( jr, jc ) )+
518 $ abs( vl( jr, jc+1 ) ) )
524 IF( alphai( jc ).EQ.zero )
THEN
526 vl( jr, jc ) = vl( jr, jc )*temp
530 vl( jr, jc ) = vl( jr, jc )*temp
531 vl( jr, jc+1 ) = vl( jr, jc+1 )*temp
537 CALL dggbak(
'P',
'R', n, ilo, ihi, work( ileft ),
538 $ work( iright ), n, vr, ldvr, ierr )
540 IF( alphai( jc ).LT.zero )
543 IF( alphai( jc ).EQ.zero )
THEN
545 temp = max( temp, abs( vr( jr, jc ) ) )
549 temp = max( temp, abs( vr( jr, jc ) )+
550 $ abs( vr( jr, jc+1 ) ) )
556 IF( alphai( jc ).EQ.zero )
THEN
558 vr( jr, jc ) = vr( jr, jc )*temp
562 vr( jr, jc ) = vr( jr, jc )*temp
563 vr( jr, jc+1 ) = vr( jr, jc+1 )*temp
578 CALL dlascl(
'G', 0, 0, anrmto, anrm, n, 1, alphar, n, ierr )
579 CALL dlascl(
'G', 0, 0, anrmto, anrm, n, 1, alphai, n, ierr )
583 CALL dlascl(
'G', 0, 0, bnrmto, bnrm, n, 1, beta, n, ierr )
subroutine dlabad(SMALL, LARGE)
DLABAD
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.
subroutine dlacpy(UPLO, M, N, A, LDA, B, LDB)
DLACPY copies all or part of one two-dimensional array to another.
subroutine dlaset(UPLO, M, N, ALPHA, BETA, A, LDA)
DLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine dggbak(JOB, SIDE, N, ILO, IHI, LSCALE, RSCALE, M, V, LDV, INFO)
DGGBAK
subroutine dggbal(JOB, N, A, LDA, B, LDB, ILO, IHI, LSCALE, RSCALE, WORK, INFO)
DGGBAL
subroutine dgeqrf(M, N, A, LDA, TAU, WORK, LWORK, INFO)
DGEQRF
subroutine dtgevc(SIDE, HOWMNY, SELECT, N, S, LDS, P, LDP, VL, LDVL, VR, LDVR, MM, M, WORK, INFO)
DTGEVC
recursive subroutine dlaqz0(WANTS, WANTQ, WANTZ, N, ILO, IHI, A, LDA, B, LDB, ALPHAR, ALPHAI, BETA, Q, LDQ, Z, LDZ, WORK, LWORK, REC, INFO)
DLAQZ0
subroutine dggev3(JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHAR, ALPHAI, BETA, VL, LDVL, VR, LDVR, WORK, LWORK, INFO)
DGGEV3 computes the eigenvalues and, optionally, the left and/or right eigenvectors for GE matrices (...
subroutine dorgqr(M, N, K, A, LDA, TAU, WORK, LWORK, INFO)
DORGQR
subroutine dormqr(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
DORMQR
subroutine dgghd3(COMPQ, COMPZ, N, ILO, IHI, A, LDA, B, LDB, Q, LDQ, Z, LDZ, WORK, LWORK, INFO)
DGGHD3