Merge remote-tracking branch 'origin/release-v4.6.1'
[WRF.git] / var / external / lapack / dlanst.inc
blob3f40329d83a35c6b79fdeb3713ea21d9acecf019
1       DOUBLE PRECISION FUNCTION DLANST( NORM, N, D, E )
3 !  -- LAPACK auxiliary routine (version 3.1) --
4 !     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
5 !     November 2006
7 !     .. Scalar Arguments ..
8       CHARACTER          NORM
9       INTEGER            N
10 !     ..
11 !     .. Array Arguments ..
12       DOUBLE PRECISION   D( * ), E( * )
13 !     ..
15 !  Purpose
16 !  =======
18 !  DLANST  returns the value of the one norm,  or the Frobenius norm, or
19 !  the  infinity norm,  or the  element of  largest absolute value  of a
20 !  real symmetric tridiagonal matrix A.
22 !  Description
23 !  ===========
25 !  DLANST returns the value
27 !     DLANST = ( max(abs(A(i,j))), NORM = 'M' or 'm'
28 !              (
29 !              ( norm1(A),         NORM = '1', 'O' or 'o'
30 !              (
31 !              ( normI(A),         NORM = 'I' or 'i'
32 !              (
33 !              ( normF(A),         NORM = 'F', 'f', 'E' or 'e'
35 !  where  norm1  denotes the  one norm of a matrix (maximum column sum),
36 !  normI  denotes the  infinity norm  of a matrix  (maximum row sum) and
37 !  normF  denotes the  Frobenius norm of a matrix (square root of sum of
38 !  squares).  Note that  max(abs(A(i,j)))  is not a consistent matrix norm.
40 !  Arguments
41 !  =========
43 !  NORM    (input) CHARACTER*1
44 !          Specifies the value to be returned in DLANST as described
45 !          above.
47 !  N       (input) INTEGER
48 !          The order of the matrix A.  N >= 0.  When N = 0, DLANST is
49 !          set to zero.
51 !  D       (input) DOUBLE PRECISION array, dimension (N)
52 !          The diagonal elements of A.
54 !  E       (input) DOUBLE PRECISION array, dimension (N-1)
55 !          The (n-1) sub-diagonal or super-diagonal elements of A.
57 !  =====================================================================
59 !     .. Parameters ..
60       DOUBLE PRECISION   ONE, ZERO
61       PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
62 !     ..
63 !     .. Local Scalars ..
64       INTEGER            I
65       DOUBLE PRECISION   ANORM, SCALE, SUM
66 !     ..
67 !     .. External Functions ..
68 !     LOGICAL            LSAME
69 !     EXTERNAL           LSAME
70 !     ..
71 !     .. External Subroutines ..
72 !     EXTERNAL           DLASSQ
73 !     ..
74 !     .. Intrinsic Functions ..
75       INTRINSIC          ABS, MAX, SQRT
76 !     ..
77 !     .. Executable Statements ..
79       IF( N.LE.0 ) THEN
80          ANORM = ZERO
81       ELSE IF( LSAME( NORM, 'M' ) ) THEN
83 !        Find max(abs(A(i,j))).
85          ANORM = ABS( D( N ) )
86          DO 10 I = 1, N - 1
87             ANORM = MAX( ANORM, ABS( D( I ) ) )
88             ANORM = MAX( ANORM, ABS( E( I ) ) )
89    10    CONTINUE
90       ELSE IF( LSAME( NORM, 'O' ) .OR. NORM.EQ.'1' .OR. &
91                LSAME( NORM, 'I' ) ) THEN
93 !        Find norm1(A).
95          IF( N.EQ.1 ) THEN
96             ANORM = ABS( D( 1 ) )
97          ELSE
98             ANORM = MAX( ABS( D( 1 ) )+ABS( E( 1 ) ), &
99                     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
107 !        Find normF(A).
109          SCALE = ZERO
110          SUM = ONE
111          IF( N.GT.1 ) THEN
112             CALL DLASSQ( N-1, E, 1, SCALE, SUM )
113             SUM = 2*SUM
114          END IF
115          CALL DLASSQ( N, D, 1, SCALE, SUM )
116          ANORM = SCALE*SQRT( SUM )
117       END IF
119       DLANST = ANORM
120       RETURN
122 !     End of DLANST
124       END FUNCTION DLANST