229 SUBROUTINE dlatps( UPLO, TRANS, DIAG, NORMIN, N, AP, X, SCALE,
238 CHARACTER DIAG, NORMIN, TRANS, UPLO
240 DOUBLE PRECISION SCALE
243 DOUBLE PRECISION AP( * ), CNORM( * ), X( * )
249 DOUBLE PRECISION ZERO, HALF, ONE
250 parameter ( zero = 0.0d+0, half = 0.5d+0, one = 1.0d+0 )
253 LOGICAL NOTRAN, NOUNIT, UPPER
254 INTEGER I, IMAX, IP, J, JFIRST, JINC, JLAST, JLEN
255 DOUBLE PRECISION BIGNUM, GROW, REC, SMLNUM, SUMJ, TJJ, TJJS,
256 $ tmax, tscal, uscal, xbnd, xj, xmax
261 DOUBLE PRECISION DASUM, DDOT, DLAMCH
262 EXTERNAL lsame, idamax, dasum, ddot, dlamch
268 INTRINSIC abs, max, min
273 upper = lsame( uplo,
'U' )
274 notran = lsame( trans,
'N' )
275 nounit = lsame( diag,
'N' )
279 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
281 ELSE IF( .NOT.notran .AND. .NOT.lsame( trans,
'T' ) .AND. .NOT.
282 $ lsame( trans,
'C' ) )
THEN
284 ELSE IF( .NOT.nounit .AND. .NOT.lsame( diag,
'U' ) )
THEN
286 ELSE IF( .NOT.lsame( normin,
'Y' ) .AND. .NOT.
287 $ lsame( normin,
'N' ) )
THEN
289 ELSE IF( n.LT.0 )
THEN
293 CALL xerbla(
'DLATPS', -info )
304 smlnum = dlamch(
'Safe minimum' ) / dlamch(
'Precision' )
305 bignum = one / smlnum
308 IF( lsame( normin,
'N' ) )
THEN
318 cnorm( j ) = dasum( j-1, ap( ip ), 1 )
327 cnorm( j ) = dasum( n-j, ap( ip+1 ), 1 )
337 imax = idamax( n, cnorm, 1 )
339 IF( tmax.LE.bignum )
THEN
342 tscal = one / ( smlnum*tmax )
343 CALL dscal( n, tscal, cnorm, 1 )
349 j = idamax( n, x, 1 )
366 IF( tscal.NE.one )
THEN
378 grow = one / max( xbnd, smlnum )
380 ip = jfirst*( jfirst+1 ) / 2
382 DO 30 j = jfirst, jlast, jinc
391 tjj = abs( ap( ip ) )
392 xbnd = min( xbnd, min( one, tjj )*grow )
393 IF( tjj+cnorm( j ).GE.smlnum )
THEN
397 grow = grow*( tjj / ( tjj+cnorm( j ) ) )
414 grow = min( one, one / max( xbnd, smlnum ) )
415 DO 40 j = jfirst, jlast, jinc
424 grow = grow*( one / ( one+cnorm( j ) ) )
443 IF( tscal.NE.one )
THEN
455 grow = one / max( xbnd, smlnum )
457 ip = jfirst*( jfirst+1 ) / 2
459 DO 60 j = jfirst, jlast, jinc
468 xj = one + cnorm( j )
469 grow = min( grow, xbnd / xj )
473 tjj = abs( ap( ip ) )
475 $ xbnd = xbnd*( tjj / xj )
479 grow = min( grow, xbnd )
486 grow = min( one, one / max( xbnd, smlnum ) )
487 DO 70 j = jfirst, jlast, jinc
496 xj = one + cnorm( j )
503 IF( ( grow*tscal ).GT.smlnum )
THEN
508 CALL dtpsv( uplo, trans, diag, n, ap, x, 1 )
513 IF( xmax.GT.bignum )
THEN
518 scale = bignum / xmax
519 CALL dscal( n, scale, x, 1 )
527 ip = jfirst*( jfirst+1 ) / 2
528 DO 110 j = jfirst, jlast, jinc
534 tjjs = ap( ip )*tscal
541 IF( tjj.GT.smlnum )
THEN
545 IF( tjj.LT.one )
THEN
546 IF( xj.GT.tjj*bignum )
THEN
551 CALL dscal( n, rec, x, 1 )
556 x( j ) = x( j ) / tjjs
558 ELSE IF( tjj.GT.zero )
THEN
562 IF( xj.GT.tjj*bignum )
THEN
567 rec = ( tjj*bignum ) / xj
568 IF( cnorm( j ).GT.one )
THEN
573 rec = rec / cnorm( j )
575 CALL dscal( n, rec, x, 1 )
579 x( j ) = x( j ) / tjjs
601 IF( cnorm( j ).GT.( bignum-xmax )*rec )
THEN
606 CALL dscal( n, rec, x, 1 )
609 ELSE IF( xj*cnorm( j ).GT.( bignum-xmax ) )
THEN
613 CALL dscal( n, half, x, 1 )
623 CALL daxpy( j-1, -x( j )*tscal, ap( ip-j+1 ), 1, x,
625 i = idamax( j-1, x, 1 )
635 CALL daxpy( n-j, -x( j )*tscal, ap( ip+1 ), 1,
637 i = j + idamax( n-j, x( j+1 ), 1 )
648 ip = jfirst*( jfirst+1 ) / 2
650 DO 160 j = jfirst, jlast, jinc
657 rec = one / max( xmax, one )
658 IF( cnorm( j ).GT.( bignum-xj )*rec )
THEN
664 tjjs = ap( ip )*tscal
669 IF( tjj.GT.one )
THEN
673 rec = min( one, rec*tjj )
676 IF( rec.LT.one )
THEN
677 CALL dscal( n, rec, x, 1 )
684 IF( uscal.EQ.one )
THEN
690 sumj = ddot( j-1, ap( ip-j+1 ), 1, x, 1 )
691 ELSE IF( j.LT.n )
THEN
692 sumj = ddot( n-j, ap( ip+1 ), 1, x( j+1 ), 1 )
700 sumj = sumj + ( ap( ip-j+i )*uscal )*x( i )
702 ELSE IF( j.LT.n )
THEN
704 sumj = sumj + ( ap( ip+i )*uscal )*x( j+i )
709 IF( uscal.EQ.tscal )
THEN
714 x( j ) = x( j ) - sumj
720 tjjs = ap( ip )*tscal
727 IF( tjj.GT.smlnum )
THEN
731 IF( tjj.LT.one )
THEN
732 IF( xj.GT.tjj*bignum )
THEN
737 CALL dscal( n, rec, x, 1 )
742 x( j ) = x( j ) / tjjs
743 ELSE IF( tjj.GT.zero )
THEN
747 IF( xj.GT.tjj*bignum )
THEN
751 rec = ( tjj*bignum ) / xj
752 CALL dscal( n, rec, x, 1 )
756 x( j ) = x( j ) / tjjs
775 x( j ) = x( j ) / tjjs - sumj
777 xmax = max( xmax, abs( x( j ) ) )
782 scale = scale / tscal
787 IF( tscal.NE.one )
THEN
788 CALL dscal( n, one / tscal, cnorm, 1 )
subroutine daxpy(N, DA, DX, INCX, DY, INCY)
DAXPY
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine dtpsv(UPLO, TRANS, DIAG, N, AP, X, INCX)
DTPSV
subroutine dlatps(UPLO, TRANS, DIAG, NORMIN, N, AP, X, SCALE, CNORM, INFO)
DLATPS solves a triangular system of equations with the matrix held in packed storage.
subroutine dscal(N, DA, DX, INCX)
DSCAL