241 SUBROUTINE zlatbs( UPLO, TRANS, DIAG, NORMIN, N, KD, AB, LDAB, X,
242 $ SCALE, CNORM, INFO )
249 CHARACTER DIAG, NORMIN, TRANS, UPLO
250 INTEGER INFO, KD, LDAB, N
251 DOUBLE PRECISION SCALE
254 DOUBLE PRECISION CNORM( * )
255 COMPLEX*16 AB( LDAB, * ), X( * )
261 DOUBLE PRECISION ZERO, HALF, ONE, TWO
262 parameter( zero = 0.0d+0, half = 0.5d+0, one = 1.0d+0,
266 LOGICAL NOTRAN, NOUNIT, UPPER
267 INTEGER I, IMAX, J, JFIRST, JINC, JLAST, JLEN, MAIND
268 DOUBLE PRECISION BIGNUM, GROW, REC, SMLNUM, TJJ, TMAX, TSCAL,
270 COMPLEX*16 CSUMJ, TJJS, USCAL, ZDUM
274 INTEGER IDAMAX, IZAMAX
275 DOUBLE PRECISION DLAMCH, DZASUM
276 COMPLEX*16 ZDOTC, ZDOTU, ZLADIV
277 EXTERNAL lsame, idamax, izamax, dlamch, dzasum, zdotc,
284 INTRINSIC abs, dble, dcmplx, dconjg, dimag, max, min
287 DOUBLE PRECISION CABS1, CABS2
290 cabs1( zdum ) = abs( dble( zdum ) ) + abs( dimag( zdum ) )
291 cabs2( zdum ) = abs( dble( zdum ) / 2.d0 ) +
292 $ abs( dimag( zdum ) / 2.d0 )
297 upper = lsame( uplo,
'U' )
298 notran = lsame( trans,
'N' )
299 nounit = lsame( diag,
'N' )
303 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
305 ELSE IF( .NOT.notran .AND. .NOT.lsame( trans,
'T' ) .AND. .NOT.
306 $ lsame( trans,
'C' ) )
THEN
308 ELSE IF( .NOT.nounit .AND. .NOT.lsame( diag,
'U' ) )
THEN
310 ELSE IF( .NOT.lsame( normin,
'Y' ) .AND. .NOT.
311 $ lsame( normin,
'N' ) )
THEN
313 ELSE IF( n.LT.0 )
THEN
315 ELSE IF( kd.LT.0 )
THEN
317 ELSE IF( ldab.LT.kd+1 )
THEN
321 CALL xerbla(
'ZLATBS', -info )
332 smlnum = dlamch(
'Safe minimum' )
333 bignum = one / smlnum
334 CALL dlabad( smlnum, bignum )
335 smlnum = smlnum / dlamch(
'Precision' )
336 bignum = one / smlnum
339 IF( lsame( normin,
'N' ) )
THEN
348 jlen = min( kd, j-1 )
349 cnorm( j ) = dzasum( jlen, ab( kd+1-jlen, j ), 1 )
356 jlen = min( kd, n-j )
358 cnorm( j ) = dzasum( jlen, ab( 2, j ), 1 )
369 imax = idamax( n, cnorm, 1 )
371 IF( tmax.LE.bignum*half )
THEN
374 tscal = half / ( smlnum*tmax )
375 CALL dscal( n, tscal, cnorm, 1 )
383 xmax = max( xmax, cabs2( x( j ) ) )
402 IF( tscal.NE.one )
THEN
414 grow = half / max( xbnd, smlnum )
416 DO 40 j = jfirst, jlast, jinc
423 tjjs = ab( maind, j )
426 IF( tjj.GE.smlnum )
THEN
430 xbnd = min( xbnd, min( one, tjj )*grow )
438 IF( tjj+cnorm( j ).GE.smlnum )
THEN
442 grow = grow*( tjj / ( tjj+cnorm( j ) ) )
457 grow = min( one, half / max( xbnd, smlnum ) )
458 DO 50 j = jfirst, jlast, jinc
467 grow = grow*( one / ( one+cnorm( j ) ) )
488 IF( tscal.NE.one )
THEN
500 grow = half / max( xbnd, smlnum )
502 DO 70 j = jfirst, jlast, jinc
511 xj = one + cnorm( j )
512 grow = min( grow, xbnd / xj )
514 tjjs = ab( maind, j )
517 IF( tjj.GE.smlnum )
THEN
522 $ xbnd = xbnd*( tjj / xj )
530 grow = min( grow, xbnd )
537 grow = min( one, half / max( xbnd, smlnum ) )
538 DO 80 j = jfirst, jlast, jinc
547 xj = one + cnorm( j )
554 IF( ( grow*tscal ).GT.smlnum )
THEN
559 CALL ztbsv( uplo, trans, diag, n, kd, ab, ldab, x, 1 )
564 IF( xmax.GT.bignum*half )
THEN
569 scale = ( bignum*half ) / xmax
570 CALL zdscal( n, scale, x, 1 )
580 DO 120 j = jfirst, jlast, jinc
586 tjjs = ab( maind, j )*tscal
593 IF( tjj.GT.smlnum )
THEN
597 IF( tjj.LT.one )
THEN
598 IF( xj.GT.tjj*bignum )
THEN
603 CALL zdscal( n, rec, x, 1 )
608 x( j ) = zladiv( x( j ), tjjs )
610 ELSE IF( tjj.GT.zero )
THEN
614 IF( xj.GT.tjj*bignum )
THEN
619 rec = ( tjj*bignum ) / xj
620 IF( cnorm( j ).GT.one )
THEN
625 rec = rec / cnorm( j )
627 CALL zdscal( n, rec, x, 1 )
631 x( j ) = zladiv( x( j ), tjjs )
653 IF( cnorm( j ).GT.( bignum-xmax )*rec )
THEN
658 CALL zdscal( n, rec, x, 1 )
661 ELSE IF( xj*cnorm( j ).GT.( bignum-xmax ) )
THEN
665 CALL zdscal( n, half, x, 1 )
676 jlen = min( kd, j-1 )
677 CALL zaxpy( jlen, -x( j )*tscal,
678 $ ab( kd+1-jlen, j ), 1, x( j-jlen ), 1 )
679 i = izamax( j-1, x, 1 )
680 xmax = cabs1( x( i ) )
682 ELSE IF( j.LT.n )
THEN
688 jlen = min( kd, n-j )
690 $
CALL zaxpy( jlen, -x( j )*tscal, ab( 2, j ), 1,
692 i = j + izamax( n-j, x( j+1 ), 1 )
693 xmax = cabs1( x( i ) )
697 ELSE IF( lsame( trans,
'T' ) )
THEN
701 DO 170 j = jfirst, jlast, jinc
708 rec = one / max( xmax, one )
709 IF( cnorm( j ).GT.( bignum-xj )*rec )
THEN
715 tjjs = ab( maind, j )*tscal
720 IF( tjj.GT.one )
THEN
724 rec = min( one, rec*tjj )
725 uscal = zladiv( uscal, tjjs )
727 IF( rec.LT.one )
THEN
728 CALL zdscal( n, rec, x, 1 )
735 IF( uscal.EQ.dcmplx( one ) )
THEN
741 jlen = min( kd, j-1 )
742 csumj = zdotu( jlen, ab( kd+1-jlen, j ), 1,
745 jlen = min( kd, n-j )
747 $ csumj = zdotu( jlen, ab( 2, j ), 1, x( j+1 ),
755 jlen = min( kd, j-1 )
757 csumj = csumj + ( ab( kd+i-jlen, j )*uscal )*
761 jlen = min( kd, n-j )
763 csumj = csumj + ( ab( i+1, j )*uscal )*x( j+i )
768 IF( uscal.EQ.dcmplx( tscal ) )
THEN
773 x( j ) = x( j ) - csumj
779 tjjs = ab( maind, j )*tscal
786 IF( tjj.GT.smlnum )
THEN
790 IF( tjj.LT.one )
THEN
791 IF( xj.GT.tjj*bignum )
THEN
796 CALL zdscal( n, rec, x, 1 )
801 x( j ) = zladiv( x( j ), tjjs )
802 ELSE IF( tjj.GT.zero )
THEN
806 IF( xj.GT.tjj*bignum )
THEN
810 rec = ( tjj*bignum ) / xj
811 CALL zdscal( n, rec, x, 1 )
815 x( j ) = zladiv( x( j ), tjjs )
834 x( j ) = zladiv( x( j ), tjjs ) - csumj
836 xmax = max( xmax, cabs1( x( j ) ) )
843 DO 220 j = jfirst, jlast, jinc
850 rec = one / max( xmax, one )
851 IF( cnorm( j ).GT.( bignum-xj )*rec )
THEN
857 tjjs = dconjg( ab( maind, j ) )*tscal
862 IF( tjj.GT.one )
THEN
866 rec = min( one, rec*tjj )
867 uscal = zladiv( uscal, tjjs )
869 IF( rec.LT.one )
THEN
870 CALL zdscal( n, rec, x, 1 )
877 IF( uscal.EQ.dcmplx( one ) )
THEN
883 jlen = min( kd, j-1 )
884 csumj = zdotc( jlen, ab( kd+1-jlen, j ), 1,
887 jlen = min( kd, n-j )
889 $ csumj = zdotc( jlen, ab( 2, j ), 1, x( j+1 ),
897 jlen = min( kd, j-1 )
899 csumj = csumj + ( dconjg( ab( kd+i-jlen, j ) )*
900 $ uscal )*x( j-jlen-1+i )
903 jlen = min( kd, n-j )
905 csumj = csumj + ( dconjg( ab( i+1, j ) )*uscal )
911 IF( uscal.EQ.dcmplx( tscal ) )
THEN
916 x( j ) = x( j ) - csumj
922 tjjs = dconjg( ab( maind, j ) )*tscal
929 IF( tjj.GT.smlnum )
THEN
933 IF( tjj.LT.one )
THEN
934 IF( xj.GT.tjj*bignum )
THEN
939 CALL zdscal( n, rec, x, 1 )
944 x( j ) = zladiv( x( j ), tjjs )
945 ELSE IF( tjj.GT.zero )
THEN
949 IF( xj.GT.tjj*bignum )
THEN
953 rec = ( tjj*bignum ) / xj
954 CALL zdscal( n, rec, x, 1 )
958 x( j ) = zladiv( x( j ), tjjs )
977 x( j ) = zladiv( x( j ), tjjs ) - csumj
979 xmax = max( xmax, cabs1( x( j ) ) )
982 scale = scale / tscal
987 IF( tscal.NE.one )
THEN
988 CALL dscal( n, one / tscal, cnorm, 1 )
subroutine dlabad(SMALL, LARGE)
DLABAD
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine zdscal(N, DA, ZX, INCX)
ZDSCAL
subroutine zaxpy(N, ZA, ZX, INCX, ZY, INCY)
ZAXPY
subroutine ztbsv(UPLO, TRANS, DIAG, N, K, A, LDA, X, INCX)
ZTBSV
subroutine zlatbs(UPLO, TRANS, DIAG, NORMIN, N, KD, AB, LDAB, X, SCALE, CNORM, INFO)
ZLATBS solves a triangular banded system of equations.
subroutine dscal(N, DA, DX, INCX)
DSCAL