179 INTEGER LA, LAFB, NN, NOUT, NRHS
180 DOUBLE PRECISION THRESH
184 INTEGER IWORK( * ), NVAL( * )
185 DOUBLE PRECISION RWORK( * ), S( * )
186 COMPLEX*16 A( * ), AFB( * ), ASAV( * ), B( * ), BSAV( * ),
187 $ WORK( * ), X( * ), XACT( * )
193 DOUBLE PRECISION ONE, ZERO
194 parameter( one = 1.0d+0, zero = 0.0d+0 )
196 parameter( ntypes = 8 )
198 parameter( ntests = 7 )
200 parameter( ntran = 3 )
203 LOGICAL EQUIL, NOFACT, PREFAC, TRFCON, ZEROT
204 CHARACTER DIST, EQUED, FACT, TRANS,
TYPE, XTYPE
206 INTEGER I, I1, I2, IEQUED, IFACT, IKL, IKU, IMAT, IN,
207 $ INFO, IOFF, ITRAN, IZERO, J, K, K1, KL, KU,
208 $ LDA, LDAFB, LDB, MODE, N, NB, NBMIN, NERRS,
209 $ NFACT, NFAIL, NIMAT, NKL, NKU, NRUN, NT
210 DOUBLE PRECISION AINVNM, AMAX, ANORM, ANORMI, ANORMO, ANRMPV,
211 $ CNDNUM, COLCND, RCOND, RCONDC, RCONDI, RCONDO,
212 $ ROLDC, ROLDI, ROLDO, ROWCND, RPVGRW
215 CHARACTER EQUEDS( 4 ), FACTS( 3 ), TRANSS( NTRAN )
216 INTEGER ISEED( 4 ), ISEEDY( 4 )
217 DOUBLE PRECISION RDUM( 1 ), RESULT( NTESTS )
221 DOUBLE PRECISION DGET06, DLAMCH, ZLANGB, ZLANGE, ZLANTB
231 INTRINSIC abs, dcmplx, max, min
239 COMMON / infoc / infot, nunit, ok, lerr
240 COMMON / srnamc / srnamt
243 DATA iseedy / 1988, 1989, 1990, 1991 /
244 DATA transs /
'N',
'T',
'C' /
245 DATA facts /
'F',
'N',
'E' /
246 DATA equeds /
'N',
'R',
'C',
'B' /
252 path( 1: 1 ) =
'Zomplex precision'
258 iseed( i ) = iseedy( i )
264 $
CALL zerrvx( path, nout )
283 nkl = max( 1, min( n, 4 ) )
298 ELSE IF( ikl.EQ.2 )
THEN
300 ELSE IF( ikl.EQ.3 )
THEN
302 ELSE IF( ikl.EQ.4 )
THEN
313 ELSE IF( iku.EQ.2 )
THEN
315 ELSE IF( iku.EQ.3 )
THEN
317 ELSE IF( iku.EQ.4 )
THEN
325 ldafb = 2*kl + ku + 1
326 IF( lda*n.GT.la .OR. ldafb*n.GT.lafb )
THEN
327 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
328 $
CALL aladhd( nout, path )
329 IF( lda*n.GT.la )
THEN
330 WRITE( nout, fmt = 9999 )la, n, kl, ku,
334 IF( ldafb*n.GT.lafb )
THEN
335 WRITE( nout, fmt = 9998 )lafb, n, kl, ku,
342 DO 120 imat = 1, nimat
346 IF( .NOT.dotype( imat ) )
351 zerot = imat.GE.2 .AND. imat.LE.4
352 IF( zerot .AND. n.LT.imat-1 )
358 CALL zlatb4( path, imat, n, n,
TYPE, KL, KU, ANORM,
359 $ MODE, CNDNUM, DIST )
360 rcondc = one / cndnum
363 CALL zlatms( n, n, dist, iseed,
TYPE, RWORK, MODE,
364 $ CNDNUM, ANORM, KL, KU,
'Z', A, LDA, WORK,
370 CALL alaerh( path,
'ZLATMS', info, 0,
' ', n, n,
371 $ kl, ku, -1, imat, nfail, nerrs, nout )
382 ELSE IF( imat.EQ.3 )
THEN
387 ioff = ( izero-1 )*lda
389 i1 = max( 1, ku+2-izero )
390 i2 = min( kl+ku+1, ku+1+( n-izero ) )
396 DO 30 i = max( 1, ku+2-j ),
397 $ min( kl+ku+1, ku+1+( n-j ) )
407 CALL zlacpy(
'Full', kl+ku+1, n, a, lda, asav, lda )
410 equed = equeds( iequed )
411 IF( iequed.EQ.1 )
THEN
417 DO 100 ifact = 1, nfact
418 fact = facts( ifact )
419 prefac =
lsame( fact,
'F' )
420 nofact =
lsame( fact,
'N' )
421 equil =
lsame( fact,
'E' )
429 ELSE IF( .NOT.nofact )
THEN
436 CALL zlacpy(
'Full', kl+ku+1, n, asav, lda,
437 $ afb( kl+1 ), ldafb )
438 IF( equil .OR. iequed.GT.1 )
THEN
443 CALL zgbequ( n, n, kl, ku, afb( kl+1 ),
444 $ ldafb, s, s( n+1 ), rowcnd,
445 $ colcnd, amax, info )
446 IF( info.EQ.0 .AND. n.GT.0 )
THEN
447 IF(
lsame( equed,
'R' ) )
THEN
450 ELSE IF(
lsame( equed,
'C' ) )
THEN
453 ELSE IF(
lsame( equed,
'B' ) )
THEN
460 CALL zlaqgb( n, n, kl, ku, afb( kl+1 ),
461 $ ldafb, s, s( n+1 ),
462 $ rowcnd, colcnd, amax,
477 anormo =
zlangb(
'1', n, kl, ku, afb( kl+1 ),
479 anormi =
zlangb(
'I', n, kl, ku, afb( kl+1 ),
484 CALL zgbtrf( n, n, kl, ku, afb, ldafb, iwork,
489 CALL zlaset(
'Full', n, n, dcmplx( zero ),
490 $ dcmplx( one ), work, ldb )
492 CALL zgbtrs(
'No transpose', n, kl, ku, n,
493 $ afb, ldafb, iwork, work, ldb,
498 ainvnm =
zlange(
'1', n, n, work, ldb,
500 IF( anormo.LE.zero .OR. ainvnm.LE.zero )
THEN
503 rcondo = ( one / anormo ) / ainvnm
509 ainvnm =
zlange(
'I', n, n, work, ldb,
511 IF( anormi.LE.zero .OR. ainvnm.LE.zero )
THEN
514 rcondi = ( one / anormi ) / ainvnm
518 DO 90 itran = 1, ntran
522 trans = transs( itran )
523 IF( itran.EQ.1 )
THEN
531 CALL zlacpy(
'Full', kl+ku+1, n, asav, lda,
538 CALL zlarhs( path, xtype,
'Full', trans, n,
539 $ n, kl, ku, nrhs, a, lda, xact,
540 $ ldb, b, ldb, iseed, info )
542 CALL zlacpy(
'Full', n, nrhs, b, ldb, bsav,
545 IF( nofact .AND. itran.EQ.1 )
THEN
552 CALL zlacpy(
'Full', kl+ku+1, n, a, lda,
553 $ afb( kl+1 ), ldafb )
554 CALL zlacpy(
'Full', n, nrhs, b, ldb, x,
558 CALL zgbsv( n, kl, ku, nrhs, afb, ldafb,
559 $ iwork, x, ldb, info )
564 $
CALL alaerh( path,
'ZGBSV ', info,
565 $ izero,
' ', n, n, kl, ku,
566 $ nrhs, imat, nfail, nerrs,
572 CALL zgbt01( n, n, kl, ku, a, lda, afb,
573 $ ldafb, iwork, work,
576 IF( izero.EQ.0 )
THEN
581 CALL zlacpy(
'Full', n, nrhs, b, ldb,
583 CALL zgbt02(
'No transpose', n, n, kl,
584 $ ku, nrhs, a, lda, x, ldb,
585 $ work, ldb, result( 2 ) )
590 CALL zget04( n, nrhs, x, ldb, xact,
591 $ ldb, rcondc, result( 3 ) )
599 IF( result( k ).GE.thresh )
THEN
600 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
601 $
CALL aladhd( nout, path )
602 WRITE( nout, fmt = 9997 )
'ZGBSV ',
603 $ n, kl, ku, imat, k, result( k )
613 $
CALL zlaset(
'Full', 2*kl+ku+1, n,
615 $ dcmplx( zero ), afb, ldafb )
616 CALL zlaset(
'Full', n, nrhs, dcmplx( zero ),
617 $ dcmplx( zero ), x, ldb )
618 IF( iequed.GT.1 .AND. n.GT.0 )
THEN
623 CALL zlaqgb( n, n, kl, ku, a, lda, s,
624 $ s( n+1 ), rowcnd, colcnd,
632 CALL zgbsvx( fact, trans, n, kl, ku, nrhs, a,
633 $ lda, afb, ldafb, iwork, equed,
634 $ s, s( ldb+1 ), b, ldb, x, ldb,
635 $ rcond, rwork, rwork( nrhs+1 ),
636 $ work, rwork( 2*nrhs+1 ), info )
641 $
CALL alaerh( path,
'ZGBSVX', info, izero,
642 $ fact // trans, n, n, kl, ku,
643 $ nrhs, imat, nfail, nerrs,
648 IF( info.NE.0 .AND. info.LE.n)
THEN
651 DO 60 i = max( ku+2-j, 1 ),
652 $ min( n+ku+1-j, kl+ku+1 )
653 anrmpv = max( anrmpv,
654 $ abs( a( i+( j-1 )*lda ) ) )
657 rpvgrw =
zlantb(
'M',
'U',
'N', info,
658 $ min( info-1, kl+ku ),
659 $ afb( max( 1, kl+ku+2-info ) ),
661 IF( rpvgrw.EQ.zero )
THEN
664 rpvgrw = anrmpv / rpvgrw
667 rpvgrw =
zlantb(
'M',
'U',
'N', n, kl+ku,
669 IF( rpvgrw.EQ.zero )
THEN
672 rpvgrw =
zlangb(
'M', n, kl, ku, a,
673 $ lda, rdum ) / rpvgrw
676 result( 7 ) = abs( rpvgrw-rwork( 2*nrhs+1 ) )
677 $ / max( rwork( 2*nrhs+1 ),
678 $ rpvgrw ) /
dlamch(
'E' )
680 IF( .NOT.prefac )
THEN
685 CALL zgbt01( n, n, kl, ku, a, lda, afb,
686 $ ldafb, iwork, work,
698 CALL zlacpy(
'Full', n, nrhs, bsav, ldb,
700 CALL zgbt02( trans, n, n, kl, ku, nrhs,
701 $ asav, lda, x, ldb, work, ldb,
707 IF( nofact .OR. ( prefac .AND.
708 $
lsame( equed,
'N' ) ) )
THEN
709 CALL zget04( n, nrhs, x, ldb, xact,
710 $ ldb, rcondc, result( 3 ) )
712 IF( itran.EQ.1 )
THEN
717 CALL zget04( n, nrhs, x, ldb, xact,
718 $ ldb, roldc, result( 3 ) )
724 CALL zgbt05( trans, n, kl, ku, nrhs, asav,
725 $ lda, bsav, ldb, x, ldb, xact,
726 $ ldb, rwork, rwork( nrhs+1 ),
735 result( 6 ) =
dget06( rcond, rcondc )
740 IF( .NOT.trfcon )
THEN
742 IF( result( k ).GE.thresh )
THEN
743 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
744 $
CALL aladhd( nout, path )
746 WRITE( nout, fmt = 9995 )
747 $
'ZGBSVX', fact, trans, n, kl,
748 $ ku, equed, imat, k,
751 WRITE( nout, fmt = 9996 )
752 $
'ZGBSVX', fact, trans, n, kl,
753 $ ku, imat, k, result( k )
758 nrun = nrun + ntests - k1 + 1
760 IF( result( 1 ).GE.thresh .AND. .NOT.
762 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
763 $
CALL aladhd( nout, path )
765 WRITE( nout, fmt = 9995 )
'ZGBSVX',
766 $ fact, trans, n, kl, ku, equed,
767 $ imat, 1, result( 1 )
769 WRITE( nout, fmt = 9996 )
'ZGBSVX',
770 $ fact, trans, n, kl, ku, imat, 1,
776 IF( result( 6 ).GE.thresh )
THEN
777 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
778 $
CALL aladhd( nout, path )
780 WRITE( nout, fmt = 9995 )
'ZGBSVX',
781 $ fact, trans, n, kl, ku, equed,
782 $ imat, 6, result( 6 )
784 WRITE( nout, fmt = 9996 )
'ZGBSVX',
785 $ fact, trans, n, kl, ku, imat, 6,
791 IF( result( 7 ).GE.thresh )
THEN
792 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
793 $
CALL aladhd( nout, path )
795 WRITE( nout, fmt = 9995 )
'ZGBSVX',
796 $ fact, trans, n, kl, ku, equed,
797 $ imat, 7, result( 7 )
799 WRITE( nout, fmt = 9996 )
'ZGBSVX',
800 $ fact, trans, n, kl, ku, imat, 7,
817 CALL alasvm( path, nout, nfail, nrun, nerrs )
819 9999
FORMAT(
' *** In ZDRVGB, LA=', i5,
' is too small for N=', i5,
820 $
', KU=', i5,
', KL=', i5, /
' ==> Increase LA to at least ',
822 9998
FORMAT(
' *** In ZDRVGB, LAFB=', i5,
' is too small for N=', i5,
823 $
', KU=', i5,
', KL=', i5, /
824 $
' ==> Increase LAFB to at least ', i5 )
825 9997
FORMAT( 1x, a,
', N=', i5,
', KL=', i5,
', KU=', i5,
', type ',
826 $ i1,
', test(', i1,
')=', g12.5 )
827 9996
FORMAT( 1x, a,
'( ''', a1,
''',''', a1,
''',', i5,
',', i5,
',',
828 $ i5,
',...), type ', i1,
', test(', i1,
')=', g12.5 )
829 9995
FORMAT( 1x, a,
'( ''', a1,
''',''', a1,
''',', i5,
',', i5,
',',
830 $ i5,
',...), EQUED=''', a1,
''', type ', i1,
', test(', i1,
double precision function dlamch(CMACH)
DLAMCH
logical function lsame(CA, CB)
LSAME
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 zlarhs(PATH, XTYPE, UPLO, TRANS, M, N, KL, KU, NRHS, A, LDA, X, LDX, B, LDB, ISEED, INFO)
ZLARHS
subroutine zgbt01(M, N, KL, KU, A, LDA, AFAC, LDAFAC, IPIV, WORK, RESID)
ZGBT01
subroutine zgbt05(TRANS, N, KL, KU, NRHS, AB, LDAB, B, LDB, X, LDX, XACT, LDXACT, FERR, BERR, RESLTS)
ZGBT05
subroutine zerrvx(PATH, NUNIT)
ZERRVX
subroutine zget04(N, NRHS, X, LDX, XACT, LDXACT, RCOND, RESID)
ZGET04
subroutine zlatb4(PATH, IMAT, M, N, TYPE, KL, KU, ANORM, MODE, CNDNUM, DIST)
ZLATB4
subroutine zgbt02(TRANS, M, N, KL, KU, NRHS, A, LDA, X, LDX, B, LDB, RESID)
ZGBT02
subroutine zlatms(M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX, KL, KU, PACK, A, LDA, WORK, INFO)
ZLATMS
subroutine zlaqgb(M, N, KL, KU, AB, LDAB, R, C, ROWCND, COLCND, AMAX, EQUED)
ZLAQGB scales a general band matrix, using row and column scaling factors computed by sgbequ.
double precision function zlangb(NORM, N, KL, KU, AB, LDAB, WORK)
ZLANGB returns the value of the 1-norm, Frobenius norm, infinity-norm, or the largest absolute value ...
subroutine zgbtrf(M, N, KL, KU, AB, LDAB, IPIV, INFO)
ZGBTRF
subroutine zgbequ(M, N, KL, KU, AB, LDAB, R, C, ROWCND, COLCND, AMAX, INFO)
ZGBEQU
subroutine zgbtrs(TRANS, N, KL, KU, NRHS, AB, LDAB, IPIV, B, LDB, INFO)
ZGBTRS
subroutine zgbsvx(FACT, TRANS, N, KL, KU, NRHS, AB, LDAB, AFB, LDAFB, IPIV, EQUED, R, C, B, LDB, X, LDX, RCOND, FERR, BERR, WORK, RWORK, INFO)
ZGBSVX computes the solution to system of linear equations A * X = B for GB matrices
subroutine zgbsv(N, KL, KU, NRHS, AB, LDAB, IPIV, B, LDB, INFO)
ZGBSV computes the solution to system of linear equations A * X = B for GB matrices (simple driver)
double precision function zlange(NORM, M, N, A, LDA, WORK)
ZLANGE returns the value of the 1-norm, Frobenius norm, infinity-norm, or the largest absolute value ...
subroutine zlacpy(UPLO, M, N, A, LDA, B, LDB)
ZLACPY copies all or part of one two-dimensional array to another.
subroutine zlaset(UPLO, M, N, ALPHA, BETA, A, LDA)
ZLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
double precision function zlantb(NORM, UPLO, DIAG, N, K, AB, LDAB, WORK)
ZLANTB returns the value of the 1-norm, or the Frobenius norm, or the infinity norm,...
double precision function dget06(RCOND, RCONDC)
DGET06