358 SUBROUTINE sdrvsg2stg( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH,
359 $ NOUNIT, A, LDA, B, LDB, D, D2, Z, LDZ, AB,
360 $ BB, AP, BP, WORK, NWORK, IWORK, LIWORK,
370 INTEGER INFO, LDA, LDB, LDZ, LIWORK, NOUNIT, NSIZES,
376 INTEGER ISEED( 4 ), IWORK( * ), NN( * )
377 REAL A( LDA, * ), AB( LDA, * ), AP( * ),
378 $ b( ldb, * ), bb( ldb, * ), bp( * ), d( * ),
379 $ d2( * ), result( * ), work( * ), z( ldz, * )
386PARAMETER ( ZERO = 0.0e0, one = 1.0e0, ten = 10.0e0 )
388 parameter( maxtyp = 21 )
393 INTEGER I, , IBUPLO, IINFO, IJ, IL, IMODE, ITEMP,
394 $ itype, iu, j, jcol, jsize, jtype, ka, ka9, kb,
395 $ kb9, m, mtypes, n, nerrs, nmats, nmax, ntest,
397 REAL ABSTOL, ANINV, ANORM, COND, OVFL, RTOVFL,
398 $ RTUNFL, ULP, ULPINV, UNFL, VL, VU, TEMP1, TEMP2
401 INTEGER IDUMMA( 1 ), IOLDSD( 4 ), ISEED2( 4 ),
402 $ KMAGN( MAXTYP ), KMODE( MAXTYP ),
408 EXTERNAL LSAME, SLAMCH, SLARND
417 INTRINSIC abs, real,
max,
min, sqrt
420 DATA ktype / 1, 2, 5*4, 5*5, 3*8, 6*9 /
421 DATA kmagn / 2*1, 1, 1, 1, 2, 3, 1, 1, 1, 2, 3, 1,
423 DATA kmode / 2*0, 4, 3, 1, 4, 4, 4, 3, 1, 4, 4, 0,
436 nmax =
max( nmax, nn( j ) )
443 IF( nsizes.LT.0 )
THEN
445 ELSE IF( badnn )
THEN
447 ELSE IF( ntypes.LT.0 )
THEN
449 ELSE IF( lda.LE.1 .OR. lda.LT.nmax )
THEN
451 ELSE IF( ldz.LE.1 .OR. ldz.LT.nmax )
THEN
453 ELSE IF( 2*
max( nmax, 3 )**2.GT.nwork )
THEN
455 ELSE IF( 2*
max( nmax, 3 )**2.GT.liwork )
THEN
460 CALL xerbla(
'SDRVSG2STG', -info )
466 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
471 unfl = slamch(
'Safe minimum' )
472 ovfl = slamch(
'Overflow' )
474 ulp = slamch(
'Epsilon' )*slamch(
'Base' )
476 rtunfl = sqrt( unfl )
477 rtovfl = sqrt( ovfl )
480 iseed2( i ) = iseed( i )
488 DO 650 jsize = 1, nsizes
492 IF( nsizes.NE.1 )
THEN
493 mtypes =
min( maxtyp, ntypes )
495 mtypes =
min( maxtyp+1, ntypes )
500 DO 640 jtype = 1, mtypes
501 IF( .NOT.dotype( jtype ) )
507 ioldsd( j ) = iseed( j )
525 IF( mtypes.GT.maxtyp )
528 itype = ktype( jtype )
529 imode = kmode( jtype )
533 GO TO ( 40, 50, 60 )kmagn( jtype )
540 anorm = ( rtovfl*ulp )*aninv
544 anorm = rtunfl*n*ulpinv
554 IF( itype.EQ.1 )
THEN
560 CALL slaset(
'Full', lda, n, zero, zero, a, lda )
562 ELSE IF( itype.EQ.2 )
THEN
568 CALL slaset(
'Full', lda, n, zero, zero, a, lda )
570 a( jcol, jcol ) = anorm
573 ELSE IF( itype.EQ.4 )
THEN
579 CALL slatms( n, n,
'S', iseed,
'S', work, imode, cond,
580 $ anorm, 0, 0,
'N', a, lda, work( n+1 ),
583 ELSE IF( itype.EQ.5 )
THEN
589 CALL slatms( n, n,
'S', iseed,
'S', work, imode, cond,
590 $ anorm, n, n,
'N', a, lda, work( n+1 ),
593 ELSE IF( itype.EQ.7 )
THEN
599 CALL slatmr( n, n,
'S', iseed,
'S', work, 6, one, one,
600 $
'T',
'N', work( n+1 ), 1, one,
601 $ work( 2*n+1 ), 1, one,
'N', idumma, 0, 0,
602 $ zero, anorm, 'no
', A, LDA, IWORK, IINFO )
604.EQ.
ELSE IF( ITYPE8 ) THEN
610 CALL SLATMR( N, N, 's
', ISEED, 'h
', WORK, 6, ONE, ONE,
611 $ 't
', 'n
', WORK( N+1 ), 1, ONE,
612 $ WORK( 2*N+1 ), 1, ONE, 'n
', IDUMMA, N, N,
613 $ ZERO, ANORM, 'no
', A, LDA, IWORK, IINFO )
615.EQ.
ELSE IF( ITYPE9 ) THEN
629.GT.
IF( KB9KA9 ) THEN
633 KA = MAX( 0, MIN( N-1, KA9 ) )
634 KB = MAX( 0, MIN( N-1, KB9 ) )
635 CALL SLATMS( N, N, 's
', ISEED, 's
', WORK, IMODE, COND,
636 $ ANORM, KA, KA, 'n
', A, LDA, WORK( N+1 ),
644.NE.
IF( IINFO0 ) THEN
645 WRITE( NOUNIT, FMT = 9999 )'generator
', IINFO, N, JTYPE,
658 IL = 1 + INT( ( N-1 )*SLARND( 1, ISEED2 ) )
659 IU = 1 + INT( ( N-1 )*SLARND( 1, ISEED2 ) )
688 CALL SLATMS( N, N, 'u
', ISEED, 'p
', WORK, 5, TEN, ONE,
689 $ KB, KB, UPLO, B, LDB, WORK( N+1 ),
696 CALL SLACPY( ' ', N, N, A, LDA, Z, LDZ )
697 CALL SLACPY( UPLO, N, N, B, LDB, BB, LDB )
699 CALL SSYGV( IBTYPE, 'v
', UPLO, N, Z, LDZ, BB, LDB, D,
700 $ WORK, NWORK, IINFO )
701.NE.
IF( IINFO0 ) THEN
702 WRITE( NOUNIT, FMT = 9999 )'ssygv(v,
' // UPLO //
703 $ ')
', IINFO, N, JTYPE, IOLDSD
705.LT.
IF( IINFO0 ) THEN
708 RESULT( NTEST ) = ULPINV
715 CALL SSGT01( IBTYPE, UPLO, N, N, A, LDA, B, LDB, Z,
716 $ LDZ, D, WORK, RESULT( NTEST ) )
722 CALL SLACPY( ' ', N, N, A, LDA, Z, LDZ )
723 CALL SLACPY( UPLO, N, N, B, LDB, BB, LDB )
725 CALL SSYGV_2STAGE( IBTYPE, 'n
', UPLO, N, Z, LDZ,
726 $ BB, LDB, D2, WORK, NWORK, IINFO )
727.NE.
IF( IINFO0 ) THEN
728 WRITE( NOUNIT, FMT = 9999 )
730 $ ')
', IINFO, N, JTYPE, IOLDSD
732.LT.
IF( IINFO0 ) THEN
735 RESULT( NTEST ) = ULPINV
753 TEMP1 = MAX( TEMP1, ABS( D( J ) ),
755 TEMP2 = MAX( TEMP2, ABS( D( J )-D2( J ) ) )
758 RESULT( NTEST ) = TEMP2 /
759 $ MAX( UNFL, ULP*MAX( TEMP1, TEMP2 ) )
765 CALL SLACPY( ' ', n, n, a, lda, z, ldz )
768 CALL ssygvd( ibtype,
'V', uplo, n, z, ldz, bb, ldb, d,
769 $ work, nwork, iwork, liwork, iinfo )
770 IF( iinfo.NE.0 )
THEN
771 WRITE( nounit, fmt = 9999 )
'SSYGVD(V,' // uplo //
772 $
')', iinfo, n, jtype, ioldsd
774 IF( iinfo.LT.0 )
THEN
777 result( ntest ) = ulpinv
784 CALL ssgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
791 CALL slacpy(
' ', n, n, a, lda, ab, lda )
792 CALL slacpy( uplo, n, n, b, ldb, bb, ldb )
794 CALL ssygvx( ibtype,
'V',
'A', uplo, n, ab, lda, bb,
795 $ ldb, vl, vu, il, iu, abstol, m, d, z,
796 $ ldz, work, nwork, iwork( n+1 ), iwork,
798 IF( iinfo.NE.0 )
THEN
799 WRITE( nounit, fmt = 9999 )
'SSYGVX(V,A' // uplo //
800 $
')', iinfo, n, jtype, ioldsd
802 IF( iinfo.LT.0 )
THEN
805 result( ntest ) = ulpinv
812 CALL ssgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
813 $ ldz, d, work, result( ntest ) )
817 CALL slacpy(
' ', n, n, a, lda, ab, lda )
827 CALL ssygvx( ibtype,
'V',
'V', uplo, n, ab, lda, bb,
828 $ ldb, vl, vu, il, iu, abstol, m, d, z,
829 $ ldz, work, nwork, iwork( n+1 ), iwork,
831 IF( iinfo.NE.0 )
THEN
832 WRITE( nounit, fmt = 9999 )
'SSYGVX(V,V,' //
833 $ uplo //
')', iinfo, n, jtype, ioldsd
835 IF( iinfo.LT.0 )
THEN
838 result( ntest ) = ulpinv
845 CALL ssgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
846 $ ldz, d, work, result( ntest ) )
850 CALL slacpy(
' ', n, n, a, lda, ab, lda )
851 CALL slacpy( uplo, n, n, b, ldb, bb, ldb )
853 CALL ssygvx( ibtype,
'V',
'I', uplo, n, ab, lda, bb,
854 $ ldb, vl, vu, il, iu, abstol, m, d, z,
855 $ ldz, work, nwork, iwork( n+1 ), iwork,
857 IF( iinfo.NE.0 )
THEN
858 WRITE( nounit, fmt = 9999 )
'SSYGVX(V,I,' //
859 $ uplo //
')', iinfo, n, jtype, ioldsd
861 IF( iinfo.LT.0 )
THEN
864 result( ntest ) = ulpinv
871 CALL ssgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
872 $ ldz, d, work, result( ntest ) )
882 IF( lsame( uplo,
'U' ) )
THEN
902 CALL sspgv( ibtype,
'V', uplo, n, ap, bp, d, z, ldz,
904 IF( iinfo.NE.0 )
THEN
905 WRITE( nounit, fmt = 9999 )
'SSPGV(V,' // uplo //
906 $
')', iinfo, n, jtype, ioldsd
908 IF( iinfo.LT.0 )
THEN
911 result( ntest ) = ulpinv
918 CALL ssgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
919 $ ldz, d, work, result( ntest ) )
927 IF( lsame( uplo,
'U' ) )
THEN
947 CALL sspgvd( ibtype,
'V', uplo, n, ap, bp, d, z, ldz,
948 $ work, nwork, iwork, liwork, iinfo )
949 IF( iinfo.NE.0 )
THEN
950 WRITE( nounit, fmt = 9999 )
'SSPGVD(V,' // uplo //
951 $
')', iinfo, n, jtype, ioldsd
953 IF( iinfo.LT.0 )
THEN
956 result( ntest ) = ulpinv
963 CALL ssgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
964 $ ldz, d, work, result( ntest ) )
972 IF( lsame( uplo,
'U' ) )
THEN
992 CALL sspgvx( ibtype,
'V',
'A', uplo, n, ap, bp, vl,
993 $ vu, il, iu, abstol, m, d, z, ldz, work,
994 $ iwork( n+1 ), iwork, info )
995 IF( iinfo.NE.0 )
THEN
996 WRITE( nounit, fmt = 9999 )
'SSPGVX(V,A' // uplo //
997 $
')', iinfo, n, jtype, ioldsd
999 IF( iinfo.LT.0 )
THEN
1009 CALL ssgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
1010 $ ldz, d, work, result( ntest ) )
1016 IF( lsame( uplo,
'U' ) )
THEN
1020 ap( ij ) = a( i, j )
1021 bp( ij ) = b( i, j )
1029 ap( ij ) = a( i, j )
1030 bp( ij ) = b( i, j )
1038 CALL sspgvx( ibtype,
'V', 'v
', UPLO, N, AP, BP, VL,
1039 $ VU, IL, IU, ABSTOL, M, D, Z, LDZ, WORK,
1040 $ IWORK( N+1 ), IWORK, INFO )
1041.NE.
IF( IINFO0 ) THEN
1042 WRITE( NOUNIT, FMT = 9999 )'sspgvx(v,v
' // UPLO //
1043 $ ')
', IINFO, N, JTYPE, IOLDSD
1045.LT.
IF( IINFO0 ) THEN
1048 RESULT( NTEST ) = ULPINV
1055 CALL SSGT01( IBTYPE, UPLO, N, M, A, LDA, B, LDB, Z,
1056 $ LDZ, D, WORK, RESULT( NTEST ) )
1062 IF( LSAME( UPLO, 'u
' ) ) THEN
1066 AP( IJ ) = A( I, J )
1067 BP( IJ ) = B( I, J )
1075 AP( IJ ) = A( I, J )
1076 BP( IJ ) = B( I, J )
1082 CALL SSPGVX( IBTYPE, 'v
', 'i
', UPLO, N, AP, BP, VL,
1083 $ VU, IL, IU, ABSTOL, M, D, Z, LDZ, WORK,
1084 $ IWORK( N+1 ), IWORK, INFO )
1085.NE.
IF( IINFO0 ) THEN
1086 WRITE( NOUNIT, FMT = 9999 )'sspgvx(v,i
' // UPLO //
1087 $ ')
', IINFO, N, JTYPE, IOLDSD
1089.LT.
IF( IINFO0 ) THEN
1092 RESULT( NTEST ) = ULPINV
1099 CALL SSGT01( IBTYPE, UPLO, N, M, A, LDA, B, LDB, Z,
1100 $ LDZ, D, WORK, RESULT( NTEST ) )
1104.EQ.
IF( IBTYPE1 ) THEN
1112 IF( LSAME( UPLO, 'u
' ) ) THEN
1114 DO 320 I = MAX( 1, J-KA ), J
1115 AB( KA+1+I-J, J ) = A( I, J )
1117 DO 330 I = MAX( 1, J-KB ), J
1118 BB( KB+1+I-J, J ) = B( I, J )
1123 DO 350 I = J, MIN( N, J+KA )
1124 AB( 1+I-J, J ) = A( I, J )
1126 DO 360 I = J, MIN( N, J+KB )
1127 BB( 1+I-J, J ) = B( I, J )
1132 CALL SSBGV( 'v
', UPLO, N, KA, KB, AB, LDA, BB, LDB,
1133 $ D, Z, LDZ, WORK, IINFO )
1134.NE.
IF( IINFO0 ) THEN
1135 WRITE( NOUNIT, FMT = 9999 )'ssbgv(v,
' //
1136 $ UPLO // ')
', IINFO, N, JTYPE, IOLDSD
1138.LT.
IF( IINFO0 ) THEN
1141 RESULT( NTEST ) = ULPINV
1148 CALL SSGT01( IBTYPE, UPLO, N, N, A, LDA, B, LDB, Z,
1149 $ LDZ, D, WORK, RESULT( NTEST ) )
1157 IF( LSAME( UPLO, 'u
' ) ) THEN
1159 DO 380 I = MAX( 1, J-KA ), J
1160 AB( KA+1+I-J, J ) = A( I, J )
1162 DO 390 I = MAX( 1, J-KB ), J
1163 BB( KB+1+I-J, J ) = B( I, J )
1168 DO 410 I = J, MIN( N, J+KA )
1169 AB( 1+I-J, J ) = A( I, J )
1171 DO 420 I = J, MIN( N, J+KB )
1172 BB( 1+I-J, J ) = B( I, J )
1177 CALL SSBGVD( 'v
', UPLO, N, KA, KB, AB, LDA, BB,
1178 $ LDB, D, Z, LDZ, WORK, NWORK, IWORK,
1180.NE.
IF( IINFO0 ) THEN
1181 WRITE( NOUNIT, FMT = 9999 )'ssbgvd(v,
' //
1182 $ UPLO // ')
', IINFO, N, JTYPE, IOLDSD
1184.LT.
IF( IINFO0 ) THEN
1187 RESULT( NTEST ) = ULPINV
1194 CALL SSGT01( IBTYPE, UPLO, N, N, A, LDA, B, LDB, Z,
1195 $ LDZ, D, WORK, RESULT( NTEST ) )
1203 IF( LSAME( UPLO, 'u
' ) ) THEN
1205 DO 440 I = MAX( 1, J-KA ), J
1206 AB( KA+1+I-J, J ) = A( I, J )
1208 DO 450 I = MAX( 1, J-KB ), J
1209 BB( KB+1+I-J, J ) = B( I, J )
1214 DO 470 I = J, MIN( N, J+KA )
1215 AB( 1+I-J, J ) = A( I, J )
1217 DO 480 I = J, MIN( N, J+KB )
1218 BB( 1+I-J, J ) = B( I, J )
1223 CALL SSBGVX( 'v
', 'a
', UPLO, N, KA, KB, AB, LDA,
1224 $ BB, LDB, BP, MAX( 1, N ), VL, VU, IL,
1225 $ IU, ABSTOL, M, D, Z, LDZ, WORK,
1226 $ IWORK( N+1 ), IWORK, IINFO )
1227.NE.
IF( IINFO0 ) THEN
1228 WRITE( NOUNIT, FMT = 9999 )'ssbgvx(v,a
' //
1229 $ UPLO // ')
', IINFO, N, JTYPE, IOLDSD
1231.LT.
IF( IINFO0 ) THEN
1234 RESULT( NTEST ) = ULPINV
1241 CALL SSGT01( IBTYPE, UPLO, N, M, A, LDA, B, LDB, Z,
1242 $ LDZ, D, WORK, RESULT( NTEST ) )
1249 IF( LSAME( UPLO, 'u
' ) ) THEN
1251 DO 500 I = MAX( 1, J-KA ), J
1252 AB( KA+1+I-J, J ) = A( I, J )
1254 DO 510 I = MAX( 1, J-KB ), J
1255 BB( KB+1+I-J, J ) = B( I, J )
1260 DO 530 I = J, MIN( N, J+KA )
1261 AB( 1+I-J, J ) = A( I, J )
1263 DO 540 I = J, MIN( N, J+KB )
1264 BB( 1+I-J, J ) = B( I, J )
1271 CALL SSBGVX( 'v
', 'v
', UPLO, N, KA, KB, AB, LDA,
1272 $ BB, LDB, BP, MAX( 1, N ), VL, VU, IL,
1273 $ IU, ABSTOL, M, D, Z, LDZ, WORK,
1274 $ IWORK( N+1 ), IWORK, IINFO )
1275.NE.
IF( IINFO0 ) THEN
1276 WRITE( NOUNIT, FMT = 9999 )'ssbgvx(v,v
' //
1277 $ UPLO // ')', iinfo, n, jtype, ioldsd
1279 IF( iinfo.LT.0 )
THEN
1282 result( ntest ) = ulpinv
1289 CALL ssgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
1290 $ ldz, d, work, result( ntest ) )
1296 IF( lsame( uplo,
'U' ) )
THEN
1298 DO 560 i =
max( 1, j-ka ), j
1299 ab( ka+1+i-j, j ) = a( i, j )
1301 DO 570 i =
max( 1, j-kb ), j
1302 bb( kb+1+i-j, j ) = b( i, j )
1307 DO 590 i = j,
min( n, j+ka )
1308 ab( 1+i-j, j ) = a( i, j )
1310 DO 600 i = j,
min( n, j+kb )
1311 bb( 1+i-j, j ) = b( i, j )
1316 CALL ssbgvx(
'V',
'I', uplo, n, ka, kb, ab, lda,
1317 $ bb, ldb, bp,
max( 1, n ), vl, vu, il,
1318 $ iu, abstol, m, d, z, ldz, work,
1319 $ iwork( n+1 ), iwork, iinfo )
1320 IF( iinfo.NE.0 )
THEN
1321 WRITE( nounit, fmt = 9999 )
'SSBGVX(V,I' //
1322 $ uplo //
')', iinfo, n, jtype, ioldsd
1324 IF( iinfo.LT.0 )
THEN
1327 result( ntest ) = ulpinv
1334 CALL ssgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
1335 $ ldz, d, work, result( ntest ) )
1344 ntestt = ntestt + ntest
1345 CALL slafts(
'SSG', n, n, jtype, ntest, result, ioldsd,
1346 $ thresh, nounit, nerrs )
1352 CALL slasum(
'SSG', nounit, nerrs, ntestt )
1358 9999
FORMAT(
' SDRVSG2STG: ', a,
' returned INFO=', i6,
'.', / 9x,
1359 $
'N=', i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ), i5,
')' )