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 dlabad(SMALL, LARGE)
DLABAD
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine zdscal(N, DA, ZX, INCX)
ZDSCAL
subroutine zaxpy(N, ZA, ZX, INCX, ZY, INCY)
ZAXPY
subroutine ztpsv(UPLO, TRANS, DIAG, N, AP, X, INCX)
ZTPSV
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 dscal(N, DA, DX, INCX)
DSCAL