229 SUBROUTINE zlatps( UPLO, TRANS, DIAG, NORMIN, N, AP, X, SCALE,
237 CHARACTER DIAG, NORMIN, TRANS,
239 DOUBLE PRECISION SCALE
242 DOUBLE PRECISION CNORM( * )
243 COMPLEX*16 AP( * ), ( * )
249 DOUBLE PRECISION ZERO, , , TWO
250 parameter( zero = 0.0d+0, half = 0.5d+0, one = 1.0d+0,
255 INTEGER I, IMAX, IP, J, JFIRST, , JLAST, JLEN
256 DOUBLE PRECISION BIGNUM, GROW, REC, SMLNUM, TJJ, TMAX, TSCAL,
258 COMPLEX*16 CSUMJ, TJJS, USCAL, ZDUM
262 INTEGER IDAMAX, IZAMAX
263 DOUBLE PRECISION , DZASUM
264 COMPLEX*16 ZDOTC, ZDOTU, ZLADIV
265 EXTERNAL lsame, idamax, izamax,
dlamch, dzasum, zdotc,
272 INTRINSIC abs, dble, dcmplx, dconjg, dimag,
max,
min
275 DOUBLE PRECISION , CABS2
278 cabs1( zdum ) = abs( dble( zdum ) ) + abs( dimag( zdum ) )
279 cabs2( zdum ) = abs( dble( zdum ) / 2.d0 ) +
280 $ abs( dimag( zdum ) / 2.d0 )
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(
'ZLATPS', -info )
316 smlnum =
dlamch(
'Safe minimum' )
317 bignum = one / smlnum
318 CALL dlabad( smlnum, bignum )
319 smlnum = smlnum /
dlamch(
'Precision' )
320 bignum = one / smlnum
323 IF( lsame( normin,
'N' ) )
THEN
333 cnorm( j ) = dzasum( j-1, ap( ip ), 1 )
342 cnorm( j ) = dzasum( n-j, ap( ip+1 ), 1 )
352 imax = idamax( n, cnorm, 1 )
354 IF( tmax.LE.bignum*half )
THEN
357 tscal = half / ( smlnum*tmax )
358 CALL dscal( 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 ztpsv( uplo, trans, diag, n, ap, x, 1 )
551 IF( xmax.GT.bignum*half )
THEN
556 scale = ( bignum*half ) / xmax
557 CALL zdscal( n, scale, x, 1 )
567 ip = jfirst*( jfirst+1 ) / 2
568 DO 120 j = jfirst, jlast, jinc
581 IF( tjj.GT.smlnum )
THEN
585 IF( tjj.LT.one )
THEN
586 IF( xj.GT.tjj*bignum )
THEN
591 CALL zdscal( n, rec, x, 1 )
596 x( j ) = zladiv( 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 zdscal( n, rec, x, 1 )
619 x( j ) = zladiv( x( j ), tjjs )
641 IF( cnorm( j ).GT.( bignum-xmax )*rec )
THEN
646 CALL zdscal( n, rec, x, 1 )
649 ELSE IF( xj*cnorm( j ).GT.( bignum-xmax ) )
THEN
653 CALL zdscal( n, half, x, 1 )
663 CALL zaxpy( j-1, -x( j )*tscal, ap( ip-j+1 ), 1, x,
665 i = izamax( j-1, x, 1 )
666 xmax = cabs1( x( i ) )
675 CALL zaxpy( n-j, -x( j )*tscal, ap( ip+1 ), 1,
677 i = j + izamax( 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 170 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 = zladiv( uscal, tjjs )
716 IF( rec.LT.one )
THEN
717 CALL zdscal( n, rec, x, 1 )
724 IF( uscal.EQ.dcmplx( one ) )
THEN
730 csumj = zdotu( j-1, ap( ip-j+1 ), 1, x, 1 )
731 ELSE IF( j.LT.n )
THEN
732 csumj = zdotu( 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.dcmplx( 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 zdscal( n, rec, x, 1 )
782 x( j ) = zladiv( x( j ), tjjs )
783 ELSE IF( tjj.GT.zero )
THEN
787 IF( xj.GT.tjj*bignum )
THEN
791 rec = ( tjj*bignum ) / xj
792 CALL zdscal( n, rec, x, 1 )
796 x( j ) = zladiv( x( j ), tjjs )
815 x( j ) = zladiv( x( j ), tjjs ) - csumj
817 xmax =
max( xmax, cabs1( x( j ) ) )
826 ip = jfirst*( jfirst+1 ) / 2
828 DO 220 j = jfirst, jlast, jinc
835 rec = one /
max( xmax, one )
836 IF( cnorm( j ).GT.( bignum-xj )*rec )
THEN
842 tjjs = dconjg( ap( ip ) )*tscal
847 IF( tjj.GT.one )
THEN
851 rec =
min( one, rec*tjj )
852 uscal = zladiv( uscal, tjjs )
854 IF( rec.LT.one )
THEN
855 CALL zdscal( n, rec, x, 1 )
862 IF( uscal.EQ.dcmplx( one ) )
THEN
868 csumj = zdotc( j-1, ap( ip-j+1 ), 1, x, 1 )
869 ELSE IF( j.LT.n )
THEN
870 csumj = zdotc( n-j, ap( ip+1 ), 1, x( j+1 ), 1 )
878 csumj = csumj + ( dconjg( ap( ip-j+i ) )*uscal )
881 ELSE IF( j.LT.n )
THEN
883 csumj = csumj + ( dconjg( ap( ip+i ) )*uscal )*
889 IF( uscal.EQ.dcmplx( tscal ) )
THEN
894 x( j ) = x( j ) - csumj
900 tjjs = dconjg( ap( ip ) )*tscal
907 IF( tjj.GT.smlnum )
THEN
911 IF( tjj.LT.one )
THEN
912 IF( xj.GT.tjj*bignum )
THEN
917 CALL zdscal( n, rec, x, 1 )
922 x( j ) = zladiv( x( j ), tjjs )
923 ELSE IF( tjj.GT.zero )
THEN
927 IF( xj.GT.tjj*bignum )
THEN
931 rec = ( tjj*bignum ) / xj
932 CALL zdscal( n, rec, x, 1 )
936 x( j ) = zladiv( x( j ), tjjs )
955 x( j ) = zladiv( x( j ), tjjs ) - csumj
957 xmax =
max( xmax, cabs1( x( j ) ) )
962 scale = scale / tscal
967 IF( tscal.NE.one )
THEN
968 CALL dscal( n, one / tscal, cnorm, 1 )