227 SUBROUTINE slatps( UPLO, TRANS, DIAG, NORMIN, N, AP, X, SCALE,
235 CHARACTER DIAG, NORMIN, TRANS, UPLO
240 REAL AP( * ), CNORM( * ), X( * )
247 parameter( zero = 0.0e+0, half = 0.5e+0, one = 1.0e+0 )
250 LOGICAL NOTRAN, NOUNIT, UPPER
251 INTEGER I, IMAX, IP, J, JFIRST, JINC, JLAST, JLEN
252 REAL BIGNUM, GROW, REC, SMLNUM, SUMJ, TJJ, TJJS,
253 $ tmax, tscal, uscal, xbnd, xj, xmax
258 REAL SASUM, SDOT, SLAMCH
259 EXTERNAL lsame, isamax, sasum, sdot, slamch
265 INTRINSIC abs, max, min
270 upper = lsame( uplo,
'U' )
271 notran = lsame( trans,
'N' )
272 nounit = lsame( diag,
'N' )
276 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
278 ELSE IF( .NOT.notran .AND. .NOT.lsame( trans,
'T' ) .AND. .NOT.
279 $ lsame( trans,
'C' ) )
THEN
281 ELSE IF( .NOT.nounit .AND. .NOT.lsame( diag,
'U' ) )
THEN
283 ELSE IF( .NOT.lsame( normin,
'Y' ) .AND. .NOT.
284 $ lsame( normin,
'N' ) )
THEN
286 ELSE IF( n.LT.0 )
THEN
290 CALL xerbla(
'SLATPS', -info )
301 smlnum = slamch(
'Safe minimum' ) / slamch(
'Precision' )
302 bignum = one / smlnum
305 IF( lsame( normin,
'N' ) )
THEN
315 cnorm( j ) = sasum( j-1, ap( ip ), 1 )
324 cnorm( j ) = sasum( n-j, ap( ip+1 ), 1 )
334 imax = isamax( n, cnorm, 1 )
336 IF( tmax.LE.bignum )
THEN
339 tscal = one / ( smlnum*tmax )
340 CALL sscal( n, tscal, cnorm, 1 )
346 j = isamax( n, x, 1 )
363 IF( tscal.NE.one )
THEN
375 grow = one / max( xbnd, smlnum )
377 ip = jfirst*( jfirst+1 ) / 2
379 DO 30 j = jfirst, jlast, jinc
388 tjj = abs( ap( ip ) )
389 xbnd = min( xbnd, min( one, tjj )*grow )
390 IF( tjj+cnorm( j ).GE.smlnum )
THEN
394 grow = grow*( tjj / ( tjj+cnorm( j ) ) )
411 grow = min( one, one / max( xbnd, smlnum ) )
412 DO 40 j = jfirst, jlast, jinc
421 grow = grow*( one / ( one+cnorm( j ) ) )
440 IF( tscal.NE.one )
THEN
452 grow = one / max( xbnd, smlnum )
454 ip = jfirst*( jfirst+1 ) / 2
456 DO 60 j = jfirst, jlast, jinc
465 xj = one + cnorm( j )
466 grow = min( grow, xbnd / xj )
470 tjj = abs( ap( ip ) )
472 $ xbnd = xbnd*( tjj / xj )
476 grow = min( grow, xbnd )
483 grow = min( one, one / max( xbnd, smlnum ) )
484 DO 70 j = jfirst, jlast, jinc
493 xj = one + cnorm( j )
500 IF( ( grow*tscal ).GT.smlnum )
THEN
505 CALL stpsv( uplo, trans, diag, n, ap, x, 1 )
510 IF( xmax.GT.bignum )
THEN
515 scale = bignum / xmax
516 CALL sscal( n, scale, x, 1 )
524 ip = jfirst*( jfirst+1 ) / 2
525 DO 100 j = jfirst, jlast, jinc
531 tjjs = ap( ip )*tscal
538 IF( tjj.GT.smlnum )
THEN
542 IF( tjj.LT.one )
THEN
543 IF( xj.GT.tjj*bignum )
THEN
548 CALL sscal( n, rec, x, 1 )
553 x( j ) = x( j ) / tjjs
555 ELSE IF( tjj.GT.zero )
THEN
559 IF( xj.GT.tjj*bignum )
THEN
564 rec = ( tjj*bignum ) / xj
565 IF( cnorm( j ).GT.one )
THEN
570 rec = rec / cnorm( j )
572 CALL sscal( n, rec, x, 1 )
576 x( j ) = x( j ) / tjjs
598 IF( cnorm( j ).GT.( bignum-xmax )*rec )
THEN
603 CALL sscal( n, rec, x, 1 )
606 ELSE IF( xj*cnorm( j ).GT.( bignum-xmax ) )
THEN
610 CALL sscal( n, half, x, 1 )
620 CALL saxpy( j-1, -x( j )*tscal, ap( ip-j+1 ), 1, x,
622 i = isamax( j-1, x, 1 )
632 CALL saxpy( n-j, -x( j )*tscal, ap( ip+1 ), 1,
634 i = j + isamax( n-j, x( j+1 ), 1 )
645 ip = jfirst*( jfirst+1 ) / 2
647 DO 140 j = jfirst, jlast, jinc
654 rec = one / max( xmax, one )
655 IF( cnorm( j ).GT.( bignum-xj )*rec )
THEN
661 tjjs = ap( ip )*tscal
666 IF( tjj.GT.one )
THEN
670 rec = min( one, rec*tjj )
673 IF( rec.LT.one )
THEN
674 CALL sscal( n, rec, x, 1 )
681 IF( uscal.EQ.one )
THEN
687 sumj = sdot( j-1, ap( ip-j+1 ), 1, x, 1 )
688 ELSE IF( j.LT.n )
THEN
689 sumj = sdot( n-j, ap( ip+1 ), 1, x( j+1 ), 1 )
697 sumj = sumj + ( ap( ip-j+i )*uscal )*x( i )
699 ELSE IF( j.LT.n )
THEN
701 sumj = sumj + ( ap( ip+i )*uscal )*x( j+i )
706 IF( uscal.EQ.tscal )
THEN
711 x( j ) = x( j ) - sumj
717 tjjs = ap( ip )*tscal
724 IF( tjj.GT.smlnum )
THEN
728 IF( tjj.LT.one )
THEN
729 IF( xj.GT.tjj*bignum )
THEN
734 CALL sscal( n, rec, x, 1 )
739 x( j ) = x( j ) / tjjs
740 ELSE IF( tjj.GT.zero )
THEN
744 IF( xj.GT.tjj*bignum )
THEN
748 rec = ( tjj*bignum ) / xj
749 CALL sscal( n, rec, x, 1 )
753 x( j ) = x( j ) / tjjs
772 x( j ) = x( j ) / tjjs - sumj
774 xmax = max( xmax, abs( x( j ) ) )
779 scale = scale / tscal
784 IF( tscal.NE.one )
THEN
785 CALL sscal( n, one / tscal, cnorm, 1 )
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine slatps(UPLO, TRANS, DIAG, NORMIN, N, AP, X, SCALE, CNORM, INFO)
SLATPS solves a triangular system of equations with the matrix held in packed storage.
subroutine sscal(N, SA, SX, INCX)
SSCAL
subroutine saxpy(N, SA, SX, INCX, SY, INCY)
SAXPY
subroutine stpsv(UPLO, TRANS, DIAG, N, AP, X, INCX)
STPSV