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 )