241 SUBROUTINE clatbs( UPLO, TRANS, DIAG, NORMIN, N, KD, AB, LDAB, X,
242 $ SCALE, CNORM, INFO )
249 CHARACTER DIAG, NORMIN, TRANS, UPLO
250 INTEGER , KD, LDAB, N
255 COMPLEX AB( , * ), X( * )
261 REAL ZERO, HALF, ONE, TWO
262 parameter( zero = 0.0e+0, half = 0.5e+0, one = 1.0e+0,
266 LOGICAL NOTRAN, NOUNIT, UPPER
267 INTEGER I, IMAX, J, JFIRST, JINC, JLAST, JLEN, MAIND
268 REAL BIGNUM, GROW, REC, SMLNUM, TJJ, TMAX, TSCAL,
270 COMPLEX CSUMJ, TJJS, USCAL, ZDUM
274 INTEGER ICAMAX, ISAMAX
276 COMPLEX CDOTC, CDOTU, CLADIV
277 EXTERNAL lsame, icamax, isamax, scasum, slamch, cdotc,
290 cabs1( zdum ) = abs( real( zdum ) ) + abs( aimag( zdum ) )
291 cabs2( zdum ) = abs( real( zdum ) / 2. ) +
292 $ abs( aimag( zdum ) / 2. )
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(
'CLATBS', -info )
332 smlnum = slamch(
'Safe minimum' )
333 bignum = one / smlnum
334 CALL slabad( smlnum, bignum )
335 smlnum = smlnum / slamch(
'Precision' )
336 bignum = one / smlnum
339 IF( lsame( normin,
'N' ) )
THEN
348 jlen =
min( kd, j-1 )
349 cnorm( j ) = scasum( jlen, ab( kd+1-jlen, j ), 1 )
356 jlen =
min( kd, n-j )
358 cnorm( j ) = scasum( jlen, ab( 2, j ), 1 )
369 imax = isamax( n, cnorm, 1 )
371 IF( tmax.LE.bignum*half )
THEN
374 tscal = half / ( smlnum*tmax )
375 CALL sscal( 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
512 grow =
min( grow, xbnd / xj )
514 tjjs = ab( maind, j )
517 IF( tjj.GE.smlnum )
THEN
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 ctbsv( uplo, trans, diag, n, kd, ab, ldab, x, 1 )
564 IF( xmax.GT.bignum*half )
THEN
569 scale = ( bignum*half ) / xmax
570 CALL csscal( n, scale, x, 1 )
580 DO 110 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 csscal( n, rec, x, 1 )
608 x( j ) = cladiv( 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 csscal( n, rec, x, 1 )
631 x( j ) = cladiv( x( j ), tjjs )
653 IF( cnorm( j ).GT.( bignum-xmax )*rec )
THEN
658 CALL csscal( n, rec, x, 1 )
661 ELSE IF( xj*cnorm( j ).GT.( bignum-xmax ) )
THEN
665 CALL csscal( n, half, x, 1 )
676 jlen =
min( kd, j-1 )
677 CALL caxpy( jlen, -x( j )*tscal,
678 $ ab( kd+1-jlen, j ), 1, x( j-jlen ), 1 )
679 i = icamax( j-1, x, 1 )
680 xmax = cabs1( x( i ) )
682 ELSE IF( j.LT.n )
THEN
688 jlen =
min( kd, n-j )
690 $
CALL caxpy( jlen, -x( j )*tscal, ab( 2, j ), 1,
692 i = j + icamax( n-j, x( j+1 ), 1 )
693 xmax = cabs1( x( i ) )
697 ELSE IF( lsame( trans,
'T' ) )
THEN
701 DO 150 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 = cladiv( uscal, tjjs )
727 IF( rec.LT.one )
THEN
728 CALL csscal( n, rec, x, 1 )
735 IF( uscal.EQ.
cmplx( one ) )
THEN
741 jlen =
min( kd, j-1 )
742 csumj = cdotu( jlen, ab( kd+1-jlen, j ), 1,
745 jlen =
min( kd, n-j )
747 $ csumj = cdotu( 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.
cmplx( 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 csscal( n, rec, x, 1 )
801 x( j ) = cladiv( x( j ), tjjs )
802 ELSE IF( tjj.GT.zero )
THEN
806 IF( xj.GT.tjj*bignum )
THEN
810 rec = ( tjj*bignum ) / xj
811 CALL csscal( n, rec, x, 1 )
815 x( j ) = cladiv( x( j ), tjjs )
834 x( j ) = cladiv( x( j ), tjjs ) - csumj
836 xmax =
max( xmax, cabs1( x( j ) ) )
843 DO 190 j = jfirst, jlast, jinc
850 rec = one /
max( xmax, one )
851 IF( cnorm( j ).GT.( bignum-xj )*rec )
THEN
857 tjjs = conjg( ab( maind, j ) )*tscal
862 IF( tjj.GT.one )
THEN
866 rec =
min( one, rec*tjj )
867 uscal = cladiv( uscal, tjjs )
869 IF( rec.LT.one )
THEN
870 CALL csscal( n, rec, x, 1 )
877 IF( uscal.EQ.
cmplx( one ) )
THEN
883 jlen =
min( kd, j-1 )
884 csumj = cdotc( jlen, ab( kd+1-jlen, j ), 1,
887 jlen =
min( kd, n-j )
889 $ csumj = cdotc( jlen, ab( 2, j ), 1, x( j+1 ),
897 jlen =
min( kd, j-1 )
899 csumj = csumj + ( conjg( ab( kd+i-jlen, j ) )*
900 $ uscal )*x( j-jlen-1+i )
903 jlen =
min( kd, n-j )
905 csumj = csumj + ( conjg( ab( i+1, j ) )*uscal )*
911 IF( uscal.EQ.
cmplx( tscal ) )
THEN
916 x( j ) = x( j ) - csumj
922 tjjs = conjg( 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 csscal( n, rec, x, 1 )
944 x( j ) = cladiv( x( j ), tjjs )
945 ELSE IF( tjj.GT.zero )
THEN
949 IF( xj.GT.tjj*bignum )
THEN
953 rec = ( tjj*bignum ) / xj
954 CALL csscal( n, rec, x, 1 )
958 x( j ) = cladiv( x( j ), tjjs )
977 x( j ) = cladiv( x( j ), tjjs ) - csumj
979 xmax =
max( xmax, cabs1( x( j ) ) )
982 scale = scale / tscal
987 IF( tscal.NE.one )
THEN
988 CALL sscal( n, one / tscal, cnorm, 1 )