366 SUBROUTINE zdrvsg( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH,
367 $ NOUNIT, A, LDA, B, LDB, D, Z, LDZ, AB, BB, AP,
368 $ BP, WORK, NWORK, RWORK, LRWORK, IWORK, LIWORK,
376 INTEGER INFO, LDA, LDB, LDZ, LIWORK, LRWORK, NOUNIT,
377 $ NSIZES, NTYPES, NWORK
378 DOUBLE PRECISION THRESH
382 INTEGER ISEED( 4 ), IWORK( * ), NN( * )
383 DOUBLE PRECISION D( * ), RESULT( * ), RWORK( * )
384 COMPLEX*16 A( LDA, * ), AB( LDA, * ), AP( * ),
385 $ b( ldb, * ), bb( ldb, * ), bp( * ), work( * ),
392 DOUBLE PRECISION ZERO, ONE, TEN
393 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0, ten = 10.0d+0 )
394 COMPLEX*16 CZERO, CONE
395 parameter( czero = ( 0.0d+0, 0.0d+0 ),
396 $ cone = ( 1.0d+0, 0.0d+0 ) )
398 parameter( maxtyp = 21 )
403 INTEGER I, IBTYPE, IBUPLO, IINFO, IJ, IL, IMODE, ITEMP,
404 $ itype, iu, j, jcol, jsize, jtype, ka, ka9, kb,
405 $ kb9, m, mtypes, n, nerrs, nmats, nmax, ntest,
407 DOUBLE PRECISION ABSTOL, ANINV, ANORM, COND, OVFL, RTOVFL,
408 $ RTUNFL, ULP, ULPINV, UNFL, VL, VU
411 INTEGER IDUMMA( 1 ), IOLDSD( 4 ), ISEED2( 4 ),
412 $ KMAGN( MAXTYP ), KMODE( MAXTYP ),
417 DOUBLE PRECISION DLAMCH, DLARND
418 EXTERNAL LSAME, DLAMCH, DLARND
426 INTRINSIC abs, dble, max, min, sqrt
429 DATA ktype / 1, 2, 5*4, 5*5, 3*8, 6*9 /
430 DATA kmagn / 2*1, 1, 1, 1, 2, 3, 1, 1, 1, 2, 3, 1,
432 DATA kmode / 2*0, 4, 3, 1, 4, 4, 4, 3, 1, 4, 4, 0,
445 nmax = max( nmax, nn( j ) )
452 IF( nsizes.LT.0 )
THEN
454 ELSE IF( badnn )
THEN
456 ELSE IF( ntypes.LT.0 )
THEN
458 ELSE IF( lda.LE.1 .OR. lda.LT.nmax )
THEN
460 ELSE IF( ldz.LE.1 .OR. ldz.LT.nmax )
THEN
462 ELSE IF( 2*max( nmax, 2 )**2.GT.nwork )
THEN
464 ELSE IF( 2*max( nmax, 2 )**2.GT.lrwork )
THEN
466 ELSE IF( 2*max( nmax, 2 )**2.GT.liwork )
THEN
471 CALL xerbla(
'ZDRVSG', -info )
477 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
482 unfl = dlamch(
'Safe minimum' )
483 ovfl = dlamch(
'Overflow' )
485 ulp = dlamch(
'Epsilon' )*dlamch(
'Base' )
487 rtunfl = sqrt( unfl )
488 rtovfl = sqrt( ovfl )
491 iseed2( i ) = iseed( i )
499 DO 650 jsize = 1, nsizes
501 aninv = one / dble( max( 1, n ) )
503 IF( nsizes.NE.1 )
THEN
504 mtypes = min( maxtyp, ntypes )
506 mtypes = min( maxtyp+1, ntypes )
511 DO 640 jtype = 1, mtypes
512 IF( .NOT.dotype( jtype ) )
518 ioldsd( j ) = iseed( j )
536 IF( mtypes.GT.maxtyp )
539 itype = ktype( jtype )
540 imode = kmode( jtype )
544 GO TO ( 40, 50, 60 )kmagn( jtype )
551 anorm = ( rtovfl*ulp )*aninv
555 anorm = rtunfl*n*ulpinv
565 IF( itype.EQ.1 )
THEN
571 CALL zlaset(
'Full', lda, n, czero, czero, a, lda )
573 ELSE IF( itype.EQ.2 )
THEN
579 CALL zlaset(
'Full', lda, n, czero, czero, a, lda )
581 a( jcol, jcol ) = anorm
584 ELSE IF( itype.EQ.4 )
THEN
590 CALL zlatms( n, n,
'S', iseed,
'H', rwork, imode, cond,
591 $ anorm, 0, 0,
'N', a, lda, work, iinfo )
593 ELSE IF( itype.EQ.5 )
THEN
599 CALL zlatms( n, n,
'S', iseed,
'H', rwork, imode, cond,
600 $ anorm, n, n,
'N', a, lda, work, iinfo )
602 ELSE IF( itype.EQ.7 )
THEN
608 CALL zlatmr( n, n,
'S', iseed,
'H', work, 6, one, cone,
609 $
'T',
'N', work( n+1 ), 1, one,
610 $ work( 2*n+1 ), 1, one,
'N', idumma, 0, 0,
611 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
613 ELSE IF( itype.EQ.8 )
THEN
619 CALL zlatmr( n, n,
'S', iseed,
'H', work, 6, one, cone,
620 $
'T',
'N', work( n+1 ), 1, one,
621 $ work( 2*n+1 ), 1, one,
'N', idumma, n, n,
622 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
624 ELSE IF( itype.EQ.9 )
THEN
638 IF( kb9.GT.ka9 )
THEN
642 ka = max( 0, min( n-1, ka9 ) )
643 kb = max( 0, min( n-1, kb9 ) )
644 CALL zlatms( n, n,
'S', iseed,
'H', rwork, imode, cond,
645 $ anorm, ka, ka,
'N', a, lda, work, iinfo )
652 IF( iinfo.NE.0 )
THEN
653 WRITE( nounit, fmt = 9999 )
'Generator', iinfo, n, jtype,
666 il = 1 + ( n-1 )*dlarnd( 1, iseed2 )
667 iu = 1 + ( n-1 )*dlarnd( 1, iseed2 )
696 CALL zlatms( n, n,
'U', iseed,
'P', rwork, 5, ten,
697 $ one, kb, kb, uplo, b, ldb, work( n+1 ),
704 CALL zlacpy(
' ', n, n, a, lda, z, ldz )
705 CALL zlacpy( uplo, n, n, b, ldb, bb, ldb )
707 CALL zhegv( ibtype,
'V', uplo, n, z, ldz, bb, ldb, d,
708 $ work, nwork, rwork, iinfo )
709 IF( iinfo.NE.0 )
THEN
710 WRITE( nounit, fmt = 9999 )
'ZHEGV(V,' // uplo //
711 $
')', iinfo, n, jtype, ioldsd
713 IF( iinfo.LT.0 )
THEN
716 result( ntest ) = ulpinv
723 CALL zsgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
724 $ ldz, d, work, rwork, result( ntest ) )
730 CALL zlacpy(
' ', n, n, a, lda, z, ldz )
731 CALL zlacpy( uplo, n, n, b, ldb, bb, ldb )
733 CALL zhegvd( ibtype,
'V', uplo, n, z, ldz, bb, ldb, d,
734 $ work, nwork, rwork, lrwork, iwork,
736 IF( iinfo.NE.0 )
THEN
737 WRITE( nounit, fmt = 9999 )
'ZHEGVD(V,' // uplo //
738 $
')', iinfo, n, jtype, ioldsd
740 IF( iinfo.LT.0 )
THEN
743 result( ntest ) = ulpinv
750 CALL zsgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
751 $ ldz, d, work, rwork, result( ntest ) )
757 CALL zlacpy(
' ', n, n, a, lda, ab, lda )
758 CALL zlacpy( uplo, n, n, b, ldb, bb, ldb )
760 CALL zhegvx( ibtype,
'V',
'A', uplo, n, ab, lda, bb,
761 $ ldb, vl, vu, il, iu, abstol, m, d, z,
762 $ ldz, work, nwork, rwork, iwork( n+1 ),
764 IF( iinfo.NE.0 )
THEN
765 WRITE( nounit, fmt = 9999 )
'ZHEGVX(V,A' // uplo //
766 $
')', iinfo, n, jtype, ioldsd
768 IF( iinfo.LT.0 )
THEN
771 result( ntest ) = ulpinv
778 CALL zsgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
779 $ ldz, d, work, rwork, result( ntest ) )
783 CALL zlacpy(
' ', n, n, a, lda, ab, lda )
784 CALL zlacpy( uplo, n, n, b, ldb, bb, ldb )
793 CALL zhegvx( ibtype,
'V',
'V', uplo, n, ab, lda, bb,
794 $ ldb, vl, vu, il, iu, abstol, m, d, z,
795 $ ldz, work, nwork, rwork, iwork( n+1 ),
797 IF( iinfo.NE.0 )
THEN
798 WRITE( nounit, fmt = 9999 )
'ZHEGVX(V,V,' //
799 $ uplo //
')', iinfo, n, jtype, ioldsd
801 IF( iinfo.LT.0 )
THEN
804 result( ntest ) = ulpinv
811 CALL zsgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
812 $ ldz, d, work, rwork, result( ntest ) )
816 CALL zlacpy(
' ', n, n, a, lda, ab, lda )
817 CALL zlacpy( uplo, n, n, b, ldb, bb, ldb )
819 CALL zhegvx( ibtype,
'V',
'I', uplo, n, ab, lda, bb,
820 $ ldb, vl, vu, il, iu, abstol, m, d, z,
821 $ ldz, work, nwork, rwork, iwork( n+1 ),
823 IF( iinfo.NE.0 )
THEN
824 WRITE( nounit, fmt = 9999 )
'ZHEGVX(V,I,' //
825 $ uplo //
')', iinfo, n, jtype, ioldsd
827 IF( iinfo.LT.0 )
THEN
830 result( ntest ) = ulpinv
837 CALL zsgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
838 $ ldz, d, work, rwork, result( ntest ) )
848 IF( lsame( uplo,
'U' ) )
THEN
868 CALL zhpgv( ibtype,
'V', uplo, n, ap, bp, d, z, ldz,
869 $ work, rwork, iinfo )
870 IF( iinfo.NE.0 )
THEN
871 WRITE( nounit, fmt = 9999 )
'ZHPGV(V,' // uplo //
872 $
')', iinfo, n, jtype, ioldsd
874 IF( iinfo.LT.0 )
THEN
877 result( ntest ) = ulpinv
884 CALL zsgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
885 $ ldz, d, work, rwork, result( ntest ) )
893 IF( lsame( uplo,
'U' ) )
THEN
913 CALL zhpgvd( ibtype,
'V', uplo, n, ap, bp, d, z, ldz,
914 $ work, nwork, rwork, lrwork, iwork,
916 IF( iinfo.NE.0 )
THEN
917 WRITE( nounit, fmt = 9999 )
'ZHPGVD(V,' // uplo //
918 $
')', iinfo, n, jtype, ioldsd
920 IF( iinfo.LT.0 )
THEN
923 result( ntest ) = ulpinv
930 CALL zsgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
931 $ ldz, d, work, rwork, result( ntest ) )
939 IF( lsame( uplo,
'U' ) )
THEN
959 CALL zhpgvx( ibtype,
'V',
'A', uplo, n, ap, bp, vl,
960 $ vu, il, iu, abstol, m, d, z, ldz, work,
961 $ rwork, iwork( n+1 ), iwork, info )
962 IF( iinfo.NE.0 )
THEN
963 WRITE( nounit, fmt = 9999 )
'ZHPGVX(V,A' // uplo //
964 $
')', iinfo, n, jtype, ioldsd
966 IF( iinfo.LT.0 )
THEN
969 result( ntest ) = ulpinv
976 CALL zsgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
977 $ ldz, d, work, rwork, result( ntest ) )
983 IF( lsame( uplo,
'U' ) )
THEN
1005 CALL zhpgvx( ibtype,
'V',
'V', uplo, n, ap, bp, vl,
1006 $ vu, il, iu, abstol, m, d, z, ldz, work,
1007 $ rwork, iwork( n+1 ), iwork, info )
1008 IF( iinfo.NE.0 )
THEN
1009 WRITE( nounit, fmt = 9999 )
'ZHPGVX(V,V' // uplo //
1010 $
')', iinfo, n, jtype, ioldsd
1012 IF( iinfo.LT.0 )
THEN
1015 result( ntest ) = ulpinv
1022 CALL zsgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
1023 $ ldz, d, work, rwork, result( ntest ) )
1029 IF( lsame( uplo,
'U' ) )
THEN
1033 ap( ij ) = a( i, j )
1034 bp( ij ) = b( i, j )
1042 ap( ij ) = a( i, j )
1043 bp( ij ) = b( i, j )
1049 CALL zhpgvx( ibtype,
'V',
'I', uplo, n, ap, bp, vl,
1050 $ vu, il, iu, abstol, m, d, z, ldz, work,
1051 $ rwork, iwork( n+1 ), iwork, info )
1052 IF( iinfo.NE.0 )
THEN
1053 WRITE( nounit, fmt = 9999 )
'ZHPGVX(V,I' // uplo //
1054 $
')', iinfo, n, jtype, ioldsd
1056 IF( iinfo.LT.0 )
THEN
1059 result( ntest ) = ulpinv
1066 CALL zsgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
1067 $ ldz, d, work, rwork, result( ntest ) )
1071 IF( ibtype.EQ.1 )
THEN
1079 IF( lsame( uplo,
'U' ) )
THEN
1081 DO 320 i = max( 1, j-ka ), j
1082 ab( ka+1+i-j, j ) = a( i, j )
1084 DO 330 i = max( 1, j-kb ), j
1085 bb( kb+1+i-j, j ) = b( i, j )
1090 DO 350 i = j, min( n, j+ka )
1091 ab( 1+i-j, j ) = a( i, j )
1093 DO 360 i = j, min( n, j+kb )
1094 bb( 1+i-j, j ) = b( i, j )
1099 CALL zhbgv(
'V', uplo, n, ka, kb, ab, lda, bb, ldb,
1100 $ d, z, ldz, work, rwork, iinfo )
1101 IF( iinfo.NE.0 )
THEN
1102 WRITE( nounit, fmt = 9999 )
'ZHBGV(V,' //
1103 $ uplo //
')', iinfo, n, jtype, ioldsd
1105 IF( iinfo.LT.0 )
THEN
1108 result( ntest ) = ulpinv
1115 CALL zsgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
1116 $ ldz, d, work, rwork, result( ntest ) )
1124 IF( lsame( uplo,
'U' ) )
THEN
1126 DO 380 i = max( 1, j-ka ), j
1127 ab( ka+1+i-j, j ) = a( i, j )
1129 DO 390 i = max( 1, j-kb ), j
1130 bb( kb+1+i-j, j ) = b( i, j )
1135 DO 410 i = j, min( n, j+ka )
1136 ab( 1+i-j, j ) = a( i, j )
1138 DO 420 i = j, min( n, j+kb )
1139 bb( 1+i-j, j ) = b( i, j )
1144 CALL zhbgvd(
'V', uplo, n, ka, kb, ab, lda, bb,
1145 $ ldb, d, z, ldz, work, nwork, rwork,
1146 $ lrwork, iwork, liwork, iinfo )
1147 IF( iinfo.NE.0 )
THEN
1148 WRITE( nounit, fmt = 9999 )
'ZHBGVD(V,' //
1149 $ uplo //
')', iinfo, n, jtype, ioldsd
1151 IF( iinfo.LT.0 )
THEN
1154 result( ntest ) = ulpinv
1161 CALL zsgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
1162 $ ldz, d, work, rwork, result( ntest ) )
1170 IF( lsame( uplo,
'U' ) )
THEN
1172 DO 440 i = max( 1, j-ka ), j
1173 ab( ka+1+i-j, j ) = a( i, j )
1175 DO 450 i = max( 1, j-kb ), j
1176 bb( kb+1+i-j, j ) = b( i, j )
1181 DO 470 i = j, min( n, j+ka )
1182 ab( 1+i-j, j ) = a( i, j )
1184 DO 480 i = j, min( n, j+kb )
1185 bb( 1+i-j, j ) = b( i, j )
1190 CALL zhbgvx(
'V',
'A', uplo, n, ka, kb, ab, lda,
1191 $ bb, ldb, bp, max( 1, n ), vl, vu, il,
1192 $ iu, abstol, m, d, z, ldz, work, rwork,
1193 $ iwork( n+1 ), iwork, iinfo )
1194 IF( iinfo.NE.0 )
THEN
1195 WRITE( nounit, fmt = 9999 )
'ZHBGVX(V,A' //
1196 $ uplo //
')', iinfo, n, jtype, ioldsd
1198 IF( iinfo.LT.0 )
THEN
1201 result( ntest ) = ulpinv
1208 CALL zsgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
1209 $ ldz, d, work, rwork, result( ntest ) )
1215 IF( lsame( uplo,
'U' ) )
THEN
1217 DO 500 i = max( 1, j-ka ), j
1218 ab( ka+1+i-j, j ) = a( i, j )
1220 DO 510 i = max( 1, j-kb ), j
1221 bb( kb+1+i-j, j ) = b( i, j )
1226 DO 530 i = j, min( n, j+ka )
1227 ab( 1+i-j, j ) = a( i, j )
1229 DO 540 i = j, min( n, j+kb )
1230 bb( 1+i-j, j ) = b( i, j )
1237 CALL zhbgvx(
'V',
'V', uplo, n, ka, kb, ab, lda,
1238 $ bb, ldb, bp, max( 1, n ), vl, vu, il,
1239 $ iu, abstol, m, d, z, ldz, work, rwork,
1240 $ iwork( n+1 ), iwork, iinfo )
1241 IF( iinfo.NE.0 )
THEN
1242 WRITE( nounit, fmt = 9999 )
'ZHBGVX(V,V' //
1243 $ uplo //
')', iinfo, n, jtype, ioldsd
1245 IF( iinfo.LT.0 )
THEN
1248 result( ntest ) = ulpinv
1255 CALL zsgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
1256 $ ldz, d, work, rwork, result( ntest ) )
1262 IF( lsame( uplo,
'U' ) )
THEN
1264 DO 560 i = max( 1, j-ka ), j
1265 ab( ka+1+i-j, j ) = a( i, j )
1267 DO 570 i = max( 1, j-kb ), j
1268 bb( kb+1+i-j, j ) = b( i, j )
1273 DO 590 i = j, min( n, j+ka )
1274 ab( 1+i-j, j ) = a( i, j )
1276 DO 600 i = j, min( n, j+kb )
1277 bb( 1+i-j, j ) = b( i, j )
1282 CALL zhbgvx(
'V',
'I', uplo, n, ka, kb, ab, lda,
1283 $ bb, ldb, bp, max( 1, n ), vl, vu, il,
1284 $ iu, abstol, m, d, z, ldz, work, rwork,
1285 $ iwork( n+1 ), iwork, iinfo )
1286 IF( iinfo.NE.0 )
THEN
1287 WRITE( nounit, fmt = 9999 )
'ZHBGVX(V,I' //
1288 $ uplo //
')', iinfo, n, jtype, ioldsd
1290 IF( iinfo.LT.0 )
THEN
1293 result( ntest ) = ulpinv
1300 CALL zsgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
1301 $ ldz, d, work, rwork, result( ntest ) )
1310 ntestt = ntestt + ntest
1311 CALL dlafts(
'ZSG', n, n, jtype, ntest, result, ioldsd,
1312 $ thresh, nounit, nerrs )
1318 CALL dlasum(
'ZSG', nounit, nerrs, ntestt )
1322 9999
FORMAT(
' ZDRVSG: ', a,
' returned INFO=', i6,
'.', / 9x,
'N=',
1323 $ i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ), i5,
')' )
subroutine dlabad(SMALL, LARGE)
DLABAD
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine zsgt01(ITYPE, UPLO, N, M, A, LDA, B, LDB, Z, LDZ, D, WORK, RWORK, RESULT)
ZSGT01
subroutine zdrvsg(NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH, NOUNIT, A, LDA, B, LDB, D, Z, LDZ, AB, BB, AP, BP, WORK, NWORK, RWORK, LRWORK, IWORK, LIWORK, RESULT, INFO)
ZDRVSG
subroutine zlatms(M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX, KL, KU, PACK, A, LDA, WORK, INFO)
ZLATMS
subroutine zlatmr(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)
ZLATMR
subroutine zhegvd(ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK, LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO)
ZHEGVD
subroutine zhegvx(ITYPE, JOBZ, RANGE, UPLO, N, A, LDA, B, LDB, VL, VU, IL, IU, ABSTOL, M, W, Z, LDZ, WORK, LWORK, RWORK, IWORK, IFAIL, INFO)
ZHEGVX
subroutine zhegv(ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK, LWORK, RWORK, INFO)
ZHEGV
subroutine zlacpy(UPLO, M, N, A, LDA, B, LDB)
ZLACPY copies all or part of one two-dimensional array to another.
subroutine zlaset(UPLO, M, N, ALPHA, BETA, A, LDA)
ZLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine zhbgvd(JOBZ, UPLO, N, KA, KB, AB, LDAB, BB, LDBB, W, Z, LDZ, WORK, LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO)
ZHBGVD
subroutine zhbgv(JOBZ, UPLO, N, KA, KB, AB, LDAB, BB, LDBB, W, Z, LDZ, WORK, RWORK, INFO)
ZHBGV
subroutine zhpgvx(ITYPE, JOBZ, RANGE, UPLO, N, AP, BP, VL, VU, IL, IU, ABSTOL, M, W, Z, LDZ, WORK, RWORK, IWORK, IFAIL, INFO)
ZHPGVX
subroutine zhbgvx(JOBZ, RANGE, UPLO, N, KA, KB, AB, LDAB, BB, LDBB, Q, LDQ, VL, VU, IL, IU, ABSTOL, M, W, Z, LDZ, WORK, RWORK, IWORK, IFAIL, INFO)
ZHBGVX
subroutine zhpgv(ITYPE, JOBZ, UPLO, N, AP, BP, W, Z, LDZ, WORK, RWORK, INFO)
ZHPGV
subroutine zhpgvd(ITYPE, JOBZ, UPLO, N, AP, BP, W, Z, LDZ, WORK, LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO)
ZHPGVD
subroutine dlasum(TYPE, IOUNIT, IE, NRUN)
DLASUM
subroutine dlafts(TYPE, M, N, IMAT, NTESTS, RESULT, ISEED, THRESH, IOUNIT, IE)
DLAFTS