372 SUBROUTINE zdrvsg2stg( 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,
385 $ NSIZES, NTYPES, NWORK
386 DOUBLE PRECISION THRESH
390 INTEGER ISEED( 4 ), IWORK( * ), NN( * )
391 DOUBLE PRECISION D( * ), D2( * ), RESULT( * ), RWORK( * )
392 COMPLEX*16 A( LDA, * ), AB( LDA, * ), AP( * ),
393 $ b( ldb, * ), bb( ldb, * ), bp( * ), work( * ),
400 DOUBLE PRECISION ZERO, ONE, TEN
401 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0, ten
402 COMPLEX*16 CZERO, CONE
403 parameter( czero = ( 0.0d+0, 0.0d+0 ),
404 $ cone = ( 1.0d+0, 0.0d+0 ) )
406 parameter( maxtyp = 21 )
411 INTEGER I, , IBUPLO, IINFO, IJ, IL, IMODE, ITEMP,
412 $ itype, iu, j, jcol, jsize, jtype, ka, ka9, kb,
413 $ kb9, m, mtypes, n, nerrs, nmats, nmax, ntest,
415 DOUBLE PRECISION 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 ),
425 DOUBLE PRECISION DLAMCH, DLARND
435 INTRINSIC abs, dble,
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(
'ZDRVSG2STG', -info )
486 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
491 unfl = dlamch(
'Safe minimum' )
492 ovfl = dlamch(
'Overflow' )
494 ulp = dlamch(
'Epsilon' )*dlamch(
'Base' )
496 rtunfl = sqrt( unfl )
497 rtovfl = sqrt( ovfl )
500 iseed2( i ) = iseed( i )
508 DO 650 jsize = 1, nsizes
510 aninv = one / dble(
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 zlaset( 'full
', LDA, N, CZERO, CZERO, A, LDA )
582.EQ.
ELSE IF( ITYPE2 ) THEN
588 CALL ZLASET( 'full
', LDA, N, CZERO, CZERO, A, LDA )
590 A( JCOL, JCOL ) = ANORM
593.EQ.
ELSE IF( ITYPE4 ) THEN
599 CALL ZLATMS( N, N, 's
', ISEED, 'h
', RWORK, IMODE, COND,
600 $ ANORM, 0, 0, 'n
', A, LDA, WORK, IINFO )
602.EQ.
ELSE IF( ITYPE5 ) THEN
608 CALL ZLATMS( N, N, 's
', ISEED, 'h
', RWORK, IMODE, COND,
609 $ ANORM, N, N, 'n
', A, LDA, WORK, IINFO )
611.EQ.
ELSE IF( ITYPE7 ) THEN
617 CALL ZLATMR( 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.EQ.
ELSE IF( ITYPE8 ) THEN
628 CALL ZLATMR( 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.EQ.
ELSE IF( ITYPE9 ) THEN
647.GT.
IF( KB9KA9 ) THEN
651 KA = MAX( 0, MIN( N-1, KA9 ) )
652 KB = MAX( 0, MIN( N-1, KB9 ) )
653 CALL ZLATMS( 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 )*DLARND( 1, ISEED2 ) )
676 IU = 1 + INT( ( N-1 )*DLARND( 1, ISEED2 ) )
705 CALL ZLATMS( N, N, 'u
', ISEED, 'p
', RWORK, 5, TEN,
706 $ ONE, KB, KB, UPLO, B, LDB, WORK( N+1 ),
713 CALL ZLACPY( ' ', N, N, A, LDA, Z, LDZ )
714 CALL ZLACPY( UPLO, N, N, B, LDB, BB, LDB )
716 CALL ZHEGV( IBTYPE, 'v
', UPLO, N, Z, LDZ, BB, LDB, D,
717 $ WORK, NWORK, RWORK, IINFO )
718.NE.
IF( IINFO0 ) THEN
719 WRITE( NOUNIT, FMT = 9999 )'zhegv(v,
' // UPLO //
720 $ ')
', IINFO, N, JTYPE, IOLDSD
722.LT.
IF( IINFO0 ) THEN
725 RESULT( NTEST ) = ULPINV
732 CALL ZSGT01( IBTYPE, UPLO, N, N, A, LDA, B, LDB, Z,
733 $ LDZ, D, WORK, RWORK, RESULT( NTEST ) )
739 CALL ZLACPY( ' ', N, N, A, LDA, Z, LDZ )
740 CALL ZLACPY( UPLO, N, N, B, LDB, BB, LDB )
742 CALL ZHEGV_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 ZLACPY( ' ', N, N, A, LDA, Z, LDZ )
783 CALL ZLACPY( UPLO, N, N, B, LDB, BB, LDB )
785 CALL ZHEGVD( 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 )'zhegvd(v,
' // UPLO //
790 $ ')
', IINFO, N, JTYPE, IOLDSD
792.LT.
IF( IINFO0 ) THEN
795 RESULT( NTEST ) = ULPINV
802 CALL ZSGT01( IBTYPE, UPLO, N, N, A, LDA, B, LDB, Z,
803 $ LDZ, D, WORK, RWORK, RESULT( NTEST ) )
809 CALL ZLACPY( ' ', N, N, A, LDA, AB, LDA )
810 CALL ZLACPY( UPLO, N, N, B, LDB, BB, LDB )
812 CALL ZHEGVX( 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 )'zhegvx(v,a
' // UPLO //
818 $ ')
', IINFO, N, JTYPE, IOLDSD
820.LT.
IF( IINFO0 ) THEN
823 RESULT( NTEST ) = ULPINV
830 CALL ZSGT01( IBTYPE, UPLO, N, N, A, LDA, B, LDB, Z,
831 $ LDZ, D, WORK, RWORK, RESULT( NTEST ) )
835 CALL ZLACPY( ' ', N, N, A, LDA, AB, LDA )
836 CALL ZLACPY( UPLO, N, N, B, LDB, BB, LDB )
845 CALL ZHEGVX( 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 )'zhegvx(v,v,
' //
851 $ UPLO // ')
', IINFO, N, JTYPE, IOLDSD
853.LT.
IF( IINFO0 ) THEN
856 RESULT( NTEST ) = ULPINV
863 CALL ZSGT01( IBTYPE, UPLO, N, M, A, LDA, B, LDB, Z,
864 $ LDZ, D, WORK, RWORK, RESULT( NTEST ) )
868 CALL ZLACPY( ' ', N, N, A, LDA, AB, LDA )
869 CALL ZLACPY( UPLO, N, N, B, LDB, BB, LDB )
871 CALL ZHEGVX( 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 )'zhegvx(v,i,
' //
877 $ UPLO // ')
', IINFO, N, JTYPE, IOLDSD
879.LT.
IF( IINFO0 ) THEN
882 RESULT( NTEST ) = ULPINV
889 CALL ZSGT01( IBTYPE, UPLO, N, M, A, LDA, B, LDB, Z,
890 $ LDZ, D, WORK, RWORK, RESULT( NTEST ) )
900 IF( LSAME( UPLO, 'u
' ) ) THEN
920 CALL ZHPGV( IBTYPE, 'v
', UPLO, N, AP, BP, D, Z, LDZ,
921 $ WORK, RWORK, IINFO )
922.NE.
IF( IINFO0 ) THEN
923 WRITE( NOUNIT, FMT = 9999 )'zhpgv(v,
' // UPLO //
924 $ ')
', IINFO, N, JTYPE, IOLDSD
926.LT.
IF( IINFO0 ) THEN
929 RESULT( NTEST ) = ULPINV
936 CALL ZSGT01( IBTYPE, UPLO, N, N, A, LDA, B, LDB, Z,
937 $ LDZ, D, WORK, RWORK, RESULT( NTEST ) )
945 IF( LSAME( UPLO, 'u
' ) ) THEN
965 CALL ZHPGVD( 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 )'zhpgvd(v,
' // UPLO //
970 $ ')', iinfo, n, jtype, ioldsd
972 IF( iinfo.LT.0 )
THEN
975 result( ntest ) = ulpinv
982 CALL zsgt01( 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 zhpgvx( 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 )
'ZHPGVX(V,A' // uplo //
1016 $
')', iinfo, n, jtype, ioldsd
1018 IF( iinfo.LT.0 )
THEN
1021 result( ntest ) = ulpinv
1028 CALL zsgt01( 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 zhpgvx( ibtype,
'V',
'V', uplo, n, ap, bp, vl,
1058 $ vu, il, iu, abstol, m, d, z, ldz, work,
1060 IF( iinfo.NE.0 )
THEN
1061 WRITE( nounit, fmt = 9999 )
'ZHPGVX(V,V' // uplo //
1062 $
')', iinfo, n, jtype, ioldsd
1064 IF( iinfo.LT.0 )
THEN
1067 result( ntest ) = ulpinv
1074 CALL zsgt01( 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 zhpgvx( 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 )
'ZHPGVX(V,I' // uplo //
1106 $
')', iinfo, n, jtype, ioldsd
1108 IF( iinfo.LT.0 )
THEN
1111 result( ntest ) = ulpinv
1118 CALL zsgt01( 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 zhbgv(
'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 )
'ZHBGV(V,' //
1155 $ uplo //
')', iinfo, n, jtype, ioldsd
1157 IF( iinfo.LT.0 )
THEN
1160 result( ntest ) = ulpinv
1167 CALL zsgt01( 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 zhbgvd(
'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 )
'ZHBGVD(V,' //
1201 $ uplo //
')', iinfo, n, jtype, ioldsd
1203 IF( iinfo.LT.0 )
THEN
1206 result( ntest ) = ulpinv
1213 CALL zsgt01( 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 zhbgvx(
'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 )
'ZHBGVX(V,A' //
1248 $ uplo //
')', iinfo, n, jtype, ioldsd
1250 IF( iinfo.LT.0 )
THEN
1253 result( ntest ) = ulpinv
1260 CALL zsgt01( 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 zhbgvx(
'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 IF( iinfo.NE.0 )
THEN
1294 WRITE( nounit, fmt = 9999 )
'ZHBGVX(V,V' //
1295 $ uplo //
')', iinfo, n, jtype, ioldsd
1297 IF( iinfo.LT.0 )
THEN
1300 result( ntest ) = ulpinv
1307 CALL zsgt01( 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 zhbgvx(
'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 IF( iinfo.NE.0 )
THEN
1339 WRITE( nounit, fmt = 9999 )
'ZHBGVX(V,I' //
1340 $ uplo //
')', iinfo, n, jtype, ioldsd
1342 IF( iinfo.LT.0 )
THEN
1345 result( ntest ) = ulpinv
1352 CALL zsgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
1353 $ ldz, d, work, rwork, result( ntest ) )
1362 ntestt = ntestt + ntest
1363 CALL dlafts(
'ZSG', n, n, jtype, ntest, result, ioldsd,
1364 $ thresh, nounit, nerrs )
1370 CALL dlasum(
'ZSG', nounit, nerrs, ntestt )
1374 9999
FORMAT(
' ZDRVSG2STG: ', a,
' returned INFO=', i6,
'.', / 9x,
1375 $
'N=', i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ), i5,
')' )