366 SUBROUTINE cdrvsg( 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
382 INTEGER ISEED( 4 ), IWORK( * ), NN( * )
383 REAL D( * ), RESULT( * ), RWORK( * )
384 COMPLEX A( LDA, * ), AB( LDA, * ), AP( * ),
385 $ b( ldb, * ), bb( ldb, * ), bp( * ), work( * ),
393 PARAMETER ( ZERO = 0.0e+0, one = 1.0e+0, ten = 10.0e+0 )
395 parameter( czero = ( 0.0e+0, 0.0e+0 ),
396 $ cone = ( 1.0e+0, 0.0e+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 REAL 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 ),
418 EXTERNAL LSAME, SLAMCH, SLARND
426 INTRINSIC abs, max, min, real, 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(
'CDRVSG', -info )
477 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
482 unfl = slamch(
'Safe minimum' )
483 ovfl = slamch(
'Overflow' )
485 ulp = slamch(
'Epsilon' )*slamch(
'Base' )
487 rtunfl = sqrt( unfl )
488 rtovfl = sqrt( ovfl )
491 iseed2( i ) = iseed( i )
499 DO 650 jsize = 1, nsizes
501 aninv = one / real( 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 claset(
'Full', lda, n, czero, czero, a, lda )
573 ELSE IF( itype.EQ.2 )
THEN
579 CALL claset(
'Full', lda, n, czero, czero, a, lda )
581 a( jcol, jcol ) = anorm
584 ELSE IF( itype.EQ.4 )
THEN
590 CALL clatms( 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 clatms( 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 clatmr( 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 clatmr( 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 clatms( 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 )*slarnd( 1, iseed2 )
667 iu = 1 + ( n-1 )*slarnd( 1, iseed2 )
696 CALL clatms( n, n,
'U', iseed,
'P', rwork, 5, ten,
697 $ one, kb, kb, uplo, b, ldb, work( n+1 ),
704 CALL clacpy(
' ', n, n, a, lda, z, ldz )
705 CALL clacpy( uplo, n, n, b, ldb, bb, ldb )
707 CALL chegv( 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 )
'CHEGV(V,' // uplo //
711 $
')', iinfo, n, jtype, ioldsd
713 IF( iinfo.LT.0 )
THEN
716 result( ntest ) = ulpinv
723 CALL csgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
724 $ ldz, d, work, rwork, result( ntest ) )
730 CALL clacpy(
' ', n, n, a, lda, z, ldz )
731 CALL clacpy( uplo, n, n, b, ldb, bb, ldb )
733 CALL chegvd( 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 )
'CHEGVD(V,' // uplo //
738 $
')', iinfo, n, jtype, ioldsd
740 IF( iinfo.LT.0 )
THEN
743 result( ntest ) = ulpinv
750 CALL csgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
751 $ ldz, d, work, rwork, result( ntest ) )
757 CALL clacpy(
' ', n, n, a, lda, ab, lda )
758 CALL clacpy( uplo, n, n, b, ldb, bb, ldb )
760 CALL chegvx( 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 )
'CHEGVX(V,A' // uplo //
766 $
')', iinfo, n, jtype, ioldsd
768 IF( iinfo.LT.0 )
THEN
771 result( ntest ) = ulpinv
778 CALL csgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
779 $ ldz, d, work, rwork, result( ntest ) )
783 CALL clacpy(
' ', n, n, a, lda, ab, lda )
784 CALL clacpy( uplo, n, n, b, ldb, bb, ldb )
793 CALL chegvx( 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 )
'CHEGVX(V,V,' //
799 $ uplo //
')', iinfo, n, jtype, ioldsd
801 IF( iinfo.LT.0 )
THEN
804 result( ntest ) = ulpinv
811 CALL csgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
812 $ ldz, d, work, rwork, result( ntest ) )
816 CALL clacpy(
' ', n, n, a, lda, ab, lda )
817 CALL clacpy( uplo, n, n, b, ldb, bb, ldb )
819 CALL chegvx( 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 )
'CHEGVX(V,I,' //
825 $ uplo //
')', iinfo, n, jtype, ioldsd
827 IF( iinfo.LT.0 )
THEN
830 result( ntest ) = ulpinv
837 CALL csgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
838 $ ldz, d, work, rwork, result( ntest ) )
848 IF( lsame( uplo,
'U' ) )
THEN
868 CALL chpgv( ibtype,
'V', uplo, n, ap, bp, d, z, ldz,
869 $ work, rwork, iinfo )
870 IF( iinfo.NE.0 )
THEN
871 WRITE( nounit, fmt = 9999 )
'CHPGV(V,' // uplo //
872 $
')', iinfo, n, jtype, ioldsd
874 IF( iinfo.LT.0 )
THEN
877 result( ntest ) = ulpinv
884 CALL csgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
885 $ ldz, d, work, rwork, result( ntest ) )
893 IF( lsame( uplo,
'U' ) )
THEN
913 CALL chpgvd( 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 )
'CHPGVD(V,' // uplo //
918 $
')', iinfo, n, jtype, ioldsd
920 IF( iinfo.LT.0 )
THEN
923 result( ntest ) = ulpinv
930 CALL csgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
931 $ ldz, d, work, rwork, result( ntest ) )
939 IF( lsame( uplo,
'U' ) )
THEN
959 CALL chpgvx( 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 )
'CHPGVX(V,A' // uplo //
964 $
')', iinfo, n, jtype, ioldsd
966 IF( iinfo.LT.0 )
THEN
969 result( ntest ) = ulpinv
976 CALL csgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
977 $ ldz, d, work, rwork, result( ntest ) )
983 IF( lsame( uplo,
'U' ) )
THEN
1005 CALL chpgvx( 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 )
'CHPGVX(V,V' // uplo //
1010 $
')', iinfo, n, jtype, ioldsd
1012 IF( iinfo.LT.0 )
THEN
1015 result( ntest ) = ulpinv
1022 CALL csgt01( 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 chpgvx( 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 )
'CHPGVX(V,I' // uplo //
1054 $
')', iinfo, n, jtype, ioldsd
1056 IF( iinfo.LT.0 )
THEN
1059 result( ntest ) = ulpinv
1066 CALL csgt01( 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 chbgv(
'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 )
'CHBGV(V,' //
1103 $ uplo //
')', iinfo, n, jtype, ioldsd
1105 IF( iinfo.LT.0 )
THEN
1108 result( ntest ) = ulpinv
1115 CALL csgt01( 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 chbgvd(
'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 )
'CHBGVD(V,' //
1149 $ uplo //
')', iinfo, n, jtype, ioldsd
1151 IF( iinfo.LT.0 )
THEN
1154 result( ntest ) = ulpinv
1161 CALL csgt01( 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 chbgvx(
'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 )
'CHBGVX(V,A' //
1196 $ uplo //
')', iinfo, n, jtype, ioldsd
1198 IF( iinfo.LT.0 )
THEN
1201 result( ntest ) = ulpinv
1208 CALL csgt01( 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 chbgvx(
'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 )
'CHBGVX(V,V' //
1243 $ uplo //
')', iinfo, n, jtype, ioldsd
1245 IF( iinfo.LT.0 )
THEN
1248 result( ntest ) = ulpinv
1255 CALL csgt01( 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 chbgvx(
'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 )
'CHBGVX(V,I' //
1288 $ uplo //
')', iinfo, n, jtype, ioldsd
1290 IF( iinfo.LT.0 )
THEN
1293 result( ntest ) = ulpinv
1300 CALL csgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
1301 $ ldz, d, work, rwork, result( ntest ) )
1310 ntestt = ntestt + ntest
1311 CALL slafts(
'CSG', n, n, jtype, ntest, result, ioldsd,
1312 $ thresh, nounit, nerrs )
1318 CALL slasum(
'CSG', nounit, nerrs, ntestt )
1322 9999
FORMAT(
' CDRVSG: ', a,
' returned INFO=', i6,
'.', / 9x,
'N=',
1323 $ i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ), i5,
')' )
subroutine slabad(SMALL, LARGE)
SLABAD
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine cdrvsg(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)
CDRVSG
subroutine csgt01(ITYPE, UPLO, N, M, A, LDA, B, LDB, Z, LDZ, D, WORK, RWORK, RESULT)
CSGT01
subroutine clatms(M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX, KL, KU, PACK, A, LDA, WORK, INFO)
CLATMS
subroutine clatmr(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)
CLATMR
subroutine chegvd(ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK, LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO)
CHEGVD
subroutine chegv(ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK, LWORK, RWORK, INFO)
CHEGV
subroutine chegvx(ITYPE, JOBZ, RANGE, UPLO, N, A, LDA, B, LDB, VL, VU, IL, IU, ABSTOL, M, W, Z, LDZ, WORK, LWORK, RWORK, IWORK, IFAIL, INFO)
CHEGVX
subroutine claset(UPLO, M, N, ALPHA, BETA, A, LDA)
CLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine clacpy(UPLO, M, N, A, LDA, B, LDB)
CLACPY copies all or part of one two-dimensional array to another.
subroutine chpgvd(ITYPE, JOBZ, UPLO, N, AP, BP, W, Z, LDZ, WORK, LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO)
CHPGVD
subroutine chbgvd(JOBZ, UPLO, N, KA, KB, AB, LDAB, BB, LDBB, W, Z, LDZ, WORK, LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO)
CHBGVD
subroutine chpgvx(ITYPE, JOBZ, RANGE, UPLO, N, AP, BP, VL, VU, IL, IU, ABSTOL, M, W, Z, LDZ, WORK, RWORK, IWORK, IFAIL, INFO)
CHPGVX
subroutine chpgv(ITYPE, JOBZ, UPLO, N, AP, BP, W, Z, LDZ, WORK, RWORK, INFO)
CHPGV
subroutine chbgvx(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)
CHBGVX
subroutine chbgv(JOBZ, UPLO, N, KA, KB, AB, LDAB, BB, LDBB, W, Z, LDZ, WORK, RWORK, INFO)
CHBGV
subroutine slafts(TYPE, M, N, IMAT, NTESTS, RESULT, ISEED, THRESH, IOUNIT, IE)
SLAFTS
subroutine slasum(TYPE, IOUNIT, IE, NRUN)
SLASUM