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, , LDA, LIWORK, LWORK, NIN, NOUT,
305 DOUBLE PRECISION THRESH
310 DOUBLE PRECISION DIF( * ), DIFTRU( * ), ( * ), LSCALE( * ),
311 $ result( 4 ), rscale
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 )
327DOUBLE PRECISION , ANORM, BNORM, RATIO1, RATIO2, THRSH2,
331 COMPLEX*16 WEIGHT( 5 )
335 DOUBLE PRECISION DLAMCH, ZLANGE
342 INTRINSIC abs, dcmplx,
max, sqrt
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 )
386 CALL xerbla(
'ZDRGVX', -info )
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 IF( result( 3 ).GT.thresh )
THEN
463 WRITE( nout, fmt = 9998 )
'Right',
'ZGGEVX',
464 $ result( 3 ), n, iptype, iwa, iwb, iwx, iwy
471 IF( s( i ).EQ.zero )
THEN
472 IF( dtru( i ).GT.abnorm*ulp )
473 $ result( 3 ) = ulpinv
474 ELSE IF( dtru( i ).EQ.zero )
THEN
475 IF( s( i ).GT.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 IF( dif( 1 ).EQ.zero )
THEN
488 IF( diftru( 1 ).GT.abnorm*ulp )
489 $ result( 4 ) = ulpinv
490 ELSE IF( diftru( 1 ).EQ.zero )
THEN
491 IF( dif( 1 ).GT.abnorm*ulp )
492 $ result( 4 ) = ulpinv
493 ELSE IF( dif( 5 ).EQ.zero )
THEN
494 IF( diftru( 5 ).GT.abnorm*ulp )
495 $ result( 4 ) = ulpinv
496 ELSE IF( diftru( 5 ).EQ.zero )
THEN
497 IF( dif( 5 ).GT.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 IF( ( result( j ).GE.thrsh2 .AND. j.GE.4 ) .OR.
513 $ ( result( j ).GE.thresh .AND. j.LE.3 ) )
519 IF( nerrs.EQ.0 )
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 IF( result( j ).LT.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.LT.
IF( RESULT( J )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
',
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