229 SUBROUTINE clatps( UPLO, TRANS, DIAG, NORMIN, N, AP, X, SCALE,
243 COMPLEX AP( * ), X( * )
249 REAL ZERO, HALF, ONE, TWO
250 parameter( zero = 0.0e+0, half = 0.5e+0, one = 1.0e+0,
254 LOGICAL NOTRAN, NOUNIT, UPPER
255 INTEGER I, IMAX, IP, J, JFIRST, JINC, JLAST, JLEN
256 REAL BIGNUM, GROW, REC, SMLNUM, TJJ, TMAX, TSCAL,
258 COMPLEX CSUMJ, TJJS, USCAL, ZDUM
262 INTEGER ICAMAX, ISAMAX
264 COMPLEX CDOTC, CDOTU, CLADIV
265 EXTERNAL lsame, icamax, isamax, scasum, slamch, cdotc,
278 cabs1( zdum ) = abs( real( zdum ) ) + abs( aimag( zdum ) )
279 cabs2( zdum ) = abs( real( zdum ) / 2. ) +
280 $ abs( aimag( zdum ) / 2. )
285 upper = lsame( uplo,
'U' )
286 notran = lsame( trans,
'N' )
287 nounit = lsame( diag,
'N' )
291 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
293 ELSE IF( .NOT.notran .AND. .NOT.lsame( trans,
'T' ) .AND. .NOT.
294 $ lsame( trans,
'C' ) )
THEN
296 ELSE IF( .NOT.nounit .AND. .NOT.lsame( diag,
'U' ) )
THEN
298 ELSE IF( .NOT.lsame( normin,
'Y' ) .AND. .NOT.
299 $ lsame( normin,
'N' ) )
THEN
301 ELSE IF( n.LT.0 )
THEN
305 CALL xerbla(
'CLATPS', -info )
316 smlnum = slamch(
'Safe minimum' )
317 bignum = one / smlnum
318 CALL slabad( smlnum, bignum )
319 smlnum = smlnum / slamch(
'Precision' )
320 bignum = one / smlnum
323 IF( lsame( normin,
'N' ) )
THEN
333 cnorm( j ) = scasum( j-1, ap( ip ), 1 )
342 cnorm( j ) = scasum( n-j, ap( ip+1 ), 1 )
352 imax = isamax( n, cnorm, 1 )
354 IF( tmax.LE.bignum*half )
THEN
357 tscal = half / ( smlnum*tmax )
358 CALL sscal( n, tscal, cnorm, 1 )
366 xmax =
max( xmax, cabs2( x( j ) ) )
383 IF( tscal.NE.one )
THEN
395 grow = half /
max( xbnd, smlnum )
397 ip = jfirst*( jfirst+1 ) / 2
399 DO 40 j = jfirst, jlast, jinc
409 IF( tjj.GE.smlnum )
THEN
413 xbnd =
min( xbnd,
min( one, tjj )*grow )
421 IF( tjj+cnorm( j ).GE.smlnum )
THEN
425 grow = grow*( tjj / ( tjj+cnorm( j ) ) )
442 grow =
min( one, half /
max( xbnd, smlnum ) )
443 DO 50 j = jfirst, jlast, jinc
452 grow = grow*( one / ( one+cnorm( j ) ) )
471 IF( tscal.NE.one )
THEN
483 grow = half /
max( xbnd, smlnum )
485 ip = jfirst*( jfirst+1 ) / 2
487 DO 70 j = jfirst, jlast, jinc
496 xj = one + cnorm( j )
497 grow =
min( grow, xbnd / xj )
502 IF( tjj.GE.smlnum )
THEN
507 $ xbnd = xbnd*( tjj / xj )
517 grow =
min( grow, xbnd )
524 grow =
min( one, half /
max( xbnd, smlnum ) )
525 DO 80 j = jfirst, jlast, jinc
534 xj = one + cnorm( j )
541 IF( ( grow*tscal ).GT.smlnum )
THEN
546 CALL ctpsv( uplo, trans, diag, n, ap, x, 1 )
551 IF( xmax.GT.bignum*half )
THEN
556 scale = ( bignum*half ) / xmax
557 CALL csscal( n, scale, x, 1 )
567 ip = jfirst*( jfirst+1 ) / 2
568 DO 110 j = jfirst, jlast, jinc
574 tjjs = ap( ip )*tscal
581 IF( tjj.GT.smlnum )
THEN
585 IF( tjj.LT.one )
THEN
586 IF( xj.GT.tjj*bignum )
THEN
591 CALL csscal( n, rec, x, 1 )
596 x( j ) = cladiv( x( j ), tjjs )
598 ELSE IF( tjj.GT.zero )
THEN
602 IF( xj.GT.tjj*bignum )
THEN
607 rec = ( tjj*bignum ) / xj
608 IF( cnorm( j ).GT.one )
THEN
613 rec = rec / cnorm( j )
615 CALL csscal( n, rec, x, 1 )
619 x( j ) = cladiv( x( j ), tjjs )
641 IF( cnorm( j ).GT.( bignum-xmax )*rec )
THEN
646 CALL csscal( n, rec, x, 1 )
649 ELSE IF( xj*cnorm( j ).GT.( bignum-xmax ) )
THEN
653 CALL csscal( n, half, x, 1 )
663 CALL caxpy( j-1, -x( j )*tscal, ap( ip-j+1 ), 1, x,
665 i = icamax( j-1, x, 1 )
666 xmax = cabs1( x( i ) )
675 CALL caxpy( n-j, -x( j )*tscal, ap( ip+1 ), 1,
677 i = j + icamax( n-j, x( j+1 ), 1 )
678 xmax = cabs1( x( i ) )
684 ELSE IF( lsame( trans,
'T' ) )
THEN
688 ip = jfirst*( jfirst+1 ) / 2
690 DO 150 j = jfirst, jlast, jinc
697 rec = one /
max( xmax, one )
698 IF( cnorm( j ).GT.( bignum-xj )*rec )
THEN
704 tjjs = ap( ip )*tscal
709 IF( tjj.GT.one )
THEN
713 rec =
min( one, rec*tjj )
714 uscal = cladiv( uscal, tjjs )
716 IF( rec.LT.one )
THEN
717 CALL csscal( n, rec, x, 1 )
724 IF( uscal.EQ.
cmplx( one ) )
THEN
730 csumj = cdotu( j-1, ap( ip-j+1 ), 1, x, 1 )
731 ELSE IF( j.LT.n )
THEN
732 csumj = cdotu( n-j, ap( ip+1 ), 1, x( j+1 ), 1 )
740 csumj = csumj + ( ap( ip-j+i )*uscal )*x( i )
742 ELSE IF( j.LT.n )
THEN
744 csumj = csumj + ( ap( ip+i )*uscal )*x( j+i )
749 IF( uscal.EQ.
cmplx( tscal ) )
THEN
754 x( j ) = x( j ) - csumj
760 tjjs = ap( ip )*tscal
767 IF( tjj.GT.smlnum )
THEN
771 IF( tjj.LT.one )
THEN
772 IF( xj.GT.tjj*bignum )
THEN
777 CALL csscal( n, rec, x, 1 )
782 x( j ) = cladiv( x( j ), tjjs )
783 ELSE IF( tjj.GT.zero )
THEN
787 IF( xj.GT.tjj*bignum )
THEN
791 rec = ( tjj*bignum ) / xj
792 CALL csscal( n, rec, x, 1 )
796 x( j ) = cladiv( x( j ), tjjs )
815 x( j ) = cladiv( x( j ), tjjs ) - csumj
817 xmax =
max( xmax, cabs1( x( j ) ) )
826 ip = jfirst*( jfirst+1 ) / 2
828 DO 190 j = jfirst, jlast, jinc
835 rec = one /
max( xmax, one )
836 IF( cnorm( j ).GT.( bignum-xj )*rec )
THEN
842 tjjs = conjg( ap( ip ) )*tscal
847 IF( tjj.GT.one )
THEN
851 rec =
min( one, rec*tjj )
852 uscal = cladiv( uscal, tjjs )
854 IF( rec.LT.one )
THEN
855 CALL csscal( n, rec, x, 1 )
862 IF( uscal.EQ.
cmplx( one ) )
THEN
868 csumj = cdotc( j-1, ap( ip-j+1 ), 1, x, 1 )
869 ELSE IF( j.LT.n )
THEN
870 csumj = cdotc( n-j, ap( ip+1 ), 1, x( j+1 ), 1 )
878 csumj = csumj + ( conjg( ap( ip-j+i ) )*uscal )*
881 ELSE IF( j.LT.n )
THEN
883 csumj = csumj + ( conjg( ap( ip+i ) )*uscal )*
889 IF( uscal.EQ.
cmplx( tscal ) )
THEN
894 x( j ) = x( j ) - csumj
900 tjjs = conjg( ap( ip ) )*tscal
907 IF( tjj.GT.smlnum )
THEN
911 IF( tjj.LT.one )
THEN
912 IF( xj.GT.tjj*bignum )
THEN
917 CALL csscal( n, rec, x, 1 )
922 x( j ) = cladiv( x( j ), tjjs )
923 ELSE IF( tjj.GT.zero )
THEN
927 IF( xj.GT.tjj*bignum )
THEN
931 rec = ( tjj*bignum ) / xj
932 CALL csscal( n, rec, x, 1 )
936 x( j ) = cladiv( x( j ), tjjs )
955 x( j ) = cladiv( x( j ), tjjs ) - csumj
957 xmax =
max( xmax, cabs1( x( j ) ) )
962 scale = scale / tscal
967 IF( tscal.NE.one )
THEN
968 CALL sscal( n, one / tscal, cnorm, 1 )