1: *> \brief \b DLANSF returns the value of the 1-norm, or the Frobenius norm, or the infinity norm, or the element of largest absolute value of a symmetric matrix in RFP format.
2: *
3: * =========== DOCUMENTATION ===========
4: *
5: * Online html documentation available at
6: * http://www.netlib.org/lapack/explore-html/
7: *
8: *> \htmlonly
9: *> Download DLANSF + dependencies
10: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlansf.f">
11: *> [TGZ]</a>
12: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlansf.f">
13: *> [ZIP]</a>
14: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlansf.f">
15: *> [TXT]</a>
16: *> \endhtmlonly
17: *
18: * Definition:
19: * ===========
20: *
21: * DOUBLE PRECISION FUNCTION DLANSF( NORM, TRANSR, UPLO, N, A, WORK )
22: *
23: * .. Scalar Arguments ..
24: * CHARACTER NORM, TRANSR, UPLO
25: * INTEGER N
26: * ..
27: * .. Array Arguments ..
28: * DOUBLE PRECISION A( 0: * ), WORK( 0: * )
29: * ..
30: *
31: *
32: *> \par Purpose:
33: * =============
34: *>
35: *> \verbatim
36: *>
37: *> DLANSF returns the value of the one norm, or the Frobenius norm, or
38: *> the infinity norm, or the element of largest absolute value of a
39: *> real symmetric matrix A in RFP format.
40: *> \endverbatim
41: *>
42: *> \return DLANSF
43: *> \verbatim
44: *>
45: *> DLANSF = ( max(abs(A(i,j))), NORM = 'M' or 'm'
46: *> (
47: *> ( norm1(A), NORM = '1', 'O' or 'o'
48: *> (
49: *> ( normI(A), NORM = 'I' or 'i'
50: *> (
51: *> ( normF(A), NORM = 'F', 'f', 'E' or 'e'
52: *>
53: *> where norm1 denotes the one norm of a matrix (maximum column sum),
54: *> normI denotes the infinity norm of a matrix (maximum row sum) and
55: *> normF denotes the Frobenius norm of a matrix (square root of sum of
56: *> squares). Note that max(abs(A(i,j))) is not a matrix norm.
57: *> \endverbatim
58: *
59: * Arguments:
60: * ==========
61: *
62: *> \param[in] NORM
63: *> \verbatim
64: *> NORM is CHARACTER*1
65: *> Specifies the value to be returned in DLANSF as described
66: *> above.
67: *> \endverbatim
68: *>
69: *> \param[in] TRANSR
70: *> \verbatim
71: *> TRANSR is CHARACTER*1
72: *> Specifies whether the RFP format of A is normal or
73: *> transposed format.
74: *> = 'N': RFP format is Normal;
75: *> = 'T': RFP format is Transpose.
76: *> \endverbatim
77: *>
78: *> \param[in] UPLO
79: *> \verbatim
80: *> UPLO is CHARACTER*1
81: *> On entry, UPLO specifies whether the RFP matrix A came from
82: *> an upper or lower triangular matrix as follows:
83: *> = 'U': RFP A came from an upper triangular matrix;
84: *> = 'L': RFP A came from a lower triangular matrix.
85: *> \endverbatim
86: *>
87: *> \param[in] N
88: *> \verbatim
89: *> N is INTEGER
90: *> The order of the matrix A. N >= 0. When N = 0, DLANSF is
91: *> set to zero.
92: *> \endverbatim
93: *>
94: *> \param[in] A
95: *> \verbatim
96: *> A is DOUBLE PRECISION array, dimension ( N*(N+1)/2 );
97: *> On entry, the upper (if UPLO = 'U') or lower (if UPLO = 'L')
98: *> part of the symmetric matrix A stored in RFP format. See the
99: *> "Notes" below for more details.
100: *> Unchanged on exit.
101: *> \endverbatim
102: *>
103: *> \param[out] WORK
104: *> \verbatim
105: *> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)),
106: *> where LWORK >= N when NORM = 'I' or '1' or 'O'; otherwise,
107: *> WORK is not referenced.
108: *> \endverbatim
109: *
110: * Authors:
111: * ========
112: *
113: *> \author Univ. of Tennessee
114: *> \author Univ. of California Berkeley
115: *> \author Univ. of Colorado Denver
116: *> \author NAG Ltd.
117: *
118: *> \ingroup doubleOTHERcomputational
119: *
120: *> \par Further Details:
121: * =====================
122: *>
123: *> \verbatim
124: *>
125: *> We first consider Rectangular Full Packed (RFP) Format when N is
126: *> even. We give an example where N = 6.
127: *>
128: *> AP is Upper AP is Lower
129: *>
130: *> 00 01 02 03 04 05 00
131: *> 11 12 13 14 15 10 11
132: *> 22 23 24 25 20 21 22
133: *> 33 34 35 30 31 32 33
134: *> 44 45 40 41 42 43 44
135: *> 55 50 51 52 53 54 55
136: *>
137: *>
138: *> Let TRANSR = 'N'. RFP holds AP as follows:
139: *> For UPLO = 'U' the upper trapezoid A(0:5,0:2) consists of the last
140: *> three columns of AP upper. The lower triangle A(4:6,0:2) consists of
141: *> the transpose of the first three columns of AP upper.
142: *> For UPLO = 'L' the lower trapezoid A(1:6,0:2) consists of the first
143: *> three columns of AP lower. The upper triangle A(0:2,0:2) consists of
144: *> the transpose of the last three columns of AP lower.
145: *> This covers the case N even and TRANSR = 'N'.
146: *>
147: *> RFP A RFP A
148: *>
149: *> 03 04 05 33 43 53
150: *> 13 14 15 00 44 54
151: *> 23 24 25 10 11 55
152: *> 33 34 35 20 21 22
153: *> 00 44 45 30 31 32
154: *> 01 11 55 40 41 42
155: *> 02 12 22 50 51 52
156: *>
157: *> Now let TRANSR = 'T'. RFP A in both UPLO cases is just the
158: *> transpose of RFP A above. One therefore gets:
159: *>
160: *>
161: *> RFP A RFP A
162: *>
163: *> 03 13 23 33 00 01 02 33 00 10 20 30 40 50
164: *> 04 14 24 34 44 11 12 43 44 11 21 31 41 51
165: *> 05 15 25 35 45 55 22 53 54 55 22 32 42 52
166: *>
167: *>
168: *> We then consider Rectangular Full Packed (RFP) Format when N is
169: *> odd. We give an example where N = 5.
170: *>
171: *> AP is Upper AP is Lower
172: *>
173: *> 00 01 02 03 04 00
174: *> 11 12 13 14 10 11
175: *> 22 23 24 20 21 22
176: *> 33 34 30 31 32 33
177: *> 44 40 41 42 43 44
178: *>
179: *>
180: *> Let TRANSR = 'N'. RFP holds AP as follows:
181: *> For UPLO = 'U' the upper trapezoid A(0:4,0:2) consists of the last
182: *> three columns of AP upper. The lower triangle A(3:4,0:1) consists of
183: *> the transpose of the first two columns of AP upper.
184: *> For UPLO = 'L' the lower trapezoid A(0:4,0:2) consists of the first
185: *> three columns of AP lower. The upper triangle A(0:1,1:2) consists of
186: *> the transpose of the last two columns of AP lower.
187: *> This covers the case N odd and TRANSR = 'N'.
188: *>
189: *> RFP A RFP A
190: *>
191: *> 02 03 04 00 33 43
192: *> 12 13 14 10 11 44
193: *> 22 23 24 20 21 22
194: *> 00 33 34 30 31 32
195: *> 01 11 44 40 41 42
196: *>
197: *> Now let TRANSR = 'T'. RFP A in both UPLO cases is just the
198: *> transpose of RFP A above. One therefore gets:
199: *>
200: *> RFP A RFP A
201: *>
202: *> 02 12 22 00 01 00 10 20 30 40 50
203: *> 03 13 23 33 11 33 11 21 31 41 51
204: *> 04 14 24 34 44 43 44 22 32 42 52
205: *> \endverbatim
206: *
207: * =====================================================================
208: DOUBLE PRECISION FUNCTION DLANSF( NORM, TRANSR, UPLO, N, A, WORK )
209: *
210: * -- LAPACK computational routine --
211: * -- LAPACK is a software package provided by Univ. of Tennessee, --
212: * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
213: *
214: * .. Scalar Arguments ..
215: CHARACTER NORM, TRANSR, UPLO
216: INTEGER N
217: * ..
218: * .. Array Arguments ..
219: DOUBLE PRECISION A( 0: * ), WORK( 0: * )
220: * ..
221: *
222: * =====================================================================
223: *
224: * .. Parameters ..
225: DOUBLE PRECISION ONE, ZERO
226: PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 )
227: * ..
228: * .. Local Scalars ..
229: INTEGER I, J, IFM, ILU, NOE, N1, K, L, LDA
230: DOUBLE PRECISION SCALE, S, VALUE, AA, TEMP
231: * ..
232: * .. External Functions ..
233: LOGICAL LSAME, DISNAN
234: EXTERNAL LSAME, DISNAN
235: * ..
236: * .. External Subroutines ..
237: EXTERNAL DLASSQ
238: * ..
239: * .. Intrinsic Functions ..
240: INTRINSIC ABS, MAX, SQRT
241: * ..
242: * .. Executable Statements ..
243: *
244: IF( N.EQ.0 ) THEN
245: DLANSF = ZERO
246: RETURN
247: ELSE IF( N.EQ.1 ) THEN
248: DLANSF = ABS( A(0) )
249: RETURN
250: END IF
251: *
252: * set noe = 1 if n is odd. if n is even set noe=0
253: *
254: NOE = 1
255: IF( MOD( N, 2 ).EQ.0 )
256: $ NOE = 0
257: *
258: * set ifm = 0 when form='T or 't' and 1 otherwise
259: *
260: IFM = 1
261: IF( LSAME( TRANSR, 'T' ) )
262: $ IFM = 0
263: *
264: * set ilu = 0 when uplo='U or 'u' and 1 otherwise
265: *
266: ILU = 1
267: IF( LSAME( UPLO, 'U' ) )
268: $ ILU = 0
269: *
270: * set lda = (n+1)/2 when ifm = 0
271: * set lda = n when ifm = 1 and noe = 1
272: * set lda = n+1 when ifm = 1 and noe = 0
273: *
274: IF( IFM.EQ.1 ) THEN
275: IF( NOE.EQ.1 ) THEN
276: LDA = N
277: ELSE
278: * noe=0
279: LDA = N + 1
280: END IF
281: ELSE
282: * ifm=0
283: LDA = ( N+1 ) / 2
284: END IF
285: *
286: IF( LSAME( NORM, 'M' ) ) THEN
287: *
288: * Find max(abs(A(i,j))).
289: *
290: K = ( N+1 ) / 2
291: VALUE = ZERO
292: IF( NOE.EQ.1 ) THEN
293: * n is odd
294: IF( IFM.EQ.1 ) THEN
295: * A is n by k
296: DO J = 0, K - 1
297: DO I = 0, N - 1
298: TEMP = ABS( A( I+J*LDA ) )
299: IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
300: $ VALUE = TEMP
301: END DO
302: END DO
303: ELSE
304: * xpose case; A is k by n
305: DO J = 0, N - 1
306: DO I = 0, K - 1
307: TEMP = ABS( A( I+J*LDA ) )
308: IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
309: $ VALUE = TEMP
310: END DO
311: END DO
312: END IF
313: ELSE
314: * n is even
315: IF( IFM.EQ.1 ) THEN
316: * A is n+1 by k
317: DO J = 0, K - 1
318: DO I = 0, N
319: TEMP = ABS( A( I+J*LDA ) )
320: IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
321: $ VALUE = TEMP
322: END DO
323: END DO
324: ELSE
325: * xpose case; A is k by n+1
326: DO J = 0, N
327: DO I = 0, K - 1
328: TEMP = ABS( A( I+J*LDA ) )
329: IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
330: $ VALUE = TEMP
331: END DO
332: END DO
333: END IF
334: END IF
335: ELSE IF( ( LSAME( NORM, 'I' ) ) .OR. ( LSAME( NORM, 'O' ) ) .OR.
336: $ ( NORM.EQ.'1' ) ) THEN
337: *
338: * Find normI(A) ( = norm1(A), since A is symmetric).
339: *
340: IF( IFM.EQ.1 ) THEN
341: K = N / 2
342: IF( NOE.EQ.1 ) THEN
343: * n is odd
344: IF( ILU.EQ.0 ) THEN
345: DO I = 0, K - 1
346: WORK( I ) = ZERO
347: END DO
348: DO J = 0, K
349: S = ZERO
350: DO I = 0, K + J - 1
351: AA = ABS( A( I+J*LDA ) )
352: * -> A(i,j+k)
353: S = S + AA
354: WORK( I ) = WORK( I ) + AA
355: END DO
356: AA = ABS( A( I+J*LDA ) )
357: * -> A(j+k,j+k)
358: WORK( J+K ) = S + AA
359: IF( I.EQ.K+K )
360: $ GO TO 10
361: I = I + 1
362: AA = ABS( A( I+J*LDA ) )
363: * -> A(j,j)
364: WORK( J ) = WORK( J ) + AA
365: S = ZERO
366: DO L = J + 1, K - 1
367: I = I + 1
368: AA = ABS( A( I+J*LDA ) )
369: * -> A(l,j)
370: S = S + AA
371: WORK( L ) = WORK( L ) + AA
372: END DO
373: WORK( J ) = WORK( J ) + S
374: END DO
375: 10 CONTINUE
376: VALUE = WORK( 0 )
377: DO I = 1, N-1
378: TEMP = WORK( I )
379: IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
380: $ VALUE = TEMP
381: END DO
382: ELSE
383: * ilu = 1
384: K = K + 1
385: * k=(n+1)/2 for n odd and ilu=1
386: DO I = K, N - 1
387: WORK( I ) = ZERO
388: END DO
389: DO J = K - 1, 0, -1
390: S = ZERO
391: DO I = 0, J - 2
392: AA = ABS( A( I+J*LDA ) )
393: * -> A(j+k,i+k)
394: S = S + AA
395: WORK( I+K ) = WORK( I+K ) + AA
396: END DO
397: IF( J.GT.0 ) THEN
398: AA = ABS( A( I+J*LDA ) )
399: * -> A(j+k,j+k)
400: S = S + AA
401: WORK( I+K ) = WORK( I+K ) + S
402: * i=j
403: I = I + 1
404: END IF
405: AA = ABS( A( I+J*LDA ) )
406: * -> A(j,j)
407: WORK( J ) = AA
408: S = ZERO
409: DO L = J + 1, N - 1
410: I = I + 1
411: AA = ABS( A( I+J*LDA ) )
412: * -> A(l,j)
413: S = S + AA
414: WORK( L ) = WORK( L ) + AA
415: END DO
416: WORK( J ) = WORK( J ) + S
417: END DO
418: VALUE = WORK( 0 )
419: DO I = 1, N-1
420: TEMP = WORK( I )
421: IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
422: $ VALUE = TEMP
423: END DO
424: END IF
425: ELSE
426: * n is even
427: IF( ILU.EQ.0 ) THEN
428: DO I = 0, K - 1
429: WORK( I ) = ZERO
430: END DO
431: DO J = 0, K - 1
432: S = ZERO
433: DO I = 0, K + J - 1
434: AA = ABS( A( I+J*LDA ) )
435: * -> A(i,j+k)
436: S = S + AA
437: WORK( I ) = WORK( I ) + AA
438: END DO
439: AA = ABS( A( I+J*LDA ) )
440: * -> A(j+k,j+k)
441: WORK( J+K ) = S + AA
442: I = I + 1
443: AA = ABS( A( I+J*LDA ) )
444: * -> A(j,j)
445: WORK( J ) = WORK( J ) + AA
446: S = ZERO
447: DO L = J + 1, K - 1
448: I = I + 1
449: AA = ABS( A( I+J*LDA ) )
450: * -> A(l,j)
451: S = S + AA
452: WORK( L ) = WORK( L ) + AA
453: END DO
454: WORK( J ) = WORK( J ) + S
455: END DO
456: VALUE = WORK( 0 )
457: DO I = 1, N-1
458: TEMP = WORK( I )
459: IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
460: $ VALUE = TEMP
461: END DO
462: ELSE
463: * ilu = 1
464: DO I = K, N - 1
465: WORK( I ) = ZERO
466: END DO
467: DO J = K - 1, 0, -1
468: S = ZERO
469: DO I = 0, J - 1
470: AA = ABS( A( I+J*LDA ) )
471: * -> A(j+k,i+k)
472: S = S + AA
473: WORK( I+K ) = WORK( I+K ) + AA
474: END DO
475: AA = ABS( A( I+J*LDA ) )
476: * -> A(j+k,j+k)
477: S = S + AA
478: WORK( I+K ) = WORK( I+K ) + S
479: * i=j
480: I = I + 1
481: AA = ABS( A( I+J*LDA ) )
482: * -> A(j,j)
483: WORK( J ) = AA
484: S = ZERO
485: DO L = J + 1, N - 1
486: I = I + 1
487: AA = ABS( A( I+J*LDA ) )
488: * -> A(l,j)
489: S = S + AA
490: WORK( L ) = WORK( L ) + AA
491: END DO
492: WORK( J ) = WORK( J ) + S
493: END DO
494: VALUE = WORK( 0 )
495: DO I = 1, N-1
496: TEMP = WORK( I )
497: IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
498: $ VALUE = TEMP
499: END DO
500: END IF
501: END IF
502: ELSE
503: * ifm=0
504: K = N / 2
505: IF( NOE.EQ.1 ) THEN
506: * n is odd
507: IF( ILU.EQ.0 ) THEN
508: N1 = K
509: * n/2
510: K = K + 1
511: * k is the row size and lda
512: DO I = N1, N - 1
513: WORK( I ) = ZERO
514: END DO
515: DO J = 0, N1 - 1
516: S = ZERO
517: DO I = 0, K - 1
518: AA = ABS( A( I+J*LDA ) )
519: * A(j,n1+i)
520: WORK( I+N1 ) = WORK( I+N1 ) + AA
521: S = S + AA
522: END DO
523: WORK( J ) = S
524: END DO
525: * j=n1=k-1 is special
526: S = ABS( A( 0+J*LDA ) )
527: * A(k-1,k-1)
528: DO I = 1, K - 1
529: AA = ABS( A( I+J*LDA ) )
530: * A(k-1,i+n1)
531: WORK( I+N1 ) = WORK( I+N1 ) + AA
532: S = S + AA
533: END DO
534: WORK( J ) = WORK( J ) + S
535: DO J = K, N - 1
536: S = ZERO
537: DO I = 0, J - K - 1
538: AA = ABS( A( I+J*LDA ) )
539: * A(i,j-k)
540: WORK( I ) = WORK( I ) + AA
541: S = S + AA
542: END DO
543: * i=j-k
544: AA = ABS( A( I+J*LDA ) )
545: * A(j-k,j-k)
546: S = S + AA
547: WORK( J-K ) = WORK( J-K ) + S
548: I = I + 1
549: S = ABS( A( I+J*LDA ) )
550: * A(j,j)
551: DO L = J + 1, N - 1
552: I = I + 1
553: AA = ABS( A( I+J*LDA ) )
554: * A(j,l)
555: WORK( L ) = WORK( L ) + AA
556: S = S + AA
557: END DO
558: WORK( J ) = WORK( J ) + S
559: END DO
560: VALUE = WORK( 0 )
561: DO I = 1, N-1
562: TEMP = WORK( I )
563: IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
564: $ VALUE = TEMP
565: END DO
566: ELSE
567: * ilu=1
568: K = K + 1
569: * k=(n+1)/2 for n odd and ilu=1
570: DO I = K, N - 1
571: WORK( I ) = ZERO
572: END DO
573: DO J = 0, K - 2
574: * process
575: S = ZERO
576: DO I = 0, J - 1
577: AA = ABS( A( I+J*LDA ) )
578: * A(j,i)
579: WORK( I ) = WORK( I ) + AA
580: S = S + AA
581: END DO
582: AA = ABS( A( I+J*LDA ) )
583: * i=j so process of A(j,j)
584: S = S + AA
585: WORK( J ) = S
586: * is initialised here
587: I = I + 1
588: * i=j process A(j+k,j+k)
589: AA = ABS( A( I+J*LDA ) )
590: S = AA
591: DO L = K + J + 1, N - 1
592: I = I + 1
593: AA = ABS( A( I+J*LDA ) )
594: * A(l,k+j)
595: S = S + AA
596: WORK( L ) = WORK( L ) + AA
597: END DO
598: WORK( K+J ) = WORK( K+J ) + S
599: END DO
600: * j=k-1 is special :process col A(k-1,0:k-1)
601: S = ZERO
602: DO I = 0, K - 2
603: AA = ABS( A( I+J*LDA ) )
604: * A(k,i)
605: WORK( I ) = WORK( I ) + AA
606: S = S + AA
607: END DO
608: * i=k-1
609: AA = ABS( A( I+J*LDA ) )
610: * A(k-1,k-1)
611: S = S + AA
612: WORK( I ) = S
613: * done with col j=k+1
614: DO J = K, N - 1
615: * process col j of A = A(j,0:k-1)
616: S = ZERO
617: DO I = 0, K - 1
618: AA = ABS( A( I+J*LDA ) )
619: * A(j,i)
620: WORK( I ) = WORK( I ) + AA
621: S = S + AA
622: END DO
623: WORK( J ) = WORK( J ) + S
624: END DO
625: VALUE = WORK( 0 )
626: DO I = 1, N-1
627: TEMP = WORK( I )
628: IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
629: $ VALUE = TEMP
630: END DO
631: END IF
632: ELSE
633: * n is even
634: IF( ILU.EQ.0 ) THEN
635: DO I = K, N - 1
636: WORK( I ) = ZERO
637: END DO
638: DO J = 0, K - 1
639: S = ZERO
640: DO I = 0, K - 1
641: AA = ABS( A( I+J*LDA ) )
642: * A(j,i+k)
643: WORK( I+K ) = WORK( I+K ) + AA
644: S = S + AA
645: END DO
646: WORK( J ) = S
647: END DO
648: * j=k
649: AA = ABS( A( 0+J*LDA ) )
650: * A(k,k)
651: S = AA
652: DO I = 1, K - 1
653: AA = ABS( A( I+J*LDA ) )
654: * A(k,k+i)
655: WORK( I+K ) = WORK( I+K ) + AA
656: S = S + AA
657: END DO
658: WORK( J ) = WORK( J ) + S
659: DO J = K + 1, N - 1
660: S = ZERO
661: DO I = 0, J - 2 - K
662: AA = ABS( A( I+J*LDA ) )
663: * A(i,j-k-1)
664: WORK( I ) = WORK( I ) + AA
665: S = S + AA
666: END DO
667: * i=j-1-k
668: AA = ABS( A( I+J*LDA ) )
669: * A(j-k-1,j-k-1)
670: S = S + AA
671: WORK( J-K-1 ) = WORK( J-K-1 ) + S
672: I = I + 1
673: AA = ABS( A( I+J*LDA ) )
674: * A(j,j)
675: S = AA
676: DO L = J + 1, N - 1
677: I = I + 1
678: AA = ABS( A( I+J*LDA ) )
679: * A(j,l)
680: WORK( L ) = WORK( L ) + AA
681: S = S + AA
682: END DO
683: WORK( J ) = WORK( J ) + S
684: END DO
685: * j=n
686: S = ZERO
687: DO I = 0, K - 2
688: AA = ABS( A( I+J*LDA ) )
689: * A(i,k-1)
690: WORK( I ) = WORK( I ) + AA
691: S = S + AA
692: END DO
693: * i=k-1
694: AA = ABS( A( I+J*LDA ) )
695: * A(k-1,k-1)
696: S = S + AA
697: WORK( I ) = WORK( I ) + S
698: VALUE = WORK( 0 )
699: DO I = 1, N-1
700: TEMP = WORK( I )
701: IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
702: $ VALUE = TEMP
703: END DO
704: ELSE
705: * ilu=1
706: DO I = K, N - 1
707: WORK( I ) = ZERO
708: END DO
709: * j=0 is special :process col A(k:n-1,k)
710: S = ABS( A( 0 ) )
711: * A(k,k)
712: DO I = 1, K - 1
713: AA = ABS( A( I ) )
714: * A(k+i,k)
715: WORK( I+K ) = WORK( I+K ) + AA
716: S = S + AA
717: END DO
718: WORK( K ) = WORK( K ) + S
719: DO J = 1, K - 1
720: * process
721: S = ZERO
722: DO I = 0, J - 2
723: AA = ABS( A( I+J*LDA ) )
724: * A(j-1,i)
725: WORK( I ) = WORK( I ) + AA
726: S = S + AA
727: END DO
728: AA = ABS( A( I+J*LDA ) )
729: * i=j-1 so process of A(j-1,j-1)
730: S = S + AA
731: WORK( J-1 ) = S
732: * is initialised here
733: I = I + 1
734: * i=j process A(j+k,j+k)
735: AA = ABS( A( I+J*LDA ) )
736: S = AA
737: DO L = K + J + 1, N - 1
738: I = I + 1
739: AA = ABS( A( I+J*LDA ) )
740: * A(l,k+j)
741: S = S + AA
742: WORK( L ) = WORK( L ) + AA
743: END DO
744: WORK( K+J ) = WORK( K+J ) + S
745: END DO
746: * j=k is special :process col A(k,0:k-1)
747: S = ZERO
748: DO I = 0, K - 2
749: AA = ABS( A( I+J*LDA ) )
750: * A(k,i)
751: WORK( I ) = WORK( I ) + AA
752: S = S + AA
753: END DO
754: * i=k-1
755: AA = ABS( A( I+J*LDA ) )
756: * A(k-1,k-1)
757: S = S + AA
758: WORK( I ) = S
759: * done with col j=k+1
760: DO J = K + 1, N
761: * process col j-1 of A = A(j-1,0:k-1)
762: S = ZERO
763: DO I = 0, K - 1
764: AA = ABS( A( I+J*LDA ) )
765: * A(j-1,i)
766: WORK( I ) = WORK( I ) + AA
767: S = S + AA
768: END DO
769: WORK( J-1 ) = WORK( J-1 ) + S
770: END DO
771: VALUE = WORK( 0 )
772: DO I = 1, N-1
773: TEMP = WORK( I )
774: IF( VALUE .LT. TEMP .OR. DISNAN( TEMP ) )
775: $ VALUE = TEMP
776: END DO
777: END IF
778: END IF
779: END IF
780: ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
781: *
782: * Find normF(A).
783: *
784: K = ( N+1 ) / 2
785: SCALE = ZERO
786: S = ONE
787: IF( NOE.EQ.1 ) THEN
788: * n is odd
789: IF( IFM.EQ.1 ) THEN
790: * A is normal
791: IF( ILU.EQ.0 ) THEN
792: * A is upper
793: DO J = 0, K - 3
794: CALL DLASSQ( K-J-2, A( K+J+1+J*LDA ), 1, SCALE, S )
795: * L at A(k,0)
796: END DO
797: DO J = 0, K - 1
798: CALL DLASSQ( K+J-1, A( 0+J*LDA ), 1, SCALE, S )
799: * trap U at A(0,0)
800: END DO
801: S = S + S
802: * double s for the off diagonal elements
803: CALL DLASSQ( K-1, A( K ), LDA+1, SCALE, S )
804: * tri L at A(k,0)
805: CALL DLASSQ( K, A( K-1 ), LDA+1, SCALE, S )
806: * tri U at A(k-1,0)
807: ELSE
808: * ilu=1 & A is lower
809: DO J = 0, K - 1
810: CALL DLASSQ( N-J-1, A( J+1+J*LDA ), 1, SCALE, S )
811: * trap L at A(0,0)
812: END DO
813: DO J = 0, K - 2
814: CALL DLASSQ( J, A( 0+( 1+J )*LDA ), 1, SCALE, S )
815: * U at A(0,1)
816: END DO
817: S = S + S
818: * double s for the off diagonal elements
819: CALL DLASSQ( K, A( 0 ), LDA+1, SCALE, S )
820: * tri L at A(0,0)
821: CALL DLASSQ( K-1, A( 0+LDA ), LDA+1, SCALE, S )
822: * tri U at A(0,1)
823: END IF
824: ELSE
825: * A is xpose
826: IF( ILU.EQ.0 ) THEN
827: * A**T is upper
828: DO J = 1, K - 2
829: CALL DLASSQ( J, A( 0+( K+J )*LDA ), 1, SCALE, S )
830: * U at A(0,k)
831: END DO
832: DO J = 0, K - 2
833: CALL DLASSQ( K, A( 0+J*LDA ), 1, SCALE, S )
834: * k by k-1 rect. at A(0,0)
835: END DO
836: DO J = 0, K - 2
837: CALL DLASSQ( K-J-1, A( J+1+( J+K-1 )*LDA ), 1,
838: $ SCALE, S )
839: * L at A(0,k-1)
840: END DO
841: S = S + S
842: * double s for the off diagonal elements
843: CALL DLASSQ( K-1, A( 0+K*LDA ), LDA+1, SCALE, S )
844: * tri U at A(0,k)
845: CALL DLASSQ( K, A( 0+( K-1 )*LDA ), LDA+1, SCALE, S )
846: * tri L at A(0,k-1)
847: ELSE
848: * A**T is lower
849: DO J = 1, K - 1
850: CALL DLASSQ( J, A( 0+J*LDA ), 1, SCALE, S )
851: * U at A(0,0)
852: END DO
853: DO J = K, N - 1
854: CALL DLASSQ( K, A( 0+J*LDA ), 1, SCALE, S )
855: * k by k-1 rect. at A(0,k)
856: END DO
857: DO J = 0, K - 3
858: CALL DLASSQ( K-J-2, A( J+2+J*LDA ), 1, SCALE, S )
859: * L at A(1,0)
860: END DO
861: S = S + S
862: * double s for the off diagonal elements
863: CALL DLASSQ( K, A( 0 ), LDA+1, SCALE, S )
864: * tri U at A(0,0)
865: CALL DLASSQ( K-1, A( 1 ), LDA+1, SCALE, S )
866: * tri L at A(1,0)
867: END IF
868: END IF
869: ELSE
870: * n is even
871: IF( IFM.EQ.1 ) THEN
872: * A is normal
873: IF( ILU.EQ.0 ) THEN
874: * A is upper
875: DO J = 0, K - 2
876: CALL DLASSQ( K-J-1, A( K+J+2+J*LDA ), 1, SCALE, S )
877: * L at A(k+1,0)
878: END DO
879: DO J = 0, K - 1
880: CALL DLASSQ( K+J, A( 0+J*LDA ), 1, SCALE, S )
881: * trap U at A(0,0)
882: END DO
883: S = S + S
884: * double s for the off diagonal elements
885: CALL DLASSQ( K, A( K+1 ), LDA+1, SCALE, S )
886: * tri L at A(k+1,0)
887: CALL DLASSQ( K, A( K ), LDA+1, SCALE, S )
888: * tri U at A(k,0)
889: ELSE
890: * ilu=1 & A is lower
891: DO J = 0, K - 1
892: CALL DLASSQ( N-J-1, A( J+2+J*LDA ), 1, SCALE, S )
893: * trap L at A(1,0)
894: END DO
895: DO J = 1, K - 1
896: CALL DLASSQ( J, A( 0+J*LDA ), 1, SCALE, S )
897: * U at A(0,0)
898: END DO
899: S = S + S
900: * double s for the off diagonal elements
901: CALL DLASSQ( K, A( 1 ), LDA+1, SCALE, S )
902: * tri L at A(1,0)
903: CALL DLASSQ( K, A( 0 ), LDA+1, SCALE, S )
904: * tri U at A(0,0)
905: END IF
906: ELSE
907: * A is xpose
908: IF( ILU.EQ.0 ) THEN
909: * A**T is upper
910: DO J = 1, K - 1
911: CALL DLASSQ( J, A( 0+( K+1+J )*LDA ), 1, SCALE, S )
912: * U at A(0,k+1)
913: END DO
914: DO J = 0, K - 1
915: CALL DLASSQ( K, A( 0+J*LDA ), 1, SCALE, S )
916: * k by k rect. at A(0,0)
917: END DO
918: DO J = 0, K - 2
919: CALL DLASSQ( K-J-1, A( J+1+( J+K )*LDA ), 1, SCALE,
920: $ S )
921: * L at A(0,k)
922: END DO
923: S = S + S
924: * double s for the off diagonal elements
925: CALL DLASSQ( K, A( 0+( K+1 )*LDA ), LDA+1, SCALE, S )
926: * tri U at A(0,k+1)
927: CALL DLASSQ( K, A( 0+K*LDA ), LDA+1, SCALE, S )
928: * tri L at A(0,k)
929: ELSE
930: * A**T is lower
931: DO J = 1, K - 1
932: CALL DLASSQ( J, A( 0+( J+1 )*LDA ), 1, SCALE, S )
933: * U at A(0,1)
934: END DO
935: DO J = K + 1, N
936: CALL DLASSQ( K, A( 0+J*LDA ), 1, SCALE, S )
937: * k by k rect. at A(0,k+1)
938: END DO
939: DO J = 0, K - 2
940: CALL DLASSQ( K-J-1, A( J+1+J*LDA ), 1, SCALE, S )
941: * L at A(0,0)
942: END DO
943: S = S + S
944: * double s for the off diagonal elements
945: CALL DLASSQ( K, A( LDA ), LDA+1, SCALE, S )
946: * tri L at A(0,1)
947: CALL DLASSQ( K, A( 0 ), LDA+1, SCALE, S )
948: * tri U at A(0,0)
949: END IF
950: END IF
951: END IF
952: VALUE = SCALE*SQRT( S )
953: END IF
954: *
955: DLANSF = VALUE
956: RETURN
957: *
958: * End of DLANSF
959: *
960: END
CVSweb interface <joel.bertrand@systella.fr>