372 SUBROUTINE cdrvsg2stg( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH,
373 $ NOUNIT, A, LDA, B, LDB, D, D2, Z, LDZ, AB,
374 $ BB, AP, BP, WORK, NWORK, RWORK, LRWORK,
375 $ IWORK, LIWORK, RESULT, INFO )
384 INTEGER INFO, LDA, LDB, LDZ, LIWORK, LRWORK, NOUNIT
390 INTEGER ISEED( 4 ), IWORK( * ), NN( * )
391 REAL D( * ), D2( * ), RESULT( * ), RWORK( * )
392 COMPLEX A( LDA, * ), AB( LDA, * ), AP( * ),
393 $ b( ldb, * ), bb( ldb, * ), bp( * ), work( * ),
401 PARAMETER ( ZERO = 0.0e+0, one = 1.0e+0, ten = 10.0e+0 )
403 parameter( czero = ( 0.0e+0, 0.0e+0 ),
404 $ cone = ( 1.0e+0, 0.0e+0 ) )
406 parameter( maxtyp = 21 )
411 INTEGER I, IBTYPE, IBUPLO, IINFO, IJ, IL, IMODE, ITEMP,
412 $ itype, iu, j, jcol, jsize, jtype, ka,
413 $ kb9, m, mtypes, n, nerrs, nmats, nmax, ntest,
415 REAL ABSTOL, ANINV, ANORM, COND, OVFL, RTOVFL,
416 $ RTUNFL, ULP, ULPINV, UNFL, VL, VU, TEMP1, TEMP2
419 INTEGER IDUMMA( 1 ), IOLDSD( 4 ), ISEED2( 4 ),
420 $ KMAGN( MAXTYP ), KMODE( MAXTYP ),
426 EXTERNAL LSAME, SLAMCH, SLARND
435 INTRINSIC abs, real,
max,
min, sqrt
438 DATA ktype / 1, 2, 5*4, 5*5, 3*8, 6*9 /
439 DATA kmagn / 2*1, 1, 1, 1, 2, 3, 1, 1, 1, 2, 3, 1,
441 DATA kmode / 2*0, 4, 3, 1, 4, 4, 4, 3, 1, 4, 4, 0,
454 nmax =
max( nmax, nn( j ) )
461 IF( nsizes.LT.0 )
THEN
463 ELSE IF( badnn )
THEN
465 ELSE IF( ntypes.LT.0 )
THEN
467 ELSE IF( lda.LE.1 .OR. lda.LT.nmax )
THEN
469 ELSE IF( ldz.LE.1 .OR. ldz.LT.nmax )
THEN
471 ELSE IF( 2*
max( nmax, 2 )**2.GT.nwork )
THEN
473 ELSE IF( 2*
max( nmax, 2 )**2.GT.lrwork )
THEN
475 ELSE IF( 2*
max( nmax, 2 )**2.GT.liwork )
THEN
480 CALL xerbla(
'CDRVSG2STG', -info )
486 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
491 unfl = slamch(
'Safe minimum' )
492 ovfl = slamch(
'Overflow' )
494 ulp = slamch(
'Epsilon' )*slamch(
'Base' )
496 rtunfl = sqrt( unfl )
497 rtovfl = sqrt( ovfl )
500 iseed2( i ) = iseed( i )
508 DO 650 jsize = 1, nsizes
510 aninv = one / real(
max( 1, n ) )
512 IF( nsizes.NE.1 )
THEN
513 mtypes =
min( maxtyp, ntypes )
515 mtypes =
min( maxtyp+1, ntypes )
520 DO 640 jtype = 1, mtypes
521 IF( .NOT.dotype( jtype ) )
527 ioldsd( j ) = iseed( j )
545 IF( mtypes.GT.maxtyp )
548 itype = ktype( jtype )
549 imode = kmode( jtype )
553 GO TO ( 40, 50, 60 )kmagn( jtype )
560 anorm = ( rtovfl*ulp )*aninv
564 anorm = rtunfl*n*ulpinv
574 IF( itype.EQ.1 )
THEN
580 CALL claset(
'Full', lda, n, czero, czero, a, lda )
582 ELSE IF( itype.EQ.2 )
THEN
588 CALL claset(
'Full', lda, n, czero, czero, a, lda )
590 a( jcol, jcol ) = anorm
593 ELSE IF( itype.EQ.4 )
THEN
599 CALL clatms( n, n,
'S', iseed,
'H', rwork, imode, cond,
600 $ anorm, 0, 0,
'N', a, lda, work, iinfo )
602 ELSE IF( itype.EQ.5 )
THEN
608 CALL clatms( n, n,
'S', iseed,
'H', rwork, imode, cond,
609 $ anorm, n, n,
'N', a, lda, work, iinfo )
611 ELSE IF( itype.EQ.7 )
THEN
617 CALL clatmr( n, n,
'S', iseed,
'H', work, 6, one, cone,
618 $
'T',
'N', work( n+1 ), 1, one,
619 $ work( 2*n+1 ), 1, one,
'N', idumma, 0, 0,
620 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
622 ELSE IF( itype.EQ.8 )
THEN
628 CALL clatmr( n, n,
'S', iseed,
'H', work, 6, one, cone,
629 $
'T',
'N', work( n+1 ), 1, one,
630 $ work( 2*n+1 ), 1, one,
'N', idumma, n, n,
631 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
633 ELSE IF( itype.EQ.9 )
THEN
647 IF( kb9.GT.ka9 )
THEN
651 ka =
max( 0,
min( n-1, ka9 ) )
652 kb =
max( 0,
min( n-1, kb9 ) )
653 CALL clatms( n, n, 's
', ISEED, 'h
', RWORK, IMODE, COND,
654 $ ANORM, KA, KA, 'n
', A, LDA, WORK, IINFO )
661.NE.
IF( IINFO0 ) THEN
662 WRITE( NOUNIT, FMT = 9999 )'generator
', IINFO, N, JTYPE,
675 IL = 1 + INT( ( N-1 )*SLARND( 1, ISEED2 ) )
676 IU = 1 + INT( ( N-1 )*SLARND( 1, ISEED2 ) )
705 CALL CLATMS( N, N, 'u
', ISEED, 'p
', RWORK, 5, TEN,
706 $ ONE, KB, KB, UPLO, B, LDB, WORK( N+1 ),
713 CALL CLACPY( ' ', N, N, A, LDA, Z, LDZ )
714 CALL CLACPY( UPLO, N, N, B, LDB, BB, LDB )
716 CALL CHEGV( IBTYPE, 'v
', UPLO, N, Z, LDZ, BB, LDB, D,
717 $ WORK, NWORK, RWORK, IINFO )
718.NE.
IF( IINFO0 ) THEN
719 WRITE( NOUNIT, FMT = 9999 )'chegv(v,
' // UPLO //
720 $ ')
', IINFO, N, JTYPE, IOLDSD
722.LT.
IF( IINFO0 ) THEN
725 RESULT( NTEST ) = ULPINV
732 CALL CSGT01( IBTYPE, UPLO, N, N, A, LDA, B, LDB, Z,
733 $ LDZ, D, WORK, RWORK, RESULT( NTEST ) )
739 CALL CLACPY( ' ', N, N, A, LDA, Z, LDZ )
740 CALL CLACPY( UPLO, N, N, B, LDB, BB, LDB )
742 CALL CHEGV_2STAGE( IBTYPE, 'n
', UPLO, N, Z, LDZ,
743 $ BB, LDB, D2, WORK, NWORK, RWORK,
745.NE.
IF( IINFO0 ) THEN
746 WRITE( NOUNIT, FMT = 9999 )
748 $ ')
', IINFO, N, JTYPE, IOLDSD
750.LT.
IF( IINFO0 ) THEN
753 RESULT( NTEST ) = ULPINV
770 TEMP1 = MAX( TEMP1, ABS( D( J ) ),
772 TEMP2 = MAX( TEMP2, ABS( D( J )-D2( J ) ) )
775 RESULT( NTEST ) = TEMP2 /
776 $ MAX( UNFL, ULP*MAX( TEMP1, TEMP2 ) )
782 CALL CLACPY( ' ', N, N, A, LDA, Z, LDZ )
783 CALL CLACPY( UPLO, N, N, B, LDB, BB, LDB )
785 CALL CHEGVD( IBTYPE, 'v
', UPLO, N, Z, LDZ, BB, LDB, D,
786 $ WORK, NWORK, RWORK, LRWORK, IWORK,
788.NE.
IF( IINFO0 ) THEN
789 WRITE( NOUNIT, FMT = 9999 )'chegvd(v,
' // UPLO //
790 $ ')
', IINFO, N, JTYPE, IOLDSD
792.LT.
IF( IINFO0 ) THEN
795 RESULT( NTEST ) = ULPINV
802 CALL CSGT01( IBTYPE, UPLO, N, N, A, LDA, B, LDB, Z,
803 $ LDZ, D, WORK, RWORK, RESULT( NTEST ) )
809 CALL CLACPY( '', N, N, A, LDA, AB, LDA )
810 CALL CLACPY( UPLO, N, N, B, LDB, BB, LDB )
812 CALL CHEGVX( IBTYPE, 'v
', 'a
', UPLO, N, AB, LDA, BB,
813 $ LDB, VL, VU, IL, IU, ABSTOL, M, D, Z,
814 $ LDZ, WORK, NWORK, RWORK, IWORK( N+1 ),
816.NE.
IF( IINFO0 ) THEN
817 WRITE( NOUNIT, FMT = 9999 )'chegvx(v,a
' // UPLO //
818 $ ')
', IINFO, N, JTYPE, IOLDSD
820.LT.
IF( IINFO0 ) THEN
823 RESULT( NTEST ) = ULPINV
830 CALL CSGT01( IBTYPE, UPLO, N, N, A, LDA, B, LDB, Z,
831 $ LDZ, D, WORK, RWORK, RESULT( NTEST ) )
835 CALL CLACPY( ' ', N, N, A, LDA, AB, LDA )
836 CALL CLACPY( UPLO, N, N, B, LDB, BB, LDB )
845 CALL CHEGVX( IBTYPE, 'v
', 'v
', UPLO, N, AB, LDA, BB,
846 $ LDB, VL, VU, IL, IU, ABSTOL, M, D, Z,
847 $ LDZ, WORK, NWORK, RWORK, IWORK( N+1 ),
849.NE.
IF( IINFO0 ) THEN
850 WRITE( NOUNIT, FMT = 9999 )'chegvx(v,v,
' //
851 $ UPLO // ')
', IINFO, N, JTYPE, IOLDSD
853.LT.
IF( IINFO0 ) THEN
856 RESULT( NTEST ) = ULPINV
863 CALL CSGT01( IBTYPE, UPLO, N, M, A, LDA, B, LDB, Z,
864 $ LDZ, D, WORK, RWORK, RESULT( NTEST ) )
868 CALL CLACPY( ' ', N, N, A, LDA, AB, LDA )
869 CALL CLACPY( UPLO, N, N, B, LDB, BB, LDB )
871 CALL CHEGVX( IBTYPE, 'v
', 'i
', UPLO, N, AB, LDA, BB,
872 $ LDB, VL, VU, IL, IU, ABSTOL, M, D, Z,
873 $ LDZ, WORK, NWORK, RWORK, IWORK( N+1 ),
875.NE.
IF( IINFO0 ) THEN
876 WRITE( NOUNIT, FMT = 9999 )'chegvx(v,i,
' //
877 $ UPLO // ')
', IINFO, N, JTYPE, IOLDSD
879.LT.
IF( IINFO0 ) THEN
882 RESULT( NTEST ) = ULPINV
889 CALL CSGT01( IBTYPE, UPLO, N, M, A, LDA, B, LDB, Z,
890 $ LDZ, D, WORK, RWORK, RESULT( NTEST ) )
900 IF( LSAME( UPLO, 'u
' ) ) THEN
920 CALL CHPGV( IBTYPE, 'v
', UPLO, N, AP, BP, D, Z, LDZ,
921 $ WORK, RWORK, IINFO )
922.NE.
IF( IINFO0 ) THEN
923 WRITE( NOUNIT, FMT = 9999 )'chpgv(v,
' // UPLO //
924 $ ')
', IINFO, N, JTYPE, IOLDSD
926.LT.
IF( IINFO0 ) THEN
929 RESULT( NTEST ) = ULPINV
936 CALL CSGT01( IBTYPE, UPLO, N, N, A, LDA, B, LDB, Z,
937 $ LDZ, D, WORK, RWORK, RESULT( NTEST ) )
945 IF( LSAME( UPLO, 'u
' ) ) THEN
965 CALL CHPGVD( IBTYPE, 'v
', UPLO, N, AP, BP, D, Z, LDZ,
966 $ WORK, NWORK, RWORK, LRWORK, IWORK,
968.NE.
IF( IINFO0 ) THEN
969 WRITE( NOUNIT, FMT = 9999 )'chpgvd(v,
' // UPLO //
970 $ ')', iinfo, n, jtype, ioldsd
972 IF( iinfo.LT.0 )
THEN
975 result( ntest ) = ulpinv
982 CALL csgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
983 $ ldz, d, work, rwork, result( ntest ) )
991 IF( lsame( uplo,
'U' ) )
THEN
1004 ap( ij ) = a( i, j )
1005 bp( ij ) = b( i, j )
1011 CALL chpgvx( ibtype,
'V',
'A', uplo, n, ap, bp, vl,
1012 $ vu, il, iu, abstol, m, d, z, ldz, work,
1013 $ rwork, iwork( n+1 ), iwork, info )
1014 IF( iinfo.NE.0 )
THEN
1015 WRITE( nounit, fmt = 9999 )
'CHPGVX(V,A' // uplo //
1016 $
')', iinfo, n, jtype, ioldsd
1018 IF( iinfo.LT.0 )
THEN
1021 result( ntest ) = ulpinv
1028 CALL csgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
1029 $ ldz, d, work, rwork, result( ntest ) )
1035 IF( lsame( uplo,
'U' ) )
THEN
1039 ap( ij ) = a( i, j )
1040 bp( ij ) = b( i, j )
1048 ap( ij ) = a( i, j )
1049 bp( ij ) = b( i, j )
1057 CALL chpgvx( ibtype,
'V',
'V', uplo, n, ap, bp, vl,
1058 $ vu, il, iu, abstol, m, d, z, ldz, work,
1059 $ rwork, iwork( n+1 ), iwork, info )
1060 IF( iinfo.NE.0 )
THEN
1061 WRITE( nounit, fmt = 9999 )
'CHPGVX(V,V' // uplo //
1062 $
')', iinfo, n, jtype, ioldsd
1064 IF( iinfo.LT.0 )
THEN
1067 result( ntest ) = ulpinv
1074 CALL csgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
1075 $ ldz, d, work, rwork, result( ntest ) )
1081 IF( lsame( uplo,
'U' ) )
THEN
1085 ap( ij ) = a( i, j )
1086 bp( ij ) = b( i, j )
1094 ap( ij ) = a( i, j )
1095 bp( ij ) = b( i, j )
1101 CALL chpgvx( ibtype,
'V',
'I', uplo, n, ap, bp, vl,
1102 $ vu, il, iu, abstol, m, d, z, ldz, work,
1103 $ rwork, iwork( n+1 ), iwork, info )
1104 IF( iinfo.NE.0 )
THEN
1105 WRITE( nounit, fmt = 9999 )
'CHPGVX(V,I' // uplo //
1106 $
')', iinfo, n, jtype, ioldsd
1108 IF( iinfo.LT.0 )
THEN
1111 result( ntest ) = ulpinv
1118 CALL csgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
1119 $ ldz, d, work, rwork, result( ntest ) )
1123 IF( ibtype.EQ.1 )
THEN
1131 IF( lsame( uplo,
'U' ) )
THEN
1133 DO 320 i =
max( 1, j-ka ), j
1134 ab( ka+1+i-j, j ) = a( i, j )
1136 DO 330 i =
max( 1, j-kb ), j
1137 bb( kb+1+i-j, j ) = b( i, j )
1142 DO 350 i = j,
min( n, j+ka )
1143 ab( 1+i-j, j ) = a( i, j )
1145 DO 360 i = j,
min( n, j+kb )
1146 bb( 1+i-j, j ) = b( i, j )
1151 CALL chbgv(
'V', uplo, n, ka, kb, ab, lda, bb, ldb,
1152 $ d, z, ldz, work, rwork, iinfo )
1153 IF( iinfo.NE.0 )
THEN
1154 WRITE( nounit, fmt = 9999 )
'CHBGV(V,' //
1155 $ uplo //
')', iinfo, n, jtype, ioldsd
1157 IF( iinfo.LT.0 )
THEN
1160 result( ntest ) = ulpinv
1167 CALL csgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
1168 $ ldz, d, work, rwork, result( ntest ) )
1176 IF( lsame( uplo,
'U' ) )
THEN
1178 DO 380 i =
max( 1, j-ka ), j
1179 ab( ka+1+i-j, j ) = a( i, j )
1181 DO 390 i =
max( 1, j-kb ), j
1182 bb( kb+1+i-j, j ) = b( i, j )
1187 DO 410 i = j,
min( n, j+ka )
1188 ab( 1+i-j, j ) = a( i, j )
1190 DO 420 i = j,
min( n, j+kb )
1191 bb( 1+i-j, j ) = b( i, j )
1196 CALL chbgvd(
'V', uplo, n, ka, kb, ab, lda, bb,
1197 $ ldb, d, z, ldz, work, nwork, rwork,
1198 $ lrwork, iwork, liwork, iinfo )
1199 IF( iinfo.NE.0 )
THEN
1200 WRITE( nounit, fmt = 9999 )
'CHBGVD(V,' //
1201 $ uplo //
')', iinfo, n, jtype, ioldsd
1203 IF( iinfo.LT.0 )
THEN
1206 result( ntest ) = ulpinv
1213 CALL csgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
1214 $ ldz, d, work, rwork, result( ntest ) )
1222 IF( lsame( uplo,
'U' ) )
THEN
1224 DO 440 i =
max( 1, j-ka ), j
1225 ab( ka+1+i-j, j ) = a( i, j )
1227 DO 450 i =
max( 1, j-kb ), j
1228 bb( kb+1+i-j, j ) = b( i, j )
1233 DO 470 i = j,
min( n, j+ka )
1234 ab( 1+i-j, j ) = a( i, j )
1236 DO 480 i = j,
min( n, j+kb )
1237 bb( 1+i-j, j ) = b( i, j )
1242 CALL chbgvx(
'V',
'A', uplo, n, ka, kb, ab, lda,
1243 $ bb, ldb, bp,
max( 1, n ), vl, vu, il,
1244 $ iu, abstol, m, d, z, ldz, work, rwork,
1245 $ iwork( n+1 ), iwork, iinfo )
1246 IF( iinfo.NE.0 )
THEN
1247 WRITE( nounit, fmt = 9999 )'
chbgvx(v,a
' //
1248 $ UPLO // ')
', IINFO, N, JTYPE, IOLDSD
1250.LT.
IF( IINFO0 ) THEN
1253 RESULT( NTEST ) = ULPINV
1260 CALL CSGT01( IBTYPE, UPLO, N, N, A, LDA, B, LDB, Z,
1261 $ LDZ, D, WORK, RWORK, RESULT( NTEST ) )
1267 IF( LSAME( UPLO, 'u
' ) ) THEN
1269 DO 500 I = MAX( 1, J-KA ), J
1270 AB( KA+1+I-J, J ) = A( I, J )
1272 DO 510 I = MAX( 1, J-KB ), J
1273 BB( KB+1+I-J, J ) = B( I, J )
1278 DO 530 I = J, MIN( N, J+KA )
1279 AB( 1+I-J, J ) = A( I, J )
1281 DO 540 I = J, MIN( N, J+KB )
1282 BB( 1+I-J, J ) = B( I, J )
1289 CALL CHBGVX( 'v
', 'v
', UPLO, N, KA, KB, AB, LDA,
1290 $ BB, LDB, BP, MAX( 1, N ), VL, VU, IL,
1291 $ IU, ABSTOL, M, D, Z, LDZ, WORK, RWORK,
1292 $ IWORK( N+1 ), IWORK, IINFO )
1293.NE.
IF( IINFO0 ) THEN
1294 WRITE( NOUNIT, FMT = 9999 )'chbgvx(v,v
' //
1295 $ UPLO // ')
', IINFO, N, JTYPE, IOLDSD
1297.LT.
IF( IINFO0 ) THEN
1300 RESULT( NTEST ) = ULPINV
1307 CALL CSGT01( IBTYPE, UPLO, N, M, A, LDA, B, LDB, Z,
1308 $ LDZ, D, WORK, RWORK, RESULT( NTEST ) )
1314 IF( LSAME( UPLO, 'u
' ) ) THEN
1316 DO 560 I = MAX( 1, J-KA ), J
1317 AB( KA+1+I-J, J ) = A( I, J )
1319 DO 570 I = MAX( 1, J-KB ), J
1320 BB( KB+1+I-J, J ) = B( I, J )
1325 DO 590 I = J, MIN( N, J+KA )
1326 AB( 1+I-J, J ) = A( I, J )
1328 DO 600 I = J, MIN( N, J+KB )
1329 BB( 1+I-J, J ) = B( I, J )
1334 CALL CHBGVX( 'v
', 'i
', UPLO, N, KA, KB, AB, LDA,
1335 $ BB, LDB, BP, MAX( 1, N ), VL, VU, IL,
1336 $ IU, ABSTOL, M, D, Z, LDZ, WORK, RWORK,
1337 $ IWORK( N+1 ), IWORK, IINFO )
1338.NE.
IF( IINFO0 ) THEN
1339 WRITE( NOUNIT, FMT = 9999 )'chbgvx(v,i
' //
1340 $ UPLO // ')
', IINFO, N, JTYPE, IOLDSD
1342.LT.
IF( IINFO0 ) THEN
1345 RESULT( NTEST ) = ULPINV
1352 CALL CSGT01( IBTYPE, UPLO, N, M, A, LDA, B, LDB, Z,
1353 $ LDZ, D, WORK, RWORK, RESULT( NTEST ) )
1362 NTESTT = NTESTT + NTEST
1363 CALL SLAFTS( 'csg
', N, N, JTYPE, NTEST, RESULT, IOLDSD,
1364 $ THRESH, NOUNIT, NERRS )
1370 CALL SLASUM( 'csg
', NOUNIT, NERRS, NTESTT )
1374 9999 FORMAT( ' cdrvsg2stg:
', A, ' returned info=
', I6, '.
', / 9X,
1375 $ 'n=
', I6, ', jtype=
', I6, ', iseed=(
', 3( I5, ',
' ), I5, ')
' )