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, , ONE, TWO
250 parameter( zero = 0.0d+0, half = 0.5d+0, one = 1.0d+0,
254 LOGICAL , 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.LE.
IF( TMAXBIGNUM*HALF ) THEN
357 TSCAL = HALF / ( SMLNUM*TMAX )
358 CALL DSCAL( N, TSCAL, CNORM, 1 )
366 XMAX = MAX( XMAX, CABS2( X( J ) ) )
383.NE.
IF( TSCALONE ) THEN
395 GROW = HALF / MAX( XBND, SMLNUM )
397 IP = JFIRST*( JFIRST+1 ) / 2
399 DO 40 J = JFIRST, JLAST, JINC
409.GE.
IF( TJJSMLNUM ) THEN
413 XBND = MIN( XBND, MIN( ONE, TJJ )*GROW )
421.GE.
IF( TJJ+CNORM( J )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.NE.
IF( TSCALONE ) 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.GE.
IF( TJJSMLNUM ) 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.GT.
IF( ( GROW*TSCAL )SMLNUM ) THEN
546 CALL ZTPSV( UPLO, TRANS, DIAG, N, AP, X, 1 )
551.GT.
IF( XMAXBIGNUM*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.GT.
IF( TJJSMLNUM ) THEN
585.LT.
IF( TJJONE ) THEN
586.GT.
IF( XJTJJ*BIGNUM ) THEN
591 CALL ZDSCAL( N, REC, X, 1 )
596 X( J ) = ZLADIV( X( J ), TJJS )
598.GT.
ELSE IF( TJJZERO ) THEN
602.GT.
IF( XJTJJ*BIGNUM ) THEN
607 REC = ( TJJ*BIGNUM ) / XJ
608.GT.
IF( CNORM( J )ONE ) THEN
613 REC = REC / CNORM( J )
615 CALL ZDSCAL( N, REC, X, 1 )
619 X( J ) = ZLADIV( X( J ), TJJS )
641.GT.
IF( CNORM( J )( BIGNUM-XMAX )*REC ) THEN
646 CALL ZDSCAL( N, REC, X, 1 )
649.GT.
ELSE IF( XJ*CNORM( J )( 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.GT.
IF( CNORM( J )( BIGNUM-XJ )*REC ) THEN
704 TJJS = AP( IP )*TSCAL
709.GT.
IF( TJJONE ) THEN
713 REC = MIN( ONE, REC*TJJ )
714 USCAL = ZLADIV( USCAL, TJJS )
716.LT.
IF( RECONE ) THEN
717 CALL ZDSCAL( N, REC, X, 1 )
724.EQ.
IF( USCALDCMPLX( ONE ) ) THEN
730 CSUMJ = ZDOTU( J-1, AP( IP-J+1 ), 1, X, 1 )
731.LT.
ELSE IF( JN ) 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.LT.
ELSE IF( JN ) THEN
744 CSUMJ = CSUMJ + ( AP( IP+I )*USCAL )*X( J+I )
749.EQ.
IF( USCALDCMPLX( TSCAL ) ) THEN
754 X( J ) = X( J ) - CSUMJ
760 TJJS = AP( IP )*TSCAL
767.GT.
IF( TJJSMLNUM ) THEN
771.LT.
IF( TJJONE ) THEN
772.GT.
IF( XJTJJ*BIGNUM ) THEN
777 CALL ZDSCAL( N, REC, X, 1 )
782 X( J ) = ZLADIV( X( J ), TJJS )
783.GT.
ELSE IF( TJJZERO ) THEN
787.GT.
IF( XJTJJ*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.GT.
IF( CNORM( J )( BIGNUM-XJ )*REC ) THEN
842 TJJS = DCONJG( AP( IP ) )*TSCAL
847.GT.
IF( TJJONE ) THEN
851 REC = MIN( ONE, REC*TJJ )
852 USCAL = ZLADIV( USCAL, TJJS )
854.LT.
IF( RECONE ) THEN
855 CALL ZDSCAL( N, REC, X, 1 )
862.EQ.
IF( USCALDCMPLX( ONE ) ) THEN
868 CSUMJ = ZDOTC( J-1, AP( IP-J+1 ), 1, X, 1 )
869.LT.
ELSE IF( JN ) THEN
870 CSUMJ = ZDOTC( N-J, AP( IP+1 ), 1, X( J+1 ), 1 )
878 CSUMJ = CSUMJ + ( DCONJG( AP( IP-J+I ) )*USCAL )
881.LT.
ELSE IF( JN ) THEN
883 CSUMJ = CSUMJ + ( DCONJG( AP( IP+I ) )*USCAL )*
889.EQ.
IF( USCALDCMPLX( TSCAL ) ) THEN
894 X( J ) = X( J ) - CSUMJ
900 TJJS = DCONJG( AP( IP ) )*TSCAL
907.GT.
IF( TJJSMLNUM ) THEN
911.LT.
IF( TJJONE ) THEN
912.GT.
IF( XJTJJ*BIGNUM ) THEN
917 CALL ZDSCAL( N, REC, X, 1 )
922 X( J ) = ZLADIV( X( J ), TJJS )
923.GT.
ELSE IF( TJJZERO ) THEN
927.GT.
IF( XJTJJ*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.NE.
IF( TSCALONE ) THEN
968 CALL DSCAL( N, ONE / TSCAL, CNORM, 1 )
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