001:       REAL             FUNCTION SLANST( NORM, N, D, E )
002: *
003: *  -- LAPACK auxiliary routine (version 3.2) --
004: *     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
005: *     November 2006
006: *
007: *     .. Scalar Arguments ..
008:       CHARACTER          NORM
009:       INTEGER            N
010: *     ..
011: *     .. Array Arguments ..
012:       REAL               D( * ), E( * )
013: *     ..
014: *
015: *  Purpose
016: *  =======
017: *
018: *  SLANST  returns the value of the one norm,  or the Frobenius norm, or
019: *  the  infinity norm,  or the  element of  largest absolute value  of a
020: *  real symmetric tridiagonal matrix A.
021: *
022: *  Description
023: *  ===========
024: *
025: *  SLANST returns the value
026: *
027: *     SLANST = ( max(abs(A(i,j))), NORM = 'M' or 'm'
028: *              (
029: *              ( norm1(A),         NORM = '1', 'O' or 'o'
030: *              (
031: *              ( normI(A),         NORM = 'I' or 'i'
032: *              (
033: *              ( normF(A),         NORM = 'F', 'f', 'E' or 'e'
034: *
035: *  where  norm1  denotes the  one norm of a matrix (maximum column sum),
036: *  normI  denotes the  infinity norm  of a matrix  (maximum row sum) and
037: *  normF  denotes the  Frobenius norm of a matrix (square root of sum of
038: *  squares).  Note that  max(abs(A(i,j)))  is not a consistent matrix norm.
039: *
040: *  Arguments
041: *  =========
042: *
043: *  NORM    (input) CHARACTER*1
044: *          Specifies the value to be returned in SLANST as described
045: *          above.
046: *
047: *  N       (input) INTEGER
048: *          The order of the matrix A.  N >= 0.  When N = 0, SLANST is
049: *          set to zero.
050: *
051: *  D       (input) REAL array, dimension (N)
052: *          The diagonal elements of A.
053: *
054: *  E       (input) REAL array, dimension (N-1)
055: *          The (n-1) sub-diagonal or super-diagonal elements of A.
056: *
057: *  =====================================================================
058: *
059: *     .. Parameters ..
060:       REAL               ONE, ZERO
061:       PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
062: *     ..
063: *     .. Local Scalars ..
064:       INTEGER            I
065:       REAL               ANORM, SCALE, SUM
066: *     ..
067: *     .. External Functions ..
068:       LOGICAL            LSAME
069:       EXTERNAL           LSAME
070: *     ..
071: *     .. External Subroutines ..
072:       EXTERNAL           SLASSQ
073: *     ..
074: *     .. Intrinsic Functions ..
075:       INTRINSIC          ABS, MAX, SQRT
076: *     ..
077: *     .. Executable Statements ..
078: *
079:       IF( N.LE.0 ) THEN
080:          ANORM = ZERO
081:       ELSE IF( LSAME( NORM, 'M' ) ) THEN
082: *
083: *        Find max(abs(A(i,j))).
084: *
085:          ANORM = ABS( D( N ) )
086:          DO 10 I = 1, N - 1
087:             ANORM = MAX( ANORM, ABS( D( I ) ) )
088:             ANORM = MAX( ANORM, ABS( E( I ) ) )
089:    10    CONTINUE
090:       ELSE IF( LSAME( NORM, 'O' ) .OR. NORM.EQ.'1' .OR.
091:      $         LSAME( NORM, 'I' ) ) THEN
092: *
093: *        Find norm1(A).
094: *
095:          IF( N.EQ.1 ) THEN
096:             ANORM = ABS( D( 1 ) )
097:          ELSE
098:             ANORM = MAX( ABS( D( 1 ) )+ABS( E( 1 ) ),
099:      $              ABS( E( N-1 ) )+ABS( D( N ) ) )
100:             DO 20 I = 2, N - 1
101:                ANORM = MAX( ANORM, ABS( D( I ) )+ABS( E( I ) )+
102:      $                 ABS( E( I-1 ) ) )
103:    20       CONTINUE
104:          END IF
105:       ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
106: *
107: *        Find normF(A).
108: *
109:          SCALE = ZERO
110:          SUM = ONE
111:          IF( N.GT.1 ) THEN
112:             CALL SLASSQ( N-1, E, 1, SCALE, SUM )
113:             SUM = 2*SUM
114:          END IF
115:          CALL SLASSQ( N, D, 1, SCALE, SUM )
116:          ANORM = SCALE*SQRT( SUM )
117:       END IF
118: *
119:       SLANST = ANORM
120:       RETURN
121: *
122: *     End of SLANST
123: *
124:       END
125: