123
124
125
126
127
128
129 CHARACTER DIAG, NORM, UPLO
130 INTEGER N
131
132
133 REAL AP( * ), WORK( * )
134
135
136
137
138
139 REAL ONE, ZERO
140 parameter( one = 1.0e+0, zero = 0.0e+0 )
141
142
143 LOGICAL UDIAG
144 INTEGER I, J, K
145 REAL SCALE, SUM, VALUE
146
147
149
150
151 LOGICAL LSAME, SISNAN
153
154
155 INTRINSIC abs, sqrt
156
157
158
159 IF( n.EQ.0 ) THEN
160 VALUE = zero
161 ELSE IF(
lsame( norm,
'M' ) )
THEN
162
163
164
165 k = 1
166 IF(
lsame( diag,
'U' ) )
THEN
167 VALUE = one
168 IF(
lsame( uplo,
'U' ) )
THEN
169 DO 20 j = 1, n
170 DO 10 i = k, k + j - 2
171 sum = abs( ap( i ) )
172 IF( VALUE .LT. sum .OR.
173 $
sisnan( sum ) )
VALUE = sum
174 10 CONTINUE
175 k = k + j
176 20 CONTINUE
177 ELSE
178 DO 40 j = 1, n
179 DO 30 i = k + 1, k + n - j
180 sum = abs( ap( i ) )
181 IF( VALUE .LT. sum .OR.
182 $
sisnan( sum ) )
VALUE = sum
183 30 CONTINUE
184 k = k + n - j + 1
185 40 CONTINUE
186 END IF
187 ELSE
188 VALUE = zero
189 IF(
lsame( uplo,
'U' ) )
THEN
190 DO 60 j = 1, n
191 DO 50 i = k, k + j - 1
192 sum = abs( ap( i ) )
193 IF( VALUE .LT. sum .OR.
194 $
sisnan( sum ) )
VALUE = sum
195 50 CONTINUE
196 k = k + j
197 60 CONTINUE
198 ELSE
199 DO 80 j = 1, n
200 DO 70 i = k, k + n - j
201 sum = abs( ap( i ) )
202 IF( VALUE .LT. sum .OR.
203 $
sisnan( sum ) )
VALUE = sum
204 70 CONTINUE
205 k = k + n - j + 1
206 80 CONTINUE
207 END IF
208 END IF
209 ELSE IF( (
lsame( norm,
'O' ) ) .OR. ( norm.EQ.
'1' ) )
THEN
210
211
212
213 VALUE = zero
214 k = 1
215 udiag =
lsame( diag,
'U' )
216 IF(
lsame( uplo,
'U' ) )
THEN
217 DO 110 j = 1, n
218 IF( udiag ) THEN
219 sum = one
220 DO 90 i = k, k + j - 2
221 sum = sum + abs( ap( i ) )
222 90 CONTINUE
223 ELSE
224 sum = zero
225 DO 100 i = k, k + j - 1
226 sum = sum + abs( ap( i ) )
227 100 CONTINUE
228 END IF
229 k = k + j
230 IF(
VALUE .LT. sum .OR.
sisnan( sum ) )
VALUE = sum
231 110 CONTINUE
232 ELSE
233 DO 140 j = 1, n
234 IF( udiag ) THEN
235 sum = one
236 DO 120 i = k + 1, k + n - j
237 sum = sum + abs( ap( i ) )
238 120 CONTINUE
239 ELSE
240 sum = zero
241 DO 130 i = k, k + n - j
242 sum = sum + abs( ap( i ) )
243 130 CONTINUE
244 END IF
245 k = k + n - j + 1
246 IF(
VALUE .LT. sum .OR.
sisnan( sum ) )
VALUE = sum
247 140 CONTINUE
248 END IF
249 ELSE IF(
lsame( norm,
'I' ) )
THEN
250
251
252
253 k = 1
254 IF(
lsame( uplo,
'U' ) )
THEN
255 IF(
lsame( diag,
'U' ) )
THEN
256 DO 150 i = 1, n
257 work( i ) = one
258 150 CONTINUE
259 DO 170 j = 1, n
260 DO 160 i = 1, j - 1
261 work( i ) = work( i ) + abs( ap( k ) )
262 k = k + 1
263 160 CONTINUE
264 k = k + 1
265 170 CONTINUE
266 ELSE
267 DO 180 i = 1, n
268 work( i ) = zero
269 180 CONTINUE
270 DO 200 j = 1, n
271 DO 190 i = 1, j
272 work( i ) = work( i ) + abs( ap( k ) )
273 k = k + 1
274 190 CONTINUE
275 200 CONTINUE
276 END IF
277 ELSE
278 IF(
lsame( diag,
'U' ) )
THEN
279 DO 210 i = 1, n
280 work( i ) = one
281 210 CONTINUE
282 DO 230 j = 1, n
283 k = k + 1
284 DO 220 i = j + 1, n
285 work( i ) = work( i ) + abs( ap( k ) )
286 k = k + 1
287 220 CONTINUE
288 230 CONTINUE
289 ELSE
290 DO 240 i = 1, n
291 work( i ) = zero
292 240 CONTINUE
293 DO 260 j = 1, n
294 DO 250 i = j, n
295 work( i ) = work( i ) + abs( ap( k ) )
296 k = k + 1
297 250 CONTINUE
298 260 CONTINUE
299 END IF
300 END IF
301 VALUE = zero
302 DO 270 i = 1, n
303 sum = work( i )
304 IF(
VALUE .LT. sum .OR.
sisnan( sum ) )
VALUE = sum
305 270 CONTINUE
306 ELSE IF( (
lsame( norm,
'F' ) ) .OR.
307 $ (
lsame( norm,
'E' ) ) )
THEN
308
309
310
311 IF(
lsame( uplo,
'U' ) )
THEN
312 IF(
lsame( diag,
'U' ) )
THEN
313 scale = one
314 sum = real( n )
315 k = 2
316 DO 280 j = 2, n
317 CALL slassq( j-1, ap( k ), 1, scale, sum )
318 k = k + j
319 280 CONTINUE
320 ELSE
321 scale = zero
322 sum = one
323 k = 1
324 DO 290 j = 1, n
325 CALL slassq( j, ap( k ), 1, scale, sum )
326 k = k + j
327 290 CONTINUE
328 END IF
329 ELSE
330 IF(
lsame( diag,
'U' ) )
THEN
331 scale = one
332 sum = real( n )
333 k = 2
334 DO 300 j = 1, n - 1
335 CALL slassq( n-j, ap( k ), 1, scale, sum )
336 k = k + n - j + 1
337 300 CONTINUE
338 ELSE
339 scale = zero
340 sum = one
341 k = 1
342 DO 310 j = 1, n
343 CALL slassq( n-j+1, ap( k ), 1, scale, sum )
344 k = k + n - j + 1
345 310 CONTINUE
346 END IF
347 END IF
348 VALUE = scale*sqrt( sum )
349 END IF
350
352 RETURN
353
354
355
logical function sisnan(sin)
SISNAN tests input for NaN.
real function slantp(norm, uplo, diag, n, ap, work)
SLANTP returns the value of the 1-norm, or the Frobenius norm, or the infinity norm,...
subroutine slassq(n, x, incx, scale, sumsq)
SLASSQ updates a sum of squares represented in scaled form.
logical function lsame(ca, cb)
LSAME