399 SUBROUTINE sdrges3( 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,
413 LOGICAL BWORK( * ), DOTYPE( * )
414 INTEGER ( 4 ), NN( * )
415 REAL A( LDA, * ), ALPHAI(
425 PARAMETER ( ZERO = 0.0e+0, one = 1.0e+0 )
427 parameter( maxtyp = 26 )
432 INTEGER , I1, IADD, , IINFO, IN, ISORT, J, JC, JR,
433 $ jsize, jtype, knteig, maxwrk, minwrk, mtypes,
436 REAL SAFMAX, SAFMIN, TEMP1, TEMP2, ULP, ULPINV
439 INTEGER IASIGN( MAXTYP ), IBSIGN( MAXTYP ),
440 $ IOLDSD( 4 ), KADD( 6 ), KAMAGN( MAXTYP ),
441 $ KATYPE( 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(
'SDRGES3', -info )
537 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
540 safmin = slamch(
'Safe minimum' )
541 ulp = slamch(
'Epsilon' )*slamch(
'Base' )
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 ) )
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
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 ) )*
725 IF( iinfo.NE.0 )
THEN
726 WRITE( nounit, fmt = 9999 )
'Generator', iinfo, n, jtype,
741 IF( isort.EQ.0 )
THEN
759 CALL slacpy(
'Full', n, n, a, lda, s, lda )
761 ntest = 1 + rsub + isort
762 result( 1+rsub+isort ) = ulpinv
764 $ sdim, alphar, alphai, beta, q, ldq, z, ldq,
765 $ work, lwork, bwork, iinfo )
766 IF( iinfo.NE.0 .AND. iinfo.NE.n+2 )
THEN
767 result( 1+rsub+isort ) = ulpinv
768 WRITE( nounit, fmt = 9999 )
'SGGES3', iinfo, n, jtype,
778 IF( isort.EQ.0 )
THEN
779 CALL sget51( 1, n, a, lda, s, lda, q, ldq, z, ldq,
780 $ work, result( 1 ) )
781 CALL sget51( 1, n, b, lda, t, lda, q, ldq, z, ldq,
782 $ work, result( 2 ) )
784 CALL sget54( n, a, lda, b, lda, s, lda, t
785 $ ldq, z, ldq, work, result( 7 ) )
787 CALL sget51( 3, n, a, lda, t, lda, q, ldq, q, ldq, work,
789 CALL sget51( 3, n, b, lda, t, lda, z, ldq, z, ldq, work,
801 IF( alphai( j ).EQ.zero )
THEN
802 temp2 = ( abs( alphar( j )-s( j, j ) ) /
803 $
max( safmin, abs( alphar( j ) ), abs( s( j,
804 $ j ) ) )+abs( beta( j )-t( j, j ) ) /
805 $
max( safmin, abs( beta( j ) ), abs( t( j,
809 IF( s( j+1, j ).NE.zero )
THEN
811 result( 5+rsub ) = ulpinv
815 IF( s( j, j-1 ).NE.zero )
THEN
817 result( 5+rsub ) = ulpinv
822 IF( alphai( j ).GT.zero )
THEN
827 IF( i1.LE.0 .OR. i1.GE.n )
THEN
829 ELSE IF( i1.LT.n-1 )
THEN
830 IF( s( i1+2, i1+1 ).NE.zero
THEN
832 result( 5+rsub ) = ulpinv
834 ELSE IF( i1.GT.1 )
THEN
835 IF( s( i1, i1-1 ).NE.zero )
THEN
837 result( 5+rsub ) = ulpinv
840 IF( .NOT.ilabad )
THEN
841 CALL sget53( s( i1, i1 ), lda, t( i1, i1 ), lda,
842 $ beta( j ), alphar( j ),
843 $ alphai( j ), temp2, ierr )
845 WRITE( nounit, fmt = 9998 )ierr, j, n,
854 temp1 =
max( temp1, temp2 )
856 WRITE( nounit, fmt = 9997 )j, n, jtype, ioldsd
859 result( 6+rsub ) = temp1
861 IF( isort.GE.1 )
THEN
869 IF(
slctes( alphar( i ), alphai( i ),
870 $ beta( i ) ) .OR.
slctes( alphar( i ),
871 $ -alphai( i ), beta( i ) ) )
THEN
875 IF( (
slctes( alphar( i+1 ), alphai( i+1 ),
876 $ beta( i+1 ) ) .OR.
slctes( alphar( i+1 ),
877 $ -alphai( i+1 ), beta( i+1 ) ) ) .AND.
878 $ ( .NOT.(
slctes( alphar( i ), alphai( i ),
879 $ beta( i ) ) .OR.
slctes( alphar( i ),
880 $ -alphai( i ), beta( i ) ) ) ) .AND.
881 $ iinfo.NE.n+2 )
THEN
882 result( 12 ) = ulpinv
886 IF( sdim.NE.knteig )
THEN
887 result( 12 ) = ulpinv
897 ntestt = ntestt + ntest
902 IF( result( jr ).GE.thresh )
THEN
907 IF( nerrs.EQ.0 )
THEN
908 WRITE( nounit, fmt = 9996 )
'SGS'
912 WRITE( nounit, fmt = 9995 )
913 WRITE( nounit, fmt = 9994 )
914 WRITE( nounit, fmt = 9993 )
'Orthogonal'
918 WRITE( nounit, fmt = 9992 )
'orthogonal',
'''',
919 $
'transpose', (
'''', j = 1, 8 )
923 IF( result( jr ).LT.10000.0 )
THEN
924 WRITE( nounit, fmt = 9991 )n, jtype, ioldsd, jr,
927 WRITE( nounit, fmt = 9990 )n, jtype, ioldsd, jr,
938 CALL alasvm( 'sgs
', NOUNIT, NERRS, NTESTT, 0 )
944 9999 FORMAT( ' sdrges3:
', A, ' returned info=
', I6, '.
', / 9X, 'n=
',
945 $ I6, ', jtype=
', I6, ', iseed=(
', 4( I4, ',
' ), I5, ')
' )
948 $ I6, '.
', / 9X, 'n=
', I6, ', jtype=
', I6, ', iseed=(
',
949 $ 4( I4, ',
' ), I5, ')
' )
951 9997 FORMAT( ' sdrges3: s not in schur form at eigenvalue
', I6, '.
',
952 $ / 9X, 'n=
', I6, ', jtype=
', I6, ', iseed=(
', 3( I5, ',
' ),
955 9996 FORMAT( / 1X, A3, ' -- real generalized schur form driver
' )
957 9995 FORMAT( ' matrix types(see
sdrges3 for details):
' )
959 9994 FORMAT( ' special matrices:
', 23X,
960 $ '(j
''=transposed jordan block)
',
961 $ / ' 1=(0,0) 2=(i,0) 3=(0,i) 4=(i,i) 5=(j
'',j
'')
',
962 $ '6=(diag(j
'',i), diag(i,j
''))
', / ' diagonal matrices: (
',
963 $ 'd=diag(0,1,2,...) )
', / ' 7=(d,i) 9=(large*d, small*i
',
964 $ ') 11=(large*i, small*d) 13=(large*d, large*i)
', /
965 $ ' 8=(i,d) 10=(small*d, large*i) 12=(small*i, large*d)
',
966 $ ' 14=(small*d, small*i)
', / ' 15=(d, reversed
' )
967 9993 FORMAT( ' matrices rotated by random
', A, ' matrices u, v:
',
968 $ / ' 16=transposed jordan blocks 19=geometric
',
969 $ 'alpha, beta=0,1
', / ' 17=arithm.
alpha&beta
',
970 $ ' 20=arithmetic
alpha, beta=0,1
', / ' 18=clustered
',
971 $ 'alpha, beta=0,1 21=random
alpha, beta=0,1
',
972 $ / ' large & small matrices:
', / ' 22=(large, small)
',
973 $ '23=(small,large) 24=(small,small) 25=(large,large)
',
974 $ / ' 26=random o(1) matrices.
' )
976 9992 FORMAT( / ' tests performed: (s is schur, t is triangular,
',
977 $ 'q and z are
', A, ',
', / 19X,
978 $ 'l and r are
the appropriate left and right
', / 19X,
979 $ 'eigenvectors, resp., a is
alpha, b is beta, and
', / 19X, A,
980 $ ' means
', A, '.)
', / ' without ordering:
',
981 $ / ' 1 = | a - q s z
', A,
982 $ ' | / ( |a| n ulp ) 2 = | b - q t z
', A,
983 $ ' | / ( |b| n ulp )
', / ' 3 = | i - qq
', A,
984 $ ' | / ( n ulp ) 4 = | i - zz
', A,
985 $ ' | / ( n ulp )
', / ' 5 = a is in schur form s
',
986 $ / ' 6 = difference between(
alpha,beta)
',
987 $ ' and diagonals of(s,t)
', / ' with ordering:
',
988 $ / ' 7 = | (a,b) - q(s,t) z
', A,
989 $ ' | / ( |(a,b)| n ulp )
', / ' 8 = | i - qq
', A,
990 $ ' | / ( n ulp ) 9 = | i - zz
', A,
991 $ ' | / ( n ulp )
', / ' 10 = a is in schur form s
',
992 $ / ' 11 = difference between(
alpha,beta) and diagonals
',
993 $ ' of(s,t)
', / ' 12 = sdim is
the correct number of
',
994 $ 'selected eigenvalues
', / )
995 9991 FORMAT( ' matrix order=
', I5, ', type=
', I2, ',
seed=
',
996 $ 4( I4, ',
' ), ' result
', I2, ' is
', 0P, F8.2 )
997 9990 FORMAT( ' matrix order=
', I5, ', type=
', I2, ',
seed=
',
998 $ 4( I4, ',
' ), ' result
', I2, ' is
', 1P, E10.3 )