Annotation of rpl/lapack/lapack/zlanhf.f, revision 1.7
1.6 bertrand 1: *> \brief \b ZLANHF
2: *
3: * =========== DOCUMENTATION ===========
4: *
5: * Online html documentation available at
6: * http://www.netlib.org/lapack/explore-html/
1.1 bertrand 7: *
1.6 bertrand 8: *> \htmlonly
9: *> Download ZLANHF + dependencies
10: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zlanhf.f">
11: *> [TGZ]</a>
12: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zlanhf.f">
13: *> [ZIP]</a>
14: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zlanhf.f">
15: *> [TXT]</a>
16: *> \endhtmlonly
1.1 bertrand 17: *
1.6 bertrand 18: * Definition:
19: * ===========
20: *
21: * DOUBLE PRECISION FUNCTION ZLANHF( 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 WORK( 0: * )
29: * COMPLEX*16 A( 0: * )
30: * ..
31: *
32: *
33: *> \par Purpose:
34: * =============
35: *>
36: *> \verbatim
37: *>
38: *> ZLANHF returns the value of the one norm, or the Frobenius norm, or
39: *> the infinity norm, or the element of largest absolute value of a
40: *> complex Hermitian matrix A in RFP format.
41: *> \endverbatim
42: *>
43: *> \return ZLANHF
44: *> \verbatim
45: *>
46: *> ZLANHF = ( 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 matrix norm.
58: *> \endverbatim
59: *
60: * Arguments:
61: * ==========
62: *
63: *> \param[in] NORM
64: *> \verbatim
65: *> NORM is CHARACTER
66: *> Specifies the value to be returned in ZLANHF as described
67: *> above.
68: *> \endverbatim
69: *>
70: *> \param[in] TRANSR
71: *> \verbatim
72: *> TRANSR is CHARACTER
73: *> Specifies whether the RFP format of A is normal or
74: *> conjugate-transposed format.
75: *> = 'N': RFP format is Normal
76: *> = 'C': RFP format is Conjugate-transposed
77: *> \endverbatim
78: *>
79: *> \param[in] UPLO
80: *> \verbatim
81: *> UPLO is CHARACTER
82: *> On entry, UPLO specifies whether the RFP matrix A came from
83: *> an upper or lower triangular matrix as follows:
84: *>
85: *> UPLO = 'U' or 'u' RFP A came from an upper triangular
86: *> matrix
87: *>
88: *> UPLO = 'L' or 'l' RFP A came from a lower triangular
89: *> matrix
90: *> \endverbatim
91: *>
92: *> \param[in] N
93: *> \verbatim
94: *> N is INTEGER
95: *> The order of the matrix A. N >= 0. When N = 0, ZLANHF is
96: *> set to zero.
97: *> \endverbatim
98: *>
99: *> \param[in] A
100: *> \verbatim
101: *> A is COMPLEX*16 array, dimension ( N*(N+1)/2 );
102: *> On entry, the matrix A in RFP Format.
103: *> RFP Format is described by TRANSR, UPLO and N as follows:
104: *> If TRANSR='N' then RFP A is (0:N,0:K-1) when N is even;
105: *> K=N/2. RFP A is (0:N-1,0:K) when N is odd; K=N/2. If
106: *> TRANSR = 'C' then RFP is the Conjugate-transpose of RFP A
107: *> as defined when TRANSR = 'N'. The contents of RFP A are
108: *> defined by UPLO as follows: If UPLO = 'U' the RFP A
109: *> contains the ( N*(N+1)/2 ) elements of upper packed A
110: *> either in normal or conjugate-transpose Format. If
111: *> UPLO = 'L' the RFP A contains the ( N*(N+1) /2 ) elements
112: *> of lower packed A either in normal or conjugate-transpose
113: *> Format. The LDA of RFP A is (N+1)/2 when TRANSR = 'C'. When
114: *> TRANSR is 'N' the LDA is N+1 when N is even and is N when
115: *> is odd. See the Note below for more details.
116: *> Unchanged on exit.
117: *> \endverbatim
118: *>
119: *> \param[out] WORK
120: *> \verbatim
121: *> WORK is DOUBLE PRECISION array, dimension (LWORK),
122: *> where LWORK >= N when NORM = 'I' or '1' or 'O'; otherwise,
123: *> WORK is not referenced.
124: *> \endverbatim
125: *
126: * Authors:
127: * ========
128: *
129: *> \author Univ. of Tennessee
130: *> \author Univ. of California Berkeley
131: *> \author Univ. of Colorado Denver
132: *> \author NAG Ltd.
133: *
134: *> \date November 2011
135: *
136: *> \ingroup complex16OTHERcomputational
137: *
138: *> \par Further Details:
139: * =====================
140: *>
141: *> \verbatim
142: *>
143: *> We first consider Standard Packed Format when N is even.
144: *> We give an example where N = 6.
145: *>
146: *> AP is Upper AP is Lower
147: *>
148: *> 00 01 02 03 04 05 00
149: *> 11 12 13 14 15 10 11
150: *> 22 23 24 25 20 21 22
151: *> 33 34 35 30 31 32 33
152: *> 44 45 40 41 42 43 44
153: *> 55 50 51 52 53 54 55
154: *>
155: *>
156: *> Let TRANSR = 'N'. RFP holds AP as follows:
157: *> For UPLO = 'U' the upper trapezoid A(0:5,0:2) consists of the last
158: *> three columns of AP upper. The lower triangle A(4:6,0:2) consists of
159: *> conjugate-transpose of the first three columns of AP upper.
160: *> For UPLO = 'L' the lower trapezoid A(1:6,0:2) consists of the first
161: *> three columns of AP lower. The upper triangle A(0:2,0:2) consists of
162: *> conjugate-transpose of the last three columns of AP lower.
163: *> To denote conjugate we place -- above the element. This covers the
164: *> case N even and TRANSR = 'N'.
165: *>
166: *> RFP A RFP A
167: *>
168: *> -- -- --
169: *> 03 04 05 33 43 53
170: *> -- --
171: *> 13 14 15 00 44 54
172: *> --
173: *> 23 24 25 10 11 55
174: *>
175: *> 33 34 35 20 21 22
176: *> --
177: *> 00 44 45 30 31 32
178: *> -- --
179: *> 01 11 55 40 41 42
180: *> -- -- --
181: *> 02 12 22 50 51 52
182: *>
183: *> Now let TRANSR = 'C'. RFP A in both UPLO cases is just the conjugate-
184: *> transpose of RFP A above. One therefore gets:
185: *>
186: *>
187: *> RFP A RFP A
188: *>
189: *> -- -- -- -- -- -- -- -- -- --
190: *> 03 13 23 33 00 01 02 33 00 10 20 30 40 50
191: *> -- -- -- -- -- -- -- -- -- --
192: *> 04 14 24 34 44 11 12 43 44 11 21 31 41 51
193: *> -- -- -- -- -- -- -- -- -- --
194: *> 05 15 25 35 45 55 22 53 54 55 22 32 42 52
195: *>
196: *>
197: *> We next consider Standard Packed Format when N is odd.
198: *> We give an example where N = 5.
199: *>
200: *> AP is Upper AP is Lower
201: *>
202: *> 00 01 02 03 04 00
203: *> 11 12 13 14 10 11
204: *> 22 23 24 20 21 22
205: *> 33 34 30 31 32 33
206: *> 44 40 41 42 43 44
207: *>
208: *>
209: *> Let TRANSR = 'N'. RFP holds AP as follows:
210: *> For UPLO = 'U' the upper trapezoid A(0:4,0:2) consists of the last
211: *> three columns of AP upper. The lower triangle A(3:4,0:1) consists of
212: *> conjugate-transpose of the first two columns of AP upper.
213: *> For UPLO = 'L' the lower trapezoid A(0:4,0:2) consists of the first
214: *> three columns of AP lower. The upper triangle A(0:1,1:2) consists of
215: *> conjugate-transpose of the last two columns of AP lower.
216: *> To denote conjugate we place -- above the element. This covers the
217: *> case N odd and TRANSR = 'N'.
218: *>
219: *> RFP A RFP A
220: *>
221: *> -- --
222: *> 02 03 04 00 33 43
223: *> --
224: *> 12 13 14 10 11 44
225: *>
226: *> 22 23 24 20 21 22
227: *> --
228: *> 00 33 34 30 31 32
229: *> -- --
230: *> 01 11 44 40 41 42
231: *>
232: *> Now let TRANSR = 'C'. RFP A in both UPLO cases is just the conjugate-
233: *> transpose of RFP A above. One therefore gets:
234: *>
235: *>
236: *> RFP A RFP A
237: *>
238: *> -- -- -- -- -- -- -- -- --
239: *> 02 12 22 00 01 00 10 20 30 40 50
240: *> -- -- -- -- -- -- -- -- --
241: *> 03 13 23 33 11 33 11 21 31 41 51
242: *> -- -- -- -- -- -- -- -- --
243: *> 04 14 24 34 44 43 44 22 32 42 52
244: *> \endverbatim
245: *>
246: * =====================================================================
247: DOUBLE PRECISION FUNCTION ZLANHF( NORM, TRANSR, UPLO, N, A, WORK )
1.1 bertrand 248: *
1.6 bertrand 249: * -- LAPACK computational routine (version 3.4.0) --
1.1 bertrand 250: * -- LAPACK is a software package provided by Univ. of Tennessee, --
251: * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
1.6 bertrand 252: * November 2011
1.1 bertrand 253: *
254: * .. Scalar Arguments ..
255: CHARACTER NORM, TRANSR, UPLO
256: INTEGER N
257: * ..
258: * .. Array Arguments ..
259: DOUBLE PRECISION WORK( 0: * )
260: COMPLEX*16 A( 0: * )
261: * ..
262: *
263: * =====================================================================
264: *
265: * .. Parameters ..
266: DOUBLE PRECISION ONE, ZERO
267: PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 )
268: * ..
269: * .. Local Scalars ..
270: INTEGER I, J, IFM, ILU, NOE, N1, K, L, LDA
271: DOUBLE PRECISION SCALE, S, VALUE, AA
272: * ..
273: * .. External Functions ..
274: LOGICAL LSAME
275: INTEGER IDAMAX
276: EXTERNAL LSAME, IDAMAX
277: * ..
278: * .. External Subroutines ..
279: EXTERNAL ZLASSQ
280: * ..
281: * .. Intrinsic Functions ..
282: INTRINSIC ABS, DBLE, MAX, SQRT
283: * ..
284: * .. Executable Statements ..
285: *
286: IF( N.EQ.0 ) THEN
287: ZLANHF = ZERO
288: RETURN
289: END IF
290: *
291: * set noe = 1 if n is odd. if n is even set noe=0
292: *
293: NOE = 1
294: IF( MOD( N, 2 ).EQ.0 )
1.5 bertrand 295: $ NOE = 0
1.1 bertrand 296: *
297: * set ifm = 0 when form='C' or 'c' and 1 otherwise
298: *
299: IFM = 1
300: IF( LSAME( TRANSR, 'C' ) )
1.5 bertrand 301: $ IFM = 0
1.1 bertrand 302: *
303: * set ilu = 0 when uplo='U or 'u' and 1 otherwise
304: *
305: ILU = 1
306: IF( LSAME( UPLO, 'U' ) )
1.5 bertrand 307: $ ILU = 0
1.1 bertrand 308: *
309: * set lda = (n+1)/2 when ifm = 0
310: * set lda = n when ifm = 1 and noe = 1
311: * set lda = n+1 when ifm = 1 and noe = 0
312: *
313: IF( IFM.EQ.1 ) THEN
314: IF( NOE.EQ.1 ) THEN
315: LDA = N
316: ELSE
317: * noe=0
318: LDA = N + 1
319: END IF
320: ELSE
321: * ifm=0
322: LDA = ( N+1 ) / 2
323: END IF
324: *
325: IF( LSAME( NORM, 'M' ) ) THEN
326: *
327: * Find max(abs(A(i,j))).
328: *
329: K = ( N+1 ) / 2
330: VALUE = ZERO
331: IF( NOE.EQ.1 ) THEN
332: * n is odd & n = k + k - 1
333: IF( IFM.EQ.1 ) THEN
334: * A is n by k
335: IF( ILU.EQ.1 ) THEN
336: * uplo ='L'
337: J = 0
338: * -> L(0,0)
339: VALUE = MAX( VALUE, ABS( DBLE( A( J+J*LDA ) ) ) )
340: DO I = 1, N - 1
341: VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
342: END DO
343: DO J = 1, K - 1
344: DO I = 0, J - 2
345: VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
346: END DO
347: I = J - 1
348: * L(k+j,k+j)
349: VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) )
350: I = J
351: * -> L(j,j)
352: VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) )
353: DO I = J + 1, N - 1
354: VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
355: END DO
356: END DO
357: ELSE
358: * uplo = 'U'
359: DO J = 0, K - 2
360: DO I = 0, K + J - 2
361: VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
362: END DO
363: I = K + J - 1
364: * -> U(i,i)
365: VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) )
366: I = I + 1
367: * =k+j; i -> U(j,j)
368: VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) )
369: DO I = K + J + 1, N - 1
370: VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
371: END DO
372: END DO
373: DO I = 0, N - 2
374: VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
375: * j=k-1
376: END DO
377: * i=n-1 -> U(n-1,n-1)
378: VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) )
379: END IF
380: ELSE
381: * xpose case; A is k by n
382: IF( ILU.EQ.1 ) THEN
383: * uplo ='L'
384: DO J = 0, K - 2
385: DO I = 0, J - 1
386: VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
387: END DO
388: I = J
389: * L(i,i)
390: VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) )
391: I = J + 1
392: * L(j+k,j+k)
393: VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) )
394: DO I = J + 2, K - 1
395: VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
396: END DO
397: END DO
398: J = K - 1
399: DO I = 0, K - 2
400: VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
401: END DO
402: I = K - 1
403: * -> L(i,i) is at A(i,j)
404: VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) )
405: DO J = K, N - 1
406: DO I = 0, K - 1
407: VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
408: END DO
409: END DO
410: ELSE
411: * uplo = 'U'
412: DO J = 0, K - 2
413: DO I = 0, K - 1
414: VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
415: END DO
416: END DO
417: J = K - 1
418: * -> U(j,j) is at A(0,j)
419: VALUE = MAX( VALUE, ABS( DBLE( A( 0+J*LDA ) ) ) )
420: DO I = 1, K - 1
421: VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
422: END DO
423: DO J = K, N - 1
424: DO I = 0, J - K - 1
425: VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
426: END DO
427: I = J - K
428: * -> U(i,i) at A(i,j)
429: VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) )
430: I = J - K + 1
431: * U(j,j)
432: VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) )
433: DO I = J - K + 2, K - 1
434: VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
435: END DO
436: END DO
437: END IF
438: END IF
439: ELSE
440: * n is even & k = n/2
441: IF( IFM.EQ.1 ) THEN
442: * A is n+1 by k
443: IF( ILU.EQ.1 ) THEN
444: * uplo ='L'
445: J = 0
446: * -> L(k,k) & j=1 -> L(0,0)
447: VALUE = MAX( VALUE, ABS( DBLE( A( J+J*LDA ) ) ) )
448: VALUE = MAX( VALUE, ABS( DBLE( A( J+1+J*LDA ) ) ) )
449: DO I = 2, N
450: VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
451: END DO
452: DO J = 1, K - 1
453: DO I = 0, J - 1
454: VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
455: END DO
456: I = J
457: * L(k+j,k+j)
458: VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) )
459: I = J + 1
460: * -> L(j,j)
461: VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) )
462: DO I = J + 2, N
463: VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
464: END DO
465: END DO
466: ELSE
467: * uplo = 'U'
468: DO J = 0, K - 2
469: DO I = 0, K + J - 1
470: VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
471: END DO
472: I = K + J
473: * -> U(i,i)
474: VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) )
475: I = I + 1
476: * =k+j+1; i -> U(j,j)
477: VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) )
478: DO I = K + J + 2, N
479: VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
480: END DO
481: END DO
482: DO I = 0, N - 2
483: VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
484: * j=k-1
485: END DO
486: * i=n-1 -> U(n-1,n-1)
487: VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) )
488: I = N
489: * -> U(k-1,k-1)
490: VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) )
491: END IF
492: ELSE
493: * xpose case; A is k by n+1
494: IF( ILU.EQ.1 ) THEN
495: * uplo ='L'
496: J = 0
497: * -> L(k,k) at A(0,0)
498: VALUE = MAX( VALUE, ABS( DBLE( A( J+J*LDA ) ) ) )
499: DO I = 1, K - 1
500: VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
501: END DO
502: DO J = 1, K - 1
503: DO I = 0, J - 2
504: VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
505: END DO
506: I = J - 1
507: * L(i,i)
508: VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) )
509: I = J
510: * L(j+k,j+k)
511: VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) )
512: DO I = J + 1, K - 1
513: VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
514: END DO
515: END DO
516: J = K
517: DO I = 0, K - 2
518: VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
519: END DO
520: I = K - 1
521: * -> L(i,i) is at A(i,j)
522: VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) )
523: DO J = K + 1, N
524: DO I = 0, K - 1
525: VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
526: END DO
527: END DO
528: ELSE
529: * uplo = 'U'
530: DO J = 0, K - 1
531: DO I = 0, K - 1
532: VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
533: END DO
534: END DO
535: J = K
536: * -> U(j,j) is at A(0,j)
537: VALUE = MAX( VALUE, ABS( DBLE( A( 0+J*LDA ) ) ) )
538: DO I = 1, K - 1
539: VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
540: END DO
541: DO J = K + 1, N - 1
542: DO I = 0, J - K - 2
543: VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
544: END DO
545: I = J - K - 1
546: * -> U(i,i) at A(i,j)
547: VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) )
548: I = J - K
549: * U(j,j)
550: VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) )
551: DO I = J - K + 1, K - 1
552: VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
553: END DO
554: END DO
555: J = N
556: DO I = 0, K - 2
557: VALUE = MAX( VALUE, ABS( A( I+J*LDA ) ) )
558: END DO
559: I = K - 1
560: * U(k,k) at A(i,j)
561: VALUE = MAX( VALUE, ABS( DBLE( A( I+J*LDA ) ) ) )
562: END IF
563: END IF
564: END IF
565: ELSE IF( ( LSAME( NORM, 'I' ) ) .OR. ( LSAME( NORM, 'O' ) ) .OR.
1.5 bertrand 566: $ ( NORM.EQ.'1' ) ) THEN
1.1 bertrand 567: *
568: * Find normI(A) ( = norm1(A), since A is Hermitian).
569: *
570: IF( IFM.EQ.1 ) THEN
571: * A is 'N'
572: K = N / 2
573: IF( NOE.EQ.1 ) THEN
574: * n is odd & A is n by (n+1)/2
575: IF( ILU.EQ.0 ) THEN
576: * uplo = 'U'
577: DO I = 0, K - 1
578: WORK( I ) = ZERO
579: END DO
580: DO J = 0, K
581: S = ZERO
582: DO I = 0, K + J - 1
583: AA = ABS( A( I+J*LDA ) )
584: * -> A(i,j+k)
585: S = S + AA
586: WORK( I ) = WORK( I ) + AA
587: END DO
588: AA = ABS( DBLE( A( I+J*LDA ) ) )
589: * -> A(j+k,j+k)
590: WORK( J+K ) = S + AA
591: IF( I.EQ.K+K )
1.5 bertrand 592: $ GO TO 10
1.1 bertrand 593: I = I + 1
594: AA = ABS( DBLE( A( I+J*LDA ) ) )
595: * -> A(j,j)
596: WORK( J ) = WORK( J ) + AA
597: S = ZERO
598: DO L = J + 1, K - 1
599: I = I + 1
600: AA = ABS( A( I+J*LDA ) )
601: * -> A(l,j)
602: S = S + AA
603: WORK( L ) = WORK( L ) + AA
604: END DO
605: WORK( J ) = WORK( J ) + S
606: END DO
607: 10 CONTINUE
608: I = IDAMAX( N, WORK, 1 )
609: VALUE = WORK( I-1 )
610: ELSE
611: * ilu = 1 & uplo = 'L'
612: K = K + 1
613: * k=(n+1)/2 for n odd and ilu=1
614: DO I = K, N - 1
615: WORK( I ) = ZERO
616: END DO
617: DO J = K - 1, 0, -1
618: S = ZERO
619: DO I = 0, J - 2
620: AA = ABS( A( I+J*LDA ) )
621: * -> A(j+k,i+k)
622: S = S + AA
623: WORK( I+K ) = WORK( I+K ) + AA
624: END DO
625: IF( J.GT.0 ) THEN
626: AA = ABS( DBLE( A( I+J*LDA ) ) )
627: * -> A(j+k,j+k)
628: S = S + AA
629: WORK( I+K ) = WORK( I+K ) + S
630: * i=j
631: I = I + 1
632: END IF
633: AA = ABS( DBLE( A( I+J*LDA ) ) )
634: * -> A(j,j)
635: WORK( J ) = AA
636: S = ZERO
637: DO L = J + 1, N - 1
638: I = I + 1
639: AA = ABS( A( I+J*LDA ) )
640: * -> A(l,j)
641: S = S + AA
642: WORK( L ) = WORK( L ) + AA
643: END DO
644: WORK( J ) = WORK( J ) + S
645: END DO
646: I = IDAMAX( N, WORK, 1 )
647: VALUE = WORK( I-1 )
648: END IF
649: ELSE
650: * n is even & A is n+1 by k = n/2
651: IF( ILU.EQ.0 ) THEN
652: * uplo = 'U'
653: DO I = 0, K - 1
654: WORK( I ) = ZERO
655: END DO
656: DO J = 0, K - 1
657: S = ZERO
658: DO I = 0, K + J - 1
659: AA = ABS( A( I+J*LDA ) )
660: * -> A(i,j+k)
661: S = S + AA
662: WORK( I ) = WORK( I ) + AA
663: END DO
664: AA = ABS( DBLE( A( I+J*LDA ) ) )
665: * -> A(j+k,j+k)
666: WORK( J+K ) = S + AA
667: I = I + 1
668: AA = ABS( DBLE( A( I+J*LDA ) ) )
669: * -> A(j,j)
670: WORK( J ) = WORK( J ) + AA
671: S = ZERO
672: DO L = J + 1, K - 1
673: I = I + 1
674: AA = ABS( A( I+J*LDA ) )
675: * -> A(l,j)
676: S = S + AA
677: WORK( L ) = WORK( L ) + AA
678: END DO
679: WORK( J ) = WORK( J ) + S
680: END DO
681: I = IDAMAX( N, WORK, 1 )
682: VALUE = WORK( I-1 )
683: ELSE
684: * ilu = 1 & uplo = 'L'
685: DO I = K, N - 1
686: WORK( I ) = ZERO
687: END DO
688: DO J = K - 1, 0, -1
689: S = ZERO
690: DO I = 0, J - 1
691: AA = ABS( A( I+J*LDA ) )
692: * -> A(j+k,i+k)
693: S = S + AA
694: WORK( I+K ) = WORK( I+K ) + AA
695: END DO
696: AA = ABS( DBLE( A( I+J*LDA ) ) )
697: * -> A(j+k,j+k)
698: S = S + AA
699: WORK( I+K ) = WORK( I+K ) + S
700: * i=j
701: I = I + 1
702: AA = ABS( DBLE( A( I+J*LDA ) ) )
703: * -> A(j,j)
704: WORK( J ) = AA
705: S = ZERO
706: DO L = J + 1, N - 1
707: I = I + 1
708: AA = ABS( A( I+J*LDA ) )
709: * -> A(l,j)
710: S = S + AA
711: WORK( L ) = WORK( L ) + AA
712: END DO
713: WORK( J ) = WORK( J ) + S
714: END DO
715: I = IDAMAX( N, WORK, 1 )
716: VALUE = WORK( I-1 )
717: END IF
718: END IF
719: ELSE
720: * ifm=0
721: K = N / 2
722: IF( NOE.EQ.1 ) THEN
723: * n is odd & A is (n+1)/2 by n
724: IF( ILU.EQ.0 ) THEN
725: * uplo = 'U'
726: N1 = K
727: * n/2
728: K = K + 1
729: * k is the row size and lda
730: DO I = N1, N - 1
731: WORK( I ) = ZERO
732: END DO
733: DO J = 0, N1 - 1
734: S = ZERO
735: DO I = 0, K - 1
736: AA = ABS( A( I+J*LDA ) )
737: * A(j,n1+i)
738: WORK( I+N1 ) = WORK( I+N1 ) + AA
739: S = S + AA
740: END DO
741: WORK( J ) = S
742: END DO
743: * j=n1=k-1 is special
744: S = ABS( DBLE( A( 0+J*LDA ) ) )
745: * A(k-1,k-1)
746: DO I = 1, K - 1
747: AA = ABS( A( I+J*LDA ) )
748: * A(k-1,i+n1)
749: WORK( I+N1 ) = WORK( I+N1 ) + AA
750: S = S + AA
751: END DO
752: WORK( J ) = WORK( J ) + S
753: DO J = K, N - 1
754: S = ZERO
755: DO I = 0, J - K - 1
756: AA = ABS( A( I+J*LDA ) )
757: * A(i,j-k)
758: WORK( I ) = WORK( I ) + AA
759: S = S + AA
760: END DO
761: * i=j-k
762: AA = ABS( DBLE( A( I+J*LDA ) ) )
763: * A(j-k,j-k)
764: S = S + AA
765: WORK( J-K ) = WORK( J-K ) + S
766: I = I + 1
767: S = ABS( DBLE( A( I+J*LDA ) ) )
768: * A(j,j)
769: DO L = J + 1, N - 1
770: I = I + 1
771: AA = ABS( A( I+J*LDA ) )
772: * A(j,l)
773: WORK( L ) = WORK( L ) + AA
774: S = S + AA
775: END DO
776: WORK( J ) = WORK( J ) + S
777: END DO
778: I = IDAMAX( N, WORK, 1 )
779: VALUE = WORK( I-1 )
780: ELSE
781: * ilu=1 & uplo = 'L'
782: K = K + 1
783: * k=(n+1)/2 for n odd and ilu=1
784: DO I = K, N - 1
785: WORK( I ) = ZERO
786: END DO
787: DO J = 0, K - 2
788: * process
789: S = ZERO
790: DO I = 0, J - 1
791: AA = ABS( A( I+J*LDA ) )
792: * A(j,i)
793: WORK( I ) = WORK( I ) + AA
794: S = S + AA
795: END DO
796: AA = ABS( DBLE( A( I+J*LDA ) ) )
797: * i=j so process of A(j,j)
798: S = S + AA
799: WORK( J ) = S
800: * is initialised here
801: I = I + 1
802: * i=j process A(j+k,j+k)
803: AA = ABS( DBLE( A( I+J*LDA ) ) )
804: S = AA
805: DO L = K + J + 1, N - 1
806: I = I + 1
807: AA = ABS( A( I+J*LDA ) )
808: * A(l,k+j)
809: S = S + AA
810: WORK( L ) = WORK( L ) + AA
811: END DO
812: WORK( K+J ) = WORK( K+J ) + S
813: END DO
814: * j=k-1 is special :process col A(k-1,0:k-1)
815: S = ZERO
816: DO I = 0, K - 2
817: AA = ABS( A( I+J*LDA ) )
818: * A(k,i)
819: WORK( I ) = WORK( I ) + AA
820: S = S + AA
821: END DO
822: * i=k-1
823: AA = ABS( DBLE( A( I+J*LDA ) ) )
824: * A(k-1,k-1)
825: S = S + AA
826: WORK( I ) = S
827: * done with col j=k+1
828: DO J = K, N - 1
829: * process col j of A = A(j,0:k-1)
830: S = ZERO
831: DO I = 0, K - 1
832: AA = ABS( A( I+J*LDA ) )
833: * A(j,i)
834: WORK( I ) = WORK( I ) + AA
835: S = S + AA
836: END DO
837: WORK( J ) = WORK( J ) + S
838: END DO
839: I = IDAMAX( N, WORK, 1 )
840: VALUE = WORK( I-1 )
841: END IF
842: ELSE
843: * n is even & A is k=n/2 by n+1
844: IF( ILU.EQ.0 ) THEN
845: * uplo = 'U'
846: DO I = K, N - 1
847: WORK( I ) = ZERO
848: END DO
849: DO J = 0, K - 1
850: S = ZERO
851: DO I = 0, K - 1
852: AA = ABS( A( I+J*LDA ) )
853: * A(j,i+k)
854: WORK( I+K ) = WORK( I+K ) + AA
855: S = S + AA
856: END DO
857: WORK( J ) = S
858: END DO
859: * j=k
860: AA = ABS( DBLE( A( 0+J*LDA ) ) )
861: * A(k,k)
862: S = AA
863: DO I = 1, K - 1
864: AA = ABS( A( I+J*LDA ) )
865: * A(k,k+i)
866: WORK( I+K ) = WORK( I+K ) + AA
867: S = S + AA
868: END DO
869: WORK( J ) = WORK( J ) + S
870: DO J = K + 1, N - 1
871: S = ZERO
872: DO I = 0, J - 2 - K
873: AA = ABS( A( I+J*LDA ) )
874: * A(i,j-k-1)
875: WORK( I ) = WORK( I ) + AA
876: S = S + AA
877: END DO
878: * i=j-1-k
879: AA = ABS( DBLE( A( I+J*LDA ) ) )
880: * A(j-k-1,j-k-1)
881: S = S + AA
882: WORK( J-K-1 ) = WORK( J-K-1 ) + S
883: I = I + 1
884: AA = ABS( DBLE( A( I+J*LDA ) ) )
885: * A(j,j)
886: S = AA
887: DO L = J + 1, N - 1
888: I = I + 1
889: AA = ABS( A( I+J*LDA ) )
890: * A(j,l)
891: WORK( L ) = WORK( L ) + AA
892: S = S + AA
893: END DO
894: WORK( J ) = WORK( J ) + S
895: END DO
896: * j=n
897: S = ZERO
898: DO I = 0, K - 2
899: AA = ABS( A( I+J*LDA ) )
900: * A(i,k-1)
901: WORK( I ) = WORK( I ) + AA
902: S = S + AA
903: END DO
904: * i=k-1
905: AA = ABS( DBLE( A( I+J*LDA ) ) )
906: * A(k-1,k-1)
907: S = S + AA
908: WORK( I ) = WORK( I ) + S
909: I = IDAMAX( N, WORK, 1 )
910: VALUE = WORK( I-1 )
911: ELSE
912: * ilu=1 & uplo = 'L'
913: DO I = K, N - 1
914: WORK( I ) = ZERO
915: END DO
916: * j=0 is special :process col A(k:n-1,k)
917: S = ABS( DBLE( A( 0 ) ) )
918: * A(k,k)
919: DO I = 1, K - 1
920: AA = ABS( A( I ) )
921: * A(k+i,k)
922: WORK( I+K ) = WORK( I+K ) + AA
923: S = S + AA
924: END DO
925: WORK( K ) = WORK( K ) + S
926: DO J = 1, K - 1
927: * process
928: S = ZERO
929: DO I = 0, J - 2
930: AA = ABS( A( I+J*LDA ) )
931: * A(j-1,i)
932: WORK( I ) = WORK( I ) + AA
933: S = S + AA
934: END DO
935: AA = ABS( DBLE( A( I+J*LDA ) ) )
936: * i=j-1 so process of A(j-1,j-1)
937: S = S + AA
938: WORK( J-1 ) = S
939: * is initialised here
940: I = I + 1
941: * i=j process A(j+k,j+k)
942: AA = ABS( DBLE( A( I+J*LDA ) ) )
943: S = AA
944: DO L = K + J + 1, N - 1
945: I = I + 1
946: AA = ABS( A( I+J*LDA ) )
947: * A(l,k+j)
948: S = S + AA
949: WORK( L ) = WORK( L ) + AA
950: END DO
951: WORK( K+J ) = WORK( K+J ) + S
952: END DO
953: * j=k is special :process col A(k,0:k-1)
954: S = ZERO
955: DO I = 0, K - 2
956: AA = ABS( A( I+J*LDA ) )
957: * A(k,i)
958: WORK( I ) = WORK( I ) + AA
959: S = S + AA
960: END DO
961: *
962: * i=k-1
963: AA = ABS( DBLE( A( I+J*LDA ) ) )
964: * A(k-1,k-1)
965: S = S + AA
966: WORK( I ) = S
967: * done with col j=k+1
968: DO J = K + 1, N
969: *
970: * process col j-1 of A = A(j-1,0:k-1)
971: S = ZERO
972: DO I = 0, K - 1
973: AA = ABS( A( I+J*LDA ) )
974: * A(j-1,i)
975: WORK( I ) = WORK( I ) + AA
976: S = S + AA
977: END DO
978: WORK( J-1 ) = WORK( J-1 ) + S
979: END DO
980: I = IDAMAX( N, WORK, 1 )
981: VALUE = WORK( I-1 )
982: END IF
983: END IF
984: END IF
985: ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
986: *
987: * Find normF(A).
988: *
989: K = ( N+1 ) / 2
990: SCALE = ZERO
991: S = ONE
992: IF( NOE.EQ.1 ) THEN
993: * n is odd
994: IF( IFM.EQ.1 ) THEN
995: * A is normal & A is n by k
996: IF( ILU.EQ.0 ) THEN
997: * A is upper
998: DO J = 0, K - 3
999: CALL ZLASSQ( K-J-2, A( K+J+1+J*LDA ), 1, SCALE, S )
1000: * L at A(k,0)
1001: END DO
1002: DO J = 0, K - 1
1003: CALL ZLASSQ( K+J-1, A( 0+J*LDA ), 1, SCALE, S )
1004: * trap U at A(0,0)
1005: END DO
1006: S = S + S
1007: * double s for the off diagonal elements
1008: L = K - 1
1009: * -> U(k,k) at A(k-1,0)
1010: DO I = 0, K - 2
1011: AA = DBLE( A( L ) )
1012: * U(k+i,k+i)
1013: IF( AA.NE.ZERO ) THEN
1014: IF( SCALE.LT.AA ) THEN
1015: S = ONE + S*( SCALE / AA )**2
1016: SCALE = AA
1017: ELSE
1018: S = S + ( AA / SCALE )**2
1019: END IF
1020: END IF
1021: AA = DBLE( A( L+1 ) )
1022: * U(i,i)
1023: IF( AA.NE.ZERO ) THEN
1024: IF( SCALE.LT.AA ) THEN
1025: S = ONE + S*( SCALE / AA )**2
1026: SCALE = AA
1027: ELSE
1028: S = S + ( AA / SCALE )**2
1029: END IF
1030: END IF
1031: L = L + LDA + 1
1032: END DO
1033: AA = DBLE( A( L ) )
1034: * U(n-1,n-1)
1035: IF( AA.NE.ZERO ) THEN
1036: IF( SCALE.LT.AA ) THEN
1037: S = ONE + S*( SCALE / AA )**2
1038: SCALE = AA
1039: ELSE
1040: S = S + ( AA / SCALE )**2
1041: END IF
1042: END IF
1043: ELSE
1044: * ilu=1 & A is lower
1045: DO J = 0, K - 1
1046: CALL ZLASSQ( N-J-1, A( J+1+J*LDA ), 1, SCALE, S )
1047: * trap L at A(0,0)
1048: END DO
1049: DO J = 1, K - 2
1050: CALL ZLASSQ( J, A( 0+( 1+J )*LDA ), 1, SCALE, S )
1051: * U at A(0,1)
1052: END DO
1053: S = S + S
1054: * double s for the off diagonal elements
1055: AA = DBLE( A( 0 ) )
1056: * L(0,0) at A(0,0)
1057: IF( AA.NE.ZERO ) THEN
1058: IF( SCALE.LT.AA ) THEN
1059: S = ONE + S*( SCALE / AA )**2
1060: SCALE = AA
1061: ELSE
1062: S = S + ( AA / SCALE )**2
1063: END IF
1064: END IF
1065: L = LDA
1066: * -> L(k,k) at A(0,1)
1067: DO I = 1, K - 1
1068: AA = DBLE( A( L ) )
1069: * L(k-1+i,k-1+i)
1070: IF( AA.NE.ZERO ) THEN
1071: IF( SCALE.LT.AA ) THEN
1072: S = ONE + S*( SCALE / AA )**2
1073: SCALE = AA
1074: ELSE
1075: S = S + ( AA / SCALE )**2
1076: END IF
1077: END IF
1078: AA = DBLE( A( L+1 ) )
1079: * L(i,i)
1080: IF( AA.NE.ZERO ) THEN
1081: IF( SCALE.LT.AA ) THEN
1082: S = ONE + S*( SCALE / AA )**2
1083: SCALE = AA
1084: ELSE
1085: S = S + ( AA / SCALE )**2
1086: END IF
1087: END IF
1088: L = L + LDA + 1
1089: END DO
1090: END IF
1091: ELSE
1092: * A is xpose & A is k by n
1093: IF( ILU.EQ.0 ) THEN
1.5 bertrand 1094: * A**H is upper
1.1 bertrand 1095: DO J = 1, K - 2
1096: CALL ZLASSQ( J, A( 0+( K+J )*LDA ), 1, SCALE, S )
1097: * U at A(0,k)
1098: END DO
1099: DO J = 0, K - 2
1100: CALL ZLASSQ( K, A( 0+J*LDA ), 1, SCALE, S )
1101: * k by k-1 rect. at A(0,0)
1102: END DO
1103: DO J = 0, K - 2
1104: CALL ZLASSQ( K-J-1, A( J+1+( J+K-1 )*LDA ), 1,
1.5 bertrand 1105: $ SCALE, S )
1.1 bertrand 1106: * L at A(0,k-1)
1107: END DO
1108: S = S + S
1109: * double s for the off diagonal elements
1110: L = 0 + K*LDA - LDA
1111: * -> U(k-1,k-1) at A(0,k-1)
1112: AA = DBLE( A( L ) )
1113: * U(k-1,k-1)
1114: IF( AA.NE.ZERO ) THEN
1115: IF( SCALE.LT.AA ) THEN
1116: S = ONE + S*( SCALE / AA )**2
1117: SCALE = AA
1118: ELSE
1119: S = S + ( AA / SCALE )**2
1120: END IF
1121: END IF
1122: L = L + LDA
1123: * -> U(0,0) at A(0,k)
1124: DO J = K, N - 1
1125: AA = DBLE( A( L ) )
1126: * -> U(j-k,j-k)
1127: IF( AA.NE.ZERO ) THEN
1128: IF( SCALE.LT.AA ) THEN
1129: S = ONE + S*( SCALE / AA )**2
1130: SCALE = AA
1131: ELSE
1132: S = S + ( AA / SCALE )**2
1133: END IF
1134: END IF
1135: AA = DBLE( A( L+1 ) )
1136: * -> U(j,j)
1137: IF( AA.NE.ZERO ) THEN
1138: IF( SCALE.LT.AA ) THEN
1139: S = ONE + S*( SCALE / AA )**2
1140: SCALE = AA
1141: ELSE
1142: S = S + ( AA / SCALE )**2
1143: END IF
1144: END IF
1145: L = L + LDA + 1
1146: END DO
1147: ELSE
1.5 bertrand 1148: * A**H is lower
1.1 bertrand 1149: DO J = 1, K - 1
1150: CALL ZLASSQ( J, A( 0+J*LDA ), 1, SCALE, S )
1151: * U at A(0,0)
1152: END DO
1153: DO J = K, N - 1
1154: CALL ZLASSQ( K, A( 0+J*LDA ), 1, SCALE, S )
1155: * k by k-1 rect. at A(0,k)
1156: END DO
1157: DO J = 0, K - 3
1158: CALL ZLASSQ( K-J-2, A( J+2+J*LDA ), 1, SCALE, S )
1159: * L at A(1,0)
1160: END DO
1161: S = S + S
1162: * double s for the off diagonal elements
1163: L = 0
1164: * -> L(0,0) at A(0,0)
1165: DO I = 0, K - 2
1166: AA = DBLE( A( L ) )
1167: * L(i,i)
1168: IF( AA.NE.ZERO ) THEN
1169: IF( SCALE.LT.AA ) THEN
1170: S = ONE + S*( SCALE / AA )**2
1171: SCALE = AA
1172: ELSE
1173: S = S + ( AA / SCALE )**2
1174: END IF
1175: END IF
1176: AA = DBLE( A( L+1 ) )
1177: * L(k+i,k+i)
1178: IF( AA.NE.ZERO ) THEN
1179: IF( SCALE.LT.AA ) THEN
1180: S = ONE + S*( SCALE / AA )**2
1181: SCALE = AA
1182: ELSE
1183: S = S + ( AA / SCALE )**2
1184: END IF
1185: END IF
1186: L = L + LDA + 1
1187: END DO
1188: * L-> k-1 + (k-1)*lda or L(k-1,k-1) at A(k-1,k-1)
1189: AA = DBLE( A( L ) )
1190: * L(k-1,k-1) at A(k-1,k-1)
1191: IF( AA.NE.ZERO ) THEN
1192: IF( SCALE.LT.AA ) THEN
1193: S = ONE + S*( SCALE / AA )**2
1194: SCALE = AA
1195: ELSE
1196: S = S + ( AA / SCALE )**2
1197: END IF
1198: END IF
1199: END IF
1200: END IF
1201: ELSE
1202: * n is even
1203: IF( IFM.EQ.1 ) THEN
1204: * A is normal
1205: IF( ILU.EQ.0 ) THEN
1206: * A is upper
1207: DO J = 0, K - 2
1208: CALL ZLASSQ( K-J-1, A( K+J+2+J*LDA ), 1, SCALE, S )
1209: * L at A(k+1,0)
1210: END DO
1211: DO J = 0, K - 1
1212: CALL ZLASSQ( K+J, A( 0+J*LDA ), 1, SCALE, S )
1213: * trap U at A(0,0)
1214: END DO
1215: S = S + S
1216: * double s for the off diagonal elements
1217: L = K
1218: * -> U(k,k) at A(k,0)
1219: DO I = 0, K - 1
1220: AA = DBLE( A( L ) )
1221: * U(k+i,k+i)
1222: IF( AA.NE.ZERO ) THEN
1223: IF( SCALE.LT.AA ) THEN
1224: S = ONE + S*( SCALE / AA )**2
1225: SCALE = AA
1226: ELSE
1227: S = S + ( AA / SCALE )**2
1228: END IF
1229: END IF
1230: AA = DBLE( A( L+1 ) )
1231: * U(i,i)
1232: IF( AA.NE.ZERO ) THEN
1233: IF( SCALE.LT.AA ) THEN
1234: S = ONE + S*( SCALE / AA )**2
1235: SCALE = AA
1236: ELSE
1237: S = S + ( AA / SCALE )**2
1238: END IF
1239: END IF
1240: L = L + LDA + 1
1241: END DO
1242: ELSE
1243: * ilu=1 & A is lower
1244: DO J = 0, K - 1
1245: CALL ZLASSQ( N-J-1, A( J+2+J*LDA ), 1, SCALE, S )
1246: * trap L at A(1,0)
1247: END DO
1248: DO J = 1, K - 1
1249: CALL ZLASSQ( J, A( 0+J*LDA ), 1, SCALE, S )
1250: * U at A(0,0)
1251: END DO
1252: S = S + S
1253: * double s for the off diagonal elements
1254: L = 0
1255: * -> L(k,k) at A(0,0)
1256: DO I = 0, K - 1
1257: AA = DBLE( A( L ) )
1258: * L(k-1+i,k-1+i)
1259: IF( AA.NE.ZERO ) THEN
1260: IF( SCALE.LT.AA ) THEN
1261: S = ONE + S*( SCALE / AA )**2
1262: SCALE = AA
1263: ELSE
1264: S = S + ( AA / SCALE )**2
1265: END IF
1266: END IF
1267: AA = DBLE( A( L+1 ) )
1268: * L(i,i)
1269: IF( AA.NE.ZERO ) THEN
1270: IF( SCALE.LT.AA ) THEN
1271: S = ONE + S*( SCALE / AA )**2
1272: SCALE = AA
1273: ELSE
1274: S = S + ( AA / SCALE )**2
1275: END IF
1276: END IF
1277: L = L + LDA + 1
1278: END DO
1279: END IF
1280: ELSE
1281: * A is xpose
1282: IF( ILU.EQ.0 ) THEN
1.5 bertrand 1283: * A**H is upper
1.1 bertrand 1284: DO J = 1, K - 1
1285: CALL ZLASSQ( J, A( 0+( K+1+J )*LDA ), 1, SCALE, S )
1286: * U at A(0,k+1)
1287: END DO
1288: DO J = 0, K - 1
1289: CALL ZLASSQ( K, A( 0+J*LDA ), 1, SCALE, S )
1290: * k by k rect. at A(0,0)
1291: END DO
1292: DO J = 0, K - 2
1293: CALL ZLASSQ( K-J-1, A( J+1+( J+K )*LDA ), 1, SCALE,
1.5 bertrand 1294: $ S )
1.1 bertrand 1295: * L at A(0,k)
1296: END DO
1297: S = S + S
1298: * double s for the off diagonal elements
1299: L = 0 + K*LDA
1300: * -> U(k,k) at A(0,k)
1301: AA = DBLE( A( L ) )
1302: * U(k,k)
1303: IF( AA.NE.ZERO ) THEN
1304: IF( SCALE.LT.AA ) THEN
1305: S = ONE + S*( SCALE / AA )**2
1306: SCALE = AA
1307: ELSE
1308: S = S + ( AA / SCALE )**2
1309: END IF
1310: END IF
1311: L = L + LDA
1312: * -> U(0,0) at A(0,k+1)
1313: DO J = K + 1, N - 1
1314: AA = DBLE( A( L ) )
1315: * -> U(j-k-1,j-k-1)
1316: IF( AA.NE.ZERO ) THEN
1317: IF( SCALE.LT.AA ) THEN
1318: S = ONE + S*( SCALE / AA )**2
1319: SCALE = AA
1320: ELSE
1321: S = S + ( AA / SCALE )**2
1322: END IF
1323: END IF
1324: AA = DBLE( A( L+1 ) )
1325: * -> U(j,j)
1326: IF( AA.NE.ZERO ) THEN
1327: IF( SCALE.LT.AA ) THEN
1328: S = ONE + S*( SCALE / AA )**2
1329: SCALE = AA
1330: ELSE
1331: S = S + ( AA / SCALE )**2
1332: END IF
1333: END IF
1334: L = L + LDA + 1
1335: END DO
1336: * L=k-1+n*lda
1337: * -> U(k-1,k-1) at A(k-1,n)
1338: AA = DBLE( A( L ) )
1339: * U(k,k)
1340: IF( AA.NE.ZERO ) THEN
1341: IF( SCALE.LT.AA ) THEN
1342: S = ONE + S*( SCALE / AA )**2
1343: SCALE = AA
1344: ELSE
1345: S = S + ( AA / SCALE )**2
1346: END IF
1347: END IF
1348: ELSE
1.5 bertrand 1349: * A**H is lower
1.1 bertrand 1350: DO J = 1, K - 1
1351: CALL ZLASSQ( J, A( 0+( J+1 )*LDA ), 1, SCALE, S )
1352: * U at A(0,1)
1353: END DO
1354: DO J = K + 1, N
1355: CALL ZLASSQ( K, A( 0+J*LDA ), 1, SCALE, S )
1356: * k by k rect. at A(0,k+1)
1357: END DO
1358: DO J = 0, K - 2
1359: CALL ZLASSQ( K-J-1, A( J+1+J*LDA ), 1, SCALE, S )
1360: * L at A(0,0)
1361: END DO
1362: S = S + S
1363: * double s for the off diagonal elements
1364: L = 0
1365: * -> L(k,k) at A(0,0)
1366: AA = DBLE( A( L ) )
1367: * L(k,k) at A(0,0)
1368: IF( AA.NE.ZERO ) THEN
1369: IF( SCALE.LT.AA ) THEN
1370: S = ONE + S*( SCALE / AA )**2
1371: SCALE = AA
1372: ELSE
1373: S = S + ( AA / SCALE )**2
1374: END IF
1375: END IF
1376: L = LDA
1377: * -> L(0,0) at A(0,1)
1378: DO I = 0, K - 2
1379: AA = DBLE( A( L ) )
1380: * L(i,i)
1381: IF( AA.NE.ZERO ) THEN
1382: IF( SCALE.LT.AA ) THEN
1383: S = ONE + S*( SCALE / AA )**2
1384: SCALE = AA
1385: ELSE
1386: S = S + ( AA / SCALE )**2
1387: END IF
1388: END IF
1389: AA = DBLE( A( L+1 ) )
1390: * L(k+i+1,k+i+1)
1391: IF( AA.NE.ZERO ) THEN
1392: IF( SCALE.LT.AA ) THEN
1393: S = ONE + S*( SCALE / AA )**2
1394: SCALE = AA
1395: ELSE
1396: S = S + ( AA / SCALE )**2
1397: END IF
1398: END IF
1399: L = L + LDA + 1
1400: END DO
1401: * L-> k - 1 + k*lda or L(k-1,k-1) at A(k-1,k)
1402: AA = DBLE( A( L ) )
1403: * L(k-1,k-1) at A(k-1,k)
1404: IF( AA.NE.ZERO ) THEN
1405: IF( SCALE.LT.AA ) THEN
1406: S = ONE + S*( SCALE / AA )**2
1407: SCALE = AA
1408: ELSE
1409: S = S + ( AA / SCALE )**2
1410: END IF
1411: END IF
1412: END IF
1413: END IF
1414: END IF
1415: VALUE = SCALE*SQRT( S )
1416: END IF
1417: *
1418: ZLANHF = VALUE
1419: RETURN
1420: *
1421: * End of ZLANHF
1422: *
1423: END
CVSweb interface <joel.bertrand@systella.fr>