229 SUBROUTINE zlatps( UPLO, TRANS, DIAG, NORMIN, N, AP, X, SCALE,
237 CHARACTER DIAG, NORMIN, TRANS, UPLO
239 DOUBLE PRECISION SCALE
242 DOUBLE PRECISION CNORM( * )
243 COMPLEX*16 AP( * ), X( * )
249 DOUBLE PRECISION ZERO, HALF, ONE, TWO
250 parameter( zero = 0.0d+0, half = 0.5d+0, one = 1.0d+0,
254 LOGICAL NOTRAN, NOUNIT, UPPER
255 INTEGER I, IMAX, IP, J, JFIRST, JINC, 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 DLAMCH, 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 CABS1, 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
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 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 )
subroutine zaxpy(N, ZA, ZX, INCX, ZY, INCY)
ZAXPY
subroutine zdscal(N, DA, ZX, INCX)
ZDSCAL
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine zlatps(UPLO, TRANS, DIAG, NORMIN, N, AP, X, SCALE, CNORM, INFO)
ZLATPS solves a triangular system of equations with the matrix held in packed storage.
subroutine ztpsv(UPLO, TRANS, DIAG, N, AP, X, INCX)
ZTPSV
subroutine dscal(N, DA, DX, INCX)
DSCAL
subroutine dlabad(SMALL, LARGE)
DLABAD