172 SUBROUTINE sdrvgb( 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
187 INTEGER IWORK( * ), NVAL( * )
188 REAL A( * ), AFB( * ), ASAV( * ), B( * ), BSAV( * ),
189 $ rwork( * ), s( * ), work( * ), x( * ),
197 PARAMETER ( ONE = 1.0e+0, zero = 0.0e+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 REAL AINVNM, AMAX, ANORM, ANORMI, ANORMO, ,
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 REAL RESULT( NTESTS ), BERR( NRHS ),
223 $ errbnds_n( nrhs, 3 ), errbnds_c( nrhs, 3 )
227 REAL SGET06, SLAMCH, SLANGB, SLANGE, SLANTB,
229 EXTERNAL lsame, sget06, slamch, slangb, slange, slantb,
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 ) =
'Single precision'
266 iseed( i ) = iseedy( i )
272 $
CALL serrvx( 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 slatb4( path, imat, n, n,
TYPE, KL, KU, ANORM,
367 $ MODE, CNDNUM, DIST )
368 rcondc = one / cndnum
371 CALL slatms( n, n, dist, iseed,
TYPE, RWORK, MODE,
372 $ cndnum, anorm, kl, ku,
'Z', a, lda, work,
378 CALL alaerh( path,
'SLATMS', 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 slacpy(
'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 slacpy(
'Full', kl+ku+1, n, asav, lda,
445 $ afb( kl+1 ), ldafb )
446 IF( equil .OR. iequed.GT.1 )
THEN
451 CALL sgbequ( 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 slaqgb( n, n, kl, ku, afb( kl+1 ),
469 $ ldafb, s, s( n+1 ),
470 $ rowcnd, colcnd, amax,
485 anormo = slangb(
'1', n, kl, ku, afb( kl+1 ),
487 anormi = slangb(
'I', n, kl, ku, afb( kl+1 ),
492 CALL sgbtrf( n, n, kl, ku, afb, ldafb, iwork,
497 CALL slaset(
'Full', n, n, zero, one, work,
500 CALL sgbtrs(
'No transpose', n, kl, ku, n,
501 $ afb, ldafb, iwork, work, ldb,
506 ainvnm = slange(
'1', n, n, work, ldb,
508 IF( anormo.LE.zero .OR. ainvnm.LE.zero )
THEN
511 rcondo = ( one / anormo ) / ainvnm
517 ainvnm = slange(
'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 slacpy(
'Full', kl+ku+1, n, asav, lda,
546 CALL slarhs( path, xtype,
'Full', trans, n,
547 $ n, kl, ku, nrhs, a, lda, xact,
548 $ ldb, b, ldb, iseed, info )
550 CALL slacpy(
'Full', n, nrhs, b, ldb, bsav,
553 IF( nofact .AND. itran.EQ.1 )
THEN
560 CALL slacpy(
'Full', kl+ku+1, n, a, lda,
561 $ afb( kl+1 ), ldafb )
562 CALL slacpy(
'Full', n, nrhs, b, ldb, x,
566 CALL sgbsv( n, kl, ku, nrhs, afb, ldafb,
567 $ iwork, x, ldb, info )
572 $
CALL alaerh( path,
'SGBSV ', info,
573 $ izero,
' ', n, n, kl, ku,
574 $ nrhs, imat, nfail, nerrs,
580 CALL sgbt01( n, n, kl, ku, a, lda, afb,
581 $ ldafb, iwork, work,
584 IF( izero.EQ.0 )
THEN
589 CALL slacpy(
'Full', n, nrhs, b, ldb,
591 CALL sgbt02(
'No transpose', n, n, kl,
592 $ ku, nrhs, a, lda, x, ldb,
599 CALL sget04( 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 )
'SGBSV '
612 $ n, kl, ku, imat, k, result( k )
622 $
CALL slaset(
'Full', 2*kl+ku+1, n, zero,
624 CALL slaset(
'Full', n, nrhs, zero, zero, x,
626 IF( iequed.GT.1 .AND. n.GT.0 )
THEN
631 CALL slaqgb( n, n, kl, ku, a, lda, s,
632 $ s( n+1 ), rowcnd, colcnd,
640 CALL SGBSVX( 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, 'sgbsvx', 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 = SLANTB( 'm
', 'u
', 'n
', INFO,
667 $ MIN( INFO-1, KL+KU ),
668 $ AFB( MAX( 1, KL+KU+2-INFO ) ),
670.EQ.
IF( RPVGRWZERO ) THEN
673 RPVGRW = ANRMPV / RPVGRW
676 RPVGRW = SLANTB( 'm
', 'u
', 'n
', N, KL+KU,
678.EQ.
IF( RPVGRWZERO ) THEN
681 RPVGRW = SLANGB( 'm
', N, KL, KU, A,
682 $ LDA, WORK ) / RPVGRW
685 RESULT( 7 ) = ABS( RPVGRW-WORK( 1 ) ) /
686 $ MAX( WORK( 1 ), RPVGRW ) /
689.NOT.
IF( PREFAC ) THEN
694 CALL SGBT01( N, N, KL, KU, A, LDA, AFB,
695 $ LDAFB, IWORK, WORK,
707 CALL SLACPY( 'full
', N, NRHS, BSAV, LDB,
709 CALL SGBT02( TRANS, N, N, KL, KU, NRHS,
710 $ ASAV, LDA, X, LDB, WORK, LDB,
717.OR..AND.
IF( NOFACT ( PREFAC
718 $ LSAME( EQUED, 'n
' ) ) ) THEN
719 CALL SGET04( N, NRHS, X, LDB, XACT,
720 $ LDB, RCONDC, RESULT( 3 ) )
722.EQ.
IF( ITRAN1 ) THEN
727 CALL SGET04( N, NRHS, X, LDB, XACT,
728 $ LDB, ROLDC, RESULT( 3 ) )
734 CALL SGBT05( TRANS, N, KL, KU, NRHS, ASAV,
735 $ LDA, B, LDB, X, LDB, XACT,
736 $ LDB, RWORK, RWORK( NRHS+1 ),
745 RESULT( 6 ) = SGET06( 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 $ 'sgbsvx', FACT, TRANS, N, KL,
758 $ KU, EQUED, IMAT, K,
761 WRITE( NOUT, FMT = 9996 )
762 $ 'sgbsvx', 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 )'sgbsvx',
776 $ FACT, TRANS, N, KL, KU, EQUED,
777 $ IMAT, 1, RESULT( 1 )
779 WRITE( NOUT, FMT = 9996 )'sgbsvx',
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 )'sgbsvx',
791 $ FACT, TRANS, N, KL, KU, EQUED,
792 $ IMAT, 6, RESULT( 6 )
794 WRITE( NOUT, FMT = 9996 )'sgbsvx',
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 )'sgbsvx',
806 $ FACT, TRANS, N, KL, KU, EQUED,
807 $ IMAT, 7, RESULT( 7 )
809 WRITE( NOUT, FMT = 9996 )'sgbsvx',
810 $ FACT, TRANS, N, KL, KU, IMAT, 7,
823 CALL SLACPY( 'full
', KL+KU+1, N, ASAV, LDA, A,
825 CALL SLACPY( 'full
', N, NRHS, BSAV, LDB, B, LDB )
828 $ CALL SLASET( 'full
', 2*KL+KU+1, N, ZERO, ZERO,
830 CALL SLASET( 'full
', N, NRHS, ZERO, ZERO, X, LDB )
831.GT..AND..GT.
IF( IEQUED1 N0 ) THEN
836 CALL SLAQGB( N, N, KL, KU, A, LDA, S,
837 $ S( N+1 ), ROWCND, COLCND, AMAX, EQUED )
845 CALL SGBSVXX( 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, 'sgbsvxx', 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 = SLA_GBRPVGRW(N, KL, KU, INFO, A, LDA,
869 RPVGRW = SLA_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 SGBT01( N, N, KL, KU, A, LDA, AFB, LDAFB,
895 CALL SLACPY( 'full
', N, NRHS, BSAV, LDB, WORK,
897 CALL SGBT02( TRANS, N, N, KL, KU, NRHS, ASAV,
898 $ LDA, X, LDB, WORK, LDB, RWORK,
903.OR..AND.
IF( NOFACT ( PREFAC LSAME( EQUED,
905 CALL SGET04( N, NRHS, X, LDB, XACT, LDB,
906 $ RCONDC, RESULT( 3 ) )
908.EQ.
IF( ITRAN1 ) THEN
913 CALL SGET04( N, NRHS, X, LDB, XACT, LDB,
914 $ ROLDC, RESULT( 3 ) )
923 RESULT( 6 ) = SGET06( RCOND, RCONDC )
928.NOT.
IF( TRFCON ) THEN
930.GE.
IF( RESULT( K )THRESH ) THEN
931.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
932 $ CALL ALADHD( NOUT, PATH )
934 WRITE( NOUT, FMT = 9995 )'sgbsvxx',
935 $ FACT, TRANS, N, KL, KU, EQUED,
936 $ IMAT, K, RESULT( K )
938 WRITE( NOUT, FMT = 9996 )'sgbsvxx',
939 $ FACT, TRANS, N, KL, KU, IMAT, K,
947.GE..AND..NOT.
IF( RESULT( 1 )THRESH PREFAC )
949.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
950 $ CALL ALADHD( NOUT, PATH )
952 WRITE( NOUT, FMT = 9995 )'sgbsvxx', FACT,
953 $ TRANS, N, KL, KU, EQUED, IMAT, 1,
956 WRITE( NOUT, FMT = 9996 )'sgbsvxx', FACT,
957 $ TRANS, N, KL, KU, IMAT, 1,
963.GE.
IF( RESULT( 6 )THRESH ) THEN
964.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
965 $ CALL ALADHD( NOUT, PATH )
967 WRITE( NOUT, FMT = 9995 )'sgbsvxx', FACT,
968 $ TRANS, N, KL, KU, EQUED, IMAT, 6,
971 WRITE( NOUT, FMT = 9996 )'sgbsvxx', fact,
972 $ trans, n, kl, ku, imat, 6,
978 IF( result( 7 ).GE.thresh )
THEN
979 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
980 $
CALL aladhd( nout, path )
982 WRITE( nout, fmt = 9995 )
'SGBSVXX', fact,
983 $ trans, n, kl, ku, equed, imat, 7,
986 WRITE( nout, fmt = 9996 )
'SGBSVXX', fact,
987 $ trans, n, kl, ku, imat, 7,
1006 CALL alasvm( path, nout, nfail, nrun, nerrs )
1013 9999
FORMAT(
' *** In SDRVGB, LA=', i5,
' is too small for N=', i5,
1014 $
', KU=', i5,
', KL=', i5, /
' ==> Increase LA to at least ',
1016 9998
FORMAT(
' *** In SDRVGB, LAFB=', i5,
' is too small for N=', i5,
1017 $
', KU=', i5,
', KL=', i5, /
1018 $
' ==> Increase LAFB to at least ', i5 )
1019 9997
FORMAT( 1x, a,
', N=', i5,
', KL=', i5,
', KU=', i5, ',
type ',
1020 $ I1, ', test(
', I1, ')=
', G12.5 )
1021 9996 FORMAT( 1X, A, '(
''', A1, ''',
''', A1, ''',
', I5, ',
', I5, ',
',
1022 $ I5, ',...),
type ', I1, ', test(
', I1, ')=
', G12.5 )
1023 9995 FORMAT( 1X, A, '(
''', A1, ''',
''', A1, ''',
', I5, ',
', I5, ',
',
1024 $ I5, ',...), equed=
''', a1,
''', type ', i1,
', test(', i1,
subroutine slaset(uplo, m, n, alpha, beta, a, lda)
SLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine slacpy(uplo, m, n, a, lda, b, ldb)
SLACPY copies all or part of one two-dimensional array to another.
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 slaqgb(m, n, kl, ku, ab, ldab, r, c, rowcnd, colcnd, amax, equed)
SLAQGB scales a general band matrix, using row and column scaling factors computed by sgbequ.
subroutine sgbtrf(m, n, kl, ku, ab, ldab, ipiv, info)
SGBTRF
subroutine sgbequ(m, n, kl, ku, ab, ldab, r, c, rowcnd, colcnd, amax, info)
SGBEQU
real function sla_gbrpvgrw(n, kl, ku, ncols, ab, ldab, afb, ldafb)
SLA_GBRPVGRW computes the reciprocal pivot growth factor norm(A)/norm(U) for a general banded matrix.
subroutine sgbtrs(trans, n, kl, ku, nrhs, ab, ldab, ipiv, b, ldb, info)
SGBTRS
subroutine sgbsvxx(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)
SGBSVXX computes the solution to system of linear equations A * X = B for GB matrices
subroutine sgbsvx(fact, trans, n, kl, ku, nrhs, ab, ldab, afb, ldafb, ipiv, equed, r, c, b, ldb, x, ldx, rcond, ferr, berr, work, iwork, info)
SGBSVX computes the solution to system of linear equations A * X = B for GB matrices
subroutine sgbsv(n, kl, ku, nrhs, ab, ldab, ipiv, b, ldb, info)
SGBSV computes the solution to system of linear equations A * X = B for GB matrices (simple driver)
subroutine slatms(m, n, dist, iseed, sym, d, mode, cond, dmax, kl, ku, pack, a, lda, work, info)
SLATMS
subroutine slarhs(path, xtype, uplo, trans, m, n, kl, ku, nrhs, a, lda, x, ldx, b, ldb, iseed, info)
SLARHS
subroutine sgbt05(trans, n, kl, ku, nrhs, ab, ldab, b, ldb, x, ldx, xact, ldxact, ferr, berr, reslts)
SGBT05
subroutine sgbt02(trans, m, n, kl, ku, nrhs, a, lda, x, ldx, b, ldb, rwork, resid)
SGBT02
subroutine serrvx(path, nunit)
SERRVX
subroutine sgbt01(m, n, kl, ku, a, lda, afac, ldafac, ipiv, work, resid)
SGBT01
subroutine sdrvgb(dotype, nn, nval, nrhs, thresh, tsterr, a, la, afb, lafb, asav, b, bsav, x, xact, s, work, rwork, iwork, nout)
SDRVGB
subroutine sebchvxx(thresh, path)
SEBCHVXX
subroutine sget04(n, nrhs, x, ldx, xact, ldxact, rcond, resid)
SGET04
subroutine slatb4(path, imat, m, n, type, kl, ku, anorm, mode, cndnum, dist)
SLATB4