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 , I1, I2, IEQUED, IFACT, , IKU, IMAT, ,
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, , ANORMO, ANRMPV,
220 CHARACTER ( 4 ), FACTS( 3 ), TRANSS( NTRAN )
221 INTEGER ISEED( 4 ), ISEEDY( 4 )
222 REAL RDUM( 1 ), RESULT( NTESTS ), BERR( ),
223 $ errbnds_n( nrhs,3 ), errbnds_c( nrhs, 3 )
227 REAL CLANGB, CLANGE, CLANTB, SGET06, SLAMCH,
229 EXTERNAL lsame, clangb, clange, clantb, sget06, slamch,
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.
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 ),
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,
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.LE..OR..LE.
IF( ANORMOZERO AINVNMZERO ) THEN
511 RCONDO = ( ONE / ANORMO ) / AINVNM
517 AINVNM = CLANGE( 'i
', N, N, WORK, LDB,
519.LE..OR..LE.
IF( ANORMIZERO AINVNMZERO ) THEN
522 RCONDI = ( ONE / ANORMI ) / AINVNM
526 DO 90 ITRAN = 1, NTRAN
530 TRANS = TRANSS( ITRAN )
531.EQ.
IF( ITRAN1 ) 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.AND..EQ.
IF( NOFACT ITRAN1 ) 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.EQ.
IF( IZERO0 ) THEN
589 CALL CLACPY( 'full
', N, NRHS, B, LDB,
591 CALL CGBT02( 'no transpose
', N, N, KL,
592 $ KU, NRHS, A, LDA, X, LDB,
599 CALL CGET04( N, NRHS, X, LDB, XACT,
600 $ LDB, RCONDC, RESULT( 3 ) )
608.GE.
IF( RESULT( K )THRESH ) THEN
609.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
610 $ CALL ALADHD( NOUT, PATH )
611 WRITE( NOUT, FMT = 9997 )'cgbsv ',
612 $ N, KL, KU, IMAT, K, RESULT( K )
622 $ CALL CLASET( 'full
', 2*KL+KU+1, N,
623 $ CMPLX( ZERO ), CMPLX( ZERO ),
625 CALL CLASET( 'full
', N, NRHS, CMPLX( ZERO ),
626 $ CMPLX( ZERO ), X, LDB )
627.GT..AND..GT.
IF( IEQUED1 N0 ) THEN
632 CALL CLAQGB( N, N, KL, KU, A, LDA, S,
633 $ S( N+1 ), ROWCND, COLCND,
641 CALL CGBSVX( FACT, TRANS, N, KL, KU, NRHS, A,
642 $ LDA, AFB, LDAFB, IWORK, EQUED,
643 $ S, S( LDB+1 ), B, LDB, X, LDB,
644 $ RCOND, RWORK, RWORK( NRHS+1 ),
645 $ WORK, RWORK( 2*NRHS+1 ), INFO )
650 $ CALL ALAERH( PATH, 'cgbsvx', INFO, IZERO,
651 $ FACT // TRANS, N, N, KL, KU,
652 $ NRHS, IMAT, NFAIL, NERRS,
661 DO 60 I = MAX( KU+2-J, 1 ),
662 $ MIN( N+KU+1-J, KL+KU+1 )
663 ANRMPV = MAX( ANRMPV,
664 $ ABS( A( I+( J-1 )*LDA ) ) )
667 RPVGRW = CLANTB( 'm
', 'u
', 'n
', INFO,
668 $ MIN( INFO-1, KL+KU ),
669 $ AFB( MAX( 1, KL+KU+2-INFO ) ),
671.EQ.
IF( RPVGRWZERO ) THEN
674 RPVGRW = ANRMPV / RPVGRW
677 RPVGRW = CLANTB( 'm
', 'u
', 'n
', N, KL+KU,
679.EQ.
IF( RPVGRWZERO ) THEN
682 RPVGRW = CLANGB( 'm
', N, KL, KU, A,
683 $ LDA, RDUM ) / RPVGRW
686 RESULT( 7 ) = ABS( RPVGRW-RWORK( 2*NRHS+1 ) )
687 $ / MAX( RWORK( 2*NRHS+1 ),
688 $ RPVGRW ) / SLAMCH( 'e
' )
690.NOT.
IF( PREFAC ) THEN
695 CALL CGBT01( N, N, KL, KU, A, LDA, AFB,
696 $ LDAFB, IWORK, WORK,
708 CALL CLACPY( 'full
', N, NRHS, BSAV, LDB,
710 CALL CGBT02( TRANS, N, N, KL, KU, NRHS,
711 $ ASAV, LDA, X, LDB, WORK, LDB,
718.OR..AND.
IF( NOFACT ( PREFAC
719 $ LSAME( EQUED, 'n
' ) ) ) THEN
720 CALL CGET04( N, NRHS, X, LDB, XACT,
721 $ LDB, RCONDC, RESULT( 3 ) )
723.EQ.
IF( ITRAN1 ) THEN
728 CALL CGET04( N, NRHS, X, LDB, XACT,
729 $ LDB, ROLDC, RESULT( 3 ) )
735 CALL CGBT05( TRANS, N, KL, KU, NRHS, ASAV,
736 $ LDA, BSAV, LDB, X, LDB, XACT,
737 $ LDB, RWORK, RWORK( NRHS+1 ),
746 RESULT( 6 ) = SGET06( RCOND, RCONDC )
751.NOT.
IF( TRFCON ) THEN
753.GE.
IF( RESULT( K )THRESH ) THEN
754.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
755 $ CALL ALADHD( NOUT, PATH )
757 WRITE( NOUT, FMT = 9995 )
758 $ 'cgbsvx', FACT, TRANS, N, KL,
759 $ KU, EQUED, IMAT, K,
762 WRITE( NOUT, FMT = 9996 )
763 $ 'cgbsvx', FACT, TRANS, N, KL,
764 $ KU, IMAT, K, RESULT( K )
771.GE..AND..NOT.
IF( RESULT( 1 )THRESH
773.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
774 $ CALL ALADHD( NOUT, PATH )
776 WRITE( NOUT, FMT = 9995 )'cgbsvx',
777 $ FACT, TRANS, N, KL, KU, EQUED,
778 $ IMAT, 1, RESULT( 1 )
780 WRITE( NOUT, FMT = 9996 )'cgbsvx',
781 $ FACT, TRANS, N, KL, KU, IMAT, 1,
787.GE.
IF( RESULT( 6 )THRESH ) THEN
788.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
789 $ CALL ALADHD( NOUT, PATH )
791 WRITE( NOUT, FMT = 9995 )'cgbsvx',
792 $ FACT, TRANS, N, KL, KU, EQUED,
793 $ IMAT, 6, RESULT( 6 )
795 WRITE( NOUT, FMT = 9996 )'cgbsvx',
796 $ FACT, TRANS, N, KL, KU, IMAT, 6,
802.GE.
IF( RESULT( 7 )THRESH ) THEN
803.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
804 $ CALL ALADHD( NOUT, PATH )
806 WRITE( NOUT, FMT = 9995 )'cgbsvx',
807 $ FACT, TRANS, N, KL, KU, EQUED,
808 $ IMAT, 7, RESULT( 7 )
810 WRITE( NOUT, FMT = 9996 )'cgbsvx',
811 $ FACT, TRANS, N, KL, KU, IMAT, 7,
825 CALL CLACPY( 'full
', KL+KU+1, N, ASAV, LDA, A,
827 CALL CLACPY( 'full
', N, NRHS, BSAV, LDB, B, LDB )
830 $ CALL CLASET( 'full
', 2*KL+KU+1, N,
831 $ CMPLX( ZERO ), CMPLX( ZERO ),
833 CALL CLASET( 'full
', N, NRHS,
834 $ CMPLX( ZERO ), CMPLX( ZERO ),
836.GT..AND..GT.
IF( IEQUED1 N0 ) THEN
841 CALL CLAQGB( N, N, KL, KU, A, LDA, S,
842 $ S( N+1 ), ROWCND, COLCND, AMAX, EQUED )
850 CALL CGBSVXX( FACT, TRANS, N, KL, KU, NRHS, A, LDA,
851 $ AFB, LDAFB, IWORK, EQUED, S, S( N+1 ), B, LDB,
852 $ X, LDB, RCOND, RPVGRW_SVXX, BERR, N_ERR_BNDS,
853 $ ERRBNDS_N, ERRBNDS_C, 0, ZERO, WORK,
858.EQ.
IF( INFON+1 ) GOTO 90
859.NE.
IF( INFOIZERO ) THEN
860 CALL ALAERH( PATH, 'cgbsvxx', INFO, IZERO,
861 $ FACT // TRANS, N, N, -1, -1, NRHS,
862 $ IMAT, NFAIL, NERRS, NOUT )
870.GT..AND..LT.
IF ( INFO 0 INFO N+1 ) THEN
871 RPVGRW = CLA_GBRPVGRW(N, KL, KU, INFO, A, LDA,
874 RPVGRW = CLA_GBRPVGRW(N, KL, KU, N, A, LDA,
878 RESULT( 7 ) = ABS( RPVGRW-rpvgrw_svxx ) /
879 $ MAX( rpvgrw_svxx, RPVGRW ) /
882.NOT.
IF( PREFAC ) THEN
887 CALL CGBT01( N, N, KL, KU, A, LDA, AFB, LDAFB,
888 $ IWORK, WORK( 2*NRHS+1 ), RESULT( 1 ) )
899 CALL CLACPY( 'full
', N, NRHS, BSAV, LDB, WORK,
901 CALL CGBT02( TRANS, N, N, KL, KU, NRHS, ASAV,
902 $ LDA, X, LDB, WORK, LDB, RWORK,
907.OR..AND.
IF( NOFACT ( PREFAC LSAME( EQUED,
909 CALL CGET04( N, NRHS, X, LDB, XACT, LDB,
910 $ RCONDC, RESULT( 3 ) )
912.EQ.
IF( ITRAN1 ) THEN
917 CALL CGET04( N, NRHS, X, LDB, XACT, LDB,
918 $ ROLDC, RESULT( 3 ) )
927 RESULT( 6 ) = SGET06( RCOND, RCONDC )
932.NOT.
IF( TRFCON ) THEN
934.GE.
IF( RESULT( K )THRESH ) THEN
935.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
936 $ CALL ALADHD( NOUT, PATH )
938 WRITE( NOUT, FMT = 9995 )'cgbsvxx',
939 $ FACT, TRANS, N, KL, KU, EQUED,
940 $ IMAT, K, RESULT( K )
942 WRITE( NOUT, FMT = 9996 )'cgbsvxx',
943 $ FACT, TRANS, N, KL, KU, IMAT, K,
951.GE..AND..NOT.
IF( RESULT( 1 )THRESH PREFAC )
953.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
954 $ CALL ALADHD( NOUT, PATH )
956 WRITE( NOUT, FMT = 9995 )'cgbsvxx', FACT,
957 $ TRANS, N, KL, KU, EQUED, IMAT, 1,
960 WRITE( NOUT, FMT = 9996 )'cgbsvxx', FACT,
961 $ TRANS, N, KL, KU, IMAT, 1,
967.GE.
IF( RESULT( 6 )THRESH ) THEN
968.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
969 $ CALL ALADHD( NOUT, PATH )
971 WRITE( NOUT, FMT = 9995 )'cgbsvxx', FACT,
972 $ TRANS, N, KL, KU, EQUED, IMAT, 6,
975 WRITE( NOUT, FMT = 9996 )'cgbsvxx', FACT,
976 $ TRANS, N, KL, KU, IMAT, 6,
982.GE.
IF( RESULT( 7 )THRESH ) THEN
983.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
984 $ CALL ALADHD( NOUT, PATH )
986 WRITE( NOUT, FMT = 9995 )'cgbsvxx', FACT,
987 $ TRANS, N, KL, KU, EQUED, IMAT, 7,
990 WRITE( NOUT, FMT = 9996 )'cgbsvxx', FACT,
991 $ TRANS, N, KL, KU, IMAT, 7,
1010 CALL ALASVM( PATH, NOUT, NFAIL, NRUN, NERRS )
1015 CALL CEBCHVXX(THRESH, PATH)
1017 9999 FORMAT( ' *** in
cdrvgb, la=
', I5, ' is too small
for n=
', I5,
1018 $ ', ku=
', I5, ', kl=
', I5, / ' ==> increase la to at least
',
1020 9998 FORMAT( ' *** in
cdrvgb, lafb=
', I5, ' is too small
for n=
', I5,
1021 $ ', ku=
', I5, ', kl=
', I5, /
1022 $ ' ==> increase lafb to at least
', I5 )
1023 9997 FORMAT( 1X, A, ', n=
', I5, ', kl=
', I5, ', ku=
', I5, ',
type ',
1024 $ I1, ', test(
', I1, ')=
', G12.5 )
1025 9996 FORMAT( 1X, A, '(
''', A1, ''',
''', A1, ''',
', I5, ',
', I5, ',
',
1026 $ I5, ',...),
type ', I1, ', test(
', I1, ')=
', G12.5 )
1027 9995 FORMAT( 1X, A, '(
''', A1, ''',
''', A1, ''',
', I5, ',', i5,
',',
1028 $ i5,
',...), EQUED=''', a1,
''', type ', i1,
', test(', i1,
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 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 cgbequ(m, n, kl, ku, ab, ldab, r, c, rowcnd, colcnd, amax, info)
CGBEQU
subroutine cgbtrf(m, n, kl, ku, ab, ldab, ipiv, info)
CGBTRF
subroutine cgbtrs(trans, n, kl, ku, nrhs, ab, ldab, ipiv, b, ldb, info)
CGBTRS
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 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 clacpy(uplo, m, n, a, lda, b, ldb)
CLACPY copies all or part of one two-dimensional array to another.
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 clarhs(path, xtype, uplo, trans, m, n, kl, ku, nrhs, a, lda, x, ldx, b, ldb, iseed, info)
CLARHS
subroutine cerrvx(path, nunit)
CERRVX
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, rwork, resid)
CGBT02
subroutine cgbt05(trans, n, kl, ku, nrhs, ab, ldab, b, ldb, x, ldx, xact, ldxact, ferr, berr, reslts)
CGBT05
subroutine cdrvgb(dotype, nn, nval, nrhs, thresh, tsterr, a, la, afb, lafb, asav, b, bsav, x, xact, s, work, rwork, iwork, nout)
CDRVGB
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 clatms(m, n, dist, iseed, sym, d, mode, cond, dmax, kl, ku, pack, a, lda, work, info)
CLATMS
for(i8=*sizetab-1;i8 >=0;i8--)