172 SUBROUTINE cdrvgb( 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 RWORK( * ), S( * )
189 COMPLEX A( * ), AFB( * ), ASAV( * ), B( * ), BSAV( * ),
190 $ work( * ), x( * ), xact( * )
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, 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 REAL RDUM( 1 ), RESULT( NTESTS ), BERR( NRHS ),
223 $ errbnds_n( nrhs,3 ), errbnds_c( nrhs, 3 )
227 REAL CLANGB, CLANGE, CLANTB, SGET06, SLAMCH,
229 EXTERNAL lsame, clangb, clange, clantb, sget06, slamch,
239 INTRINSIC abs, cmplx, 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 ) =
'Complex precision'
266 iseed( i ) = iseedy( i )
272 $
CALL cerrvx( 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 clatb4( path, imat, n, n,
TYPE, KL, KU, ANORM,
367 $ MODE, CNDNUM, DIST )
368 rcondc = one / cndnum
371 CALL clatms( n, n, dist, iseed,
TYPE, RWORK, MODE,
372 $ cndnum, anorm, kl, ku,
'Z', a, lda, work,
378 CALL alaerh( path,
'CLATMS', 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 clacpy(
'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 clacpy(
'Full', kl+ku+1, n, asav, lda,
445 $ afb( kl+1 ), ldafb )
446 IF( equil .OR. iequed.GT.1 )
THEN
451 CALL cgbequ( 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 claqgb( n, n, kl, ku, afb( kl+1 ),
469 $ ldafb, s, s( n+1 ),
470 $ rowcnd, colcnd, amax,
485 anormo = clangb(
'1', n, kl, ku, afb( kl+1 ),
487 anormi = clangb(
'I', n, kl, ku, afb( kl+1 ),
492 CALL cgbtrf( n, n, kl, ku, afb, ldafb, iwork,
497 CALL claset(
'Full', n, n, cmplx( zero ),
498 $ cmplx( one ), work, ldb )
500 CALL cgbtrs(
'No transpose', n, kl, ku, n,
501 $ afb, ldafb, iwork, work, ldb,
506 ainvnm = clange(
'1', n, n, work, ldb,
508 IF( anormo.LE.zero .OR. ainvnm.LE.zero )
THEN
511 rcondo = ( one / anormo ) / ainvnm
517 ainvnm = clange(
'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 clacpy(
'Full', kl+ku+1, n, asav, lda,
546 CALL clarhs( path, xtype,
'Full', trans, n,
547 $ n, kl, ku, nrhs, a, lda, xact,
548 $ ldb, b, ldb, iseed, info )
550 CALL clacpy(
'Full', n, nrhs, b, ldb, bsav,
553 IF( nofact .AND. itran.EQ.1 )
THEN
560 CALL clacpy(
'Full', kl+ku+1, n, a, lda,
561 $ afb( kl+1 ), ldafb )
562 CALL clacpy(
'Full', n, nrhs, b, ldb, x,
566 CALL cgbsv( n, kl, ku, nrhs, afb, ldafb,
567 $ iwork, x, ldb, info )
572 $
CALL alaerh( path,
'CGBSV ', info,
573 $ izero,
' ', n, n, kl, ku,
574 $ nrhs, imat, nfail, nerrs,
580 CALL cgbt01( n, n, kl, ku, a, lda, afb,
581 $ ldafb, iwork, work,
584 IF( izero.EQ.0 )
THEN
589 CALL clacpy(
'Full', n, nrhs, b, ldb,
591 CALL cgbt02(
'No transpose', n, n, kl,
592 $ ku, nrhs, a, lda, x, ldb,
593 $ work, ldb, result( 2 ) )
598 CALL cget04( 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 )
'CGBSV ',
611 $ n, kl, ku, imat, k, result( k )
621 $
CALL claset(
'Full', 2*kl+ku+1, n,
622 $ cmplx( zero ), cmplx( zero ),
624 CALL claset(
'Full', n, nrhs, cmplx( zero ),
625 $ cmplx( zero ), x, ldb )
626 IF( iequed.GT.1 .AND. n.GT.0 )
THEN
631 CALL claqgb( n, n, kl, ku, a, lda, s,
632 $ s( n+1 ), rowcnd, colcnd,
640 CALL cgbsvx( 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,
'CGBSVX', 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 = clantb(
'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 = clantb(
'M',
'U',
'N', n, kl+ku,
678 IF( rpvgrw.EQ.zero )
THEN
681 rpvgrw = clangb(
'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 ) / slamch(
'E' )
689 IF( .NOT.prefac )
THEN
694 CALL cgbt01( n, n, kl, ku, a, lda, afb,
695 $ ldafb, iwork, work,
707 CALL clacpy(
'Full', n, nrhs, bsav, ldb,
709 CALL cgbt02( 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 cget04( n, nrhs, x, ldb, xact,
719 $ ldb, rcondc, result( 3 ) )
721 IF( itran.EQ.1 )
THEN
726 CALL cget04( n, nrhs, x, ldb, xact,
727 $ ldb, roldc, result( 3 ) )
733 CALL cgbt05( trans, n, kl, ku, nrhs, asav,
734 $ lda, bsav, ldb, x, ldb, xact,
735 $ ldb, rwork, rwork( nrhs+1 ),
744 result( 6 ) = sget06( 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 $
'CGBSVX', fact, trans, n, kl,
757 $ ku, equed, imat, k,
760 WRITE( nout, fmt = 9996 )
761 $
'CGBSVX', 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 )
'CGBSVX',
775 $ fact, trans, n, kl, ku, equed,
776 $ imat, 1, result( 1 )
778 WRITE( nout, fmt = 9996 )
'CGBSVX',
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 )
'CGBSVX',
790 $ fact, trans, n, kl, ku, equed,
791 $ imat, 6, result( 6 )
793 WRITE( nout, fmt = 9996 )
'CGBSVX',
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 )
'CGBSVX',
805 $ fact, trans, n, kl, ku, equed,
806 $ imat, 7, result( 7 )
808 WRITE( nout, fmt = 9996 )
'CGBSVX',
809 $ fact, trans, n, kl, ku, imat, 7,
823 CALL clacpy(
'Full', kl+ku+1, n, asav, lda, a,
825 CALL clacpy(
'Full', n, nrhs, bsav, ldb, b, ldb )
828 $
CALL claset(
'Full', 2*kl+ku+1, n,
829 $ cmplx( zero ), cmplx( zero ),
831 CALL claset(
'Full', n, nrhs,
832 $ cmplx( zero ), cmplx( zero ),
834 IF( iequed.GT.1 .AND. n.GT.0 )
THEN
839 CALL claqgb( n, n, kl, ku, a, lda, s,
840 $ s( n+1 ), rowcnd, colcnd, amax, equed )
848 CALL cgbsvxx( 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,
'CGBSVXX', 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 cgbt01( n, n, kl, ku, a, lda, afb, ldafb,
886 $ iwork, work( 2*nrhs+1 ), result( 1 ) )
897 CALL clacpy(
'Full', n, nrhs, bsav, ldb, work,
899 CALL cgbt02( 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 cget04( n, nrhs, x, ldb, xact, ldb,
907 $ rcondc, result( 3 ) )
909 IF( itran.EQ.1 )
THEN
914 CALL cget04( n, nrhs, x, ldb, xact, ldb,
915 $ roldc, result( 3 ) )
924 result( 6 ) = sget06( 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 )
'CGBSVXX',
936 $ fact, trans, n, kl, ku, equed,
937 $ imat, k, result( k )
939 WRITE( nout, fmt = 9996 )
'CGBSVXX',
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 )
'CGBSVXX', fact,
954 $ trans, n, kl, ku, equed, imat, 1,
957 WRITE( nout, fmt = 9996 )
'CGBSVXX', 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 )
'CGBSVXX', fact,
969 $ trans, n, kl, ku, equed, imat, 6,
972 WRITE( nout, fmt = 9996 )
'CGBSVXX', 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 )
'CGBSVXX', fact,
984 $ trans, n, kl, ku, equed, imat, 7,
987 WRITE( nout, fmt = 9996 )
'CGBSVXX', fact,
988 $ trans, n, kl, ku, imat, 7,
1007 CALL alasvm( path, nout, nfail, nrun, nerrs )
1014 9999
FORMAT(
' *** In CDRVGB, LA=', i5,
' is too small for N=', i5,
1015 $
', KU=', i5,
', KL=', i5, /
' ==> Increase LA to at least ',
1017 9998
FORMAT(
' *** In CDRVGB, 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 clarhs(PATH, XTYPE, UPLO, TRANS, M, N, KL, KU, NRHS, A, LDA, X, LDX, B, LDB, ISEED, INFO)
CLARHS
subroutine clatb4(PATH, IMAT, M, N, TYPE, KL, KU, ANORM, MODE, CNDNUM, DIST)
CLATB4
subroutine cget04(N, NRHS, X, LDX, XACT, LDXACT, RCOND, RESID)
CGET04
subroutine cgbt05(TRANS, N, KL, KU, NRHS, AB, LDAB, B, LDB, X, LDX, XACT, LDXACT, FERR, BERR, RESLTS)
CGBT05
subroutine cebchvxx(THRESH, PATH)
CEBCHVXX
subroutine cdrvgb(DOTYPE, NN, NVAL, NRHS, THRESH, TSTERR, A, LA, AFB, LAFB, ASAV, B, BSAV, X, XACT, S, WORK, RWORK, IWORK, NOUT)
CDRVGB
subroutine cgbt01(M, N, KL, KU, A, LDA, AFAC, LDAFAC, IPIV, WORK, RESID)
CGBT01
subroutine cgbt02(TRANS, M, N, KL, KU, NRHS, A, LDA, X, LDX, B, LDB, RESID)
CGBT02
subroutine cerrvx(PATH, NUNIT)
CERRVX
subroutine clatms(M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX, KL, KU, PACK, A, LDA, WORK, INFO)
CLATMS
subroutine claqgb(M, N, KL, KU, AB, LDAB, R, C, ROWCND, COLCND, AMAX, EQUED)
CLAQGB scales a general band matrix, using row and column scaling factors computed by sgbequ.
subroutine cgbtrf(M, N, KL, KU, AB, LDAB, IPIV, INFO)
CGBTRF
real function cla_gbrpvgrw(N, KL, KU, NCOLS, AB, LDAB, AFB, LDAFB)
CLA_GBRPVGRW computes the reciprocal pivot growth factor norm(A)/norm(U) for a general banded matrix.
subroutine cgbtrs(TRANS, N, KL, KU, NRHS, AB, LDAB, IPIV, B, LDB, INFO)
CGBTRS
subroutine cgbequ(M, N, KL, KU, AB, LDAB, R, C, ROWCND, COLCND, AMAX, INFO)
CGBEQU
subroutine cgbsvxx(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)
CGBSVXX computes the solution to system of linear equations A * X = B for GB matrices
subroutine cgbsvx(FACT, TRANS, N, KL, KU, NRHS, AB, LDAB, AFB, LDAFB, IPIV, EQUED, R, C, B, LDB, X, LDX, RCOND, FERR, BERR, WORK, RWORK, INFO)
CGBSVX computes the solution to system of linear equations A * X = B for GB matrices
subroutine cgbsv(N, KL, KU, NRHS, AB, LDAB, IPIV, B, LDB, INFO)
CGBSV computes the solution to system of linear equations A * X = B for GB matrices (simple driver)
subroutine claset(UPLO, M, N, ALPHA, BETA, A, LDA)
CLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine clacpy(UPLO, M, N, A, LDA, B, LDB)
CLACPY copies all or part of one two-dimensional array to another.