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 = 10.0d+0 )
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, IBTYPE, 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
426 EXTERNAL LSAME, 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 ELSE IF( itype.EQ.2 )
THEN
588 CALL zlaset(
'Full', lda, n, czero, czero, a, lda )
590 a( jcol, jcol ) = anorm
593 ELSE IF( itype.EQ.4 )
THEN
599 CALL zlatms( 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 zlatms( 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 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 ELSE IF( itype.EQ.8 )
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 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 zlatms( n, n,
'S', iseed,
'H', rwork, imode, cond,
654 $ anorm, ka, ka,
'N', a, lda, work, iinfo )
661 IF( iinfo.NE.0 )
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 IF( iinfo.NE.0 )
THEN
719 WRITE( nounit, fmt = 9999 )
'ZHEGV(V,' // uplo //
720 $
')', iinfo, n, jtype, ioldsd
722 IF( iinfo.LT.0 )
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 )
743 $ bb, ldb, d2, work, nwork, rwork,
745 IF( iinfo.NE.0 )
THEN
746 WRITE( nounit, fmt = 9999 )
747 $
'ZHEGV_2STAGE(V,' // uplo //
748 $
')', iinfo, n, jtype, ioldsd
750 IF( iinfo.LT.0 )
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 IF( iinfo.NE.0 )
THEN
789 WRITE( nounit, fmt = 9999 )
'ZHEGVD(V,' // uplo //
790 $
')', iinfo, n, jtype, ioldsd
792 IF( iinfo.LT.0 )
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 IF( iinfo.NE.0 )
THEN
817 WRITE( nounit, fmt = 9999 )
'ZHEGVX(V,A' // uplo //
818 $
')', iinfo, n, jtype, ioldsd
820 IF( iinfo.LT.0 )
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 IF( iinfo.NE.0 )
THEN
850 WRITE( nounit, fmt = 9999 )
'ZHEGVX(V,V,' //
851 $ uplo //
')', iinfo, n, jtype, ioldsd
853 IF( iinfo.LT.0 )
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 IF( iinfo.NE.0 )
THEN
876 WRITE( nounit, fmt = 9999 )
'ZHEGVX(V,I,' //
877 $ uplo //
')', iinfo, n, jtype, ioldsd
879 IF( iinfo.LT.0 )
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 IF( iinfo.NE.0 )
THEN
923 WRITE( nounit, fmt = 9999 )
'ZHPGV(V,' // uplo //
924 $
')', iinfo, n, jtype, ioldsd
926 IF( iinfo.LT.0 )
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 IF( iinfo.NE.0 )
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,
1059 $ rwork, iwork( n+1 ), iwork, info )
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.LT.
IF( IINFO0 ) 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, ')
' )