399 SUBROUTINE sdrges( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH,
400 $ NOUNIT, A, LDA, B, S, T, Q, LDQ, Z, ALPHAR,
401 $ ALPHAI, BETA, WORK, LWORK, RESULT, BWORK,
409 INTEGER INFO, LDA, LDQ, LWORK, NOUNIT, NSIZES, NTYPES
413 LOGICAL BWORK( * ), DOTYPE( * )
414 INTEGER ISEED( 4 ), NN( * )
415 REAL A( LDA, * ), ALPHAI( * ), ALPHAR( * ),
416 $ b( lda, * ), beta( * ), q( ldq, * ),
417 $ result( 13 ), s( lda, * ), t( lda, * ),
418 $ work( * ), z( ldq, * )
425 PARAMETER ( ZERO = 0.0e+0, one = 1.0e+0 )
427 parameter( maxtyp = 26 )
430 LOGICAL BADNN, ILABAD
434 $ n, n1, nb, nerrs, nmats, nmax, ntest, ntestt,
436 REAL SAFMAX, SAFMIN, TEMP1, TEMP2, ULP, ULPINV
439 INTEGER IASIGN( MAXTYP ), IBSIGN( MAXTYP ),
440 $ IOLDSD( 4 ), KADD( 6 ), KAMAGN( MAXTYP ),
441 $ ( MAXTYP ), KAZERO( MAXTYP ),
442 $ kbmagn( maxtyp ), kbtype( maxtyp ),
443 $ kbzero( maxtyp ), kclass( maxtyp ),
444 $ ktrian( maxtyp ), kz1( 6 ), kz2( 6 )
451 EXTERNAL slctes, ilaenv,
slamch, slarnd
458 INTRINSIC abs,
max,
min, real, sign
461 DATA kclass / 15*1, 10*2, 1*3 /
462 DATA kz1 / 0, 1, 2, 1, 3, 3 /
463 DATA kz2 / 0, 0, 1, 2, 1, 1 /
464 DATA kadd / 0, 0, 0, 0, 3, 2 /
465 DATA katype / 0, 1, 0, 1, 2, 3, 4, 1, 4, 4, 1, 1, 4,
466 $ 4, 4, 2, 4, 5, 8, 7, 9, 4*4, 0 /
467 DATA kbtype / 0, 0, 1, 1, 2, -3, 1, 4, 1, 1, 4, 4,
468 $ 1, 1, -4, 2, -4, 8*8, 0 /
469 DATA kazero / 6*1, 2, 1, 2*2, 2*1, 2*2, 3, 1, 3,
471 DATA kbzero / 6*1, 1, 2, 2*1, 2*2, 2*1, 4, 1, 4,
473 DATA kamagn / 8*1, 2, 3, 2, 3, 2, 3, 7*1, 2, 3, 3,
475 DATA kbmagn / 8*1, 3, 2, 3, 2, 2, 3, 7*1, 3, 2, 3,
477 DATA ktrian / 16*0, 10*1 /
478 DATA iasign / 6*0, 2, 0, 2*2, 2*0, 3*2, 0, 2, 3*0,
480 DATA ibsign / 7*0, 2, 2*0, 2*2, 2*0, 2, 0, 2, 9*0 /
491 nmax =
max( nmax, nn( j ) )
496 IF( nsizes.LT.0 )
THEN
498 ELSE IF( badnn )
THEN
500 ELSE IF( ntypes.LT.0 )
THEN
502 ELSE IF( thresh.LT.zero )
THEN
504 ELSE IF( lda.LE.1 .OR. lda.LT.nmax )
THEN
506 ELSE IF( ldq.LE.1 .OR. ldq.LT.nmax )
THEN
518 IF( info.EQ.0 .AND. lwork.GE.1 )
THEN
519 minwrk =
max( 10*( nmax+1 ), 3*nmax*nmax )
520 nb =
max( 1, ilaenv( 1,
'SGEQRF',
' ', nmax, nmax, -1, -1 ),
521 $ ilaenv( 1,
'SORMQR',
'LT', nmax, nmax, nmax, -1 ),
522 $ ilaenv( 1,
'SORGQR',
' ', nmax, nmax, nmax, -1 ) )
523 maxwrk =
max( 10*( nmax+1 ), 2*nmax+nmax*nb, 3*nmax*nmax )
527 IF( lwork.LT.minwrk )
531 CALL xerbla(
'SDRGES', -info )
537 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
540 safmin =
slamch(
'Safe minimum' )
542 safmin = safmin / ulp
543 safmax = one / safmin
544 CALL slabad( safmin, safmax )
558 DO 190 jsize = 1, nsizes
561 rmagn( 2 ) = safmax*ulp / real( n1 )
562 rmagn( 3 ) = safmin*ulpinv*real( n1 )
564 IF( nsizes.NE.1 )
THEN
565 mtypes =
min( maxtyp, ntypes )
567 mtypes =
min( maxtyp+1, ntypes )
572 DO 180 jtype = 1, mtypes
573 IF( .NOT.dotype( jtype ) )
581 ioldsd( j ) = iseed( j )
613 IF( mtypes.GT.maxtyp )
616 IF( kclass( jtype ).LT.3 )
THEN
620 IF( abs( katype( jtype ) ).EQ.3 )
THEN
621 in = 2*( ( n-1 ) / 2 ) + 1
623 $
CALL slaset(
'Full', n, n, zero, zero, a, lda )
627 CALL slatm4( katype( jtype ), in, kz1( kazero( jtype ) ),
628 $ kz2( kazero( jtype ) ), iasign( jtype ),
629 $ rmagn( kamagn( jtype ) ), ulp,
630 $ rmagn( ktrian( jtype )*kamagn( jtype ) ), 2,
632 iadd = kadd( kazero( jtype ) )
633 IF( iadd.GT.0 .AND. iadd.LE.n )
634 $ a( iadd, iadd ) = one
638 IF( abs( kbtype( jtype ) ).EQ.3 )
THEN
639 in = 2*( ( n-1 ) / 2 ) + 1
641 $
CALL slaset(
'Full', n, n, zero, zero, b, lda )
645 CALL slatm4( kbtype( jtype ), in, kz1( kbzero( jtype ) ),
646 $ kz2( kbzero( jtype ) ), ibsign( jtype ),
647 $ rmagn( kbmagn( jtype ) ), one,
648 $ rmagn( ktrian( jtype )*kbmagn( jtype ) ), 2,
650 iadd = kadd( kbzero( jtype ) )
651 IF( iadd.NE.0 .AND. iadd.LE.n )
652 $ b( iadd, iadd ) = one
654 IF( kclass( jtype ).EQ.2 .AND. n.GT.0 )
THEN
663 q( jr, jc ) = slarnd( 3, iseed )
664 z( jr, jc ) = slarnd( 3, iseed )
666 CALL slarfg( n+1-jc, q( jc, jc ), q( jc+1, jc ), 1,
668 work( 2*n+jc ) = sign( one, q( jc, jc ) )
670 CALL slarfg( n+1-jc, z( jc, jc ), z( jc+1, jc ), 1,
672 work( 3*n+jc ) = sign( one, z( jc, jc ) )
677 work( 3*n ) = sign( one, slarnd( 2, iseed ) )
680 work( 4*n ) = sign( one, slarnd( 2, iseed ) )
686 a( jr, jc ) = work( 2*n+jr )*work( 3*n+jc )*
688 b( jr, jc ) = work( 2*n+jr )*work( 3*n+jc )*
692 CALL sorm2r(
'L',
'N', n, n, n-1, q, ldq, work, a,
693 $ lda, work( 2*n+1 ), iinfo )
696 CALL sorm2r(
'R',
'T', n, n, n-1, z, ldq, work( n+1 ),
697 $ a, lda, work( 2*n+1 ), iinfo )
700 CALL sorm2r(
'L',
'N', n, n, n-1, q, ldq, work, b,
701 $ lda, work( 2*n+1 ), iinfo )
704 CALL sorm2r(
'R',
'T', n, n, n-1, z, ldq, work( n+1 ),
705 $ b, lda, work( 2*n+1 ), iinfo )
715 a( jr, jc ) = rmagn( kamagn( jtype ) )*
717 b( jr, jc ) = rmagn( kbmagn( jtype ) )*
725 IF( iinfo.NE.0 )
THEN
726 WRITE( nounit, fmt = 9999 )
'Generator', iinfo, n, jtype,
741 IF( isort.EQ.0 )
THEN
751 CALL slacpy(
'Full', n, n, a, lda, s, lda )
752 CALL slacpy(
'Full', n, n, b, lda, t, lda )
753 ntest = 1 + rsub + isort
754 result( 1+rsub+isort ) = ulpinv
755 CALL sgges( 'v
', 'v
', SORT, SLCTES, N, S, LDA, T, LDA,
756 $ SDIM, ALPHAR, ALPHAI, BETA, Q, LDQ, Z, LDQ,
757 $ WORK, LWORK, BWORK, IINFO )
758.NE..AND..NE.
IF( IINFO0 IINFON+2 ) THEN
759 RESULT( 1+RSUB+ISORT ) = ULPINV
760 WRITE( NOUNIT, FMT = 9999 )'sgges', IINFO, N, JTYPE,
770.EQ.
IF( ISORT0 ) THEN
771 CALL SGET51( 1, N, A, LDA, S, LDA, Q, LDQ, Z, LDQ,
772 $ WORK, RESULT( 1 ) )
773 CALL SGET51( 1, N, B, LDA, T, LDA, Q, LDQ, Z, LDQ,
774 $ WORK, RESULT( 2 ) )
776 CALL SGET54( N, A, LDA, B, LDA, S, LDA, T, LDA, Q,
777 $ LDQ, Z, LDQ, WORK, RESULT( 7 ) )
779 CALL SGET51( 3, N, A, LDA, T, LDA, Q, LDQ, Q, LDQ, WORK,
781 CALL SGET51( 3, N, B, LDA, T, LDA, Z, LDQ, Z, LDQ, WORK,
793.EQ.
IF( ALPHAI( J )ZERO ) THEN
794 TEMP2 = ( ABS( ALPHAR( J )-S( J, J ) ) /
795 $ MAX( SAFMIN, ABS( ALPHAR( J ) ), ABS( S( J,
796 $ J ) ) )+ABS( BETA( J )-T( J, J ) ) /
797 $ MAX( SAFMIN, ABS( BETA( J ) ), ABS( T( J,
801.NE.
IF( S( J+1, J )ZERO ) THEN
803 RESULT( 5+RSUB ) = ULPINV
807.NE.
IF( S( J, J-1 )ZERO ) THEN
809 RESULT( 5+RSUB ) = ULPINV
814.GT.
IF( ALPHAI( J )ZERO ) THEN
819.LE..OR..GE.
IF( I10 I1N ) THEN
821.LT.
ELSE IF( I1N-1 ) THEN
822.NE.
IF( S( I1+2, I1+1 )ZERO ) THEN
824 RESULT( 5+RSUB ) = ULPINV
826.GT.
ELSE IF( I11 ) THEN
827.NE.
IF( S( I1, I1-1 )ZERO ) THEN
829 RESULT( 5+RSUB ) = ULPINV
832.NOT.
IF( ILABAD ) THEN
833 CALL SGET53( S( I1, I1 ), LDA, T( I1, I1 ), LDA,
834 $ BETA( J ), ALPHAR( J ),
835 $ ALPHAI( J ), TEMP2, IERR )
837 WRITE( NOUNIT, FMT = 9998 )IERR, J, N,
846 TEMP1 = MAX( TEMP1, TEMP2 )
848 WRITE( NOUNIT, FMT = 9997 )J, N, JTYPE, IOLDSD
851 RESULT( 6+RSUB ) = TEMP1
853.GE.
IF( ISORT1 ) THEN
861 IF( SLCTES( ALPHAR( I ), ALPHAI( I ),
862.OR.
$ BETA( I ) ) SLCTES( ALPHAR( I ),
863 $ -ALPHAI( I ), BETA( I ) ) ) THEN
867 IF( ( SLCTES( ALPHAR( I+1 ), ALPHAI( I+1 ),
868.OR.
$ BETA( I+1 ) ) SLCTES( ALPHAR( I+1 ),
869.AND.
$ -ALPHAI( I+1 ), BETA( I+1 ) ) )
870.NOT.
$ ( ( SLCTES( ALPHAR( I ), ALPHAI( I ),
871.OR.
$ BETA( I ) ) SLCTES( ALPHAR( I ),
872.AND.
$ -ALPHAI( I ), BETA( I ) ) ) )
873.NE.
$ IINFON+2 ) THEN
874 RESULT( 12 ) = ULPINV
878.NE.
IF( SDIMKNTEIG ) THEN
879 RESULT( 12 ) = ULPINV
889 NTESTT = NTESTT + NTEST
894.GE.
IF( RESULT( JR )THRESH ) THEN
899.EQ.
IF( NERRS0 ) THEN
900 WRITE( NOUNIT, FMT = 9996 )'sgs
'
904 WRITE( NOUNIT, FMT = 9995 )
905 WRITE( NOUNIT, FMT = 9994 )
906 WRITE( NOUNIT, FMT = 9993 )'orthogonal
'
910 WRITE( NOUNIT, FMT = 9992 )'orthogonal
', '''',
911 $ 'transpose
', ( '''', J = 1, 8 )
915.LT.
IF( RESULT( JR )10000.0 ) THEN
916 WRITE( NOUNIT, FMT = 9991 )N, JTYPE, IOLDSD, JR,
919 WRITE( NOUNIT, FMT = 9990 )N, JTYPE, IOLDSD, JR,
930 CALL ALASVM( 'sgs
', NOUNIT, NERRS, NTESTT, 0 )
936 9999 FORMAT( ' sdrges:
', A, ' returned info=
', I6, '.
', / 9X, 'n=
',
937 $ I6, ', jtype=
', I6, ', iseed=(
', 4( I4, ',
' ), I5, ')
' )
940 $ I6, '.
', / 9X, 'n=
', I6, ', jtype=
', I6, ', iseed=(
',
941 $ 4( I4, ',
' ), I5, ')
' )
943 9997 FORMAT( ' sdrges: s not in schur form at eigenvalue
', I6, '.
',
944 $ / 9X, 'n=
', I6, ', jtype=
', I6, ', iseed=(
', 3( I5, ',
' ),
947 9996 FORMAT( / 1X, A3, ' -- real generalized schur form driver
' )
949 9995 FORMAT( ' matrix types(see
sdrges for details):
' )
951 9994 FORMAT( ' special matrices:
', 23X,
952 $ '(j
''=transposed jordan block)
',
953 $ / ' 1=(0,0) 2=(i,0) 3=(0,i) 4=(i,i) 5=(j
'',j
'')
',
954 $ '6=(diag(j
'',i), diag(i,j
''))
', / ' diagonal matrices: (
',
955 $ 'd=diag(0,1,2,...) )
', / ' 7=(d,i) 9=(large*d, small*i
',
956 $ ') 11=(large*i, small
', /
957 $ ' 8=(i,d) 10=(small*d, large*i) 12=(small*i, large*d)
',
958 $ ' 14=(small*d, small*i)
', / ' 15=(d, reversed d)
' )
959 9993 FORMAT( ' matrices rotated by random
', A, ' matrices u, v:
',
960 $ / ' 16=transposed jordan blocks 19=geometric
',
961 $ 'alpha, beta=0,1
', / ' 17=arithm.
alpha&beta
',
962 $ ' 20=arithmetic
alpha, beta=0,1
', / ' 18=clustered
',
963 $ 'alpha, beta=0,1 21=random
alpha, beta=0,1
',
964 $ / ' large & small matrices:
', / ' 22=(large, small)
',
965 $ '23=(small,large) 24=(small,small) 25=(large,large)
',
966 $ / ' 26=random o(1) matrices.
' )
968 9992 FORMAT( / ' tests performed: (s is schur, t is triangular,
',
969 $ 'q and z are
', A, ',
', / 19X,
970 $ 'l and r are
the appropriate left and right
', / 19X,
971 $ 'eigenvectors, resp., a is
alpha, b is beta, and', / 19x, a,
972 $
' means ', a,
'.)', /
' Without ordering: ',
973 $ /
' 1 = | A - Q S Z', a,
974 $
' | / ( |A| n ulp ) 2 = | B - Q T Z', a,
975 $
' | / ( |B| n ulp )', /
' 3 = | I - QQ', a,
976 $
' | / ( n ulp ) 4 = | I - ZZ', a,
977 $
' | / ( n ulp )', /
' 5 = A is in Schur form S',
978 $ /
' 6 = difference between (alpha,beta)',
979 $
' and diagonals of (S,T)', /
' With ordering: ',
980 $ /
' 7 = | (A,B) - Q (S,T) Z', a,
981 $
' | / ( |(A,B)| n ulp ) ', /
' 8 = | I - QQ', a,
982 $
' | / ( n ulp ) 9 = | I - ZZ', a,
983 $
' | / ( n ulp )', /
' 10 = A is in Schur form S',
984 $ /
' 11 = difference between (alpha,beta) and diagonals',
985 $
' of (S,T)', /
' 12 = SDIM is the correct number of ',
986 $
'selected eigenvalues', / )
987 9991
FORMAT(
' Matrix order=', i5,
', type=', i2,
', seed=',
988 $ 4( i4,
',' ),
' result ', i2,
' is', 0p, f8.2 )
989 9990
FORMAT(
' Matrix order=', i5,
', type=', i2,
', seed=',
990 $ 4( i4,
',' ),
' result ', i2,
' is', 1p, e10.3 )