356 SUBROUTINE sdrgsx( NSIZE, NCMAX, THRESH, NIN, NOUT, A, LDA, B,
357 $ AI, BI, Z, Q, ALPHAR, ALPHAI, BETA, C, LDC, S,
358 $ WORK, LWORK, IWORK, LIWORK, BWORK, INFO )
365 INTEGER INFO, LDA, LDC, LIWORK, LWORK, NCMAX, ,
372 REAL A( LDA, * ), AI( LDA, * ), ALPHAI( * ),
373 $ alphar( * ), b( lda, * ), beta( * ),
375 $ work( * ), z( lda, * )
382 PARAMETER ( ZERO = 0.0e+0, one = 1.0e+0, ten = 1.0e+1 )
387 INTEGER BDSPAC, , I1, IFUNC, IINFO, J, LINFO, MAXWRK,
388 $ minwrk, mm, mn2, nerrs, nptknt, ntest, ntestt,
390 REAL ABNRM, BIGNUM, DIFTRU, PLTRU, SMLNUM, TEMP1,
391 $ TEMP2, THRSH2, ULP, ULPINV, WEIGHT
394 REAL DIFEST( 2 ), PL( 2 ), RESULT( 10 )
400 EXTERNAL slctsx, ilaenv, slamch, slange
407 INTRINSIC abs,
max, sqrt
411 INTEGER K, M, MPLUSN, N
414 COMMON / mn / m, n, mplusn, k, fs
420 IF( nsize.LT.0 )
THEN
422 ELSE IF( thresh.LT.zero )
THEN
424 ELSE IF( nin.LE.0 )
THEN
426 ELSE IF( nout.LE.0 )
THEN
428 ELSE IF( lda.LT.1 .OR. lda.LT.nsize )
THEN
430 ELSE IF( ldc.LT.1 .OR. ldc.LT.nsize*nsize / 2 )
THEN
432 ELSE IF( liwork.LT.nsize+6 )
THEN
444 IF( info.EQ.0 .AND. lwork.GE.1 )
THEN
446 minwrk =
max( 10*( nsize+1 ), 5*nsize*nsize / 2 )
450 maxwrk = 9*( nsize+1 ) + nsize*
451 $ ilaenv( 1,
'SGEQRF',
' ', nsize, 1, nsize, 0 )
452 maxwrk =
max( maxwrk, 9*( nsize+1 )+nsize*
453 $ ilaenv( 1,
'SORGQR',
' ', nsize, 1, nsize, -1 ) )
457 bdspac = 5*nsize*nsize / 2
458 maxwrk =
max( maxwrk, 3*nsize*nsize / 2+nsize*nsize*
459 $ ilaenv( 1,
'SGEBRD',
' ', nsize*nsize / 2,
460 $ nsize*nsize / 2, -1, -1 ) )
461 maxwrk =
max( maxwrk, bdspac )
463 maxwrk =
max( maxwrk, minwrk )
468 IF( lwork.LT.minwrk )
472 CALL xerbla(
'SDRGSX', -info )
480 smlnum = slamch(
'S' ) / ulp
481 bignum = one / smlnum
482 CALL slabad( smlnum, bignum )
504 DO 40 m = 1, nsize - 1
505 DO 30 n = 1, nsize - m
507 weight = one / weight
515 CALL slaset(
'Full', mplusn, mplusn, zero, zero, ai,
517 CALL slaset(
'Full', mplusn, mplusn, zero, zero, bi,
520 CALL slatm5( 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 IF( ifunc.EQ.0 )
THEN
532.EQ.
ELSE IF( IFUNC1 ) THEN
534.EQ.
ELSE IF( IFUNC2 ) THEN
536.EQ.
ELSE IF( IFUNC3 ) THEN
540 CALL SLACPY( 'full
', MPLUSN, MPLUSN, AI, LDA, A, LDA )
541 CALL SLACPY( 'full
', MPLUSN, MPLUSN, BI, LDA, B, LDA )
543 CALL SGGESX( 'v
', 'v
', 's
', SLCTSX, SENSE, MPLUSN, AI,
544 $ LDA, BI, LDA, MM, ALPHAR, ALPHAI, BETA,
545 $ Q, LDA, Z, LDA, PL, DIFEST, WORK, LWORK,
546 $ IWORK, LIWORK, BWORK, LINFO )
548.NE..AND..NE.
IF( LINFO0 LINFOMPLUSN+2 ) THEN
550 WRITE( NOUT, FMT = 9999 )'sggesx', LINFO, MPLUSN,
558 CALL SLACPY( 'full
', MPLUSN, MPLUSN, AI, LDA, WORK,
560 CALL SLACPY( 'full
', MPLUSN, MPLUSN, BI, LDA,
561 $ WORK( MPLUSN*MPLUSN+1 ), MPLUSN )
562 ABNRM = SLANGE( 'fro
', MPLUSN, 2*MPLUSN, WORK, MPLUSN,
567 CALL SGET51( 1, MPLUSN, A, LDA, AI, LDA, Q, LDA, Z,
568 $ LDA, WORK, RESULT( 1 ) )
569 CALL SGET51( 1, MPLUSN, B, LDA, BI, LDA, Q, LDA, Z,
570 $ LDA, WORK, RESULT( 2 ) )
571 CALL SGET51( 3, MPLUSN, B, LDA, BI, LDA, Q, LDA, Q,
572 $ LDA, WORK, RESULT( 3 ) )
573 CALL SGET51( 3, MPLUSN, B, LDA, BI, LDA, Z, LDA, Z,
574 $ LDA, WORK, RESULT( 4 ) )
586.EQ.
IF( ALPHAI( J )ZERO ) THEN
587 TEMP2 = ( ABS( ALPHAR( J )-AI( J, J ) ) /
588 $ MAX( SMLNUM, ABS( ALPHAR( J ) ),
589 $ ABS( AI( J, J ) ) )+
590 $ ABS( BETA( J )-BI( J, J ) ) /
591 $ MAX( SMLNUM, ABS( BETA( J ) ),
592 $ ABS( 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
606.GT.
IF( ALPHAI( J )ZERO ) THEN
611.LE..OR..GE.
IF( I10 I1MPLUSN ) THEN
613.LT.
ELSE IF( I1MPLUSN-1 ) THEN
614.NE.
IF( AI( I1+2, I1+1 )ZERO ) THEN
618.GT.
ELSE IF( I11 ) THEN
619.NE.
IF( AI( I1, I1-1 )ZERO ) THEN
624.NOT.
IF( ILABAD ) THEN
625 CALL SGET53( AI( I1, I1 ), LDA, BI( I1, I1 ),
626 $ LDA, BETA( J ), ALPHAR( J ),
627 $ ALPHAI( J ), TEMP2, IINFO )
628.GE.
IF( IINFO3 ) THEN
629 WRITE( NOUT, FMT = 9997 )IINFO, J,
637 TEMP1 = MAX( TEMP1, TEMP2 )
639 WRITE( NOUT, FMT = 9996 )J, MPLUSN, PRTYPE
648.EQ.
IF( LINFOMPLUSN+3 ) THEN
650.NE.
ELSE IF( MMN ) THEN
659 MN2 = MM*( MPLUSN-MM )*2
660.GE..AND..LE.
IF( IFUNC2 MN2NCMAX*NCMAX ) THEN
665 CALL SLAKF2( MM, MPLUSN-MM, AI, LDA,
666 $ AI( MM+1, MM+1 ), BI,
667 $ BI( MM+1, MM+1 ), C, LDC )
669 CALL SGESVD( 'n
', 'n
', MN2, MN2, C, LDC, S, WORK,
670 $ 1, WORK( 2 ), 1, WORK( 3 ), LWORK-2,
674.EQ.
IF( DIFEST( 2 )ZERO ) THEN
675.GT.
IF( DIFTRUABNRM*ULP )
676 $ RESULT( 8 ) = ULPINV
677.EQ.
ELSE IF( DIFTRUZERO ) THEN
678.GT.
IF( DIFEST( 2 )ABNRM*ULP )
679 $ RESULT( 8 ) = ULPINV
680.GT..OR.
ELSE IF( ( DIFTRUTHRSH2*DIFEST( 2 ) )
681.LT.
$ ( DIFTRU*THRSH2DIFEST( 2 ) ) ) THEN
682 RESULT( 8 ) = MAX( DIFTRU / DIFEST( 2 ),
683 $ DIFEST( 2 ) / DIFTRU )
691.EQ.
IF( LINFO( MPLUSN+2 ) ) THEN
692.GT.
IF( DIFTRUABNRM*ULP )
693 $ RESULT( 9 ) = ULPINV
694.GT..AND..NE.
IF( ( IFUNC1 ) ( DIFEST( 2 )ZERO ) )
695 $ RESULT( 9 ) = ULPINV
696.EQ..AND..NE.
IF( ( IFUNC1 ) ( PL( 1 )ZERO ) )
697 $ RESULT( 9 ) = ULPINV
701 NTESTT = NTESTT + NTEST
706.GE.
IF( RESULT( J )THRESH ) THEN
711.EQ.
IF( NERRS0 ) THEN
712 WRITE( NOUT, FMT = 9995 )'sgx
'
716 WRITE( NOUT, FMT = 9993 )
720 WRITE( NOUT, FMT = 9992 )'orthogonal
', '''',
721 $ 'transpose
', ( '''', I = 1, 4 )
725.LT.
IF( RESULT( J )10000.0 ) THEN
726 WRITE( NOUT, FMT = 9991 )MPLUSN, PRTYPE,
727 $ WEIGHT, M, J, RESULT( J )
729 WRITE( NOUT, FMT = 9990 )MPLUSN, PRTYPE,
730 $ WEIGHT, M, J, RESULT( J )
750 READ( NIN, FMT = *, END = 140 )MPLUSN
753 READ( NIN, FMT = *, END = 140 )N
755 READ( NIN, FMT = * )( AI( I, J ), J = 1, MPLUSN )
758 READ( NIN, FMT = * )( BI( I, J ), J = 1, MPLUSN )
760 READ( NIN, FMT = * )PLTRU, DIFTRU
767 CALL SLACPY( 'full
', MPLUSN, MPLUSN, AI, LDA, A, LDA )
768 CALL SLACPY( 'full
', MPLUSN, MPLUSN, BI, LDA, B, LDA )
773 CALL SGGESX( 'v
', 'v
', 's
', SLCTSX, 'b
', MPLUSN, AI, LDA, BI, LDA,
774 $ MM, ALPHAR, ALPHAI, BETA, Q, LDA, Z, LDA, PL, DIFEST,
775 $ WORK, LWORK, IWORK, LIWORK, BWORK, LINFO )
777.NE..AND..NE.
IF( LINFO0 LINFOMPLUSN+2 ) THEN
779 WRITE( NOUT, FMT = 9998 )'sggesx', LINFO, MPLUSN, NPTKNT
786 CALL SLACPY( 'full
', MPLUSN, MPLUSN, AI, LDA, WORK, MPLUSN )
787 CALL SLACPY( 'full
', MPLUSN, MPLUSN, BI, LDA,
788 $ WORK( MPLUSN*MPLUSN+1 ), MPLUSN )
789 ABNRM = SLANGE( 'fro
', MPLUSN, 2*MPLUSN, WORK, MPLUSN, WORK )
793 CALL SGET51( 1, MPLUSN, A, LDA, AI, LDA, Q, LDA, Z, LDA, WORK,
795 CALL SGET51( 1, MPLUSN, B, LDA, BI, LDA, Q, LDA, Z, LDA, WORK,
797 CALL SGET51( 3, MPLUSN, B, LDA, BI, LDA, Q, LDA, Q, LDA, WORK,
799 CALL SGET51( 3, MPLUSN, B, LDA, BI, LDA, Z, LDA, Z, LDA, WORK,
812.EQ.
IF( ALPHAI( J )ZERO ) THEN
813 TEMP2 = ( ABS( ALPHAR( J )-AI( J, J ) ) /
814 $ MAX( SMLNUM, ABS( ALPHAR( J ) ), ABS( AI( J,
815 $ J ) ) )+ABS( BETA( J )-BI( J, J ) ) /
816 $ MAX( SMLNUM, ABS( BETA( J ) ), ABS( BI( J, J ) ) ) )
818.LT.
IF( JMPLUSN ) THEN
819.NE.
IF( AI( J+1, J )ZERO ) THEN
825.NE.
IF( AI( J, J-1 )ZERO ) THEN
831.GT.
IF( ALPHAI( J )ZERO ) THEN
836.LE..OR..GE.
IF( I10 I1MPLUSN ) THEN
838.LT.
ELSE IF( I1MPLUSN-1 ) THEN
839.NE.
IF( AI( I1+2, I1+1 )ZERO ) THEN
843.GT.
ELSE IF( I11 ) THEN
844.NE.
IF( AI( I1, I1-1 )ZERO ) THEN
849.NOT.
IF( ILABAD ) THEN
850 CALL SGET53( AI( I1, I1 ), LDA, BI( I1, I1 ), LDA,
851 $ BETA( J ), ALPHAR( J ), ALPHAI( J ), TEMP2,
853.GE.
IF( IINFO3 ) THEN
854 WRITE( NOUT, FMT = 9997 )IINFO, J, MPLUSN, NPTKNT
861 TEMP1 = MAX( TEMP1, TEMP2 )
863 WRITE( NOUT, FMT = 9996 )J, MPLUSN, NPTKNT
872.EQ.
IF( LINFOMPLUSN+3 )
873 $ RESULT( 7 ) = ULPINV
879.EQ.
IF( DIFEST( 2 )ZERO ) THEN
880.GT.
IF( DIFTRUABNRM*ULP )
881 $ RESULT( 8 ) = ULPINV
882.EQ.
ELSE IF( DIFTRUZERO ) THEN
883.GT.
IF( DIFEST( 2 )ABNRM*ULP )
884 $ RESULT( 8 ) = ULPINV
885.GT..OR.
ELSE IF( ( DIFTRUTHRSH2*DIFEST( 2 ) )
886.LT.
$ ( DIFTRU*THRSH2DIFEST( 2 ) ) ) THEN
887 RESULT( 8 ) = MAX( DIFTRU / DIFEST( 2 ), DIFEST( 2 ) / DIFTRU )
894.EQ.
IF( LINFO( MPLUSN+2 ) ) THEN
895.GT.
IF( DIFTRUABNRM*ULP )
896 $ RESULT( 9 ) = ULPINV
897.GT..AND..NE.
IF( ( IFUNC1 ) ( DIFEST( 2 )ZERO ) )
898 $ RESULT( 9 ) = ULPINV
899.EQ..AND..NE.
IF( ( IFUNC1 ) ( PL( 1 )ZERO ) )
900 $ RESULT( 9 ) = ULPINV
907.EQ.
IF( PL( 1 )ZERO ) THEN
908.GT.
IF( PLTRUABNRM*ULP )
909 $ RESULT( 10 ) = ULPINV
910.EQ.
ELSE IF( PLTRUZERO ) THEN
911.GT.
IF( PL( 1 )ABNRM*ULP )
912 $ RESULT( 10 ) = ULPINV
913.GT..OR.
ELSE IF( ( PLTRUTHRESH*PL( 1 ) )
914.LT.
$ ( PLTRU*THRESHPL( 1 ) ) ) THEN
915 RESULT( 10 ) = ULPINV
918 NTESTT = NTESTT + NTEST
923.GE.
IF( RESULT( J )THRESH ) THEN
928.EQ.
IF( NERRS0 ) THEN
929 WRITE( NOUT, FMT = 9995 )'sgx
'
933 WRITE( NOUT, FMT = 9994 )
937 WRITE( NOUT, FMT = 9992 )'orthogonal
', '''',
938 $ 'transpose
', ( '''', I = 1, 4 )
942.LT.
IF( RESULT( J )10000.0 ) THEN
943 WRITE( NOUT, FMT = 9989 )NPTKNT, MPLUSN, J, RESULT( J )
945 WRITE( NOUT, FMT = 9988 )NPTKNT, MPLUSN, J, RESULT( J )
959 CALL ALASVM( 'sgx
', NOUT, NERRS, NTESTT, 0 )
965 9999 FORMAT( ' sdrgsx:
', A, ' returned info=
', I6, '.
', / 9X, 'n=
',
966 $ I6, ', jtype=
', I6, ')
' )
968 9998 FORMAT( ' sdrgsx:
', A, ' returned info=
', I6, '.
', / 9X, 'n
',
969 $ I6, ', input example
#', I2, ')' )
971 9997
FORMAT(
' SDRGSX: SGET53 returned INFO=', i1,
' for eigenvalue ',
972 $ i6,
'.', / 9x,
'N=', i6,
', JTYPE=', i6,
')' )
974 9996
FORMAT(
' SDRGSX: S not in Schur form at eigenvalue ', i6,
'.',
975 $ / 9x,
'N=', i6,
', JTYPE=', i6,
')' )
977 9995
FORMAT( / 1x, a3,
' -- Real Expert Generalized Schur form',
980 9994
FORMAT(
'Input Example' )
982 9993
FORMAT(
' Matrix types: ', /
983 $
' 1: A is a block diagonal matrix of Jordan blocks ',
984 $
'and B is the identity ', /
' matrix, ',
985 $ /
' 2: A and B are upper triangular matrices, ',
986 $ /
' 3: A and B are as type 2, but each second diagonal ',
987 $
'block in A_11 and ', /
988 $
' each third diaongal block in A_22 are 2x2 blocks,',
989 $ /
' 4: A and B are block diagonal matrices, ',
990 $ /
' 5: (A,B) has potentially close or common ',
991 $
'eigenvalues.', / )
993 9992
FORMAT( /
' Tests performed: (S is Schur, T is triangular, ',
994 $
'Q and Z are ', a,
',', / 19x,
995 $
' a is alpha, b is beta, and ', a,
' means ', a,
'.)',
996 $ /
' 1 = | A - Q S Z', a,
997 $
' | / ( |A| n ulp ) 2 = | B - Q T Z', a,
998 $ ' | / ( |b| n ulp )
', / ' 3 = | i - qq
', A,
999 $ ' | / ( n ulp ) 4 = | i - zz
', A,
1000 $ ' | / ( n ulp )
', / ' 5 = 1/ulp
if a is not in ',
1001 $
'Schur form S', /
' 6 = difference between (alpha,beta)',
1002 $
' and diagonals of (S,T)', /
1003 $
' 7 = 1/ULP if SDIM is not the correct number of ',
1004 $
'selected eigenvalues', /
1005 $
' 8 = 1/ULP if DIFEST/DIFTRU > 10*THRESH or ',
1006 $
'DIFTRU/DIFEST > 10*THRESH',
1007 $ /
' 9 = 1/ULP if DIFEST <> 0 or DIFTRU > ULP*norm(A,B) ',
1008 $
'when reordering fails', /
1009 $
' 10 = 1/ULP if PLEST/PLTRU > THRESH or ',
1010 $
'PLTRU/PLEST > THRESH', /
1011 $
' ( Test 10 is only for input examples )', / )
1012 9991
FORMAT(
' Matrix order=', i2,
', type=', i2,
', a=', e10.3,
1013 $
', order(A_11)=', i2,
', result ', i2,
' is ', 0p, f8.2 )
1014 9990
FORMAT(
' Matrix order=', i2,
', type=', i2,
', a=', e10.3,
1015 $
', order(A_11)=', i2,
', result ', i2,
' is ', 0p, e10.3 )
1016 9989
FORMAT(
' Input example #', i2,
', matrix order=', i4,
',',
1017 $
' result ', i2,
' is', 0p, f8.2 )
1018 9988
FORMAT(
' Input example #', i2,
', matrix order=', i4,
',',
1019 $
' result ', i2,
' is', 1p, e10.3 )
subroutine sggesx(jobvsl, jobvsr, sort, selctg, sense, n, a, lda, b, ldb, sdim, alphar, alphai, beta, vsl, ldvsl, vsr, ldvsr, rconde, rcondv, work, lwork, iwork, liwork, bwork, info)
SGGESX computes the eigenvalues, the Schur form, and, optionally, the matrix of Schur vectors for GE ...
subroutine sgesvd(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, work, lwork, info)
SGESVD computes the singular value decomposition (SVD) for GE matrices
subroutine slatm5(prtype, m, n, a, lda, b, ldb, c, ldc, d, ldd, e, lde, f, ldf, r, ldr, l, ldl, alpha, qblcka, qblckb)
SLATM5
subroutine sdrgsx(nsize, ncmax, thresh, nin, nout, a, lda, b, ai, bi, z, q, alphar, alphai, beta, c, ldc, s, work, lwork, iwork, liwork, bwork, info)
SDRGSX