1 SUBROUTINE clatrs( UPLO, TRANS, DIAG, NORMIN, N, A, LDA, X, SCALE,
15 COMPLEX a( lda, * ), x( * )
173 REAL zero, half, one, two
174 parameter( zero = 0.0e+0, half = 0.5e+0, one = 1.0e+0,
178 LOGICAL notran, nounit, upper
179 INTEGER i, imax, j, jfirst, jinc, jlast
180 REAL bignum, grow, rec, smlnum, tjj, tmax, tscal,
182 COMPLEX csumj, tjjs, uscal, zdum
186 INTEGER icamax, isamax
188 COMPLEX cdotc, cdotu, cladiv
189 EXTERNAL lsame, icamax, isamax, scasum, slamch, cdotc,
196 INTRINSIC abs, aimag, cmplx, conjg,
max,
min, real
202 cabs1( zdum ) = abs(
REAL( ZDUM ) ) + abs( aimag( zdum ) )
203 cabs2( zdum ) = abs(
REAL( ZDUM ) / 2. ) +
204 $ abs( aimag( zdum ) / 2. )
209 upper = lsame(
uplo,
'U' )
210 notran = lsame(
trans,
'N' )
211 nounit = lsame(
diag,
'N' )
215 IF( .NOT.upper .AND. .NOT.lsame(
uplo,
'L' ) )
THEN
217 ELSE IF( .NOT.notran .AND. .NOT.lsame(
trans,
'T' ) .AND. .NOT.
218 $ lsame(
trans,
'C' ) )
THEN
220 ELSE IF( .NOT.nounit .AND. .NOT.lsame(
diag,
'U' ) )
THEN
222 ELSE IF( .NOT.lsame( normin,
'Y' ) .AND. .NOT.
223 $ lsame( normin,
'N' ) )
THEN
225 ELSE IF( n.LT.0 )
THEN
227 ELSE IF( lda.LT.
max( 1, n ) )
THEN
231 CALL
xerbla(
'CLATRS', -info )
242 smlnum = slamch(
'Safe minimum' )
243 bignum = one / smlnum
244 CALL
slabad( smlnum, bignum )
245 smlnum = smlnum / slamch(
'Precision' )
246 bignum = one / smlnum
249 IF( lsame( normin,
'N' ) )
THEN
258 cnorm( j ) = scasum( j-1, a( 1, j ), 1 )
265 cnorm( j ) = scasum( n-j, a( j+1, j ), 1 )
274 imax = isamax( n, cnorm, 1 )
276 IF( tmax.LE.bignum*half )
THEN
279 tscal = half / ( smlnum*tmax )
280 CALL sscal( n, tscal, cnorm, 1 )
288 xmax =
max( xmax, cabs2( x( j ) ) )
306 IF( tscal.NE.one )
THEN
318 grow = half /
max( xbnd, smlnum )
320 DO 40 j = jfirst, jlast, jinc
330 IF( tjj.GE.smlnum )
THEN
334 xbnd =
min( xbnd,
min( one, tjj )*grow )
342 IF( tjj+cnorm( j ).GE.smlnum )
THEN
346 grow = grow*( tjj / ( tjj+cnorm( j ) ) )
361 grow =
min( one, half /
max( xbnd, smlnum ) )
362 DO 50 j = jfirst, jlast, jinc
371 grow = grow*( one / ( one+cnorm( j ) ) )
390 IF( tscal.NE.one )
THEN
402 grow = half /
max( xbnd, smlnum )
404 DO 70 j = jfirst, jlast, jinc
413 xj = one + cnorm( j )
414 grow =
min( grow, xbnd / xj )
419 IF( tjj.GE.smlnum )
THEN
424 $ xbnd = xbnd*( tjj / xj )
432 grow =
min( grow, xbnd )
439 grow =
min( one, half /
max( xbnd, smlnum ) )
440 DO 80 j = jfirst, jlast, jinc
449 xj = one + cnorm( j )
456 IF( ( grow*tscal ).GT.smlnum )
THEN
466 IF( xmax.GT.bignum*half )
THEN
471 scale = ( bignum*half ) / xmax
472 CALL csscal( n, scale, x, 1 )
482 DO 110 j = jfirst, jlast, jinc
488 tjjs = a( j, j )*tscal
495 IF( tjj.GT.smlnum )
THEN
499 IF( tjj.LT.one )
THEN
500 IF( xj.GT.tjj*bignum )
THEN
505 CALL csscal( n, rec, x, 1 )
510 x( j ) = cladiv( x( j ), tjjs )
512 ELSE IF( tjj.GT.zero )
THEN
516 IF( xj.GT.tjj*bignum )
THEN
521 rec = ( tjj*bignum ) / xj
522 IF( cnorm( j ).GT.one )
THEN
527 rec = rec / cnorm( j )
529 CALL csscal( n, rec, x, 1 )
533 x( j ) = cladiv( x( j ), tjjs )
555 IF( cnorm( j ).GT.( bignum-xmax )*rec )
THEN
560 CALL csscal( n, rec, x, 1 )
563 ELSE IF( xj*cnorm( j ).GT.( bignum-xmax ) )
THEN
567 CALL csscal( n, half, x, 1 )
577 CALL caxpy( j-1, -x( j )*tscal, a( 1, j ), 1, x,
579 i = icamax( j-1, x, 1 )
580 xmax = cabs1( x( i ) )
588 CALL caxpy( n-j, -x( j )*tscal, a( j+1, j ), 1,
590 i = j + icamax( n-j, x( j+1 ), 1 )
591 xmax = cabs1( x( i ) )
596 ELSE IF( lsame(
trans,
'T' ) )
THEN
600 DO 150 j = jfirst, jlast, jinc
607 rec = one /
max( xmax, one )
608 IF( cnorm( j ).GT.( bignum-xj )*rec )
THEN
614 tjjs = a( j, j )*tscal
619 IF( tjj.GT.one )
THEN
623 rec =
min( one, rec*tjj )
624 uscal = cladiv( uscal, tjjs )
626 IF( rec.LT.one )
THEN
627 CALL csscal( n, rec, x, 1 )
634 IF( uscal.EQ.cmplx( one ) )
THEN
640 csumj = cdotu( j-1, a( 1, j ), 1, x, 1 )
641 ELSE IF( j.LT.n )
THEN
642 csumj = cdotu( n-j, a( j+1, j ), 1, x( j+1 ), 1 )
650 csumj = csumj + ( a( i, j )*uscal )*x( i )
652 ELSE IF( j.LT.n )
THEN
654 csumj = csumj + ( a( i, j )*uscal )*x( i )
659 IF( uscal.EQ.cmplx( tscal ) )
THEN
664 x( j ) = x( j ) - csumj
667 tjjs = a( j, j )*tscal
677 IF( tjj.GT.smlnum )
THEN
681 IF( tjj.LT.one )
THEN
682 IF( xj.GT.tjj*bignum )
THEN
687 CALL csscal( n, rec, x, 1 )
692 x( j ) = cladiv( x( j ), tjjs )
693 ELSE IF( tjj.GT.zero )
THEN
697 IF( xj.GT.tjj*bignum )
THEN
701 rec = ( tjj*bignum ) / xj
702 CALL csscal( n, rec, x, 1 )
706 x( j ) = cladiv( x( j ), tjjs )
725 x( j ) = cladiv( x( j ), tjjs ) - csumj
727 xmax =
max( xmax, cabs1( x( j ) ) )
734 DO 190 j = jfirst, jlast, jinc
741 rec = one /
max( xmax, one )
742 IF( cnorm( j ).GT.( bignum-xj )*rec )
THEN
748 tjjs = conjg( a( j, j ) )*tscal
753 IF( tjj.GT.one )
THEN
757 rec =
min( one, rec*tjj )
758 uscal = cladiv( uscal, tjjs )
760 IF( rec.LT.one )
THEN
761 CALL csscal( n, rec, x, 1 )
768 IF( uscal.EQ.cmplx( one ) )
THEN
774 csumj = cdotc( j-1, a( 1, j ), 1, x, 1 )
775 ELSE IF( j.LT.n )
THEN
776 csumj = cdotc( n-j, a( j+1, j ), 1, x( j+1 ), 1 )
784 csumj = csumj + ( conjg( a( i, j ) )*uscal )*
787 ELSE IF( j.LT.n )
THEN
789 csumj = csumj + ( conjg( a( i, j ) )*uscal )*
795 IF( uscal.EQ.cmplx( tscal ) )
THEN
800 x( j ) = x( j ) - csumj
803 tjjs = conjg( a( j, j ) )*tscal
813 IF( tjj.GT.smlnum )
THEN
817 IF( tjj.LT.one )
THEN
818 IF( xj.GT.tjj*bignum )
THEN
823 CALL csscal( n, rec, x, 1 )
828 x( j ) = cladiv( x( j ), tjjs )
829 ELSE IF( tjj.GT.zero )
THEN
833 IF( xj.GT.tjj*bignum )
THEN
837 rec = ( tjj*bignum ) / xj
838 CALL csscal( n, rec, x, 1 )
842 x( j ) = cladiv( x( j ), tjjs )
861 x( j ) = cladiv( x( j ), tjjs ) - csumj
863 xmax =
max( xmax, cabs1( x( j ) ) )
866 scale = scale / tscal
871 IF( tscal.NE.one )
THEN
872 CALL sscal( n, one / tscal, cnorm, 1 )