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, * )
386 PARAMETER ( ZERO = 0.0e0, one = 1.0e0, ten = 10.0e0 )
388 parameter( maxtyp = 21 )
393 INTEGER I, IBTYPE, 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
490 aninv = one / real( max( 1, n ) )
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 ELSE IF( itype.EQ.8 )
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 ELSE IF( itype.EQ.9 )
THEN
629 IF( kb9.GT.ka9 )
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 IF( iinfo.NE.0 )
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 IF( iinfo.NE.0 )
THEN
702 WRITE( nounit, fmt = 9999 )
'SSYGV(V,' // uplo //
703 $
')', iinfo, n, jtype, ioldsd
705 IF( iinfo.LT.0 )
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 )
726 $ bb, ldb, d2, work, nwork, iinfo )
727 IF( iinfo.NE.0 )
THEN
728 WRITE( nounit, fmt = 9999 )
729 $
'SSYGV_2STAGE(V,' // uplo //
730 $
')', iinfo, n, jtype, ioldsd
732 IF( iinfo.LT.0 )
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 )
766 CALL slacpy( uplo, n, n, b, ldb, bb, ldb )
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,
785 $ ldz, d, work, result( ntest ) )
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 )
818 CALL slacpy( uplo, n, n, b, ldb, bb, ldb )
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
1002 result( ntest ) = ulpinv
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 IF( iinfo.NE.0 )
THEN
1042 WRITE( nounit, fmt = 9999 )
'SSPGVX(V,V' // uplo //
1043 $
')', iinfo, n, jtype, ioldsd
1045 IF( iinfo.LT.0 )
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 IF( iinfo.NE.0 )
THEN
1086 WRITE( nounit, fmt = 9999 )
'SSPGVX(V,I' // uplo //
1087 $
')', iinfo, n, jtype, ioldsd
1089 IF( iinfo.LT.0 )
THEN
1092 result( ntest ) = ulpinv
1099 CALL ssgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
1100 $ ldz, d, work, result( ntest ) )
1104 IF( ibtype.EQ.1 )
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 IF( iinfo.NE.0 )
THEN
1135 WRITE( nounit, fmt = 9999 )
'SSBGV(V,' //
1136 $ uplo //
')', iinfo, n, jtype, ioldsd
1138 IF( iinfo.LT.0 )
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 IF( iinfo.NE.0 )
THEN
1181 WRITE( nounit, fmt = 9999 )
'SSBGVD(V,' //
1182 $ uplo //
')', iinfo, n, jtype, ioldsd
1184 IF( iinfo.LT.0 )
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 IF( iinfo.NE.0 )
THEN
1228 WRITE( nounit, fmt = 9999 )
'SSBGVX(V,A' //
1229 $ uplo //
')', iinfo, n, jtype, ioldsd
1231 IF( iinfo.LT.0 )
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 IF( iinfo.NE.0 )
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,
')' )
subroutine slabad(SMALL, LARGE)
SLABAD
subroutine slaset(UPLO, M, N, ALPHA, BETA, A, LDA)
SLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine slacpy(UPLO, M, N, A, LDA, B, LDB)
SLACPY copies all or part of one two-dimensional array to another.
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine slatms(M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX, KL, KU, PACK, A, LDA, WORK, INFO)
SLATMS
subroutine slatmr(M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX, RSIGN, GRADE, DL, MODEL, CONDL, DR, MODER, CONDR, PIVTNG, IPIVOT, KL, KU, SPARSE, ANORM, PACK, A, LDA, IWORK, INFO)
SLATMR
subroutine ssbgvd(JOBZ, UPLO, N, KA, KB, AB, LDAB, BB, LDBB, W, Z, LDZ, WORK, LWORK, IWORK, LIWORK, INFO)
SSBGVD
subroutine ssbgv(JOBZ, UPLO, N, KA, KB, AB, LDAB, BB, LDBB, W, Z, LDZ, WORK, INFO)
SSBGV
subroutine ssbgvx(JOBZ, RANGE, UPLO, N, KA, KB, AB, LDAB, BB, LDBB, Q, LDQ, VL, VU, IL, IU, ABSTOL, M, W, Z, LDZ, WORK, IWORK, IFAIL, INFO)
SSBGVX
subroutine sspgvx(ITYPE, JOBZ, RANGE, UPLO, N, AP, BP, VL, VU, IL, IU, ABSTOL, M, W, Z, LDZ, WORK, IWORK, IFAIL, INFO)
SSPGVX
subroutine sspgvd(ITYPE, JOBZ, UPLO, N, AP, BP, W, Z, LDZ, WORK, LWORK, IWORK, LIWORK, INFO)
SSPGVD
subroutine sspgv(ITYPE, JOBZ, UPLO, N, AP, BP, W, Z, LDZ, WORK, INFO)
SSPGV
subroutine ssygv(ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK, LWORK, INFO)
SSYGV
subroutine ssygvx(ITYPE, JOBZ, RANGE, UPLO, N, A, LDA, B, LDB, VL, VU, IL, IU, ABSTOL, M, W, Z, LDZ, WORK, LWORK, IWORK, IFAIL, INFO)
SSYGVX
subroutine ssygv_2stage(ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK, LWORK, INFO)
SSYGV_2STAGE
subroutine ssygvd(ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK, LWORK, IWORK, LIWORK, INFO)
SSYGVD
subroutine ssgt01(ITYPE, UPLO, N, M, A, LDA, B, LDB, Z, LDZ, D, WORK, RESULT)
SSGT01
subroutine slafts(TYPE, M, N, IMAT, NTESTS, RESULT, ISEED, THRESH, IOUNIT, IE)
SLAFTS
subroutine sdrvsg2stg(NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH, NOUNIT, A, LDA, B, LDB, D, D2, Z, LDZ, AB, BB, AP, BP, WORK, NWORK, IWORK, LIWORK, RESULT, INFO)
SDRVSG2STG
subroutine slasum(TYPE, IOUNIT, IE, NRUN)
SLASUM