169 SUBROUTINE zdrvgb( DOTYPE, NN, NVAL, NRHS, THRESH, TSTERR, A, LA,
170 $ AFB, LAFB, ASAV, B, BSAV, X, XACT, S, WORK,
171 $ RWORK, IWORK, NOUT )
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 $ , COLCND, RCOND, RCONDC, RCONDI, RCONDO,
212 $ roldc, roldi, roldo, rowcnd, rpvgrw
215 CHARACTER EQUEDS( 4 ), FACTS( 3 ), TRANSS( NTRAN )
216 INTEGER ( 4 ), ISEEDY( 4 )
217 DOUBLE PRECISION RDUM( 1 ), RESULT( NTESTS )
221 DOUBLE PRECISION , DLAMCH, ZLANGB, ZLANGE, ZLANTB
222 EXTERNAL lsame,
dget06, dlamch, zlangb, zlange, zlantb
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
584 $ ku, nrhs, a, lda, x, ldb,
591 CALL zget04( n, nrhs, x, ldb, xact,
592 $ ldb, rcondc, result( 3 ) )
600 IF( result( k ).GE.thresh )
THEN
601 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
602 $
CALL aladhd( nout, path )
603 WRITE( nout, fmt = 9997 )
'ZGBSV ',
604 $ n, kl, ku, imat, k, result( k )
614 $
CALL zlaset(
'Full', 2*kl+ku+1, n,
616 $ dcmplx( zero ), afb, ldafb )
617 CALL zlaset( 'full
', N, NRHS, DCMPLX( ZERO ),
618 $ DCMPLX( ZERO ), X, LDB )
619.GT..AND..GT.
IF( IEQUED1 N0 ) THEN
624 CALL ZLAQGB( N, N, KL, KU, A, LDA, S,
625 $ S( N+1 ), ROWCND, COLCND,
633 CALL ZGBSVX( FACT, TRANS, N, KL, KU, NRHS, A,
634 $ LDA, AFB, LDAFB, IWORK, EQUED,
635 $ S, S( LDB+1 ), B, LDB, X, LDB,
636 $ RCOND, RWORK, RWORK( NRHS+1 ),
637 $ WORK, RWORK( 2*NRHS+1 ), INFO )
642 $ CALL ALAERH( PATH, 'zgbsvx', INFO, IZERO,
643 $ FACT // TRANS, N, N, KL, KU,
644 $ NRHS, IMAT, NFAIL, NERRS,
649.NE..AND..LE.
IF( INFO0 INFON) THEN
652 DO 60 I = MAX( KU+2-J, 1 ),
653 $ MIN( N+KU+1-J, KL+KU+1 )
654 ANRMPV = MAX( ANRMPV,
655 $ ABS( A( I+( J-1 )*LDA ) ) )
658 RPVGRW = ZLANTB( 'm
', 'u
', 'n
', INFO,
659 $ MIN( INFO-1, KL+KU ),
660 $ AFB( MAX( 1, KL+KU+2-INFO ) ),
662.EQ.
IF( RPVGRWZERO ) THEN
665 RPVGRW = ANRMPV / RPVGRW
668 RPVGRW = ZLANTB( 'm
', 'u
', 'n
', N, KL+KU,
670.EQ.
IF( RPVGRWZERO ) THEN
673 RPVGRW = ZLANGB( 'm
', N, KL, KU, A,
674 $ LDA, RDUM ) / RPVGRW
677 RESULT( 7 ) = ABS( RPVGRW-RWORK( 2*NRHS+1 ) )
678 $ / MAX( RWORK( 2*NRHS+1 ),
679 $ RPVGRW ) / DLAMCH( 'e
' )
681.NOT.
IF( PREFAC ) THEN
686 CALL ZGBT01( N, N, KL, KU, A, LDA, AFB,
687 $ LDAFB, IWORK, WORK,
699 CALL ZLACPY( 'full
', N, NRHS, BSAV, LDB,
701 CALL ZGBT02( TRANS, N, N, KL, KU, NRHS,
702 $ ASAV, LDA, X, LDB, WORK, LDB,
709.OR..AND.
IF( NOFACT ( PREFAC
710 $ LSAME( EQUED, 'n
' ) ) ) THEN
711 CALL ZGET04( N, NRHS, X, LDB, XACT,
712 $ LDB, RCONDC, RESULT( 3 ) )
714.EQ.
IF( ITRAN1 ) THEN
719 CALL ZGET04( N, NRHS, X, LDB, XACT,
720 $ LDB, ROLDC, RESULT( 3 ) )
726 CALL ZGBT05( TRANS, N, KL, KU, NRHS, ASAV,
727 $ LDA, BSAV, LDB, X, LDB, XACT,
728 $ LDB, RWORK, RWORK( NRHS+1 ),
737 RESULT( 6 ) = DGET06( RCOND, RCONDC )
742.NOT.
IF( TRFCON ) THEN
744.GE.
IF( RESULT( K )THRESH ) THEN
745.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
746 $ CALL ALADHD( NOUT, PATH )
748 WRITE( NOUT, FMT = 9995 )
749 $ 'zgbsvx', FACT, TRANS, N, KL,
750 $ KU, EQUED, IMAT, K,
753 WRITE( NOUT, FMT = 9996 )
754 $ 'zgbsvx', FACT, TRANS, N, KL,
755 $ KU, IMAT, K, RESULT( K )
760 NRUN = NRUN + NTESTS - K1 + 1
762.GE..AND..NOT.
IF( RESULT( 1 )THRESH
764.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
765 $ CALL ALADHD( NOUT, PATH )
767 WRITE( NOUT, FMT = 9995 )'zgbsvx',
768 $ FACT, TRANS, N, KL, KU, EQUED,
769 $ IMAT, 1, RESULT( 1 )
771 WRITE( NOUT, FMT = 9996 )'zgbsvx',
772 $ FACT, TRANS, N, KL, KU, IMAT, 1,
778.GE.
IF( RESULT( 6 )THRESH ) THEN
779.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
780 $ CALL ALADHD( NOUT, PATH )
782 WRITE( NOUT, FMT = 9995 )'zgbsvx',
783 $ FACT, TRANS, N, KL, KU, EQUED,
784 $ IMAT, 6, RESULT( 6 )
786 WRITE( NOUT, FMT = 9996 )'zgbsvx',
787 $ FACT, TRANS, N, KL, KU, IMAT, 6,
793.GE.
IF( RESULT( 7 )THRESH ) THEN
794.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
795 $ CALL ALADHD( NOUT, PATH )
797 WRITE( NOUT, FMT = 9995 )'zgbsvx',
798 $ FACT, TRANS, N, KL, KU, EQUED,
799 $ IMAT, 7, RESULT( 7 )
801 WRITE( NOUT, FMT = 9996 )'zgbsvx',
802 $ FACT, TRANS, N, KL, KU, IMAT, 7,
819 CALL ALASVM( PATH, NOUT, NFAIL, NRUN, NERRS )
821 9999 FORMAT( ' *** in
zdrvgb, la=
', I5, ' is too small
for n=
', I5,
822 $ ', ku=
', I5, ', kl=
', I5, / ' ==> increase la to at least
',
824 9998 FORMAT( ' *** in
zdrvgb, lafb=
', I5, ' is too small
for n=', i5,
825 $
', KU=', i5,
', KL=', i5, /
826 $
' ==> Increase LAFB to at least ', i5 )
827 9997
FORMAT( 1x, a,
', N=', i5,
', KL=', i5,
', KU=', i5,
', type ',
828 $ i1,
', test(', i1,
')=', g12.5 )
829 9996
FORMAT( 1x, a,
'( ''', a1,
''',''', a1,
''',', i5,
',', i5,
',',
830 $ i5,
',...), type ', i1,
', test('')='
831 9995
FORMAT( 1x, a,
'( ''', a1,
''',''', a1,
''',', i5,
',', i5,
',',
832 $ i5,
',...), EQUED=''', a1,
''', type ', i1,
', test(', i1,