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 ONE, 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, ZEROT
207 CHARACTER DIST, 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, nt,
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 ELSE IF( .NOT.nofact )
THEN
444 CALL zlacpy(
'Full', kl+ku+1, n, asav, lda,
445 $ afb( kl+1 ), ldafb )
446 IF( equil .OR. iequed.GT.1 )
THEN
451 CALL zgbequ( n, n, kl, ku, afb( kl+1 ),
452 $ ldafb, s, s( n+1 ), rowcnd,
453 $ colcnd, amax, info )
454 IF( info.EQ.0 .AND. n.GT.0 )
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 IF( anormo.LE.zero .OR. ainvnm.LE.zero )
THEN
511 rcondo = ( one / anormo ) / ainvnm
517 ainvnm = zlange(
'I', n, n, work, ldb,
519 IF( anormi.LE.zero .OR. ainvnm.LE.zero )
THEN
522 rcondi = ( one / anormi ) / ainvnm
526 DO 90 itran = 1, ntran
530 trans = transs( itran )
531 IF( itran.EQ.1 )
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 IF( nofact .AND. itran.EQ.1 )
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 IF( izero.EQ.0 )
THEN
589 CALL zlacpy(
'Full', n, nrhs, b, ldb,
591 CALL zgbt02(
'No transpose', n, n, kl,
592 $ ku, nrhs, a, lda, x, ldb,
593 $ work, ldb, result( 2 ) )
598 CALL zget04( n, nrhs, x, ldb, xact,
599 $ ldb, rcondc, result( 3 ) )
607 IF( result( k ).GE.thresh )
THEN
608 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
609 $
CALL aladhd( nout, path )
610 WRITE( nout, fmt = 9997 )
'ZGBSV ',
611 $ n, kl, ku, imat, k, result( k )
621 $
CALL zlaset(
'Full', 2*kl+ku+1, n,
623 $ dcmplx( zero ), afb, ldafb )
624 CALL zlaset(
'Full', n, nrhs, dcmplx( zero ),
625 $ dcmplx( zero ), x, ldb )
626 IF( iequed.GT.1 .AND. n.GT.0 )
THEN
631 CALL zlaqgb( n, n, kl, ku, a, lda, s,
632 $ s( n+1 ), rowcnd, colcnd,
640 CALL zgbsvx( fact, trans, n, kl, ku, nrhs, a,
641 $ lda, afb, ldafb, iwork, equed,
642 $ s, s( ldb+1 ), b, ldb, x, ldb,
643 $ rcond, rwork, rwork( nrhs+1 ),
644 $ work, rwork( 2*nrhs+1 ), info )
649 $
CALL alaerh( path,
'ZGBSVX', info, izero,
650 $ fact // trans, n, n, kl, ku,
651 $ nrhs, imat, nfail, nerrs,
660 DO 60 i = max( ku+2-j, 1 ),
661 $ min( n+ku+1-j, kl+ku+1 )
662 anrmpv = max( anrmpv,
663 $ abs( a( i+( j-1 )*lda ) ) )
666 rpvgrw = zlantb(
'M',
'U',
'N', info,
667 $ min( info-1, kl+ku ),
668 $ afb( max( 1, kl+ku+2-info ) ),
670 IF( rpvgrw.EQ.zero )
THEN
673 rpvgrw = anrmpv / rpvgrw
676 rpvgrw = zlantb(
'M',
'U',
'N', n, kl+ku,
678 IF( rpvgrw.EQ.zero )
THEN
681 rpvgrw = zlangb(
'M', n, kl, ku, a,
682 $ lda, rdum ) / rpvgrw
685 result( 7 ) = abs( rpvgrw-rwork( 2*nrhs+1 ) )
686 $ / max( rwork( 2*nrhs+1 ),
687 $ rpvgrw ) / dlamch(
'E' )
689 IF( .NOT.prefac )
THEN
694 CALL zgbt01( n, n, kl, ku, a, lda, afb,
695 $ ldafb, iwork, work,
707 CALL zlacpy(
'Full', n, nrhs, bsav, ldb,
709 CALL zgbt02( trans, n, n, kl, ku, nrhs,
710 $ asav, lda, x, ldb, work, ldb,
716 IF( nofact .OR. ( prefac .AND.
717 $ lsame( equed,
'N' ) ) )
THEN
718 CALL zget04( n, nrhs, x, ldb, xact,
719 $ ldb, rcondc, result( 3 ) )
721 IF( itran.EQ.1 )
THEN
726 CALL zget04( n, nrhs, x, ldb, xact,
727 $ ldb, roldc, result( 3 ) )
733 CALL zgbt05( trans, n, kl, ku, nrhs, asav,
734 $ lda, bsav, ldb, x, ldb, xact,
735 $ ldb, rwork, rwork( nrhs+1 ),
744 result( 6 ) = dget06( rcond, rcondc )
749 IF( .NOT.trfcon )
THEN
751 IF( result( k ).GE.thresh )
THEN
752 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
753 $
CALL aladhd( nout, path )
755 WRITE( nout, fmt = 9995 )
756 $
'ZGBSVX', fact, trans, n, kl,
757 $ ku, equed, imat, k,
760 WRITE( nout, fmt = 9996 )
761 $
'ZGBSVX', fact, trans, n, kl,
762 $ ku, imat, k, result( k )
769 IF( result( 1 ).GE.thresh .AND. .NOT.
771 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
772 $
CALL aladhd( nout, path )
774 WRITE( nout, fmt = 9995 )
'ZGBSVX',
775 $ fact, trans, n, kl, ku, equed,
776 $ imat, 1, result( 1 )
778 WRITE( nout, fmt = 9996 )
'ZGBSVX',
779 $ fact, trans, n, kl, ku, imat, 1,
785 IF( result( 6 ).GE.thresh )
THEN
786 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
787 $
CALL aladhd( nout, path )
789 WRITE( nout, fmt = 9995 )
'ZGBSVX',
790 $ fact, trans, n, kl, ku, equed,
791 $ imat, 6, result( 6 )
793 WRITE( nout, fmt = 9996 )
'ZGBSVX',
794 $ fact, trans, n, kl, ku, imat, 6,
800 IF( result( 7 ).GE.thresh )
THEN
801 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
802 $
CALL aladhd( nout, path )
804 WRITE( nout, fmt = 9995 )
'ZGBSVX',
805 $ fact, trans, n, kl, ku, equed,
806 $ imat, 7, result( 7 )
808 WRITE( nout, fmt = 9996 )
'ZGBSVX',
809 $ fact, trans, n, kl, ku, imat, 7,
823 CALL zlacpy(
'Full', kl+ku+1, n, asav, lda, a,
825 CALL zlacpy(
'Full', n, nrhs, bsav, ldb, b, ldb )
828 $
CALL zlaset(
'Full', 2*kl+ku+1, n,
829 $ dcmplx( zero ), dcmplx( zero ),
831 CALL zlaset(
'Full', n, nrhs,
832 $ dcmplx( zero ), dcmplx( zero ),
834 IF( iequed.GT.1 .AND. n.GT.0 )
THEN
839 CALL zlaqgb( n, n, kl, ku, a, lda, s,
840 $ s( n+1 ), rowcnd, colcnd, amax, equed )
848 CALL zgbsvxx( fact, trans, n, kl, ku, nrhs, a, lda,
849 $ afb, ldafb, iwork, equed, s, s( n+1 ), b, ldb,
850 $ x, ldb, rcond, rpvgrw_svxx, berr, n_err_bnds,
851 $ errbnds_n, errbnds_c, 0, zero, work,
856 IF( info.EQ.n+1 )
GOTO 90
857 IF( info.NE.izero )
THEN
858 CALL alaerh( path,
'ZGBSVXX', info, izero,
859 $ fact // trans, n, n, -1, -1, nrhs,
860 $ imat, nfail, nerrs, nout )
868 IF ( info .GT. 0 .AND. info .LT. n+1 )
THEN
876 result( 7 ) = abs( rpvgrw-rpvgrw_svxx ) /
877 $ max( rpvgrw_svxx, rpvgrw ) /
880 IF( .NOT.prefac )
THEN
885 CALL zgbt01( n, n, kl, ku, a, lda, afb, ldafb,
886 $ iwork, work( 2*nrhs+1 ), result( 1 ) )
897 CALL zlacpy(
'Full', n, nrhs, bsav, ldb, work,
899 CALL zgbt02( trans, n, n, kl, ku, nrhs, asav,
900 $ lda, x, ldb, work, ldb, result( 2 ) )
904 IF( nofact .OR. ( prefac .AND. lsame( equed,
906 CALL zget04( n, nrhs, x, ldb, xact, ldb,
907 $ rcondc, result( 3 ) )
909 IF( itran.EQ.1 )
THEN
914 CALL zget04( n, nrhs, x, ldb, xact, ldb,
915 $ roldc, result( 3 ) )
924 result( 6 ) = dget06( rcond, rcondc )
929 IF( .NOT.trfcon )
THEN
931 IF( result( k ).GE.thresh )
THEN
932 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
933 $
CALL aladhd( nout, path )
935 WRITE( nout, fmt = 9995 )
'ZGBSVXX',
936 $ fact, trans, n, kl, ku, equed,
937 $ imat, k, result( k )
939 WRITE( nout, fmt = 9996 )
'ZGBSVXX',
940 $ fact, trans, n, kl, ku, imat, k,
948 IF( result( 1 ).GE.thresh .AND. .NOT.prefac )
950 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
951 $
CALL aladhd( nout, path )
953 WRITE( nout, fmt = 9995 )
'ZGBSVXX', fact,
954 $ trans, n, kl, ku, equed, imat, 1,
957 WRITE( nout, fmt = 9996 )
'ZGBSVXX', fact,
958 $ trans, n, kl, ku, imat, 1,
964 IF( result( 6 ).GE.thresh )
THEN
965 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
966 $
CALL aladhd( nout, path )
968 WRITE( nout, fmt = 9995 )
'ZGBSVXX', fact,
969 $ trans, n, kl, ku, equed, imat, 6,
972 WRITE( nout, fmt = 9996 )
'ZGBSVXX', fact,
973 $ trans, n, kl, ku, imat, 6,
979 IF( result( 7 ).GE.thresh )
THEN
980 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
981 $
CALL aladhd( nout, path )
983 WRITE( nout, fmt = 9995 )
'ZGBSVXX', fact,
984 $ trans, n, kl, ku, equed, imat, 7,
987 WRITE( nout, fmt = 9996 )
'ZGBSVXX', fact,
988 $ trans, n, kl, ku, imat, 7,
1007 CALL alasvm( path, nout, nfail, nrun, nerrs )
1014 9999
FORMAT(
' *** In ZDRVGB, LA=', i5,
' is too small for N=', i5,
1015 $
', KU=', i5,
', KL=', i5, /
' ==> Increase LA to at least ',
1017 9998
FORMAT(
' *** In ZDRVGB, LAFB=', i5,
' is too small for N=', i5,
1018 $
', KU=', i5,
', KL=', i5, /
1019 $
' ==> Increase LAFB to at least ', i5 )
1020 9997
FORMAT( 1x, a,
', N=', i5,
', KL=', i5,
', KU=', i5,
', type ',
1021 $ i1,
', test(', i1,
')=', g12.5 )
1022 9996
FORMAT( 1x, a,
'( ''', a1,
''',''', a1,
''',', i5,
',', i5,
',',
1023 $ i5,
',...), type ', i1,
', test(', i1,
')=', g12.5 )
1024 9995
FORMAT( 1x, a,
'( ''', a1,
''',''', a1,
''',', i5,
',', i5,
',',
1025 $ i5,
',...), EQUED=''', a1,
''', type ', i1,
', test(', i1,
subroutine alasvm(TYPE, NOUT, NFAIL, NRUN, NERRS)
ALASVM
subroutine xlaenv(ISPEC, NVALUE)
XLAENV
subroutine aladhd(IOUNIT, PATH)
ALADHD
subroutine alaerh(PATH, SUBNAM, INFO, INFOE, OPTS, M, N, KL, KU, N5, IMAT, NFAIL, NERRS, NOUT)
ALAERH
subroutine zlarhs(PATH, XTYPE, UPLO, TRANS, M, N, KL, KU, NRHS, A, LDA, X, LDX, B, LDB, ISEED, INFO)
ZLARHS
subroutine zgbt01(M, N, KL, KU, A, LDA, AFAC, LDAFAC, IPIV, WORK, RESID)
ZGBT01
subroutine zebchvxx(THRESH, PATH)
ZEBCHVXX
subroutine zgbt05(TRANS, N, KL, KU, NRHS, AB, LDAB, B, LDB, X, LDX, XACT, LDXACT, FERR, BERR, RESLTS)
ZGBT05
subroutine zerrvx(PATH, NUNIT)
ZERRVX
subroutine zget04(N, NRHS, X, LDX, XACT, LDXACT, RCOND, RESID)
ZGET04
subroutine zdrvgb(DOTYPE, NN, NVAL, NRHS, THRESH, TSTERR, A, LA, AFB, LAFB, ASAV, B, BSAV, X, XACT, S, WORK, RWORK, IWORK, NOUT)
ZDRVGB
subroutine zlatb4(PATH, IMAT, M, N, TYPE, KL, KU, ANORM, MODE, CNDNUM, DIST)
ZLATB4
subroutine zgbt02(TRANS, M, N, KL, KU, NRHS, A, LDA, X, LDX, B, LDB, RESID)
ZGBT02
subroutine zlatms(M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX, KL, KU, PACK, A, LDA, WORK, INFO)
ZLATMS
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 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 zgbtrs(TRANS, N, KL, KU, NRHS, AB, LDAB, IPIV, B, LDB, INFO)
ZGBTRS
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 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 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 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.