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