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, LAFB, 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,
239 INTRINSIC abs, 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 ) =
'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, 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 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
444 CALL dlacpy(
'Full', kl+ku+1, n, asav, lda,
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
530 trans = transs( itran )
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,
593 $ work, ldb, result( 2 ) )
598 CALL dget04( 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 )
'DGBSV ',
611 $ n, kl, ku, imat, k, result( k )
621 $
CALL dlaset(
'Full', 2*kl+ku+1, n, zero,
623 CALL dlaset(
'Full', n, nrhs, zero, zero, x,
625 IF( iequed.GT.1 .AND. n.GT.0 )
THEN
630 CALL dlaqgb( n, n, kl, ku, a, lda, s,
631 $ s( n+1 ), rowcnd, colcnd,
639 CALL dgbsvx( fact, trans, n, kl, ku, nrhs, a,
640 $ lda, afb, ldafb, iwork, equed,
641 $ s, s( n+1 ), b, ldb, x, ldb,
642 $ rcond, rwork, rwork( nrhs+1 ),
643 $ work, iwork( n+1 ), info )
648 $
CALL alaerh( path,
'DGBSVX', info, izero,
649 $ fact // trans, n, n, kl, ku,
650 $ nrhs, imat, nfail, nerrs,
659 DO 60 i = max( ku+2-j, 1 ),
660 $ min( n+ku+1-j, kl+ku+1 )
661 anrmpv = max( anrmpv,
662 $ abs( a( i+( j-1 )*lda ) ) )
665 rpvgrw = dlantb(
'M',
'U',
'N', info,
666 $ min( info-1, kl+ku ),
667 $ afb( max( 1, kl+ku+2-info ) ),
669 IF( rpvgrw.EQ.zero )
THEN
672 rpvgrw = anrmpv / rpvgrw
675 rpvgrw = dlantb(
'M',
'U',
'N', n, kl+ku,
677 IF( rpvgrw.EQ.zero )
THEN
680 rpvgrw = dlangb(
'M', n, kl, ku, a,
681 $ lda, work ) / rpvgrw
684 result( 7 ) = abs( rpvgrw-work( 1 ) ) /
685 $ max( work( 1 ), rpvgrw ) /
688 IF( .NOT.prefac )
THEN
693 CALL dgbt01( n, n, kl, ku, a, lda, afb,
694 $ ldafb, iwork, work,
706 CALL dlacpy(
'Full', n, nrhs, bsav, ldb,
708 CALL dgbt02( trans, n, n, kl, ku, nrhs,
709 $ asav, lda, x, ldb, work, ldb,
715 IF( nofact .OR. ( prefac .AND.
716 $ lsame( equed,
'N' ) ) )
THEN
717 CALL dget04( n, nrhs, x, ldb, xact,
718 $ ldb, rcondc, result( 3 ) )
720 IF( itran.EQ.1 )
THEN
725 CALL dget04( n, nrhs, x, ldb, xact,
726 $ ldb, roldc, result( 3 ) )
732 CALL dgbt05( trans, n, kl, ku, nrhs, asav,
733 $ lda, b, ldb, x, ldb, xact,
734 $ ldb, rwork, rwork( nrhs+1 ),
743 result( 6 ) = dget06( rcond, rcondc )
748 IF( .NOT.trfcon )
THEN
750 IF( result( k ).GE.thresh )
THEN
751 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
752 $
CALL aladhd( nout, path )
754 WRITE( nout, fmt = 9995 )
755 $
'DGBSVX', fact, trans, n, kl,
756 $ ku, equed, imat, k,
759 WRITE( nout, fmt = 9996 )
760 $
'DGBSVX', fact, trans, n, kl,
761 $ ku, imat, k, result( k )
768 IF( result( 1 ).GE.thresh .AND. .NOT.
770 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
771 $
CALL aladhd( nout, path )
773 WRITE( nout, fmt = 9995 )
'DGBSVX',
774 $ fact, trans, n, kl, ku, equed,
775 $ imat, 1, result( 1 )
777 WRITE( nout, fmt = 9996 )
'DGBSVX',
778 $ fact, trans, n, kl, ku, imat, 1,
784 IF( result( 6 ).GE.thresh )
THEN
785 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
786 $
CALL aladhd( nout, path )
788 WRITE( nout, fmt = 9995 )
'DGBSVX',
789 $ fact, trans, n, kl, ku, equed,
790 $ imat, 6, result( 6 )
792 WRITE( nout, fmt = 9996 )
'DGBSVX',
793 $ fact, trans, n, kl, ku, imat, 6,
799 IF( result( 7 ).GE.thresh )
THEN
800 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
801 $
CALL aladhd( nout, path )
803 WRITE( nout, fmt = 9995 )
'DGBSVX',
804 $ fact, trans, n, kl, ku, equed,
805 $ imat, 7, result( 7 )
807 WRITE( nout, fmt = 9996 )
'DGBSVX',
808 $ fact, trans, n, kl, ku, imat, 7,
821 CALL dlacpy(
'Full', kl+ku+1, n, asav, lda, a,
823 CALL dlacpy(
'Full', n, nrhs, bsav, ldb, b, ldb )
826 $
CALL dlaset(
'Full', 2*kl+ku+1, n, zero, zero,
828 CALL dlaset(
'Full', n, nrhs, zero, zero, x, ldb )
829 IF( iequed.GT.1 .AND. n.GT.0 )
THEN
834 CALL dlaqgb( n, n, kl, ku, a, lda, s, s( n+1 ),
835 $ rowcnd, colcnd, amax, equed )
843 CALL dgbsvxx( fact, trans, n, kl, ku, nrhs, a, lda,
844 $ afb, ldafb, iwork, equed, s, s( n+1 ), b, ldb,
845 $ x, ldb, rcond, rpvgrw_svxx, berr, n_err_bnds,
846 $ errbnds_n, errbnds_c, 0, zero, work,
847 $ iwork( n+1 ), info )
851 IF( info.EQ.n+1 )
GOTO 90
852 IF( info.NE.izero )
THEN
853 CALL alaerh( path,
'DGBSVXX', info, izero,
854 $ fact // trans, n, n, -1, -1, nrhs,
855 $ imat, nfail, nerrs, nout )
863 IF ( info .GT. 0 .AND. info .LT. n+1 )
THEN
871 result( 7 ) = abs( rpvgrw-rpvgrw_svxx ) /
872 $ max( rpvgrw_svxx, rpvgrw ) /
875 IF( .NOT.prefac )
THEN
880 CALL dgbt01( n, n, kl, ku, a, lda, afb, ldafb,
881 $ iwork, work, result( 1 ) )
892 CALL dlacpy(
'Full', n, nrhs, bsav, ldb, work,
894 CALL dgbt02( trans, n, n, kl, ku, nrhs, asav,
895 $ lda, x, ldb, work, ldb,
900 IF( nofact .OR. ( prefac .AND. lsame( equed,
902 CALL dget04( n, nrhs, x, ldb, xact, ldb,
903 $ rcondc, result( 3 ) )
905 IF( itran.EQ.1 )
THEN
910 CALL dget04( n, nrhs, x, ldb, xact, ldb,
911 $ roldc, result( 3 ) )
920 result( 6 ) = dget06( rcond, rcondc )
925 IF( .NOT.trfcon )
THEN
927 IF( result( k ).GE.thresh )
THEN
928 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
929 $
CALL aladhd( nout, path )
931 WRITE( nout, fmt = 9995 )
'DGBSVXX',
932 $ fact, trans, n, kl, ku, equed,
933 $ imat, k, result( k )
935 WRITE( nout, fmt = 9996 )
'DGBSVXX',
936 $ fact, trans, n, kl, ku, imat, k,
944 IF( result( 1 ).GE.thresh .AND. .NOT.prefac )
946 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
947 $
CALL aladhd( nout, path )
949 WRITE( nout, fmt = 9995 )
'DGBSVXX', fact,
950 $ trans, n, kl, ku, equed, imat, 1,
953 WRITE( nout, fmt = 9996 )
'DGBSVXX', fact,
954 $ trans, n, kl, ku, imat, 1,
960 IF( result( 6 ).GE.thresh )
THEN
961 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
962 $
CALL aladhd( nout, path )
964 WRITE( nout, fmt = 9995 )
'DGBSVXX', fact,
965 $ trans, n, kl, ku, equed, imat, 6,
968 WRITE( nout, fmt = 9996 )
'DGBSVXX', fact,
969 $ trans, n, kl, ku, imat, 6,
975 IF( result( 7 ).GE.thresh )
THEN
976 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
977 $
CALL aladhd( nout, path )
979 WRITE( nout, fmt = 9995 )
'DGBSVXX', fact,
980 $ trans, n, kl, ku, equed, imat, 7,
983 WRITE( nout, fmt = 9996 )
'DGBSVXX', fact,
984 $ trans, n, kl, ku, imat, 7,
1002 CALL alasvm( path, nout, nfail, nrun, nerrs )
1008 9999
FORMAT(
' *** In DDRVGB, LA=', i5,
' is too small for N=', i5,
1009 $
', KU=', i5,
', KL=', i5, /
' ==> Increase LA to at least ',
1011 9998
FORMAT(
' *** In DDRVGB, LAFB=', i5,
' is too small for N=', i5,
1012 $
', KU=', i5,
', KL=', i5, /
1013 $
' ==> Increase LAFB to at least ', i5 )
1014 9997
FORMAT( 1x, a,
', N=', i5,
', KL=', i5,
', KU=', i5,
', type ',
1015 $ i1,
', test(', i1,
')=', g12.5 )
1016 9996
FORMAT( 1x, a,
'( ''', a1,
''',''', a1,
''',', i5,
',', i5,
',',
1017 $ i5,
',...), type ', i1,
', test(', i1,
')=', g12.5 )
1018 9995
FORMAT( 1x, a,
'( ''', a1,
''',''', a1,
''',', i5,
',', i5,
',',
1019 $ 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 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 dlarhs(PATH, XTYPE, UPLO, TRANS, M, N, KL, KU, NRHS, A, LDA, X, LDX, B, LDB, ISEED, INFO)
DLARHS
subroutine dget04(N, NRHS, X, LDX, XACT, LDXACT, RCOND, RESID)
DGET04
subroutine dgbt01(M, N, KL, KU, A, LDA, AFAC, LDAFAC, IPIV, WORK, RESID)
DGBT01
subroutine dgbt05(TRANS, N, KL, KU, NRHS, AB, LDAB, B, LDB, X, LDX, XACT, LDXACT, FERR, BERR, RESLTS)
DGBT05
subroutine dgbt02(TRANS, M, N, KL, KU, NRHS, A, LDA, X, LDX, B, LDB, RESID)
DGBT02
subroutine ddrvgb(DOTYPE, NN, NVAL, NRHS, THRESH, TSTERR, A, LA, AFB, LAFB, ASAV, B, BSAV, X, XACT, S, WORK, RWORK, IWORK, NOUT)
DDRVGB
subroutine dlatb4(PATH, IMAT, M, N, TYPE, KL, KU, ANORM, MODE, CNDNUM, DIST)
DLATB4
subroutine derrvx(PATH, NUNIT)
DERRVX
subroutine debchvxx(THRESH, PATH)
DEBCHVXX
subroutine dlatms(M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX, KL, KU, PACK, A, LDA, WORK, INFO)
DLATMS
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.
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 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 dgbtrf(M, N, KL, KU, AB, LDAB, IPIV, INFO)
DGBTRF
subroutine dgbequ(M, N, KL, KU, AB, LDAB, R, C, ROWCND, COLCND, AMAX, INFO)
DGBEQU
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)