293 SUBROUTINE zdrgvx( NSIZE, THRESH, NIN, NOUT, A, LDA, B, AI, BI,
294 $ ALPHA, BETA, VL, VR, ILO, IHI, LSCALE, RSCALE,
295 $ S, DTRU, DIF, DIFTRU, WORK, LWORK, RWORK,
296 $ IWORK, LIWORK, RESULT, BWORK, INFO )
303 INTEGER IHI, ILO, INFO, LDA, LIWORK, LWORK, NIN, NOUT,
305 DOUBLE PRECISION THRESH
310 DOUBLE PRECISION DIF( * ), DIFTRU( * ), DTRU( * ), LSCALE( * ),
311 $ result( 4 ), rscale( * ), rwork( * ), s( * )
312 COMPLEX*16 A( LDA, * ), AI( LDA, * ), ALPHA( * ),
313 $ b( lda, * ), beta( * ), bi( lda, * ),
314 $ vl( lda, * ), vr( lda, * ), work( * )
320 DOUBLE PRECISION ZERO, ONE, TEN, TNTH, HALF
321 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0, ten = 1.0d+1,
322 $ tnth = 1.0d-1, half = 0.5d+0 )
325 INTEGER I, IPTYPE, IWA, IWB, IWX, IWY, J, LINFO
327DOUBLE PRECISION ABNORM, ANORM, BNORM, RATIO1, RATIO2, THRSH2,
331 COMPLEX*16 WEIGHT( 5 )
335 DOUBLE PRECISION DLAMCH, ZLANGE
336 EXTERNAL , DLAMCH, ZLANGE
342 INTRINSIC abs, dcmplx,
max, sqrt
352 IF( nsize.LT.0 )
THEN
354 ELSE IF( thresh.LT.zero )
THEN
356 ELSE IF( nin.LE.0 )
THEN
358 ELSE IF( nout.LE.0 )
THEN
360 ELSE IF( lda.LT.1 .OR. lda.LT.nmax )
THEN
362 ELSE IF( liwork.LT.nmax+2 )
THEN
374 IF( info.EQ.0 .AND. lwork.GE.1 )
THEN
375 minwrk = 2*nmax*( nmax+1 )
376 maxwrk = nmax*( 1+ilaenv( 1,
'ZGEQRF',
' ', nmax, 1, nmax,
378 maxwrk =
max( maxwrk, 2*nmax*( nmax+1 ) )
382 IF( lwork.LT.minwrk )
403 weight( 1 ) = dcmplx( tnth, zero )
404 weight( 2 ) = dcmplx( half, zero )
406 weight( 4 ) = one / weight( 2 )
407 weight( 5 ) = one / weight( 1 )
417 CALL zlatm6( iptype, 5, a, lda, b, vr, lda, vl,
418 $ lda, weight( iwa ), weight( iwb ),
419 $ weight( iwx ), weight( iwy ), dtru,
426 CALL zlacpy(
'F', n, n, a, lda, ai, lda )
427 CALL zlacpy(
'F', n, n, b, lda, bi, lda )
429 CALL zggevx(
'N',
'V',
'V',
'B', n, ai, lda, bi,
430 $ lda, alpha, beta, vl, lda, vr, lda,
431 $ ilo, ihi, lscale, rscale, anorm,
432 $ bnorm, s, dif, work, lwork, rwork,
433 $ iwork, bwork, linfo )
434 IF( linfo.NE.0 )
THEN
435 WRITE( nout, fmt = 9999 )
'ZGGEVX', linfo, n,
436 $ iptype, iwa, iwb, iwx, iwy
442 CALL zlacpy(
'Full', n, n, ai, lda, work, n )
443 CALL zlacpy(
'Full', n, n, bi, lda, work( n*n+1 ),
445 abnorm = zlange(
'Fro', n, 2*n, work, n, rwork )
450 CALL zget52( .true., n, a, lda, b, lda, vl, lda,
451 $ alpha, beta, work, rwork,
453 IF( result( 2 ).GT.thresh )
THEN
454 WRITE( nout, fmt = 9998 )
'Left', '
zggevx',
455 $ RESULT( 2 ), N, IPTYPE, IWA, IWB, IWX, IWY
459 CALL ZGET52( .FALSE., N, A, LDA, B, LDA, VR, LDA,
460 $ ALPHA, BETA, WORK, RWORK,
462.GT.
IF( RESULT( 3 )THRESH ) THEN
463 WRITE( NOUT, FMT = 9998 )'right
', 'zggevx',
464 $ RESULT( 3 ), N, IPTYPE, IWA, IWB, IWX, IWY
471.EQ.
IF( S( I )ZERO ) THEN
472.GT.
IF( DTRU( I )ABNORM*ULP )
473 $ RESULT( 3 ) = ULPINV
474.EQ.
ELSE IF( DTRU( I )ZERO ) THEN
475.GT.
IF( S( I )ABNORM*ULP )
476 $ RESULT( 3 ) = ULPINV
478 RWORK( I ) = MAX( ABS( DTRU( I ) / S( I ) ),
479 $ ABS( S( I ) / DTRU( I ) ) )
480 RESULT( 3 ) = MAX( RESULT( 3 ), RWORK( I ) )
487.EQ.
IF( DIF( 1 )ZERO ) THEN
488.GT.
IF( DIFTRU( 1 )ABNORM*ULP )
489 $ RESULT( 4 ) = ULPINV
490.EQ.
ELSE IF( DIFTRU( 1 )ZERO ) THEN
491.GT.
IF( DIF( 1 )ABNORM*ULP )
492 $ RESULT( 4 ) = ULPINV
493.EQ.
ELSE IF( DIF( 5 )ZERO ) THEN
494.GT.
IF( DIFTRU( 5 )ABNORM*ULP )
495 $ RESULT( 4 ) = ULPINV
496.EQ.
ELSE IF( DIFTRU( 5 )ZERO ) THEN
497.GT.
IF( DIF( 5 )ABNORM*ULP )
498 $ RESULT( 4 ) = ULPINV
500 RATIO1 = MAX( ABS( DIFTRU( 1 ) / DIF( 1 ) ),
501 $ ABS( DIF( 1 ) / DIFTRU( 1 ) ) )
502 RATIO2 = MAX( ABS( DIFTRU( 5 ) / DIF( 5 ) ),
503 $ ABS( DIF( 5 ) / DIFTRU( 5 ) ) )
504 RESULT( 4 ) = MAX( RATIO1, RATIO2 )
512.GE..AND..GE..OR.
IF( ( RESULT( J )THRSH2 J4 )
513.GE..AND..LE.
$ ( RESULT( J )THRESH J3 ) )
519.EQ.
IF( NERRS0 ) THEN
520 WRITE( NOUT, FMT = 9997 )'zxv
'
526 WRITE( NOUT, FMT = 9995 )
527 WRITE( NOUT, FMT = 9994 )
528 WRITE( NOUT, FMT = 9993 )
532 WRITE( NOUT, FMT = 9992 )'''',
537.LT.
IF( RESULT( J )10000.0D0 ) THEN
538 WRITE( NOUT, FMT = 9991 )IPTYPE, IWA,
539 $ IWB, IWX, IWY, J, RESULT( J )
541 WRITE( NOUT, FMT = 9990 )IPTYPE, IWA,
542 $ IWB, IWX, IWY, J, RESULT( J )
562 READ( NIN, FMT = *, END = 150 )N
566 READ( NIN, FMT = * )( A( I, J ), J = 1, N )
569 READ( NIN, FMT = * )( B( I, J ), J = 1, N )
571 READ( NIN, FMT = * )( DTRU( I ), I = 1, N )
572 READ( NIN, FMT = * )( DIFTRU( I ), I = 1, N )
580 CALL ZLACPY( 'f
', N, N, A, LDA, AI, LDA )
581 CALL ZLACPY( 'f
', N, N, B, LDA, BI, LDA )
583 CALL ZGGEVX( 'n
', 'v
', 'v
', 'b
', N, AI, LDA, BI, LDA, ALPHA, BETA,
584 $ VL, LDA, VR, LDA, ILO, IHI, LSCALE, RSCALE, ANORM,
585 $ BNORM, S, DIF, WORK, LWORK, RWORK, IWORK, BWORK,
588.NE.
IF( LINFO0 ) THEN
589 WRITE( NOUT, FMT = 9987 )'zggevx', LINFO, N, NPTKNT
595 CALL ZLACPY( 'full
', N, N, AI, LDA, WORK, N )
596 CALL ZLACPY( 'full
', N, N, BI, LDA, WORK( N*N+1 ), N )
597 ABNORM = ZLANGE( 'fro
', N, 2*N, WORK, N, RWORK )
602 CALL ZGET52( .TRUE., N, A, LDA, B, LDA, VL, LDA, ALPHA, BETA,
603 $ WORK, RWORK, RESULT( 1 ) )
604.GT.
IF( RESULT( 2 )THRESH ) THEN
605 WRITE( NOUT, FMT = 9986 )'left
', 'zggevx', RESULT( 2 ), N,
610 CALL ZGET52( .FALSE., N, A, LDA, B, LDA, VR, LDA, ALPHA, BETA,
611 $ WORK, RWORK, RESULT( 2 ) )
612.GT.
IF( RESULT( 3 )THRESH ) THEN
613 WRITE( NOUT, FMT = 9986 )'right
', 'zggevx', RESULT( 3 ), N,
621.EQ.
IF( S( I )ZERO ) THEN
622.GT.
IF( DTRU( I )ABNORM*ULP )
623 $ RESULT( 3 ) = ULPINV
624.EQ.
ELSE IF( DTRU( I )ZERO ) THEN
625.GT.
IF( S( I )ABNORM*ULP )
626 $ RESULT( 3 ) = ULPINV
628 RWORK( I ) = MAX( ABS( DTRU( I ) / S( I ) ),
629 $ ABS( S( I ) / DTRU( I ) ) )
630 RESULT( 3 ) = MAX( RESULT( 3 ), RWORK( I ) )
637.EQ.
IF( DIF( 1 )ZERO ) THEN
638.GT.
IF( DIFTRU( 1 )ABNORM*ULP )
639 $ RESULT( 4 ) = ULPINV
640.EQ.
ELSE IF( DIFTRU( 1 )ZERO ) THEN
641.GT.
IF( DIF( 1 )ABNORM*ULP )
642 $ RESULT( 4 ) = ULPINV
643.EQ.
ELSE IF( DIF( 5 )ZERO ) THEN
644.GT.
IF( DIFTRU( 5 )ABNORM*ULP )
645 $ RESULT( 4 ) = ULPINV
646.EQ.
ELSE IF( DIFTRU( 5 )ZERO ) THEN
647.GT.
IF( DIF( 5 )ABNORM*ULP )
648 $ RESULT( 4 ) = ULPINV
650 RATIO1 = MAX( ABS( DIFTRU( 1 ) / DIF( 1 ) ),
651 $ ABS( DIF( 1 ) / DIFTRU( 1 ) ) )
652 RATIO2 = MAX( ABS( DIFTRU( 5 ) / DIF( 5 ) ),
653 $ ABS( DIF( 5 ) / DIFTRU( 5 ) ) )
654 RESULT( 4 ) = MAX( RATIO1, RATIO2 )
662.GE.
IF( RESULT( J )THRSH2 ) THEN
667.EQ.
IF( NERRS0 ) THEN
668 WRITE( NOUT, FMT = 9997 )'zxv
'
674 WRITE( NOUT, FMT = 9996 )
678 WRITE( NOUT, FMT = 9992 )'''',
'transpose',
''''
682 IF( result( j ).LT.10000.0d0 )
THEN
683 WRITE( nout, fmt = 9989 )nptknt, n, j, result( j )
685 WRITE( nout, fmt = 9988 )nptknt, n, j, result( j )
697 CALL alasvm(
'ZXV', nout, nerrs, ntestt, 0 )
703 9999
FORMAT(
' ZDRGVX: ', a,
' returned INFO=', i6,
'.', / 9x,
'N=',
704 $ i6,
', JTYPE=', i6,
')' )
706 9998
FORMAT(
' ZDRGVX: ', a,
' Eigenvectors from ', a,
' incorrectly ',
707 $
'normalized.', /
' Bits of error=', 0p, g10.3,
',', 9x,
708 $
'N=', i6,
', JTYPE=', i6,
', IWA=', i5,
', IWB=', i5,
709 $
', IWX=', i5,
', IWY=', i5 )
711 9997
FORMAT( / 1x, a3,
' -- Complex Expert Eigenvalue/vector',
712 $
' problem driver' )
714 9996
FORMAT(
'Input Example' )
716 9995
FORMAT(
' Matrix types: ', / )
718 9994
FORMAT(
' TYPE 1: Da is diagonal, Db is identity, ',
719 $ /
' A = Y^(-H) Da X^(-1), B = Y^(-H) Db X^(-1) ',
720 $ /
' YH and X are left and right eigenvectors. ', / )
722 9993
FORMAT(
' TYPE 2: Da is quasi-diagonal, Db is identity, ',
723 $ /
' A = Y^(-H) Da X^(-1), B = Y^(-H) Db X^(-1) ',
724 $ /
' YH and X are left and right eigenvectors. ', / )
726 9992
FORMAT( /
' Tests performed: ', / 4x,
727 $
' a is alpha, b is beta, l is a left eigenvector, ', / 4x,
728 $
' r is a right eigenvector and ', a,
' means ', a,
'.',
729 $ /
' 1 = max | ( b A - a B )', a,
' l | / const.',
730 $ /
' 2 = max | ( b A - a B ) r | / const.',
731 $ / ' 3 =
max( sest/stru, stru/sest )
',
732 $ ' over all eigenvalues
', /
733 $ ' 4 =
max( difest/diftru, diftru/difest )
',
734 $ ' over
the 1st and 5th eigenvectors
', / )
736 9991 FORMAT( ' type=
', I2, ',
', ' iwa=
', I2, ', iwb=
', I2, ', iwx=
',
737 $ I2, ', iwy=
', I2, ', result
', I2, ' is
', 0P, F8.2 )
739 9990 FORMAT( ' type=
', I2, ',
', ' iwa=
', I2, ', iwb=
', I2, ', iwx=
',
740 $ I2, ', iwy=
', I2, ', result
', I2, ' is
', 1P, D10.3 )
742 9989 FORMAT( ' input example
#', I2, ', matrix order=', I4, ',',
743 $
' result ', i2,
' is', 0p, f8.2 )
745 9988
FORMAT(
' Input example #', i2,
', matrix order=', i4, ',
',
746 $ ' result
', I2, ' is
', 1P, D10.3 )
748 9987 FORMAT( ' zdrgvx:
', A, ' returned info=
', I6, '.
', / 9X, 'n=',
749 $ i6,
', Input example #', i2,
')' )
751 9986
FORMAT(
' ZDRGVX: ', a,
' Eigenvectors from ', a,
' incorrectly ',
752 $
'normalized.', /
' Bits of error=', 0p, g10.3,
',', 9x,
753 $
'N=', i6,
', Input Example #', i2,
')' )
subroutine zggevx(balanc, jobvl, jobvr, sense, n, a, lda, b, ldb, alpha, beta, vl, ldvl, vr, ldvr, ilo, ihi, lscale, rscale, abnrm, bbnrm, rconde, rcondv, work, lwork, rwork, iwork, bwork, info)
ZGGEVX computes the eigenvalues and, optionally, the left and/or right eigenvectors for GE matrices
subroutine zdrgvx(nsize, thresh, nin, nout, a, lda, b, ai, bi, alpha, beta, vl, vr, ilo, ihi, lscale, rscale, s, dtru, dif, diftru, work, lwork, rwork, iwork, liwork, result, bwork, info)
ZDRGVX