346 SUBROUTINE zdrgsx( NSIZE, NCMAX, THRESH, NIN, NOUT, A, LDA, B, AI,
347 $ BI, Z, Q, ALPHA, BETA, C, LDC, S, WORK, LWORK,
348 $ RWORK, IWORK, LIWORK, BWORK, INFO )
355 INTEGER INFO, LDA, LDC, LIWORK, LWORK, NCMAX, NIN,
357 DOUBLE PRECISION THRESH
362 DOUBLE PRECISION RWORK( * ), S( * )
363 COMPLEX*16 A( , * ), AI( LDA, * ), ALPHA( * ),
364 $ b( lda, * ), beta( * ), bi( lda, * ),
365 $ c( ldc, * ), q( lda, * ), work( * ),
372 DOUBLE PRECISION ZERO, ONE, TEN
373 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0, ten = 1.0d+1 )
375 parameter( czero = ( 0.0d+0, 0.0d+0 ) )
380 INTEGER BDSPAC, I, IFUNC, J, LINFO, MAXWRK, MINWRK, MM,
381 $ mn2, nerrs, nptknt, ntest, ntestt, prtype, qba,
383 DOUBLE PRECISION ABNRM, BIGNUM, DIFTRU, PLTRU, SMLNUM, TEMP1,
384 $ TEMP2, THRSH2, ULP, ULPINV, WEIGHT
388 DOUBLE PRECISION DIFEST( 2 ), PL( 2 ), RESULT( 10 )
393 DOUBLE PRECISION DLAMCH, ZLANGE
394 EXTERNAL zlctsx, ilaenv, dlamch, zlange
402 INTEGER K, M, MPLUSN, N
405 COMMON / mn / m, n, mplusn, k, fs
408 INTRINSIC abs, dble, dimag,
max, sqrt
411 DOUBLE PRECISION ABS1
414 abs1( x ) = abs( dble( x ) ) + abs( dimag( x ) )
421 IF( nsize.LT.0 )
THEN
423 ELSE IF( thresh.LT.zero )
THEN
425 ELSE IF( nin.LE.0 )
THEN
427 ELSE IF( nout.LE.0 )
THEN
429 ELSE IF( lda.LT.1 .OR. lda.LT.nsize )
THEN
431 ELSE IF( ldc.LT.1 .OR. ldc.LT.nsize*nsize / 2 )
THEN
433 ELSE IF( liwork.LT.nsize+2 )
THEN
445 IF( info.EQ.0 .AND. lwork.GE.1 )
THEN
446 minwrk = 3*nsize*nsize / 2
450 maxwrk = nsize*( 1+ilaenv( 1, '
zgeqrf', ' ', NSIZE, 1, NSIZE,
452 MAXWRK = MAX( MAXWRK, NSIZE*( 1+ILAENV( 1, 'zungqr', ' ',
453 $ NSIZE, 1, NSIZE, -1 ) ) )
457 BDSPAC = 3*NSIZE*NSIZE / 2
458 MAXWRK = MAX( MAXWRK, NSIZE*NSIZE*
459 $ ( 1+ILAENV( 1, 'zgebrd', ' ', NSIZE*NSIZE / 2,
460 $ NSIZE*NSIZE / 2, -1, -1 ) ) )
461 MAXWRK = MAX( MAXWRK, BDSPAC )
463 MAXWRK = MAX( MAXWRK, MINWRK )
468.LT.
IF( LWORKMINWRK )
472 CALL XERBLA( 'zdrgsx', -INFO )
480 SMLNUM = DLAMCH( 's
' ) / ULP
481 BIGNUM = ONE / SMLNUM
482 CALL DLABAD( SMLNUM, BIGNUM )
504 DO 40 M = 1, NSIZE - 1
505 DO 30 N = 1, NSIZE - M
507 WEIGHT = ONE / WEIGHT
515 CALL ZLASET( 'full
', MPLUSN, MPLUSN, CZERO, CZERO, AI,
517 CALL ZLASET( 'full
', MPLUSN, MPLUSN, CZERO, CZERO, BI,
520 CALL ZLATM5( PRTYPE, M, N, AI, LDA, AI( M+1, M+1 ),
521 $ LDA, AI( 1, M+1 ), LDA, BI, LDA,
522 $ BI( M+1, M+1 ), LDA, BI( 1, M+1 ), LDA,
523 $ Q, LDA, Z, LDA, WEIGHT, QBA, QBB )
530.EQ.
IF( IFUNC0 ) THEN
532.EQ.
ELSE IF( IFUNC1 ) THEN
534.EQ.
ELSE IF( IFUNC2 ) THEN
536.EQ.
ELSE IF( IFUNC3 ) THEN
540 CALL ZLACPY( 'full
', MPLUSN, MPLUSN, AI, LDA, A, LDA )
541 CALL ZLACPY( 'full
', MPLUSN, MPLUSN, BI, LDA, B, LDA )
543 CALL ZGGESX( 'v
', 'v
', 's
', ZLCTSX, SENSE, MPLUSN, AI,
544 $ LDA, BI, LDA, MM, ALPHA, BETA, Q, LDA, Z,
545 $ LDA, PL, DIFEST, WORK, LWORK, RWORK,
546 $ IWORK, LIWORK, BWORK, LINFO )
548.NE..AND..NE.
IF( LINFO0 LINFOMPLUSN+2 ) THEN
550 WRITE( NOUT, FMT = 9999 )'zggesx', LINFO, MPLUSN,
558 CALL ZLACPY( 'full
', MPLUSN, MPLUSN, AI, LDA, WORK,
560 CALL ZLACPY( 'full
', MPLUSN, MPLUSN, BI, LDA,
561 $ WORK( MPLUSN*MPLUSN+1 ), MPLUSN )
562 ABNRM = ZLANGE( 'fro
', MPLUSN, 2*MPLUSN, WORK, MPLUSN,
568 CALL ZGET51( 1, MPLUSN, A, LDA, AI, LDA, Q, LDA, Z,
569 $ LDA, WORK, RWORK, RESULT( 1 ) )
570 CALL ZGET51( 1, MPLUSN, B, LDA, BI, LDA, Q, LDA, Z,
571 $ LDA, WORK, RWORK, RESULT( 2 ) )
572 CALL ZGET51( 3, MPLUSN, B, LDA, BI, LDA, Q, LDA, Q,
573 $ LDA, WORK, RWORK, RESULT( 3 ) )
574 CALL ZGET51( 3, MPLUSN, B, LDA, BI, LDA, Z, LDA, Z,
575 $ LDA, WORK, RWORK, RESULT( 4 ) )
587 TEMP2 = ( ABS1( ALPHA( J )-AI( J, J ) ) /
588 $ MAX( SMLNUM, ABS1( ALPHA( J ) ),
589 $ ABS1( AI( J, J ) ) )+
590 $ ABS1( BETA( J )-BI( J, J ) ) /
591 $ MAX( SMLNUM, ABS1( BETA( J ) ),
592 $ ABS1( BI( J, J ) ) ) ) / ULP
593.LT.
IF( JMPLUSN ) THEN
594.NE.
IF( AI( J+1, J )ZERO ) THEN
600.NE.
IF( AI( J, J-1 )ZERO ) THEN
605 TEMP1 = MAX( TEMP1, TEMP2 )
607 WRITE( NOUT, FMT = 9997 )J, MPLUSN, PRTYPE
616.EQ.
IF( LINFOMPLUSN+3 ) THEN
618.NE.
ELSE IF( MMN ) THEN
627 MN2 = MM*( MPLUSN-MM )*2
628.GE..AND..LE.
IF( IFUNC2 MN2NCMAX*NCMAX ) THEN
633 CALL ZLAKF2( MM, MPLUSN-MM, AI, LDA,
634 $ AI( MM+1, MM+1 ), BI,
635 $ BI( MM+1, MM+1 ), C, LDC )
637 CALL ZGESVD( 'n
', 'n
', MN2, MN2, C, LDC, S, WORK,
638 $ 1, WORK( 2 ), 1, WORK( 3 ), LWORK-2,
642.EQ.
IF( DIFEST( 2 )ZERO ) THEN
643.GT.
IF( DIFTRUABNRM*ULP )
644 $ RESULT( 8 ) = ULPINV
645.EQ.
ELSE IF( DIFTRUZERO ) THEN
646.GT.
IF( DIFEST( 2 )ABNRM*ULP )
647 $ RESULT( 8 ) = ULPINV
648.GT..OR.
ELSE IF( ( DIFTRUTHRSH2*DIFEST( 2 ) )
649.LT.
$ ( DIFTRU*THRSH2DIFEST( 2 ) ) ) THEN
650 RESULT( 8 ) = MAX( DIFTRU / DIFEST( 2 ),
651 $ DIFEST( 2 ) / DIFTRU )
659.EQ.
IF( LINFO( MPLUSN+2 ) ) THEN
660.GT.
IF( DIFTRUABNRM*ULP )
661 $ RESULT( 9 ) = ULPINV
662.GT..AND..NE.
IF( ( IFUNC1 ) ( DIFEST( 2 )ZERO ) )
663 $ RESULT( 9 ) = ULPINV
664.EQ..AND..NE.
IF( ( IFUNC1 ) ( PL( 1 )ZERO ) )
665 $ RESULT( 9 ) = ULPINV
669 NTESTT = NTESTT + NTEST
674.GE.
IF( RESULT( J )THRESH ) THEN
679.EQ.
IF( NERRS0 ) THEN
680 WRITE( NOUT, FMT = 9996 )'zgx
'
684 WRITE( NOUT, FMT = 9994 )
688 WRITE( NOUT, FMT = 9993 )'unitary
', '''',
689 $ 'transpose
', ( '''', I = 1, 4 )
693.LT.
IF( RESULT( J )10000.0D0 ) THEN
694 WRITE( NOUT, FMT = 9992 )MPLUSN, PRTYPE,
695 $ WEIGHT, M, J, RESULT( J )
697 WRITE( NOUT, FMT = 9991 )MPLUSN, PRTYPE,
698 $ WEIGHT, M, J, RESULT( J )
718 READ( NIN, FMT = *, END = 140 )MPLUSN
721 READ( NIN, FMT = *, END = 140 )N
723 READ( NIN, FMT = * )( AI( I, J ), J = 1, MPLUSN )
726 READ( NIN, FMT = * )( BI( I, J ), J = 1, MPLUSN )
728 READ( NIN, FMT = * )PLTRU, DIFTRU
735 CALL ZLACPY( 'full
', MPLUSN, MPLUSN, AI, LDA, A, LDA )
736 CALL ZLACPY( 'full
', MPLUSN, MPLUSN, BI, LDA, B, LDA )
741 CALL ZGGESX( 'v
', 'v
', 's
', ZLCTSX, 'b
', MPLUSN, AI, LDA, BI, LDA,
742 $ MM, ALPHA, BETA, Q, LDA, Z, LDA, PL, DIFEST, WORK,
743 $ LWORK, RWORK, IWORK, LIWORK, BWORK, LINFO )
745.NE..AND..NE.
IF( LINFO0 LINFOMPLUSN+2 ) THEN
747 WRITE( NOUT, FMT = 9998 )'zggesx', LINFO, MPLUSN, NPTKNT
754 CALL ZLACPY( 'full
', MPLUSN, MPLUSN, AI, LDA, WORK, MPLUSN )
755 CALL ZLACPY( 'full
', MPLUSN, MPLUSN, BI, LDA,
756 $ WORK( MPLUSN*MPLUSN+1 ), MPLUSN )
757 ABNRM = ZLANGE( 'fro
', MPLUSN, 2*MPLUSN, WORK, MPLUSN, RWORK )
761 CALL ZGET51( 1, MPLUSN, A, LDA, AI, LDA, Q, LDA, Z, LDA, WORK,
762 $ RWORK, RESULT( 1 ) )
763 CALL ZGET51( 1, MPLUSN, B, LDA, BI, LDA, Q, LDA, Z, LDA, WORK,
764 $ RWORK, RESULT( 2 ) )
765 CALL ZGET51( 3, MPLUSN, B, LDA, BI, LDA, Q, LDA, Q, LDA, WORK,
766 $ RWORK, RESULT( 3 ) )
767 CALL ZGET51( 3, MPLUSN, B, LDA, BI, LDA, Z, LDA, Z, LDA, WORK,
768 $ RWORK, RESULT( 4 ) )
780 TEMP2 = ( ABS1( ALPHA( J )-AI( J, J ) ) /
781 $ MAX( SMLNUM, ABS1( ALPHA( J ) ), ABS1( AI( J, J ) ) )+
782 $ ABS1( BETA( J )-BI( J, J ) ) /
783 $ MAX( SMLNUM, ABS1( BETA( J ) ), ABS1( BI( J, J ) ) ) )
785.LT.
IF( JMPLUSN ) THEN
786.NE.
IF( AI( J+1, J )ZERO ) THEN
792.NE.
IF( AI( J, J-1 )ZERO ) THEN
797 TEMP1 = MAX( TEMP1, TEMP2 )
799 WRITE( NOUT, FMT = 9997 )J, MPLUSN, NPTKNT
808.EQ.
IF( LINFOMPLUSN+3 )
809 $ RESULT( 7 ) = ULPINV
815.EQ.
IF( DIFEST( 2 )ZERO ) THEN
816.GT.
IF( DIFTRUABNRM*ULP )
817 $ RESULT( 8 ) = ULPINV
818.EQ.
ELSE IF( DIFTRUZERO ) THEN
819.GT.
IF( DIFEST( 2 )ABNRM*ULP )
820 $ RESULT( 8 ) = ULPINV
821.GT..OR.
ELSE IF( ( DIFTRUTHRSH2*DIFEST( 2 ) )
822.LT.
$ ( DIFTRU*THRSH2DIFEST( 2 ) ) ) THEN
823 RESULT( 8 ) = MAX( DIFTRU / DIFEST( 2 ), DIFEST( 2 ) / DIFTRU )
830.EQ.
IF( LINFO( MPLUSN+2 ) ) THEN
831.GT.
IF( DIFTRUABNRM*ULP )
832 $ RESULT( 9 ) = ULPINV
833.GT..AND..NE.
IF( ( IFUNC1 ) ( DIFEST( 2 )ZERO ) )
834 $ RESULT( 9 ) = ULPINV
835.EQ..AND..NE.
IF( ( IFUNC1 ) ( PL( 1 )ZERO ) )
836 $ RESULT( 9 ) = ULPINV
843.EQ.
IF( PL( 1 )ZERO ) THEN
844.GT.
IF( PLTRUABNRM*ULP )
845 $ RESULT( 10 ) = ULPINV
846.EQ.
ELSE IF( PLTRUZERO ) THEN
847.GT.
IF( PL( 1 )ABNRM*ULP )
848 $ RESULT( 10 ) = ULPINV
849.GT..OR.
ELSE IF( ( PLTRUTHRESH*PL( 1 ) )
850.LT.
$ ( PLTRU*THRESHPL( 1 ) ) ) THEN
851 RESULT( 10 ) = ULPINV
854 NTESTT = NTESTT + NTEST
859.GE.
IF( RESULT( J )THRESH ) THEN
864.EQ.
IF( NERRS0 ) THEN
865 WRITE( NOUT, FMT = 9996 )'zgx
'
869 WRITE( NOUT, FMT = 9995 )
873 WRITE( NOUT, FMT = 9993 )'unitary
', '''', 'transpose
',
878.LT.
IF( RESULT( J )10000.0D0 ) THEN
879 WRITE( NOUT, FMT = 9990 )NPTKNT, MPLUSN, J, RESULT( J )
881 WRITE( NOUT, FMT = 9989 )NPTKNT, MPLUSN, J, RESULT( J )
895 CALL ALASVM( 'zgx
', NOUT, NERRS, NTESTT, 0 )
901 9999 FORMAT( ' zdrgsx:
', A, ' returned info=
', I6, '.
', / 9X, 'n=
',
902 $ I6, ', jtype=
', I6, ')
' )
904 9998 FORMAT( ' zdrgsx:
', A, ' returned info=
', I6, '.
', / 9X, 'n=
',
905 $ I6, ', input example
#', I2, ')' )
907 9997
FORMAT(
' ZDRGSX: S not in Schur form at eigenvalue ', i6,
'.',
908 $ / 9x,
'N=', i6,
', JTYPE=', i6,
')' )
910 9996
FORMAT( / 1x, a3,
' -- Complex Expert Generalized Schur form',
911 $
' problem driver' )
913 9995
FORMAT(
'Input Example' )
915 9994
FORMAT(
' Matrix types: ', /
916 $
' 1: A is a block diagonal matrix of Jordan blocks ',
917 $
'and B is the identity ', /
' matrix, ',
918 $ /
' 2: A and B are upper triangular matrices, ',
919 $ /
' 3: A and B are as type 2, but each second diagonal ',
920 $
'block in A_11 and ', /
921 $
' each third diaongal block in A_22 are 2x2 blocks,',
922 $ /
' 4: A and B are block diagonal matrices, ',
923 $ /
' 5: (A,B) has potentially close or common ',
924 $
'eigenvalues.', / )
926 9993
FORMAT( /
' Tests performed: (S is Schur, T is triangular, ',
927 $
'Q and Z are ', a,
',', / 19x,
928 $
' a is alpha, b is beta, and ', a,
' means ', a,
'.)',
929 $ /
' 1 = | A - Q S Z', a,
930 $
' | / ( |A| n ulp ) 2 = | B - Q T Z', a,
931 $
' | / ( |B| n ulp )', /
' 3 = | I - QQ', a,
932 $
' | / ( n ulp ) 4 = | I - ZZ', a,
933 $
' | / ( n ulp )', /
' 5 = 1/ULP if A is not in ',
934 $
'Schur form S', /
' 6 = difference between (alpha,beta)',
935 $
' and diagonals of (S,T)', /
936 $
' 7 = 1/ULP if SDIM is not the correct number of ',
937 $
'selected eigenvalues', /
938 $
' 8 = 1/ULP if DIFEST/DIFTRU > 10*THRESH or ',
939 $
'DIFTRU/DIFEST > 10*THRESH',
940 $ /
' 9 = 1/ULP if DIFEST <> 0 or DIFTRU > ULP*norm(A,B) ',
941 $
'when reordering fails', /
942 $
' 10 = 1/ULP if PLEST/PLTRU > THRESH or ',
943 $ 'pltru/plest > thresh
', /
944 $ ' ( test 10 is only
for input examples )
', / )
945 9992 FORMAT( ' matrix order=
', I2, ', type=
', I2, ', a=
', D10.3,
946 $ ', order(a_11)=
', I2, ', result
', I2, ' is
', 0P, F8.2 )
947 9991 FORMAT( ' matrix order=
', I2, ', type=
', I2, ', a=
', D10.3,
948 $ ', order(a_11)=
', I2, ', result
', I2, ' is
', 0P, D10.3 )
949 9990 FORMAT( ' input example
#', I2, ', matrix order=', I4, ',',
950 $
' result ', i2,
' is', 0p, f8.2 )
951 9989
FORMAT(
' Input example #', i2, ', matrix order=
', I4, ',
',
952 $ ' result
', I2, ' is
', 1P, D10.3 )
subroutine dlabad(small, large)
DLABAD
subroutine xerbla(srname, info)
XERBLA
subroutine alasvm(type, nout, nfail, nrun, nerrs)
ALASVM
subroutine zgebrd(m, n, a, lda, d, e, tauq, taup, work, lwork, info)
ZGEBRD
subroutine zggesx(jobvsl, jobvsr, sort, selctg, sense, n, a, lda, b, ldb, sdim, alpha, beta, vsl, ldvsl, vsr, ldvsr, rconde, rcondv, work, lwork, rwork, iwork, liwork, bwork, info)
ZGGESX computes the eigenvalues, the Schur form, and, optionally, the matrix of Schur vectors for GE ...
subroutine zgesvd(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, work, lwork, rwork, info)
ZGESVD computes the singular value decomposition (SVD) for GE matrices
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 zungqr(m, n, k, a, lda, tau, work, lwork, info)
ZUNGQR
subroutine zget51(itype, n, a, lda, b, ldb, u, ldu, v, ldv, work, rwork, result)
ZGET51
subroutine zdrgsx(nsize, ncmax, thresh, nin, nout, a, lda, b, ai, bi, z, q, alpha, beta, c, ldc, s, work, lwork, rwork, iwork, liwork, bwork, info)
ZDRGSX
subroutine zlatm5(prtype, m, n, a, lda, b, ldb, c, ldc, d, ldd, e, lde, f, ldf, r, ldr, l, ldl, alpha, qblcka, qblckb)
ZLATM5
subroutine zlakf2(m, n, a, lda, b, d, e, z, ldz)
ZLAKF2
subroutine zgeqrf(m, n, a, lda, tau, work, lwork, info)
ZGEQRF VARIANT: left-looking Level 3 BLAS of the algorithm.
for(i8=*sizetab-1;i8 >=0;i8--)