172 SUBROUTINE zdrvgb( DOTYPE, NN, NVAL, NRHS, THRESH, TSTERR, A, LA,
173 $ AFB, LAFB, ASAV, B, BSAV, X, XACT, S, WORK,
174 $ RWORK, IWORK, NOUT )
182 INTEGER LA, LAFB, NN, NOUT, NRHS
183 DOUBLE PRECISION THRESH
187 INTEGER IWORK( * ), NVAL( * )
188 DOUBLE PRECISION RWORK( * ), S( * )
189 COMPLEX*16 A( * ), AFB( * ), ASAV( * ), B( * ), BSAV( * ),
190 $ work( * ), x( * ), xact( * )
196 DOUBLE PRECISION , ZERO
197 PARAMETER ( ONE = 1.0d+0, zero = 0.0d+0 )
199 parameter( ntypes = 8 )
201 parameter( ntests = 7 )
203 parameter( ntran = 3 )
206 LOGICAL EQUIL, NOFACT, PREFAC, TRFCON,
207 CHARACTER , EQUED, FACT, TRANS,
TYPE, XTYPE
209 INTEGER I, I1, I2, IEQUED, IFACT, IKL, IKU, IMAT, IN,
210 $ info, ioff, itran, izero, j, k, k1, kl, ku,
211 $ lda, ldafb, ldb, mode, n, nb, nbmin, nerrs,
212 $ nfact, nfail, nimat, nkl, nku, nrun
214 DOUBLE PRECISION AINVNM, AMAX, ANORM, ANORMI, ANORMO, ANRMPV,
215 $ CNDNUM, COLCND, RCOND, RCONDC, RCONDI, RCONDO,
216 $ roldc, roldi, roldo, rowcnd, rpvgrw,
220 CHARACTER EQUEDS( 4 ), FACTS( 3 ), TRANSS( NTRAN )
221 INTEGER ISEED( 4 ), ISEEDY( 4 )
222 DOUBLE PRECISION RDUM( 1 ), RESULT( NTESTS ), BERR( NRHS ),
223 $ errbnds_n( nrhs, 3 ), errbnds_c( nrhs, 3 )
227 DOUBLE PRECISION DGET06, DLAMCH, ZLANGB, ZLANGE, ZLANTB,
229 EXTERNAL lsame, dget06, dlamch, zlangb, zlange, zlantb,
239 INTRINSIC abs, dcmplx,
max,
min
247 COMMON / infoc / infot, nunit, ok, lerr
248 COMMON / srnamc / srnamt
251 DATA iseedy / 1988, 1989, 1990, 1991 /
252 DATA transs /
'N',
'T',
'C' /
253 DATA facts /
'F',
'N',
'E' /
254 DATA equeds /
'N',
'R',
'C',
'B' /
260 path( 1: 1 ) =
'Zomplex precision'
266 iseed( i ) = iseedy( i )
272 $
CALL zerrvx( path, nout )
291 nkl =
max( 1,
min( n, 4 ) )
306 ELSE IF( ikl.EQ.2 )
THEN
308 ELSE IF( ikl.EQ.3 )
THEN
310 ELSE IF( ikl.EQ.4 )
THEN
321 ELSE IF( iku.EQ.2 )
THEN
323 ELSE IF( iku.EQ.3 )
THEN
325 ELSE IF( iku.EQ.4 )
THEN
333 ldafb = 2*kl + ku + 1
334 IF( lda*n.GT.la .OR. ldafb*n.GT.lafb )
THEN
335 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
336 $
CALL aladhd( nout, path )
337 IF( lda*n.GT.la )
THEN
338 WRITE( nout, fmt = 9999 )la, n, kl, ku,
342 IF( ldafb*n.GT.lafb )
THEN
343 WRITE( nout, fmt = 9998 )lafb, n, kl, ku,
350 DO 120 imat = 1, nimat
354 IF( .NOT.dotype( imat ) )
359 zerot = imat.GE.2 .AND. imat.LE.4
360 IF( zerot .AND. n.LT.imat-1 )
366 CALL zlatb4( path, imat, n, n,
TYPE, KL, KU, ANORM,
367 $ MODE, CNDNUM, DIST )
368 rcondc = one / cndnum
371 CALL zlatms( n, n, dist, iseed,
TYPE, RWORK, MODE,
372 $ cndnum, anorm, kl, ku,
'Z', a, lda, work,
378 CALL alaerh( path,
'ZLATMS', info, 0,
' ', n, n,
379 $ kl, ku, -1, imat, nfail, nerrs, nout )
390 ELSE IF( imat.EQ.3 )
THEN
395 ioff = ( izero-1 )*lda
397 i1 =
max( 1, ku+2-izero )
398 i2 =
min( kl+ku+1, ku+1+( n-izero ) )
404 DO 30 i =
max( 1, ku+2-j ),
405 $
min( kl+ku+1, ku+1+( n-j ) )
415 CALL zlacpy(
'Full', kl+ku+1, n, a, lda, asav, lda )
418 equed = equeds( iequed )
419 IF( iequed.EQ.1 )
THEN
425 DO 100 ifact = 1, nfact
426 fact = facts( ifact )
427 prefac = lsame( fact,
'F' )
428 nofact = lsame( fact, 'n
' )
429 EQUIL = LSAME( FACT, 'e
' )
437.NOT.
ELSE IF( NOFACT ) THEN
444 CALL ZLACPY( 'full
', KL+KU+1, N, ASAV, LDA,
445 $ AFB( KL+1 ), LDAFB )
446.OR..GT.
IF( EQUIL IEQUED1 ) THEN
451 CALL ZGBEQU( N, N, KL, KU, AFB( KL+1 ),
452 $ LDAFB, S, S( N+1 ), ROWCND,
453 $ COLCND, AMAX, INFO )
454.EQ..AND..GT.
IF( INFO0 N0 ) THEN
455 IF( LSAME( EQUED, 'r
' ) ) THEN
458 ELSE IF( LSAME( EQUED, 'c
' ) ) THEN
461 ELSE IF( LSAME( EQUED, 'b
' ) ) THEN
468 CALL ZLAQGB( N, N, KL, KU, AFB( KL+1 ),
469 $ LDAFB, S, S( N+1 ),
470 $ ROWCND, COLCND, AMAX,
485 ANORMO = ZLANGB( '1
', N, KL, KU, AFB( KL+1 ),
487 ANORMI = ZLANGB( 'i
', N, KL, KU, AFB( KL+1 ),
492 CALL ZGBTRF( N, N, KL, KU, AFB, LDAFB, IWORK,
497 CALL ZLASET( 'full
', N, N, DCMPLX( ZERO ),
498 $ DCMPLX( ONE ), WORK, LDB )
500 CALL ZGBTRS( 'no transpose
', N, KL, KU, N,
501 $ AFB, LDAFB, IWORK, WORK, LDB,
506 AINVNM = ZLANGE( '1
', N, N, WORK, LDB,
508.LE..OR..LE.
IF( ANORMOZERO AINVNMZERO ) THEN
511 RCONDO = ( ONE / ANORMO ) / AINVNM
517 AINVNM = ZLANGE( 'i
', N, N, WORK, LDB,
519.LE..OR..LE.
IF( ANORMIZERO AINVNMZERO ) THEN
522 RCONDI = ( ONE / ANORMI ) / AINVNM
526 DO 90 ITRAN = 1, NTRAN
530 TRANS = TRANSS( ITRAN )
531.EQ.
IF( ITRAN1 ) THEN
539 CALL ZLACPY( 'full
', KL+KU+1, N, ASAV, LDA,
546 CALL ZLARHS( PATH, XTYPE, 'full
', TRANS, N,
547 $ N, KL, KU, NRHS, A, LDA, XACT,
548 $ LDB, B, LDB, ISEED, INFO )
550 CALL ZLACPY( 'full
', N, NRHS, B, LDB, BSAV,
553.AND..EQ.
IF( NOFACT ITRAN1 ) THEN
560 CALL ZLACPY( 'full
', KL+KU+1, N, A, LDA,
561 $ AFB( KL+1 ), LDAFB )
562 CALL ZLACPY( 'full
', N, NRHS, B, LDB, X,
566 CALL ZGBSV( N, KL, KU, NRHS, AFB, LDAFB,
567 $ IWORK, X, LDB, INFO )
572 $ CALL ALAERH( PATH, 'zgbsv ', INFO,
573 $ IZERO, ' ', N, N, KL, KU,
574 $ NRHS, IMAT, NFAIL, NERRS,
580 CALL ZGBT01( N, N, KL, KU, A, LDA, AFB,
581 $ LDAFB, IWORK, WORK,
584.EQ.
IF( IZERO0 ) THEN
589 CALL ZLACPY( 'full
', N, NRHS, B, LDB,
591 CALL ZGBT02( 'no transpose
', N, N, KL,
592 $ KU, NRHS, A, LDA, X, LDB,
599 CALL ZGET04( N, NRHS, X, LDB, XACT,
600 $ LDB, RCONDC, RESULT( 3 ) )
608.GE.
IF( RESULT( K )THRESH ) THEN
609.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
610 $ CALL ALADHD( NOUT, PATH )
611 WRITE( NOUT, FMT = 9997 )'zgbsv ',
612 $ N, KL, KU, IMAT, K, RESULT( K )
622 $ CALL ZLASET( 'full
', 2*KL+KU+1, N,
624 $ DCMPLX( ZERO ), AFB, LDAFB )
625 CALL ZLASET( 'full
', N, NRHS, DCMPLX( ZERO ),
626 $ DCMPLX( ZERO ), X, LDB )
627.GT..AND..GT.
IF( IEQUED1 N0 ) THEN
632 CALL ZLAQGB( N, N, KL, KU, A, LDA, S,
633 $ S( N+1 ), ROWCND, COLCND,
641 CALL ZGBSVX( FACT, TRANS, N, KL, KU, NRHS, A,
642 $ LDA, AFB, LDAFB, IWORK, EQUED,
643 $ S, S( LDB+1 ), B, LDB, X, LDB,
644 $ RCOND, RWORK, RWORK( NRHS+1 ),
645 $ WORK, RWORK( 2*NRHS+1 ), INFO )
650 $ CALL ALAERH( PATH, 'zgbsvx', INFO, IZERO,
651 $ FACT // TRANS, N, N, KL, KU,
652 $ NRHS, IMAT, NFAIL, NERRS,
661 DO 60 I = MAX( KU+2-J, 1 ),
662 $ MIN( N+KU+1-J, KL+KU+1 )
663 ANRMPV = MAX( ANRMPV,
664 $ ABS( A( I+( J-1 )*LDA ) ) )
667 RPVGRW = ZLANTB( 'm
', 'u
', 'n
', INFO,
668 $ MIN( INFO-1, KL+KU ),
669 $ AFB( MAX( 1, KL+KU+2-INFO ) ),
671.EQ.
IF( RPVGRWZERO ) THEN
674 RPVGRW = ANRMPV / RPVGRW
677 RPVGRW = ZLANTB( 'm
', 'u
', 'n
', N, KL+KU,
679.EQ.
IF( RPVGRWZERO ) THEN
682 RPVGRW = ZLANGB( 'm
', N, KL, KU, A,
683 $ LDA, RDUM ) / RPVGRW
686 RESULT( 7 ) = ABS( RPVGRW-RWORK( 2*NRHS+1 ) )
687 $ / MAX( RWORK( 2*NRHS+1 ),
688 $ RPVGRW ) / DLAMCH( 'e
' )
690.NOT.
IF( PREFAC ) THEN
695 CALL ZGBT01( N, N, KL, KU, A, LDA, AFB,
696 $ LDAFB, IWORK, WORK,
708 CALL ZLACPY( 'full
', N, NRHS, BSAV, LDB,
710 CALL ZGBT02( TRANS, N, N, KL, KU, NRHS,
711 $ ASAV, LDA, X, LDB, WORK, LDB,
718.OR..AND.
IF( NOFACT ( PREFAC
719 $ LSAME( EQUED, 'n
' ) ) ) THEN
720 CALL ZGET04( N, NRHS, X, LDB, XACT,
721 $ LDB, RCONDC, RESULT( 3 ) )
723.EQ.
IF( ITRAN1 ) THEN
728 CALL ZGET04( N, NRHS, X, LDB, XACT,
729 $ LDB, ROLDC, RESULT( 3 ) )
735 CALL ZGBT05( TRANS, N, KL, KU, NRHS, ASAV,
736 $ LDA, BSAV, LDB, X, LDB, XACT,
737 $ LDB, RWORK, RWORK( NRHS+1 ),
746 RESULT( 6 ) = DGET06( RCOND, RCONDC )
751.NOT.
IF( TRFCON ) THEN
753.GE.
IF( RESULT( K )THRESH ) THEN
754.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
755 $ CALL ALADHD( NOUT, PATH )
757 WRITE( NOUT, FMT = 9995 )
758 $ 'zgbsvx', FACT, TRANS, N, KL,
759 $ KU, EQUED, IMAT, K,
762 WRITE( NOUT, FMT = 9996 )
763 $ 'zgbsvx', FACT, TRANS, N, KL,
764 $ KU, IMAT, K, RESULT( K )
771.GE..AND..NOT.
IF( RESULT( 1 )THRESH
773.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
774 $ CALL ALADHD( NOUT, PATH )
776 WRITE( NOUT, FMT = 9995 )'zgbsvx',
777 $ FACT, TRANS, N, KL, KU, EQUED,
778 $ IMAT, 1, RESULT( 1 )
780 WRITE( NOUT, FMT = 9996 )'zgbsvx',
781 $ FACT, TRANS, N, KL, KU, IMAT, 1,
787.GE.
IF( RESULT( 6 )THRESH ) THEN
788.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
789 $ CALL ALADHD( NOUT, PATH )
791 WRITE( NOUT, FMT = 9995 )'zgbsvx',
792 $ FACT, TRANS, N, KL, KU, EQUED,
793 $ IMAT, 6, RESULT( 6 )
795 WRITE( NOUT, FMT = 9996 )'zgbsvx',
796 $ FACT, TRANS, N, KL, KU, IMAT, 6,
802.GE.
IF( RESULT( 7 )THRESH ) THEN
803.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
804 $ CALL ALADHD( NOUT, PATH )
806 WRITE( NOUT, FMT = 9995 )'zgbsvx',
807 $ FACT, TRANS, N, KL, KU, EQUED,
808 $ IMAT, 7, RESULT( 7 )
810 WRITE( NOUT, FMT = 9996 )'zgbsvx',
811 $ FACT, TRANS, N, KL, KU, IMAT, 7,
825 CALL ZLACPY( 'full
', KL+KU+1, N, ASAV, LDA, A,
827 CALL ZLACPY( 'full
', N, NRHS, BSAV, LDB, B, LDB )
830 $ CALL ZLASET( 'full
', 2*KL+KU+1, N,
831 $ DCMPLX( ZERO ), DCMPLX( ZERO ),
833 CALL ZLASET( 'full
', N, NRHS,
834 $ DCMPLX( ZERO ), DCMPLX( ZERO ),
836.GT..AND..GT.
IF( IEQUED1 N0 ) THEN
841 CALL ZLAQGB( N, N, KL, KU, A, LDA, S,
842 $ S( N+1 ), ROWCND, COLCND, AMAX, EQUED )
850 CALL ZGBSVXX( FACT, TRANS, N, KL, KU, NRHS, A, LDA,
851 $ AFB, LDAFB, IWORK, EQUED, S, S( N+1 ), B, LDB,
852 $ X, LDB, RCOND, RPVGRW_SVXX, BERR, N_ERR_BNDS,
853 $ ERRBNDS_N, ERRBNDS_C, 0, ZERO, WORK,
858.EQ.
IF( INFON+1 ) GOTO 90
859.NE.
IF( INFOIZERO ) THEN
860 CALL ALAERH( PATH, 'zgbsvxx', INFO, IZERO,
861 $ FACT // TRANS, N, N, -1, -1, NRHS,
862 $ IMAT, NFAIL, NERRS, NOUT )
870.GT..AND..LT.
IF ( INFO 0 INFO N+1 ) THEN
871 RPVGRW = ZLA_GBRPVGRW(N, KL, KU, INFO, A, LDA,
874 RPVGRW = ZLA_GBRPVGRW(N, KL, KU, N, A, LDA,
878 RESULT( 7 ) = ABS( RPVGRW-rpvgrw_svxx ) /
879 $ MAX( rpvgrw_svxx, RPVGRW ) /
882.NOT.
IF( PREFAC ) THEN
887 CALL ZGBT01( N, N, KL, KU, A, LDA, AFB, LDAFB,
888 $ IWORK, WORK( 2*NRHS+1 ), RESULT( 1 ) )
899 CALL ZLACPY( 'full
', N, NRHS, BSAV, LDB, WORK,
901 CALL ZGBT02( TRANS, N, N, KL, KU, NRHS, ASAV,
902 $ LDA, X, LDB, WORK, LDB, RWORK,
907.OR..AND.
IF( NOFACT ( PREFAC LSAME( EQUED,
909 CALL ZGET04( N, NRHS, X, LDB, XACT, LDB,
910 $ RCONDC, RESULT( 3 ) )
912.EQ.
IF( ITRAN1 ) THEN
917 CALL ZGET04( N, NRHS, X, LDB, XACT, LDB,
918 $ ROLDC, RESULT( 3 ) )
927 RESULT( 6 ) = DGET06( RCOND, RCONDC )
932.NOT.
IF( TRFCON ) THEN
934.GE.
IF( RESULT( K )THRESH ) THEN
935.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
936 $ CALL ALADHD( NOUT, PATH )
938 WRITE( NOUT, FMT = 9995 )'zgbsvxx',
939 $ FACT, TRANS, N, KL, KU, EQUED,
940 $ IMAT, K, RESULT( K )
942 WRITE( NOUT, FMT = 9996 )'zgbsvxx',
943 $ FACT, TRANS, N, KL, KU, IMAT, K,
951.GE..AND..NOT.
IF( RESULT( 1 )THRESH PREFAC )
953.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
954 $ CALL ALADHD( NOUT, PATH )
956 WRITE( NOUT, FMT = 9995 )'zgbsvxx', FACT,
957 $ TRANS, N, KL, KU, EQUED, IMAT, 1,
960 WRITE( NOUT, FMT = 9996 )'zgbsvxx', FACT,
961 $ TRANS, N, KL, KU, IMAT, 1,
967.GE.
IF( RESULT( 6 )THRESH ) THEN
968.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
969 $ CALL ALADHD( NOUT, PATH )
971 WRITE( NOUT, FMT = 9995 )'zgbsvxx', FACT,
972 $ TRANS, N, KL, KU, EQUED, IMAT, 6,
975 WRITE( NOUT, FMT = 9996 )'zgbsvxx', FACT,
976 $ TRANS, N, KL, KU, IMAT, 6,
982.GE.
IF( RESULT( 7 )THRESH ) THEN
983.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
984 $ CALL ALADHD( NOUT, PATH )
986 WRITE( NOUT, FMT = 9995 )'zgbsvxx', FACT,
987 $ TRANS, N, KL, KU, EQUED, IMAT, 7,
990 WRITE( NOUT, FMT = 9996 )'zgbsvxx', FACT,
991 $ TRANS, N, KL, KU, IMAT, 7,
1010 CALL ALASVM( PATH, NOUT, NFAIL, NRUN, NERRS )
1015 CALL ZEBCHVXX(THRESH, PATH)
1017 9999 FORMAT( ' *** in
zdrvgb, la=
', I5, ' is too small
for n=
', I5,
1018 $ ', ku=
', I5, ', kl=
', I5, / ' ==> increase la to at least
',
1020 9998 FORMAT( ' *** in
zdrvgb, lafb=
', I5, ' is too small
for n=
', I5,
1021 $ ', ku=
', I5, ', kl=
', I5, /
1022 $ ' ==> increase lafb to at least
', I5 )
1023 9997 FORMAT( 1X, A, ', n=
', I5, ', kl=
', I5, ', ku=
', I5, ',
type ',
1024 $ I1, ', test(
', I1, ')=
', G12.5 )
1025 9996 FORMAT( 1X, A, '(
''', A1, ''',
''', A1, ''',
', I5, ',
', I5, ',
',
1026 $ I5, ',...),
type ', I1, ', test(
', I1, ')=
', G12.5 )
1027 9995 FORMAT( 1X, A, '(
''', A1, ''',
''', A1, ''',
', I5, ',
', I5, ',
',
1028 $ I5, ',...), equed=
''', A1, ''',
type ', I1, ', test(
', I1,
subroutine xlaenv(ispec, nvalue)
XLAENV
subroutine alasvm(type, nout, nfail, nrun, nerrs)
ALASVM
subroutine aladhd(iounit, path)
ALADHD
subroutine alaerh(path, subnam, info, infoe, opts, m, n, kl, ku, n5, imat, nfail, nerrs, nout)
ALAERH
subroutine zlaqgb(m, n, kl, ku, ab, ldab, r, c, rowcnd, colcnd, amax, equed)
ZLAQGB scales a general band matrix, using row and column scaling factors computed by sgbequ.
subroutine zgbtrs(trans, n, kl, ku, nrhs, ab, ldab, ipiv, b, ldb, info)
ZGBTRS
subroutine zgbtrf(m, n, kl, ku, ab, ldab, ipiv, info)
ZGBTRF
double precision function zla_gbrpvgrw(n, kl, ku, ncols, ab, ldab, afb, ldafb)
ZLA_GBRPVGRW computes the reciprocal pivot growth factor norm(A)/norm(U) for a general banded matrix.
subroutine zgbequ(m, n, kl, ku, ab, ldab, r, c, rowcnd, colcnd, amax, info)
ZGBEQU
subroutine zgbsvx(fact, trans, n, kl, ku, nrhs, ab, ldab, afb, ldafb, ipiv, equed, r, c, b, ldb, x, ldx, rcond, ferr, berr, work, rwork, info)
ZGBSVX computes the solution to system of linear equations A * X = B for GB matrices
subroutine zgbsvxx(fact, trans, n, kl, ku, nrhs, ab, ldab, afb, ldafb, ipiv, equed, r, c, b, ldb, x, ldx, rcond, rpvgrw, berr, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params, work, rwork, info)
ZGBSVXX computes the solution to system of linear equations A * X = B for GB matrices
subroutine zgbsv(n, kl, ku, nrhs, ab, ldab, ipiv, b, ldb, info)
ZGBSV computes the solution to system of linear equations A * X = B for GB matrices (simple driver)
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 zlarhs(path, xtype, uplo, trans, m, n, kl, ku, nrhs, a, lda, x, ldx, b, ldb, iseed, info)
ZLARHS
subroutine zgbt02(trans, m, n, kl, ku, nrhs, a, lda, x, ldx, b, ldb, rwork, resid)
ZGBT02
subroutine zdrvgb(dotype, nn, nval, nrhs, thresh, tsterr, a, la, afb, lafb, asav, b, bsav, x, xact, s, work, rwork, iwork, nout)
ZDRVGB
subroutine zgbt01(m, n, kl, ku, a, lda, afac, ldafac, ipiv, work, resid)
ZGBT01
subroutine zerrvx(path, nunit)
ZERRVX
subroutine zget04(n, nrhs, x, ldx, xact, ldxact, rcond, resid)
ZGET04
subroutine zgbt05(trans, n, kl, ku, nrhs, ab, ldab, b, ldb, x, ldx, xact, ldxact, ferr, berr, reslts)
ZGBT05
subroutine zlatb4(path, imat, m, n, type, kl, ku, anorm, mode, cndnum, dist)
ZLATB4
subroutine zlatms(m, n, dist, iseed, sym, d, mode, cond, dmax, kl, ku, pack, a, lda, work, info)
ZLATMS
for(i8=*sizetab-1;i8 >=0;i8--)