225      SUBROUTINE dlatps( UPLO, TRANS, DIAG, NORMIN, N, AP, X, SCALE,
 
  233      CHARACTER          DIAG, NORMIN, TRANS, UPLO
 
  235      DOUBLE PRECISION   SCALE
 
  238      DOUBLE PRECISION   AP( * ), CNORM( * ), X( * )
 
  244      DOUBLE PRECISION   ZERO, HALF, ONE
 
  245      parameter( zero = 0.0d+0, half = 0.5d+0, one = 1.0d+0 )
 
  248      LOGICAL            NOTRAN, NOUNIT, UPPER
 
  249      INTEGER            I, IMAX, IP, J, JFIRST, JINC, JLAST, JLEN
 
  250      DOUBLE PRECISION   BIGNUM, GROW, REC, SMLNUM, SUMJ, TJJ, TJJS,
 
  251     $                   tmax, tscal, uscal, xbnd, xj, xmax
 
  256      DOUBLE PRECISION   DASUM, DDOT, DLAMCH
 
  257      EXTERNAL           lsame, idamax, dasum, ddot, dlamch
 
  263      INTRINSIC          abs, max, min
 
  268      upper = lsame( uplo, 
'U' )
 
  269      notran = lsame( trans, 
'N' )
 
  270      nounit = lsame( diag, 
'N' )
 
  274      IF( .NOT.upper .AND. .NOT.lsame( uplo, 
'L' ) ) 
THEN 
  276      ELSE IF( .NOT.notran .AND. .NOT.lsame( trans, 
'T' ) .AND. .NOT.
 
  277     $         lsame( trans, 
'C' ) ) 
THEN 
  279      ELSE IF( .NOT.nounit .AND. .NOT.lsame( diag, 
'U' ) ) 
THEN 
  281      ELSE IF( .NOT.lsame( normin, 
'Y' ) .AND. .NOT.
 
  282     $         lsame( normin, 
'N' ) ) 
THEN 
  284      ELSE IF( n.LT.0 ) 
THEN 
  288         CALL xerbla( 
'DLATPS', -info )
 
  299      smlnum = dlamch( 
'Safe minimum' ) / dlamch( 
'Precision' )
 
  300      bignum = one / smlnum
 
  303      IF( lsame( normin, 
'N' ) ) 
THEN 
  313               cnorm( j ) = dasum( j-1, ap( ip ), 1 )
 
  322               cnorm( j ) = dasum( n-j, ap( ip+1 ), 1 )
 
  332      imax = idamax( n, cnorm, 1 )
 
  334      IF( tmax.LE.bignum ) 
THEN 
  337         tscal = one / ( smlnum*tmax )
 
  338         CALL dscal( n, tscal, cnorm, 1 )
 
  344      j = idamax( n, x, 1 )
 
  361         IF( tscal.NE.one ) 
THEN 
  373            grow = one / max( xbnd, smlnum )
 
  375            ip = jfirst*( jfirst+1 ) / 2
 
  377            DO 30 j = jfirst, jlast, jinc
 
  386               tjj = abs( ap( ip ) )
 
  387               xbnd = min( xbnd, min( one, tjj )*grow )
 
  388               IF( tjj+cnorm( j ).GE.smlnum ) 
THEN 
  392                  grow = grow*( tjj / ( tjj+cnorm( j ) ) )
 
  409            grow = min( one, one / max( xbnd, smlnum ) )
 
  410            DO 40 j = jfirst, jlast, jinc
 
  419               grow = grow*( one / ( one+cnorm( j ) ) )
 
  438         IF( tscal.NE.one ) 
THEN 
  450            grow = one / max( xbnd, smlnum )
 
  452            ip = jfirst*( jfirst+1 ) / 2
 
  454            DO 60 j = jfirst, jlast, jinc
 
  463               xj = one + cnorm( j )
 
  464               grow = min( grow, xbnd / xj )
 
  468               tjj = abs( ap( ip ) )
 
  470     $            xbnd = xbnd*( tjj / xj )
 
  474            grow = min( grow, xbnd )
 
  481            grow = min( one, one / max( xbnd, smlnum ) )
 
  482            DO 70 j = jfirst, jlast, jinc
 
  491               xj = one + cnorm( j )
 
  498      IF( ( grow*tscal ).GT.smlnum ) 
THEN 
  503         CALL dtpsv( uplo, trans, diag, n, ap, x, 1 )
 
  508         IF( xmax.GT.bignum ) 
THEN 
  513            scale = bignum / xmax
 
  514            CALL dscal( n, scale, x, 1 )
 
  522            ip = jfirst*( jfirst+1 ) / 2
 
  523            DO 110 j = jfirst, jlast, jinc
 
  529                  tjjs = ap( ip )*tscal
 
  536               IF( tjj.GT.smlnum ) 
THEN 
  540                  IF( tjj.LT.one ) 
THEN 
  541                     IF( xj.GT.tjj*bignum ) 
THEN 
  546                        CALL dscal( n, rec, x, 1 )
 
  551                  x( j ) = x( j ) / tjjs
 
  553               ELSE IF( tjj.GT.zero ) 
THEN 
  557                  IF( xj.GT.tjj*bignum ) 
THEN 
  562                     rec = ( tjj*bignum ) / xj
 
  563                     IF( cnorm( j ).GT.one ) 
THEN 
  568                        rec = rec / cnorm( j )
 
  570                     CALL dscal( n, rec, x, 1 )
 
  574                  x( j ) = x( j ) / tjjs
 
  596                  IF( cnorm( j ).GT.( bignum-xmax )*rec ) 
THEN 
  601                     CALL dscal( n, rec, x, 1 )
 
  604               ELSE IF( xj*cnorm( j ).GT.( bignum-xmax ) ) 
THEN 
  608                  CALL dscal( n, half, x, 1 )
 
  618                     CALL daxpy( j-1, -x( j )*tscal, ap( ip-j+1 ), 1,
 
  621                     i = idamax( j-1, x, 1 )
 
  631                     CALL daxpy( n-j, -x( j )*tscal, ap( ip+1 ), 1,
 
  633                     i = j + idamax( n-j, x( j+1 ), 1 )
 
  644            ip = jfirst*( jfirst+1 ) / 2
 
  646            DO 160 j = jfirst, jlast, jinc
 
  653               rec = one / max( xmax, one )
 
  654               IF( cnorm( j ).GT.( bignum-xj )*rec ) 
THEN 
  660                     tjjs = ap( ip )*tscal
 
  665                  IF( tjj.GT.one ) 
THEN 
  669                     rec = min( one, rec*tjj )
 
  672                  IF( rec.LT.one ) 
THEN 
  673                     CALL dscal( n, rec, x, 1 )
 
  680               IF( uscal.EQ.one ) 
THEN 
  686                     sumj = ddot( j-1, ap( ip-j+1 ), 1, x, 1 )
 
  687                  ELSE IF( j.LT.n ) 
THEN 
  688                     sumj = ddot( n-j, ap( ip+1 ), 1, x( j+1 ), 1 )
 
  696                        sumj = sumj + ( ap( ip-j+i )*uscal )*x( i )
 
  698                  ELSE IF( j.LT.n ) 
THEN 
  700                        sumj = sumj + ( ap( ip+i )*uscal )*x( j+i )
 
  705               IF( uscal.EQ.tscal ) 
THEN 
  710                  x( j ) = x( j ) - sumj
 
  716                     tjjs = ap( ip )*tscal
 
  723                  IF( tjj.GT.smlnum ) 
THEN 
  727                     IF( tjj.LT.one ) 
THEN 
  728                        IF( xj.GT.tjj*bignum ) 
THEN 
  733                           CALL dscal( n, rec, x, 1 )
 
  738                     x( j ) = x( j ) / tjjs
 
  739                  ELSE IF( tjj.GT.zero ) 
THEN 
  743                     IF( xj.GT.tjj*bignum ) 
THEN 
  747                        rec = ( tjj*bignum ) / xj
 
  748                        CALL dscal( n, rec, x, 1 )
 
  752                     x( j ) = x( j ) / tjjs
 
  771                  x( j ) = x( j ) / tjjs - sumj
 
  773               xmax = max( xmax, abs( x( j ) ) )
 
  778         scale = scale / tscal
 
  783      IF( tscal.NE.one ) 
THEN 
  784         CALL dscal( n, one / tscal, cnorm, 1 )