352 SUBROUTINE sdrvsg( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH,
353 $ NOUNIT, A, LDA, B, LDB, D, Z, LDZ, AB, BB, AP,
354 $ BP, WORK, NWORK, IWORK, LIWORK, RESULT, INFO )
361 INTEGER INFO, LDA, LDB, LDZ, LIWORK, NOUNIT, NSIZES,
367 INTEGER ISEED( 4 ), IWORK( * ), NN( * )
368 REAL A( LDA, * ), AB( LDA, * ), AP( * ),
369 $ b( ldb, * ), bb( ldb, * ), bp( * ), d( * ),
370 $ result( * ), work( * ), z( ldz, * )
377 PARAMETER ( ZERO = 0.0e0, one = 1.0e0, ten = 10.0e0 )
379 parameter( maxtyp = 21 )
384 INTEGER I, IBTYPE, IBUPLO, IINFO, IJ, IL, IMODE, ITEMP,
385 $ itype, iu, j, jcol, jsize, jtype, ka, ka9, kb,
386 $ kb9, m, mtypes, n, nerrs, nmats, nmax, ntest,
388 REAL ABSTOL, ANINV, ANORM, COND, OVFL, RTOVFL,
389 $ RTUNFL, ULP, ULPINV, UNFL, VL, VU
392 INTEGER IDUMMA( 1 ), IOLDSD( 4 ), ISEED2( 4 ),
393 $ KMAGN( MAXTYP ), KMODE( MAXTYP ),
399 EXTERNAL lsame, slamch, slarnd
407 INTRINSIC abs,
max,
min, real, sqrt
410 DATA ktype / 1, 2, 5*4, 5*5, 3*8, 6*9 /
411 DATA kmagn / 2*1, 1, 1, 1, 2, 3, 1, 1, 1, 2, 3, 1,
413 DATA kmode / 2*0, 4, 3, 1, 4, 4, 4, 3, 1, 4, 4, 0,
426 nmax =
max( nmax, nn( j ) )
433 IF( nsizes.LT.0 )
THEN
435 ELSE IF( badnn )
THEN
437 ELSE IF( ntypes.LT.0 )
THEN
439 ELSE IF( lda.LE.1 .OR. lda.LT.nmax )
THEN
441 ELSE IF( ldz.LE.1 .OR. ldz.LT.nmax )
THEN
443 ELSE IF( 2*
max( nmax, 3 )**2.GT.nwork )
THEN
445 ELSE IF( 2*
max( nmax, 3 )**2.GT.liwork )
THEN
450 CALL xerbla(
'SDRVSG', -info )
456 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
461 unfl = slamch(
'Safe minimum' )
462 ovfl = slamch(
'Overflow' )
464 ulp = slamch( 'epsilon
' )*SLAMCH( 'base
' )
466 RTUNFL = SQRT( UNFL )
467 RTOVFL = SQRT( OVFL )
470 ISEED2( I ) = ISEED( I )
478 DO 650 JSIZE = 1, NSIZES
480 ANINV = ONE / REAL( MAX( 1, N ) )
482.NE.
IF( NSIZES1 ) THEN
483 MTYPES = MIN( MAXTYP, NTYPES )
485 MTYPES = MIN( MAXTYP+1, NTYPES )
490 DO 640 JTYPE = 1, MTYPES
491.NOT.
IF( DOTYPE( JTYPE ) )
497 IOLDSD( J ) = ISEED( J )
515.GT.
IF( MTYPESMAXTYP )
518 ITYPE = KTYPE( JTYPE )
519 IMODE = KMODE( JTYPE )
523 GO TO ( 40, 50, 60 )KMAGN( JTYPE )
530 ANORM = ( RTOVFL*ULP )*ANINV
534 ANORM = RTUNFL*N*ULPINV
544.EQ.
IF( ITYPE1 ) THEN
550 CALL SLASET( 'full
', LDA, N, ZERO, ZERO, A, LDA )
552.EQ.
ELSE IF( ITYPE2 ) THEN
558 CALL SLASET( 'full
', LDA, N, ZERO, ZERO, A, LDA )
560 A( JCOL, JCOL ) = ANORM
563.EQ.
ELSE IF( ITYPE4 ) THEN
569 CALL SLATMS( N, N, 's
', ISEED, 's
', WORK, IMODE, COND,
570 $ ANORM, 0, 0, 'n
', A, LDA, WORK( N+1 ),
573.EQ.
ELSE IF( ITYPE5 ) THEN
579 CALL SLATMS( N, N, 's
', ISEED, 's
', WORK, IMODE, COND,
580 $ ANORM, N, N, 'n
', A, LDA, WORK( N+1 ),
583.EQ.
ELSE IF( ITYPE7 ) THEN
589 CALL SLATMR( N, N, 's
', ISEED, 's
', WORK, 6, ONE, ONE,
590 $ 't
', 'n
', WORK( N+1 ), 1, ONE,
591 $ WORK( 2*N+1 ), 1, ONE, 'n
', IDUMMA, 0, 0,
592 $ ZERO, ANORM, 'no
', A, LDA, IWORK, IINFO )
594.EQ.
ELSE IF( ITYPE8 ) THEN
600 CALL SLATMR( N, N, 's
', ISEED, 'h
', WORK, 6, ONE, ONE,
601 $ 't
', 'n
', WORK( N+1 ), 1, ONE,
602 $ WORK( 2*N+1 ), 1, ONE, 'n
', IDUMMA, N, N,
603 $ ZERO, ANORM, 'no
', A, LDA, IWORK, IINFO )
605.EQ.
ELSE IF( ITYPE9 ) THEN
619.GT.
IF( KB9KA9 ) THEN
623 KA = MAX( 0, MIN( N-1, KA9 ) )
624 KB = MAX( 0, MIN( N-1, KB9 ) )
625 CALL SLATMS( N, N, 's
', ISEED, 's
', WORK, IMODE, COND,
626 $ ANORM, KA, KA, 'n
', A, LDA, WORK( N+1 ),
634.NE.
IF( IINFO0 ) THEN
635 WRITE( NOUNIT, FMT = 9999 )'generator
', IINFO, N, JTYPE,
648 IL = 1 + ( N-1 )*SLARND( 1, ISEED2 )
649 IU = 1 + ( N-1 )*SLARND( 1, ISEED2 )
678 CALL SLATMS( N, N, 'u
', ISEED, 'p
', WORK, 5, TEN, ONE,
679 $ KB, KB, UPLO, B, LDB, WORK( N+1 ),
686 CALL SLACPY( ' ', N, N, A, LDA, Z, LDZ )
687 CALL SLACPY( UPLO, N, N, B, LDB, BB, LDB )
689 CALL SSYGV( IBTYPE, 'v
', UPLO, N, Z, LDZ, BB, LDB, D,
690 $ WORK, NWORK, IINFO )
691.NE.
IF( IINFO0 ) THEN
692 WRITE( NOUNIT, FMT = 9999 )'ssygv(v,
' // UPLO //
693 $ ')
', IINFO, N, JTYPE, IOLDSD
695.LT.
IF( IINFO0 ) THEN
698 RESULT( NTEST ) = ULPINV
705 CALL SSGT01( IBTYPE, UPLO, N, N, A, LDA, B, LDB, Z,
706 $ LDZ, D, WORK, RESULT( NTEST ) )
712 CALL SLACPY( ' ', N, N, A, LDA, Z, LDZ )
713 CALL SLACPY( UPLO, N, N, B, LDB, BB, LDB )
715 CALL SSYGVD( IBTYPE, 'v
', UPLO, N, Z, LDZ, BB, LDB, D,
716 $ WORK, NWORK, IWORK, LIWORK, IINFO )
717.NE.
IF( IINFO0 ) THEN
718 WRITE( NOUNIT, FMT = 9999 )'ssygvd(v,
' // UPLO //
719 $ ')
', IINFO, N, JTYPE, IOLDSD
721.LT.
IF( IINFO0 ) THEN
724 RESULT( NTEST ) = ULPINV
731 CALL SSGT01( IBTYPE, UPLO, N, N, A, LDA, B, LDB, Z,
732 $ LDZ, D, WORK, RESULT( NTEST ) )
738 CALL SLACPY( ' ', N, N, A, LDA, AB, LDA )
739 CALL SLACPY( UPLO, N, N, B, LDB, BB, LDB )
741 CALL SSYGVX( IBTYPE, 'v
', 'a', uplo, n, ab, lda, bb,
742 $ ldb, vl, vu, il, iu, abstol, m, d, z,
743 $ ldz, work, nwork, iwork( n+1 ), iwork,
745 IF( iinfo.NE.0 )
THEN
746 WRITE( nounit, fmt = 9999 )
'SSYGVX(V,A' // uplo //
747 $
')', iinfo, n, jtype, ioldsd
749 IF( iinfo.LT.0 )
THEN
752 result( ntest ) = ulpinv
759 CALL ssgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
760 $ ldz, d, work, result( ntest ) )
764 CALL slacpy(
' ', n, n, a, lda, ab, lda )
765 CALL slacpy( uplo, n, n, b, ldb, bb, ldb )
774 CALL ssygvx( ibtype,
'V',
'V', uplo, n, ab, lda, bb,
775 $ ldb, vl, vu, il, iu, abstol, m, d, z,
776 $ ldz, work, nwork, iwork( n+1 ), iwork,
778 IF( iinfo.NE.0 )
THEN
779 WRITE( nounit, fmt = 9999 )
'SSYGVX(V,V,' //
780 $ uplo //
')', iinfo, n, jtype, ioldsd
782 IF( iinfo.LT.0 )
THEN
785 result( ntest ) = ulpinv
792 CALL ssgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
793 $ ldz, d, work, result( ntest ) )
797 CALL slacpy(
' ', n, n, a, lda, ab, lda )
798 CALL slacpy( uplo, n, n, b, ldb, bb, ldb )
800 CALL ssygvx( ibtype,
'V',
'I', uplo, n, ab, lda, bb,
801 $ ldb, vl, vu, il, iu, abstol, m, d, z,
802 $ ldz, work, nwork, iwork( n+1 ), iwork,
804 IF( iinfo.NE.0 )
THEN
805 WRITE( nounit, fmt = 9999 )
'SSYGVX(V,I,' //
806 $ uplo //
')', iinfo, n, jtype, ioldsd
808 IF( iinfo.LT.0 )
THEN
811 result( ntest ) = ulpinv
818 CALL ssgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
819 $ ldz, d, work, result( ntest ) )
829 IF( lsame( uplo,
'U' ) )
THEN
849 CALL sspgv( ibtype,
'V', uplo, n, ap, bp, d, z, ldz,
851 IF( iinfo.NE.0 )
THEN
852 WRITE( nounit, fmt = 9999 )
'SSPGV(V,' // uplo //
853 $
')', iinfo, n, jtype, ioldsd
855 IF( iinfo.LT.0 )
THEN
858 result( ntest ) = ulpinv
865 CALL ssgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
866 $ ldz, d, work, result( ntest ) )
874 IF( lsame( uplo,
'U' ) )
THEN
894 CALL sspgvd( ibtype,
'V', uplo, n, ap, bp, d, z, ldz,
895 $ work, nwork, iwork, liwork, iinfo )
896 IF( iinfo.NE.0 )
THEN
897 WRITE( nounit, fmt = 9999 )
'SSPGVD(V,' // uplo //
898 $
')', iinfo, n, jtype, ioldsd
900 IF( iinfo.LT.0 )
THEN
903 result( ntest ) = ulpinv
910 CALL ssgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
911 $ ldz, d, work, result
919 IF( lsame( uplo,
'U' ) )
THEN
939 CALL sspgvx( ibtype,
'V',
'A', uplo, n, ap, bp, vl,
940 $ vu, il, iu, abstol, m, d, z, ldz, work,
941 $ iwork( n+1 ), iwork, info )
942 IF( iinfo.NE.0 )
THEN
943 WRITE( nounit, fmt = 9999 )
'SSPGVX(V,A' // uplo //
944 $
')', iinfo, n, jtype, ioldsd
946 IF( iinfo.LT.0 )
THEN
949 result( ntest ) = ulpinv
956 CALL ssgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
957 $ ldz, d, work, result( ntest ) )
963 IF( lsame( uplo,
'U' ) )
THEN
985 CALL sspgvx( ibtype,
'V',
'V', uplo, n, ap, bp, vl,
986 $ vu, il, iu, abstol, m, d, z, ldz, work,
987 $ iwork( n+1 ), iwork, info )
988 IF( iinfo.NE.0 )
THEN
989 WRITE( nounit, fmt = 9999 )
'SSPGVX(V,V' // uplo //
990 $
')', iinfo, n, jtype, ioldsd
992 IF( iinfo.LT.0 )
THEN
995 result( ntest ) = ulpinv
1002 CALL ssgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
1003 $ ldz, d, work, result( ntest ) )
1009 IF( lsame( uplo,
'U' ) )
THEN
1013 ap( ij ) = a( i, j )
1014 bp( ij ) = b( i, j )
1022 ap( ij ) = a( i, j )
1023 bp( ij ) = b( i, j )
1029 CALL sspgvx( ibtype,
'V',
'I', uplo, n, ap, bp, vl,
1030 $ vu, il, iu, abstol, m, d, z, ldz, work,
1031 $ iwork( n+1 ), iwork, info )
1032 IF( iinfo.NE.0 )
THEN
1033 WRITE( nounit, fmt = 9999 )
'SSPGVX(V,I' // uplo //
1034 $
')', iinfo, n, jtype, ioldsd
1036 IF( iinfo.LT.0 )
THEN
1039 result( ntest ) = ulpinv
1046 CALL ssgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
1047 $ ldz, d, work, result( ntest ) )
1051 IF( ibtype.EQ.1 )
THEN
1059 IF( lsame( uplo,
'U' ) )
THEN
1061 DO 320 i =
max( 1, j-ka ), j
1062 ab( ka+1+i-j, j ) = a( i, j )
1064 DO 330 i =
max( 1, j-kb ), j
1065 bb( kb+1+i-j, j ) = b( i, j )
1070 DO 350 i = j,
min( n, j+ka )
1071 ab( 1+i-j, j ) = a( i, j )
1073 DO 360 i = j,
min( n, j+kb )
1074 bb( 1+i-j, j ) = b( i, j )
1079 CALL ssbgv(
'V', uplo, n, ka, kb, ab, lda, bb, ldb,
1080 $ d, z, ldz, work, iinfo )
1081 IF( iinfo.NE.0 )
THEN
1082 WRITE( nounit, fmt = 9999 )
'SSBGV(V,' //
1083 $ uplo //
')', iinfo, n, jtype, ioldsd
1085 IF( iinfo.LT.0 )
THEN
1088 result( ntest ) = ulpinv
1095 CALL ssgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
1096 $ ldz, d, work, result( ntest ) )
1104 IF( lsame( uplo,
'U' ) )
THEN
1106 DO 380 i =
max( 1, j-ka ), j
1107 ab( ka+1+i-j, j ) = a( i, j )
1109 DO 390 i =
max( 1, j-kb ), j
1110 bb( kb+1+i-j, j ) = b( i, j )
1115 DO 410 i = j,
min( n, j+ka )
1116 ab( 1+i-j, j ) = a( i, j )
1118 DO 420 i = j,
min( n, j+kb )
1119 bb( 1+i-j, j ) = b( i, j )
1124 CALL ssbgvd(
'V', uplo, n, ka, kb, ab, lda, bb,
1125 $ ldb, d, z, ldz, work, nwork, iwork,
1127 IF( iinfo.NE.0 )
THEN
1128 WRITE( nounit, fmt = 9999 )
'SSBGVD(V,' //
1129 $ uplo //
')', iinfo, n, jtype, ioldsd
1131 IF( iinfo.LT.0 )
THEN
1134 result( ntest ) = ulpinv
1141 CALL ssgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
1142 $ ldz, d, work, result( ntest ) )
1150 IF( lsame( uplo,
'U' ) )
THEN
1152 DO 440 i =
max( 1, j-ka ), j
1153 ab( ka+1+i-j, j ) = a( i, j )
1155 DO 450 i =
max( 1, j-kb ), j
1156 bb( kb+1+i-j, j ) = b( i, j )
1161 DO 470 i = j,
min( n, j+ka )
1162 ab( 1+i-j, j ) = a( i, j )
1164 DO 480 i = j,
min( n, j+kb )
1165 bb( 1+i-j, j ) = b( i, j )
1170 CALL ssbgvx(
'V',
'A', uplo, n, ka, kb, ab, lda,
1171 $ bb, ldb, bp,
max( 1, n ), vl, vu, il,
1172 $ iu, abstol, m, d, z, ldz, work,
1173 $ iwork( n+1 ), iwork, iinfo )
1174 IF( iinfo.NE.0 )
THEN
1175 WRITE( nounit, fmt = 9999 )
'SSBGVX(V,A' //
1176 $ uplo //
')', iinfo, n, jtype, ioldsd
1178 IF( iinfo.LT.0 )
THEN
1181 result( ntest ) = ulpinv
1188 CALL ssgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
1189 $ ldz, d, work, result( ntest ) )
1196 IF( lsame( uplo,
'U' ) )
THEN
1198 DO 500 i =
max( 1, j-ka ), j
1199 ab( ka+1+i-j, j ) = a( i, j )
1201 DO 510 i =
max( 1, j-kb ), j
1202 bb( kb+1+i-j, j ) = b( i, j )
1207 DO 530 i = j,
min( n, j+ka )
1208 ab( 1+i-j, j ) = a( i, j )
1210 DO 540 i = j,
min( n, j+kb )
1211 bb( 1+i-j, j ) = b( i, j )
1218 CALL ssbgvx(
'V',
'V', uplo, n, ka, kb, ab, lda,
1219 $ bb, ldb, bp,
max( 1, n ), vl, vu, il,
1220 $ iu, abstol, m, d, z, ldz, work,
1221 $ iwork( n+1 ), iwork, iinfo )
1222 IF( iinfo.NE.0 )
THEN
1223 WRITE( nounit, fmt = 9999 )
'SSBGVX(V,V' //
1224 $ uplo //
')', iinfo, n, jtype, ioldsd
1226 IF( iinfo.LT.0 )
THEN
1229 result( ntest ) = ulpinv
1236 CALL ssgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
1237 $ ldz, d, work, result( ntest ) )
1243 IF( lsame( uplo,
'U' ) )
THEN
1245 DO 560 i =
max( 1, j-ka ), j
1246 ab( ka+1+i-j, j ) = a( i, j )
1248 DO 570 i =
max( 1, j-kb ), j
1249 bb( kb+1+i-j, j ) = b( i, j )
1254 DO 590 i = j,
min( n, j+ka )
1255 ab( 1+i-j, j ) = a( i, j )
1257 DO 600 i = j,
min( n, j+kb )
1258 bb( 1+i-j, j ) = b( i, j )
1263 CALL ssbgvx(
'V',
'I', uplo, n, ka, kb, ab, lda,
1264 $ bb, ldb, bp,
max( 1, n ), vl, vu, il,
1265 $ iu, abstol, m, d, z, ldz, work,
1266 $ iwork( n+1 ), iwork, iinfo )
1267 IF( iinfo.NE.0 )
THEN
1268 WRITE( nounit, fmt = 9999 )
'SSBGVX(V,I' //
1269 $ uplo //
')', iinfo, n, jtype, ioldsd
1271 IF( iinfo.LT.0 )
THEN
1274 result( ntest ) = ulpinv
1281 CALL ssgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
1282 $ ldz, d, work, result( ntest ) )
1291 ntestt = ntestt + ntest
1292 CALL slafts(
'SSG', n, n, jtype, ntest, result, ioldsd,
1293 $ thresh, nounit, nerrs )
1299 CALL slasum(
'SSG', nounit, nerrs, ntestt )
1305 9999
FORMAT( '
sdrvsg:
', A, ' returned info=
', I6, '.
', / 9X, 'n=
',
1306 $ I6, ', jtype=
', I6, ', iseed=(
', 3( I5, ',
' ), I5, ')
' )