172 SUBROUTINE ddrvgb( 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, , NN, NOUT, NRHS
183 DOUBLE PRECISION THRESH
187 INTEGER IWORK( * ), NVAL( * )
188 DOUBLE PRECISION A( * ), AFB( * ), ASAV( * ), B( * ), BSAV( * ),
189 $ rwork( * ), s( * ), work( * ), x( * ),
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 RESULT( NTESTS ), BERR( NRHS ),
223 $ errbnds_n( nrhs, 3 ), errbnds_c( nrhs, 3 )
227 DOUBLE PRECISION DGET06, DLAMCH, DLANGB, DLANGE, DLANTB,
229 EXTERNAL lsame, dget06, dlamch, dlangb, dlange, dlantb,
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 ) =
'Double precision'
266 iseed( i ) = iseedy( i )
272 $
CALL derrvx( 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 dlatb4( path, imat, n, n
TYPE, KL, KU, ANORM,
367 $ MODE, CNDNUM, DIST )
368 rcondc = one / cndnum
371 CALL dlatms( n, n, dist, iseed,
TYPE, RWORK, MODE,
372 $ cndnum, anorm, kl, ku,
'Z', a, lda, work,
378 CALL alaerh( path,
'DLATMS', info
' '
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 dlacpy(
'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
445 $ afb( kl+1 ), ldafb )
446 IF( equil .OR. iequed.GT.1 )
THEN
451 CALL dgbequ( 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 dlaqgb( n, n, kl, ku, afb( kl+1 ),
469 $ ldafb, s, s( n+1 ),
470 $ rowcnd, colcnd, amax,
485 anormo = dlangb(
'1', n, kl, ku, afb( kl+1 ),
487 anormi = dlangb(
'I', n, kl, ku, afb( kl+1 ),
492 CALL dgbtrf( n, n, kl, ku, afb, ldafb, iwork,
497 CALL dlaset(
'Full', n, n, zero, one, work,
500 CALL dgbtrs(
'No transpose', n, kl, ku, n,
501 $ afb, ldafb, iwork, work, ldb,
506 ainvnm = dlange(
'1', n, n, work, ldb,
508 IF( anormo.LE.zero .OR. ainvnm.LE.zero )
THEN
511 rcondo = ( one / anormo ) / ainvnm
517 ainvnm = dlange(
'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
531 IF( itran.EQ.1 )
THEN
539 CALL dlacpy(
'Full', kl+ku+1, n, asav, lda,
546 CALL dlarhs( path, xtype,
'Full', trans, n,
547 $ n, kl, ku, nrhs, a, lda, xact,
548 $ ldb, b, ldb, iseed, info )
550 CALL dlacpy(
'Full', n, nrhs, b, ldb, bsav,
553 IF( nofact .AND. itran.EQ.1 )
THEN
560 CALL dlacpy(
'Full', kl+ku+1, n, a, lda,
561 $ afb( kl+1 ), ldafb )
562 CALL dlacpy(
'Full', n, nrhs, b, ldb, x,
566 CALL dgbsv( n, kl, ku, nrhs, afb, ldafb,
567 $ iwork, x, ldb, info )
572 $
CALL alaerh( path,
'DGBSV ', info,
573 $ izero,
' ', n, n, kl, ku,
574 $ nrhs, imat, nfail, nerrs,
580 CALL dgbt01( n, n, kl, ku, a, lda, afb,
581 $ ldafb, iwork, work,
584 IF( izero.EQ.0 )
THEN
589 CALL dlacpy(
'Full', n, nrhs, b, ldb,
591 CALL dgbt02(
'No transpose', n, n, kl,
592 $ ku, nrhs, a, lda, x, ldb,
599 CALL dget04( n, nrhs, x, ldb, xact,
600 $ ldb, rcondc, result( 3 ) )
608 IF( result( k ).GE.thresh )
THEN
609 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
610 $
CALL aladhd( nout, path )
611 WRITE( nout, fmt = 9997 )
'DGBSV ',
612 $ n, kl, ku, imat, k, result( k )
622 $
CALL dlaset(
'Full', 2*kl+ku+1, n, zero,
624 CALL dlaset(
'Full', n, nrhs, zero, zero, x,
626 IF( iequed.GT.1 .AND. n.GT.0 )
THEN
631 CALL dlaqgb( n, n, kl, ku, a, lda, s,
632 $ s( n+1 ), rowcnd, colcnd,
640 CALL dgbsvx( fact, trans, n, kl, ku, nrhs, a,
641 $ lda, afb, ldafb, iwork, equed,
642 $ s, s( n+1 ), b, ldb, x, ldb,
643 $ rcond, rwork, rwork( nrhs+1 ),
644 $ work, iwork( n+1 ), info )
649 $
CALL alaerh( path,
'DGBSVX', 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 = dlantb(
'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 = dlantb(
'M',
'U',
'N', n, kl+ku,
678 IF( rpvgrw.EQ.zero )
THEN
681 rpvgrw = dlangb(
'M', n, kl, ku, a,
682 $ lda, work ) / rpvgrw
685 result( 7 ) = abs( rpvgrw-work( 1 ) ) /
686 $
max( work( 1 ), rpvgrw ) /
689 IF( .NOT.prefac )
THEN
694 CALL dgbt01( n, n, kl, ku, a, lda, afb,
695 $ ldafb, iwork, work,
707 CALL dlacpy(
'Full', n, nrhs, bsav, ldb,
709 CALL dgbt02( trans, n, n, kl, ku, nrhs,
710 $ asav, lda, x, ldb, work, ldb,
717 IF( nofact .OR. ( prefac .AND.
718 $ lsame( equed, 'n
' ) ) ) THEN
719 CALL DGET04( N, NRHS, X, LDB, XACT,
720 $ LDB, RCONDC, RESULT( 3 ) )
722.EQ.
IF( ITRAN1 ) THEN
727 CALL DGET04( N, NRHS, X, LDB, XACT,
728 $ LDB, ROLDC, RESULT( 3 ) )
734 CALL DGBT05( TRANS, N, KL, KU, NRHS, ASAV,
735 $ LDA, B, LDB, X, LDB, XACT,
736 $ LDB, RWORK, RWORK( NRHS+1 ),
745 RESULT( 6 ) = DGET06( RCOND, RCONDC )
750.NOT.
IF( TRFCON ) THEN
752.GE.
IF( RESULT( K )THRESH ) THEN
753.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
754 $ CALL ALADHD( NOUT, PATH )
756 WRITE( NOUT, FMT = 9995 )
757 $ 'dgbsvx', FACT, TRANS, N, KL,
758 $ KU, EQUED, IMAT, K,
761 WRITE( NOUT, FMT = 9996 )
762 $ 'dgbsvx', FACT, TRANS, N, KL,
763 $ KU, IMAT, K, RESULT( K )
770.GE..AND..NOT.
IF( RESULT( 1 )THRESH
772.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
773 $ CALL ALADHD( NOUT, PATH )
775 WRITE( NOUT, FMT = 9995 )'dgbsvx',
776 $ FACT, TRANS, N, KL, KU, EQUED,
777 $ IMAT, 1, RESULT( 1 )
779 WRITE( NOUT, FMT = 9996 )'dgbsvx',
780 $ FACT, TRANS, N, KL, KU, IMAT, 1,
786.GE.
IF( RESULT( 6 )THRESH ) THEN
787.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
788 $ CALL ALADHD( NOUT, PATH )
790 WRITE( NOUT, FMT = 9995 )'dgbsvx',
791 $ FACT, TRANS, N, KL, KU, EQUED,
792 $ IMAT, 6, RESULT( 6 )
794 WRITE( NOUT, FMT = 9996 )'dgbsvx',
795 $ FACT, TRANS, N, KL, KU, IMAT, 6,
801.GE.
IF( RESULT( 7 )THRESH ) THEN
802.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
803 $ CALL ALADHD( NOUT, PATH )
805 WRITE( NOUT, FMT = 9995 )'dgbsvx',
806 $ FACT, TRANS, N, KL, KU, EQUED,
807 $ IMAT, 7, RESULT( 7 )
809 WRITE( NOUT, FMT = 9996 )'dgbsvx',
810 $ FACT, TRANS, N, KL, KU, IMAT, 7,
823 CALL DLACPY( 'full
', KL+KU+1, N, ASAV, LDA, A,
825 CALL DLACPY( 'full
', N, NRHS, BSAV, LDB, B, LDB )
828 $ CALL DLASET( 'full
', 2*KL+KU+1, N, ZERO, ZERO,
830 CALL DLASET( 'full
', N, NRHS, ZERO, ZERO, X, LDB )
831.GT..AND..GT.
IF( IEQUED1 N0 ) THEN
836 CALL DLAQGB( N, N, KL, KU, A, LDA, S, S( N+1 ),
837 $ ROWCND, COLCND, AMAX, EQUED )
845 CALL DGBSVXX( FACT, TRANS, N, KL, KU, NRHS, A, LDA,
846 $ AFB, LDAFB, IWORK, EQUED, S, S( N+1 ), B, LDB,
847 $ X, LDB, RCOND, RPVGRW_SVXX, BERR, N_ERR_BNDS,
848 $ ERRBNDS_N, ERRBNDS_C, 0, ZERO, WORK,
849 $ IWORK( N+1 ), INFO )
853.EQ.
IF( INFON+1 ) GOTO 90
854.NE.
IF( INFOIZERO ) THEN
855 CALL ALAERH( PATH, 'dgbsvxx', INFO, IZERO,
856 $ FACT // TRANS, N, N, -1, -1, NRHS,
857 $ IMAT, NFAIL, NERRS, NOUT )
865.GT..AND..LT.
IF ( INFO 0 INFO N+1 ) THEN
866 RPVGRW = DLA_GBRPVGRW(N, KL, KU, INFO, A, LDA,
869 RPVGRW = DLA_GBRPVGRW(N, KL, KU, N, A, LDA,
873 RESULT( 7 ) = ABS( RPVGRW-rpvgrw_svxx ) /
874 $ MAX( rpvgrw_svxx, RPVGRW ) /
877.NOT.
IF( PREFAC ) THEN
882 CALL DGBT01( N, N, KL, KU, A, LDA, AFB, LDAFB,
883 $ IWORK, WORK, RESULT( 1 ) )
894 CALL DLACPY( 'full
', N, NRHS, BSAV, LDB, WORK,
896 CALL DGBT02( TRANS, N, N, KL, KU, NRHS, ASAV,
897 $ LDA, X, LDB, WORK, LDB, RWORK,
902.OR..AND.
IF( NOFACT ( PREFAC LSAME( EQUED,
904 CALL DGET04( N, NRHS, X, LDB, XACT, LDB,
905 $ RCONDC, RESULT( 3 ) )
907.EQ.
IF( ITRAN1 ) THEN
912 CALL DGET04( N, NRHS, X, LDB, XACT, LDB,
913 $ ROLDC, RESULT( 3 ) )
922 RESULT( 6 ) = DGET06( RCOND, RCONDC )
927.NOT.
IF( TRFCON ) THEN
929.GE.
IF( RESULT( K )THRESH ) THEN
930.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
931 $ CALL ALADHD( NOUT, PATH )
933 WRITE( NOUT, FMT = 9995 )'dgbsvxx',
934 $ FACT, TRANS, N, KL, KU, EQUED,
935 $ IMAT, K, RESULT( K )
937 WRITE( NOUT, FMT = 9996 )'dgbsvxx',
938 $ FACT, TRANS, N, KL, KU, IMAT, K,
946.GE..AND..NOT.
IF( RESULT( 1 )THRESH PREFAC )
948.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
949 $ CALL ALADHD( NOUT, PATH )
951 WRITE( NOUT, FMT = 9995 )'dgbsvxx', FACT,
952 $ TRANS, N, KL, KU, EQUED, IMAT, 1,
955 WRITE( NOUT, FMT = 9996 )'dgbsvxx', FACT,
956 $ TRANS, N, KL, KU, IMAT, 1,
962.GE.
IF( RESULT( 6 )THRESH ) THEN
963.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
964 $ CALL ALADHD( NOUT, PATH )
966 WRITE( NOUT, FMT = 9995 )'dgbsvxx', FACT,
967 $ TRANS, N, KL, KU, EQUED, IMAT, 6,
970 WRITE( NOUT, FMT = 9996 )'dgbsvxx', FACT,
971 $ TRANS, N, KL, KU, IMAT, 6,
977.GE.
IF( RESULT( 7 )THRESH ) THEN
978.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
979 $ CALL ALADHD( NOUT, PATH )
981 WRITE( NOUT, FMT = 9995 )'dgbsvxx', FACT,
982 $ TRANS, N, KL, KU, EQUED, IMAT, 7,
985 WRITE( NOUT, FMT = 9996 )'dgbsvxx', FACT,
986 $ TRANS, N, KL, KU, IMAT, 7,
1004 CALL ALASVM( PATH, NOUT, NFAIL, NRUN, NERRS )
1008 CALL DEBCHVXX(THRESH, PATH)
1010 9999 FORMAT( ' *** in
ddrvgb, la=
', I5, ' is too small
for n=
', I5,
1011 $ ', ku=
', I5, ', kl=
', I5, / ' ==> increase la to at least
',
1013 9998 FORMAT( ' *** in
ddrvgb, lafb=
', I5, ' is too small
for n=
', I5,
1014 $ ', ku=
', I5, ', kl=
', I5, /
1015 $ ' ==> increase lafb to at least
', I5 )
1016 9997 FORMAT( 1X, A, ', n=
', I5, ', kl=
', I5, ', ku=
', I5, ',
type ',
1017 $ I1, ', test(
', I1, ')=
', G12.5 )
1018 9996 FORMAT( 1X, A, '(
''', A1, ''',
''', A1, ''',
', I5, ',
', I5, ',
',
1019 $ I5, ',...),
type ', I1, ', test(
', I1, ')=
', G12.5 )
1020 9995 FORMAT( 1X, A, '(
''', A1, ''',
''', A1, ''',
', I5, ',
', I5, ',
',
1021 $ I5, ',...), equed=
''', A1, ''',
type ', I1, ', test(
', I1,
subroutine dlacpy(uplo, m, n, a, lda, b, ldb)
DLACPY copies all or part of one two-dimensional array to another.
subroutine dlaset(uplo, m, n, alpha, beta, a, lda)
DLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
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 dlaqgb(m, n, kl, ku, ab, ldab, r, c, rowcnd, colcnd, amax, equed)
DLAQGB scales a general band matrix, using row and column scaling factors computed by sgbequ.
subroutine dgbtrs(trans, n, kl, ku, nrhs, ab, ldab, ipiv, b, ldb, info)
DGBTRS
subroutine dgbequb(m, n, kl, ku, ab, ldab, r, c, rowcnd, colcnd, amax, info)
DGBEQUB
subroutine dgbequ(m, n, kl, ku, ab, ldab, r, c, rowcnd, colcnd, amax, info)
DGBEQU
subroutine dgbtrf(m, n, kl, ku, ab, ldab, ipiv, info)
DGBTRF
double precision function dla_gbrpvgrw(n, kl, ku, ncols, ab, ldab, afb, ldafb)
DLA_GBRPVGRW computes the reciprocal pivot growth factor norm(A)/norm(U) for a general banded matrix.
subroutine dgbsvx(fact, trans, n, kl, ku, nrhs, ab, ldab, afb, ldafb, ipiv, equed, r, c, b, ldb, x, ldx, rcond, ferr, berr, work, iwork, info)
DGBSVX computes the solution to system of linear equations A * X = B for GB matrices
subroutine dgbsvxx(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, iwork, info)
DGBSVXX computes the solution to system of linear equations A * X = B for GB matrices
subroutine dgbsv(n, kl, ku, nrhs, ab, ldab, ipiv, b, ldb, info)
DGBSV computes the solution to system of linear equations A * X = B for GB matrices (simple driver)
subroutine dlarhs(path, xtype, uplo, trans, m, n, kl, ku, nrhs, a, lda, x, ldx, b, ldb, iseed, info)
DLARHS
subroutine ddrvgb(dotype, nn, nval, nrhs, thresh, tsterr, a, la, afb, lafb, asav, b, bsav, x, xact, s, work, rwork, iwork, nout)
DDRVGB
subroutine derrvx(path, nunit)
DERRVX
subroutine dgbt02(trans, m, n, kl, ku, nrhs, a, lda, x, ldx, b, ldb, rwork, resid)
DGBT02
subroutine dgbt05(trans, n, kl, ku, nrhs, ab, ldab, b, ldb, x, ldx, xact, ldxact, ferr, berr, reslts)
DGBT05
subroutine dlatb4(path, imat, m, n, type, kl, ku, anorm, mode, cndnum, dist)
DLATB4
subroutine dgbt01(m, n, kl, ku, a, lda, afac, ldafac, ipiv, work, resid)
DGBT01
subroutine dget04(n, nrhs, x, ldx, xact, ldxact, rcond, resid)
DGET04
subroutine dlatms(m, n, dist, iseed, sym, d, mode, cond, dmax, kl, ku, pack, a, lda, work, info)
DLATMS
for(i8=*sizetab-1;i8 >=0;i8--)