27c6fe6433e93af781c8b9776625bb7770d3fa4c
[platform/upstream/lapack.git] / SRC / slangb.f
1 *> \brief \b SLANGB returns the value of the 1-norm, Frobenius norm, infinity-norm, or the largest absolute value of any element of general band matrix.
2 *
3 *  =========== DOCUMENTATION ===========
4 *
5 * Online html documentation available at 
6 *            http://www.netlib.org/lapack/explore-html/ 
7 *
8 *> \htmlonly
9 *> Download SLANGB + dependencies 
10 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/slangb.f"> 
11 *> [TGZ]</a> 
12 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/slangb.f"> 
13 *> [ZIP]</a> 
14 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/slangb.f"> 
15 *> [TXT]</a>
16 *> \endhtmlonly 
17 *
18 *  Definition:
19 *  ===========
20 *
21 *       REAL             FUNCTION SLANGB( NORM, N, KL, KU, AB, LDAB,
22 *                        WORK )
23
24 *       .. Scalar Arguments ..
25 *       CHARACTER          NORM
26 *       INTEGER            KL, KU, LDAB, N
27 *       ..
28 *       .. Array Arguments ..
29 *       REAL               AB( LDAB, * ), WORK( * )
30 *       ..
31 *  
32 *
33 *> \par Purpose:
34 *  =============
35 *>
36 *> \verbatim
37 *>
38 *> SLANGB  returns the value of the one norm,  or the Frobenius norm, or
39 *> the  infinity norm,  or the element of  largest absolute value  of an
40 *> n by n band matrix  A,  with kl sub-diagonals and ku super-diagonals.
41 *> \endverbatim
42 *>
43 *> \return SLANGB
44 *> \verbatim
45 *>
46 *>    SLANGB = ( max(abs(A(i,j))), NORM = 'M' or 'm'
47 *>             (
48 *>             ( norm1(A),         NORM = '1', 'O' or 'o'
49 *>             (
50 *>             ( normI(A),         NORM = 'I' or 'i'
51 *>             (
52 *>             ( normF(A),         NORM = 'F', 'f', 'E' or 'e'
53 *>
54 *> where  norm1  denotes the  one norm of a matrix (maximum column sum),
55 *> normI  denotes the  infinity norm  of a matrix  (maximum row sum) and
56 *> normF  denotes the  Frobenius norm of a matrix (square root of sum of
57 *> squares).  Note that  max(abs(A(i,j)))  is not a consistent matrix norm.
58 *> \endverbatim
59 *
60 *  Arguments:
61 *  ==========
62 *
63 *> \param[in] NORM
64 *> \verbatim
65 *>          NORM is CHARACTER*1
66 *>          Specifies the value to be returned in SLANGB as described
67 *>          above.
68 *> \endverbatim
69 *>
70 *> \param[in] N
71 *> \verbatim
72 *>          N is INTEGER
73 *>          The order of the matrix A.  N >= 0.  When N = 0, SLANGB is
74 *>          set to zero.
75 *> \endverbatim
76 *>
77 *> \param[in] KL
78 *> \verbatim
79 *>          KL is INTEGER
80 *>          The number of sub-diagonals of the matrix A.  KL >= 0.
81 *> \endverbatim
82 *>
83 *> \param[in] KU
84 *> \verbatim
85 *>          KU is INTEGER
86 *>          The number of super-diagonals of the matrix A.  KU >= 0.
87 *> \endverbatim
88 *>
89 *> \param[in] AB
90 *> \verbatim
91 *>          AB is REAL array, dimension (LDAB,N)
92 *>          The band matrix A, stored in rows 1 to KL+KU+1.  The j-th
93 *>          column of A is stored in the j-th column of the array AB as
94 *>          follows:
95 *>          AB(ku+1+i-j,j) = A(i,j) for max(1,j-ku)<=i<=min(n,j+kl).
96 *> \endverbatim
97 *>
98 *> \param[in] LDAB
99 *> \verbatim
100 *>          LDAB is INTEGER
101 *>          The leading dimension of the array AB.  LDAB >= KL+KU+1.
102 *> \endverbatim
103 *>
104 *> \param[out] WORK
105 *> \verbatim
106 *>          WORK is REAL array, dimension (MAX(1,LWORK)),
107 *>          where LWORK >= N when NORM = 'I'; otherwise, WORK is not
108 *>          referenced.
109 *> \endverbatim
110 *
111 *  Authors:
112 *  ========
113 *
114 *> \author Univ. of Tennessee 
115 *> \author Univ. of California Berkeley 
116 *> \author Univ. of Colorado Denver 
117 *> \author NAG Ltd. 
118 *
119 *> \date September 2012
120 *
121 *> \ingroup realGBauxiliary
122 *
123 *  =====================================================================
124       REAL             FUNCTION SLANGB( NORM, N, KL, KU, AB, LDAB,
125      $                 WORK )
126 *
127 *  -- LAPACK auxiliary routine (version 3.4.2) --
128 *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
129 *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
130 *     September 2012
131 *
132 *     .. Scalar Arguments ..
133       CHARACTER          NORM
134       INTEGER            KL, KU, LDAB, N
135 *     ..
136 *     .. Array Arguments ..
137       REAL               AB( LDAB, * ), WORK( * )
138 *     ..
139 *
140 * =====================================================================
141 *
142 *
143 *     .. Parameters ..
144       REAL               ONE, ZERO
145       PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
146 *     ..
147 *     .. Local Scalars ..
148       INTEGER            I, J, K, L
149       REAL               SCALE, SUM, VALUE, TEMP
150 *     ..
151 *     .. External Subroutines ..
152       EXTERNAL           SLASSQ
153 *     ..
154 *     .. External Functions ..
155       LOGICAL            LSAME, SISNAN
156       EXTERNAL           LSAME, SISNAN
157 *     ..
158 *     .. Intrinsic Functions ..
159       INTRINSIC          ABS, MAX, MIN, SQRT
160 *     ..
161 *     .. Executable Statements ..
162 *
163       IF( N.EQ.0 ) THEN
164          VALUE = ZERO
165       ELSE IF( LSAME( NORM, 'M' ) ) THEN
166 *
167 *        Find max(abs(A(i,j))).
168 *
169          VALUE = ZERO
170          DO 20 J = 1, N
171             DO 10 I = MAX( KU+2-J, 1 ), MIN( N+KU+1-J, KL+KU+1 )
172                TEMP = ABS( AB( I, J ) ) 
173                IF( VALUE.LT.TEMP .OR. SISNAN( TEMP ) ) VALUE = TEMP
174    10       CONTINUE
175    20    CONTINUE
176       ELSE IF( ( LSAME( NORM, 'O' ) ) .OR. ( NORM.EQ.'1' ) ) THEN
177 *
178 *        Find norm1(A).
179 *
180          VALUE = ZERO
181          DO 40 J = 1, N
182             SUM = ZERO
183             DO 30 I = MAX( KU+2-J, 1 ), MIN( N+KU+1-J, KL+KU+1 )
184                SUM = SUM + ABS( AB( I, J ) )
185    30       CONTINUE
186             IF( VALUE.LT.SUM .OR. SISNAN( SUM ) ) VALUE = SUM
187    40    CONTINUE
188       ELSE IF( LSAME( NORM, 'I' ) ) THEN
189 *
190 *        Find normI(A).
191 *
192          DO 50 I = 1, N
193             WORK( I ) = ZERO
194    50    CONTINUE
195          DO 70 J = 1, N
196             K = KU + 1 - J
197             DO 60 I = MAX( 1, J-KU ), MIN( N, J+KL )
198                WORK( I ) = WORK( I ) + ABS( AB( K+I, J ) )
199    60       CONTINUE
200    70    CONTINUE
201          VALUE = ZERO
202          DO 80 I = 1, N
203             TEMP = WORK( I )
204             IF( VALUE.LT.TEMP .OR. SISNAN( TEMP ) ) VALUE = TEMP
205    80    CONTINUE
206       ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
207 *
208 *        Find normF(A).
209 *
210          SCALE = ZERO
211          SUM = ONE
212          DO 90 J = 1, N
213             L = MAX( 1, J-KU )
214             K = KU + 1 - J + L
215             CALL SLASSQ( MIN( N, J+KL )-L+1, AB( K, J ), 1, SCALE, SUM )
216    90    CONTINUE
217          VALUE = SCALE*SQRT( SUM )
218       END IF
219 *
220       SLANGB = VALUE
221       RETURN
222 *
223 *     End of SLANGB
224 *
225       END