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