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, , 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
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
' )
484 CALL DLABAD( UNFL, OVFL )
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.NE.
IF( NSIZES1 ) THEN
504 MTYPES = MIN( MAXTYP, NTYPES )
506 MTYPES = MIN( MAXTYP+1, NTYPES )
511 DO 640 JTYPE = 1, MTYPES
512.NOT.
IF( DOTYPE( JTYPE ) )
518 IOLDSD( J ) = ISEED( J )
536.GT.
IF( MTYPESMAXTYP )
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.EQ.
IF( ITYPE1 ) THEN
571 CALL ZLASET( 'full
', LDA, N, CZERO, CZERO, A, LDA )
573.EQ.
ELSE IF( ITYPE2 ) THEN
579 CALL ZLASET( 'full
', LDA, N, CZERO, CZERO, A, LDA )
581 A( JCOL, JCOL ) = ANORM
584.EQ.
ELSE IF( ITYPE4 ) THEN
590 CALL ZLATMS( N, N, 's
', ISEED, 'h
', RWORK, IMODE, COND,
591 $ ANORM, 0, 0, 'n
', A, LDA, WORK, IINFO )
593.EQ.
ELSE IF( ITYPE5 ) THEN
599 CALL ZLATMS( N, N, 's
', ISEED, 'h
', RWORK, IMODE, COND,
600 $ ANORM, N, N, 'n
', A, LDA, WORK, IINFO )
602.EQ.
ELSE IF( ITYPE7 ) 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
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,
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 =
'ZHPGVX(V,V' // uplo //
1010 $
')', iinfo, n, jtype, ioldsd
1012 IF( iinfo.LT.0 )
THEN
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
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,
')' )