280 SUBROUTINE zgegv( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHA, BETA,
281 $ VL, LDVL, VR, LDVR, WORK, LWORK, RWORK, INFO )
288 CHARACTER JOBVL, JOBVR
289 INTEGER INFO, LDA, LDB, LDVL, LDVR, , N
292 DOUBLE PRECISION RWORK( * )
293 COMPLEX*16 A( LDA, * ), ALPHA( * ), B( LDB, * ),
294 $ beta( * ), vl( ldvl, * ), vr( ldvr, * ),
301 DOUBLE PRECISION ZERO, ONE
302 parameter( zero = 0.0d0, one = 1.0d0 )
303 COMPLEX*16 CZERO, CONE
304 parameter( czero = ( 0.0d0, 0.0d0 ),
305 $ cone = ( 1.0d0, 0.0d0 ) )
308 LOGICAL ILIMIT, ILV, ILVL, ILVR, LQUERY
310 INTEGER ICOLS, , IINFO, , IJOBVR, , ILO,
311 $ in, iright, irows, irwork, itau, iwork, jc, jr,
312 $ lopt, lwkmin, lwkopt, nb, nb1, nb2, nb3
313 DOUBLE PRECISION ABSAI, ABSAR, ABSB, ANRM, ANRM1, ANRM2, BNRM,
314 $ bnrm1, bnrm2, eps, safmax, safmin, salfai,
315 $ salfar, sbeta, scale
328 DOUBLE PRECISION DLAMCH, ZLANGE
329 EXTERNAL lsame, ilaenv, dlamch, zlange
332 INTRINSIC abs, dble, dcmplx, dimag, int,
max
335 DOUBLE PRECISION ABS1
338 abs1( x ) = abs( dble( x ) ) + abs( dimag( x ) )
344 IF( lsame( jobvl,
'N' ) )
THEN
347 ELSE IF( lsame( jobvl,
'V' ) )
THEN
355 IF( lsame( jobvr,
'N' ) )
THEN
358 ELSE IF( lsame( jobvr,
'V' ) )
THEN
369 lwkmin =
max( 2*n, 1 )
372 lquery = ( lwork.EQ.-1 )
374 IF( ijobvl.LE.0 )
THEN
376 ELSE IF( ijobvr.LE.0 )
THEN
378 ELSE IF( n.LT.0 )
THEN
380 ELSE IF( lda.LT.
max( 1, n ) )
THEN
382 ELSE IF( ldb.LT.
max( 1, n ) )
THEN
384 ELSE IF( ldvl.LT.1 .OR. ( ilvl .AND. ldvl.LT.n ) )
THEN
386 ELSE IF( ldvr.LT.1 .OR. ( ilvr .AND. ldvr.LT.n ) )
THEN
388 ELSE IF( lwork.LT.lwkmin .AND. .NOT.lquery )
THEN
393 nb1 = ilaenv( 1,
'ZGEQRF',
' ', n, n, -1, -1 )
394 nb2 = ilaenv( 1,
'ZUNMQR',
' ', n, n, n, -1 )
395 nb3 = ilaenv( 1,
'ZUNGQR',
' ', n, n, n, -1 )
396 nb =
max( nb1, nb2, nb3 )
397 lopt =
max( 2*n, n*( nb+1 ) )
402 CALL xerbla(
'ZGEGV ', -info )
404 ELSE IF( lquery )
THEN
415 eps = dlamch(
'E' )*dlamch(
'B' )
416 safmin = dlamch(
'S' )
417 safmin = safmin + safmin
422 anrm = zlange( 'm
', N, N, A, LDA, RWORK )
425.LT.
IF( ANRMONE ) THEN
426.LT.
IF( SAFMAX*ANRMONE ) THEN
432.GT.
IF( ANRMZERO ) THEN
433 CALL ZLASCL( 'g
', -1, -1, ANRM, ONE, N, N, A, LDA, IINFO )
434.NE.
IF( IINFO0 ) THEN
442 BNRM = ZLANGE( 'm
', N, N, B, LDB, RWORK )
445.LT.
IF( BNRMONE ) THEN
446.LT.
IF( SAFMAX*BNRMONE ) THEN
452.GT.
IF( BNRMZERO ) THEN
453 CALL ZLASCL( 'g
', -1, -1, BNRM, ONE, N, N, B, LDB, IINFO )
454.NE.
IF( IINFO0 ) THEN
466 CALL ZGGBAL( 'p
', N, A, LDA, B, LDB, ILO, IHI, RWORK( ILEFT ),
467 $ RWORK( IRIGHT ), RWORK( IRWORK ), IINFO )
468.NE.
IF( IINFO0 ) THEN
475 IROWS = IHI + 1 - ILO
483 CALL ZGEQRF( IROWS, ICOLS, B( ILO, ILO ), LDB, WORK( ITAU ),
484 $ WORK( IWORK ), LWORK+1-IWORK, IINFO )
486 $ LWKOPT = MAX( LWKOPT, INT( WORK( IWORK ) )+IWORK-1 )
487.NE.
IF( IINFO0 ) THEN
492 CALL ZUNMQR( 'l
', 'c
', IROWS, ICOLS, IROWS, B( ILO, ILO ), LDB,
493 $ WORK( ITAU ), A( ILO, ILO ), LDA, WORK( IWORK ),
494 $ LWORK+1-IWORK, IINFO )
496 $ LWKOPT = MAX( LWKOPT, INT( WORK( IWORK ) )+IWORK-1 )
497.NE.
IF( IINFO0 ) THEN
503 CALL ZLASET( 'full
', N, N, CZERO, CONE, VL, LDVL )
504 CALL ZLACPY( 'l
', IROWS-1, IROWS-1, B( ILO+1, ILO ), LDB,
505 $ VL( ILO+1, ILO ), LDVL )
506 CALL ZUNGQR( IROWS, IROWS, IROWS, VL( ILO, ILO ), LDVL,
507 $ WORK( ITAU ), WORK( IWORK ), LWORK+1-IWORK,
510 $ LWKOPT = MAX( LWKOPT, INT( WORK( IWORK ) )+IWORK-1 )
511.NE.
IF( IINFO0 ) THEN
518 $ CALL ZLASET( 'full
', N, N, CZERO, CONE, VR, LDVR )
526 CALL ZGGHRD( JOBVL, JOBVR, N, ILO, IHI, A, LDA, B, LDB, VL,
527 $ LDVL, VR, LDVR, IINFO )
529 CALL ZGGHRD( 'n
', 'n
', IROWS, 1, IROWS, A( ILO, ILO ), LDA,
530 $ B( ILO, ILO ), LDB, VL, LDVL, VR, LDVR, IINFO )
532.NE.
IF( IINFO0 ) THEN
545 CALL ZHGEQZ( CHTEMP, JOBVL, JOBVR, N, ILO, IHI, A, LDA, B, LDB,
546 $ ALPHA, BETA, VL, LDVL, VR, LDVR, WORK( IWORK ),
547 $ LWORK+1-IWORK, RWORK( IRWORK ), IINFO )
549 $ LWKOPT = MAX( LWKOPT, INT( WORK( IWORK ) )+IWORK-1 )
550.NE.
IF( IINFO0 ) THEN
551.GT..AND..LE.
IF( IINFO0 IINFON ) THEN
553.GT..AND..LE.
ELSE IF( IINFON IINFO2*N ) THEN
575 CALL ZTGEVC( CHTEMP, 'b
', LDUMMA, N, A, LDA, B, LDB, VL, LDVL,
576 $ VR, LDVR, N, IN, WORK( IWORK ), RWORK( IRWORK ),
578.NE.
IF( IINFO0 ) THEN
586 CALL ZGGBAK( 'p
', 'l
', N, ILO, IHI, RWORK( ILEFT ),
587 $ RWORK( IRIGHT ), N, VL, LDVL, IINFO )
588.NE.
IF( IINFO0 ) THEN
595 TEMP = MAX( TEMP, ABS1( VL( JR, JC ) ) )
601 VL( JR, JC ) = VL( JR, JC )*TEMP
606 CALL ZGGBAK( 'p
', 'r
', N, ILO, IHI, RWORK( ILEFT ),
607 $ RWORK( IRIGHT ), N, VR, LDVR, IINFO )
608.NE.
IF( IINFO0 ) THEN
615 TEMP = MAX( TEMP, ABS1( VR( JR, JC ) ) )
621 VR( JR, JC ) = VR( JR, JC )*TEMP
639 ABSAR = ABS( DBLE( ALPHA( JC ) ) )
640 ABSAI = ABS( DIMAG( ALPHA( JC ) ) )
641 ABSB = ABS( DBLE( BETA( JC ) ) )
642 SALFAR = ANRM*DBLE( ALPHA( JC ) )
643 SALFAI = ANRM*DIMAG( ALPHA( JC ) )
644 SBETA = BNRM*DBLE( BETA( JC ) )
650.LT..AND..GE.
IF( ABS( SALFAI )SAFMIN ABSAI
651 $ MAX( SAFMIN, EPS*ABSAR, EPS*ABSB ) ) THEN
653 SCALE = ( SAFMIN / ANRM1 ) / MAX( SAFMIN, ANRM2*ABSAI )
658.LT..AND..GE.
IF( ABS( SALFAR )SAFMIN ABSAR
659 $ MAX( SAFMIN, EPS*ABSAI, EPS*ABSB ) ) THEN
661 SCALE = MAX( SCALE, ( SAFMIN / ANRM1 ) /
662 $ MAX( SAFMIN, ANRM2*ABSAR ) )
667.LT..AND..GE.
IF( ABS( SBETA )SAFMIN ABSB
668 $ MAX( SAFMIN, EPS*ABSAR, EPS*ABSAI ) ) THEN
670 SCALE = MAX( SCALE, ( SAFMIN / BNRM1 ) /
671 $ MAX( SAFMIN, BNRM2*ABSB ) )
677 TEMP = ( SCALE*SAFMIN )*MAX( ABS( SALFAR ), ABS( SALFAI ),
680 $ SCALE = SCALE / TEMP
688 SALFAR = ( SCALE*DBLE( ALPHA( JC ) ) )*ANRM
689 SALFAI = ( SCALE*DIMAG( ALPHA( JC ) ) )*ANRM
690 SBETA = ( SCALE*BETA( JC ) )*BNRM
692 ALPHA( JC ) = DCMPLX( SALFAR, SALFAI )
subroutine xerbla(srname, info)
XERBLA
subroutine zggbak(job, side, n, ilo, ihi, lscale, rscale, m, v, ldv, info)
ZGGBAK
subroutine zggbal(job, n, a, lda, b, ldb, ilo, ihi, lscale, rscale, work, info)
ZGGBAL
subroutine ztgevc(side, howmny, select, n, s, lds, p, ldp, vl, ldvl, vr, ldvr, mm, m, work, rwork, info)
ZTGEVC
subroutine zhgeqz(job, compq, compz, n, ilo, ihi, h, ldh, t, ldt, alpha, beta, q, ldq, z, ldz, work, lwork, rwork, info)
ZHGEQZ
subroutine zgegv(jobvl, jobvr, n, a, lda, b, ldb, alpha, beta, vl, ldvl, vr, ldvr, work, lwork, rwork, info)
ZGEEVX computes the eigenvalues and, optionally, the left and/or right eigenvectors for GE matrices
subroutine zlascl(type, kl, ku, cfrom, cto, m, n, a, lda, info)
ZLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine zlacpy(uplo, m, n, a, lda, b, ldb)
ZLACPY copies all or part of one two-dimensional array to another.
subroutine zlaset(uplo, m, n, alpha, beta, a, lda)
ZLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine zgghrd(compq, compz, n, ilo, ihi, a, lda, b, ldb, q, ldq, z, ldz, info)
ZGGHRD
subroutine zunmqr(side, trans, m, n, k, a, lda, tau, c, ldc, work, lwork, info)
ZUNMQR
subroutine zungqr(m, n, k, a, lda, tau, work, lwork, info)
ZUNGQR
subroutine zgeqrf(m, n, a, lda, tau, work, lwork, info)
ZGEQRF VARIANT: left-looking Level 3 BLAS of the algorithm.