Annotation of rpl/lapack/lapack/ztpttf.f, revision 1.6
1.1 bertrand 1: SUBROUTINE ZTPTTF( TRANSR, UPLO, N, AP, ARF, INFO )
2: *
1.6 ! bertrand 3: * -- LAPACK routine (version 3.3.1) --
1.1 bertrand 4: *
5: * -- Contributed by Fred Gustavson of the IBM Watson Research Center --
1.6 ! bertrand 6: * -- April 2011 --
1.1 bertrand 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: * ..
12: * .. Scalar Arguments ..
13: CHARACTER TRANSR, UPLO
14: INTEGER INFO, N
15: * ..
16: * .. Array Arguments ..
17: COMPLEX*16 AP( 0: * ), ARF( 0: * )
18: *
19: * Purpose
20: * =======
21: *
22: * ZTPTTF copies a triangular matrix A from standard packed format (TP)
23: * to rectangular full packed format (TF).
24: *
25: * Arguments
26: * =========
27: *
1.4 bertrand 28: * TRANSR (input) CHARACTER*1
1.1 bertrand 29: * = 'N': ARF in Normal format is wanted;
30: * = 'C': ARF in Conjugate-transpose format is wanted.
31: *
1.4 bertrand 32: * UPLO (input) CHARACTER*1
1.1 bertrand 33: * = 'U': A is upper triangular;
34: * = 'L': A is lower triangular.
35: *
36: * N (input) INTEGER
37: * The order of the matrix A. N >= 0.
38: *
39: * AP (input) COMPLEX*16 array, dimension ( N*(N+1)/2 ),
40: * On entry, the upper or lower triangular matrix A, packed
41: * columnwise in a linear array. The j-th column of A is stored
42: * in the array AP as follows:
43: * if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j;
44: * if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = A(i,j) for j<=i<=n.
45: *
46: * ARF (output) COMPLEX*16 array, dimension ( N*(N+1)/2 ),
47: * On exit, the upper or lower triangular matrix A stored in
48: * RFP format. For a further discussion see Notes below.
49: *
50: * INFO (output) INTEGER
51: * = 0: successful exit
52: * < 0: if INFO = -i, the i-th argument had an illegal value
53: *
54: * Further Details
55: * ===============
56: *
57: * We first consider Standard Packed Format when N is even.
58: * We give an example where N = 6.
59: *
60: * AP is Upper AP is Lower
61: *
62: * 00 01 02 03 04 05 00
63: * 11 12 13 14 15 10 11
64: * 22 23 24 25 20 21 22
65: * 33 34 35 30 31 32 33
66: * 44 45 40 41 42 43 44
67: * 55 50 51 52 53 54 55
68: *
69: *
70: * Let TRANSR = 'N'. RFP holds AP as follows:
71: * For UPLO = 'U' the upper trapezoid A(0:5,0:2) consists of the last
72: * three columns of AP upper. The lower triangle A(4:6,0:2) consists of
73: * conjugate-transpose of the first three columns of AP upper.
74: * For UPLO = 'L' the lower trapezoid A(1:6,0:2) consists of the first
75: * three columns of AP lower. The upper triangle A(0:2,0:2) consists of
76: * conjugate-transpose of the last three columns of AP lower.
77: * To denote conjugate we place -- above the element. This covers the
78: * case N even and TRANSR = 'N'.
79: *
80: * RFP A RFP A
81: *
82: * -- -- --
83: * 03 04 05 33 43 53
84: * -- --
85: * 13 14 15 00 44 54
86: * --
87: * 23 24 25 10 11 55
88: *
89: * 33 34 35 20 21 22
90: * --
91: * 00 44 45 30 31 32
92: * -- --
93: * 01 11 55 40 41 42
94: * -- -- --
95: * 02 12 22 50 51 52
96: *
97: * Now let TRANSR = 'C'. RFP A in both UPLO cases is just the conjugate-
98: * transpose of RFP A above. One therefore gets:
99: *
100: *
101: * RFP A RFP A
102: *
103: * -- -- -- -- -- -- -- -- -- --
104: * 03 13 23 33 00 01 02 33 00 10 20 30 40 50
105: * -- -- -- -- -- -- -- -- -- --
106: * 04 14 24 34 44 11 12 43 44 11 21 31 41 51
107: * -- -- -- -- -- -- -- -- -- --
108: * 05 15 25 35 45 55 22 53 54 55 22 32 42 52
109: *
110: *
111: * We next consider Standard Packed Format when N is odd.
112: * We give an example where N = 5.
113: *
114: * AP is Upper AP is Lower
115: *
116: * 00 01 02 03 04 00
117: * 11 12 13 14 10 11
118: * 22 23 24 20 21 22
119: * 33 34 30 31 32 33
120: * 44 40 41 42 43 44
121: *
122: *
123: * Let TRANSR = 'N'. RFP holds AP as follows:
124: * For UPLO = 'U' the upper trapezoid A(0:4,0:2) consists of the last
125: * three columns of AP upper. The lower triangle A(3:4,0:1) consists of
126: * conjugate-transpose of the first two columns of AP upper.
127: * For UPLO = 'L' the lower trapezoid A(0:4,0:2) consists of the first
128: * three columns of AP lower. The upper triangle A(0:1,1:2) consists of
129: * conjugate-transpose of the last two columns of AP lower.
130: * To denote conjugate we place -- above the element. This covers the
131: * case N odd and TRANSR = 'N'.
132: *
133: * RFP A RFP A
134: *
135: * -- --
136: * 02 03 04 00 33 43
137: * --
138: * 12 13 14 10 11 44
139: *
140: * 22 23 24 20 21 22
141: * --
142: * 00 33 34 30 31 32
143: * -- --
144: * 01 11 44 40 41 42
145: *
146: * Now let TRANSR = 'C'. RFP A in both UPLO cases is just the conjugate-
147: * transpose of RFP A above. One therefore gets:
148: *
149: *
150: * RFP A RFP A
151: *
152: * -- -- -- -- -- -- -- -- --
153: * 02 12 22 00 01 00 10 20 30 40 50
154: * -- -- -- -- -- -- -- -- --
155: * 03 13 23 33 11 33 11 21 31 41 51
156: * -- -- -- -- -- -- -- -- --
157: * 04 14 24 34 44 43 44 22 32 42 52
158: *
159: * =====================================================================
160: *
161: * .. Parameters ..
162: * ..
163: * .. Local Scalars ..
164: LOGICAL LOWER, NISODD, NORMALTRANSR
165: INTEGER N1, N2, K, NT
166: INTEGER I, J, IJ
167: INTEGER IJP, JP, LDA, JS
168: * ..
169: * .. External Functions ..
170: LOGICAL LSAME
171: EXTERNAL LSAME
172: * ..
173: * .. External Subroutines ..
174: EXTERNAL XERBLA
175: * ..
176: * .. Intrinsic Functions ..
177: INTRINSIC DCONJG, MOD
178: * ..
179: * .. Executable Statements ..
180: *
181: * Test the input parameters.
182: *
183: INFO = 0
184: NORMALTRANSR = LSAME( TRANSR, 'N' )
185: LOWER = LSAME( UPLO, 'L' )
186: IF( .NOT.NORMALTRANSR .AND. .NOT.LSAME( TRANSR, 'C' ) ) THEN
187: INFO = -1
188: ELSE IF( .NOT.LOWER .AND. .NOT.LSAME( UPLO, 'U' ) ) THEN
189: INFO = -2
190: ELSE IF( N.LT.0 ) THEN
191: INFO = -3
192: END IF
193: IF( INFO.NE.0 ) THEN
194: CALL XERBLA( 'ZTPTTF', -INFO )
195: RETURN
196: END IF
197: *
198: * Quick return if possible
199: *
200: IF( N.EQ.0 )
1.6 ! bertrand 201: $ RETURN
1.1 bertrand 202: *
203: IF( N.EQ.1 ) THEN
204: IF( NORMALTRANSR ) THEN
205: ARF( 0 ) = AP( 0 )
206: ELSE
207: ARF( 0 ) = DCONJG( AP( 0 ) )
208: END IF
209: RETURN
210: END IF
211: *
212: * Size of array ARF(0:NT-1)
213: *
214: NT = N*( N+1 ) / 2
215: *
216: * Set N1 and N2 depending on LOWER
217: *
218: IF( LOWER ) THEN
219: N2 = N / 2
220: N1 = N - N2
221: ELSE
222: N1 = N / 2
223: N2 = N - N1
224: END IF
225: *
226: * If N is odd, set NISODD = .TRUE.
227: * If N is even, set K = N/2 and NISODD = .FALSE.
228: *
229: * set lda of ARF^C; ARF^C is (0:(N+1)/2-1,0:N-noe)
230: * where noe = 0 if n is even, noe = 1 if n is odd
231: *
232: IF( MOD( N, 2 ).EQ.0 ) THEN
233: K = N / 2
234: NISODD = .FALSE.
235: LDA = N + 1
236: ELSE
237: NISODD = .TRUE.
238: LDA = N
239: END IF
240: *
241: * ARF^C has lda rows and n+1-noe cols
242: *
243: IF( .NOT.NORMALTRANSR )
1.6 ! bertrand 244: $ LDA = ( N+1 ) / 2
1.1 bertrand 245: *
246: * start execution: there are eight cases
247: *
248: IF( NISODD ) THEN
249: *
250: * N is odd
251: *
252: IF( NORMALTRANSR ) THEN
253: *
254: * N is odd and TRANSR = 'N'
255: *
256: IF( LOWER ) THEN
257: *
258: * SRPA for LOWER, NORMAL and N is odd ( a(0:n-1,0:n1-1) )
259: * T1 -> a(0,0), T2 -> a(0,1), S -> a(n1,0)
260: * T1 -> a(0), T2 -> a(n), S -> a(n1); lda = n
261: *
262: IJP = 0
263: JP = 0
264: DO J = 0, N2
265: DO I = J, N - 1
266: IJ = I + JP
267: ARF( IJ ) = AP( IJP )
268: IJP = IJP + 1
269: END DO
270: JP = JP + LDA
271: END DO
272: DO I = 0, N2 - 1
273: DO J = 1 + I, N2
274: IJ = I + J*LDA
275: ARF( IJ ) = DCONJG( AP( IJP ) )
276: IJP = IJP + 1
277: END DO
278: END DO
279: *
280: ELSE
281: *
282: * SRPA for UPPER, NORMAL and N is odd ( a(0:n-1,0:n2-1)
283: * T1 -> a(n1+1,0), T2 -> a(n1,0), S -> a(0,0)
284: * T1 -> a(n2), T2 -> a(n1), S -> a(0)
285: *
286: IJP = 0
287: DO J = 0, N1 - 1
288: IJ = N2 + J
289: DO I = 0, J
290: ARF( IJ ) = DCONJG( AP( IJP ) )
291: IJP = IJP + 1
292: IJ = IJ + LDA
293: END DO
294: END DO
295: JS = 0
296: DO J = N1, N - 1
297: IJ = JS
298: DO IJ = JS, JS + J
299: ARF( IJ ) = AP( IJP )
300: IJP = IJP + 1
301: END DO
302: JS = JS + LDA
303: END DO
304: *
305: END IF
306: *
307: ELSE
308: *
309: * N is odd and TRANSR = 'C'
310: *
311: IF( LOWER ) THEN
312: *
313: * SRPA for LOWER, TRANSPOSE and N is odd
314: * T1 -> A(0,0) , T2 -> A(1,0) , S -> A(0,n1)
315: * T1 -> a(0+0) , T2 -> a(1+0) , S -> a(0+n1*n1); lda=n1
316: *
317: IJP = 0
318: DO I = 0, N2
319: DO IJ = I*( LDA+1 ), N*LDA - 1, LDA
320: ARF( IJ ) = DCONJG( AP( IJP ) )
321: IJP = IJP + 1
322: END DO
323: END DO
324: JS = 1
325: DO J = 0, N2 - 1
326: DO IJ = JS, JS + N2 - J - 1
327: ARF( IJ ) = AP( IJP )
328: IJP = IJP + 1
329: END DO
330: JS = JS + LDA + 1
331: END DO
332: *
333: ELSE
334: *
335: * SRPA for UPPER, TRANSPOSE and N is odd
336: * T1 -> A(0,n1+1), T2 -> A(0,n1), S -> A(0,0)
337: * T1 -> a(n2*n2), T2 -> a(n1*n2), S -> a(0); lda = n2
338: *
339: IJP = 0
340: JS = N2*LDA
341: DO J = 0, N1 - 1
342: DO IJ = JS, JS + J
343: ARF( IJ ) = AP( IJP )
344: IJP = IJP + 1
345: END DO
346: JS = JS + LDA
347: END DO
348: DO I = 0, N1
349: DO IJ = I, I + ( N1+I )*LDA, LDA
350: ARF( IJ ) = DCONJG( AP( IJP ) )
351: IJP = IJP + 1
352: END DO
353: END DO
354: *
355: END IF
356: *
357: END IF
358: *
359: ELSE
360: *
361: * N is even
362: *
363: IF( NORMALTRANSR ) THEN
364: *
365: * N is even and TRANSR = 'N'
366: *
367: IF( LOWER ) THEN
368: *
369: * SRPA for LOWER, NORMAL, and N is even ( a(0:n,0:k-1) )
370: * T1 -> a(1,0), T2 -> a(0,0), S -> a(k+1,0)
371: * T1 -> a(1), T2 -> a(0), S -> a(k+1)
372: *
373: IJP = 0
374: JP = 0
375: DO J = 0, K - 1
376: DO I = J, N - 1
377: IJ = 1 + I + JP
378: ARF( IJ ) = AP( IJP )
379: IJP = IJP + 1
380: END DO
381: JP = JP + LDA
382: END DO
383: DO I = 0, K - 1
384: DO J = I, K - 1
385: IJ = I + J*LDA
386: ARF( IJ ) = DCONJG( AP( IJP ) )
387: IJP = IJP + 1
388: END DO
389: END DO
390: *
391: ELSE
392: *
393: * SRPA for UPPER, NORMAL, and N is even ( a(0:n,0:k-1) )
394: * T1 -> a(k+1,0) , T2 -> a(k,0), S -> a(0,0)
395: * T1 -> a(k+1), T2 -> a(k), S -> a(0)
396: *
397: IJP = 0
398: DO J = 0, K - 1
399: IJ = K + 1 + J
400: DO I = 0, J
401: ARF( IJ ) = DCONJG( AP( IJP ) )
402: IJP = IJP + 1
403: IJ = IJ + LDA
404: END DO
405: END DO
406: JS = 0
407: DO J = K, N - 1
408: IJ = JS
409: DO IJ = JS, JS + J
410: ARF( IJ ) = AP( IJP )
411: IJP = IJP + 1
412: END DO
413: JS = JS + LDA
414: END DO
415: *
416: END IF
417: *
418: ELSE
419: *
420: * N is even and TRANSR = 'C'
421: *
422: IF( LOWER ) THEN
423: *
424: * SRPA for LOWER, TRANSPOSE and N is even (see paper)
425: * T1 -> B(0,1), T2 -> B(0,0), S -> B(0,k+1)
426: * T1 -> a(0+k), T2 -> a(0+0), S -> a(0+k*(k+1)); lda=k
427: *
428: IJP = 0
429: DO I = 0, K - 1
430: DO IJ = I + ( I+1 )*LDA, ( N+1 )*LDA - 1, LDA
431: ARF( IJ ) = DCONJG( AP( IJP ) )
432: IJP = IJP + 1
433: END DO
434: END DO
435: JS = 0
436: DO J = 0, K - 1
437: DO IJ = JS, JS + K - J - 1
438: ARF( IJ ) = AP( IJP )
439: IJP = IJP + 1
440: END DO
441: JS = JS + LDA + 1
442: END DO
443: *
444: ELSE
445: *
446: * SRPA for UPPER, TRANSPOSE and N is even (see paper)
447: * T1 -> B(0,k+1), T2 -> B(0,k), S -> B(0,0)
448: * T1 -> a(0+k*(k+1)), T2 -> a(0+k*k), S -> a(0+0)); lda=k
449: *
450: IJP = 0
451: JS = ( K+1 )*LDA
452: DO J = 0, K - 1
453: DO IJ = JS, JS + J
454: ARF( IJ ) = AP( IJP )
455: IJP = IJP + 1
456: END DO
457: JS = JS + LDA
458: END DO
459: DO I = 0, K - 1
460: DO IJ = I, I + ( K+I )*LDA, LDA
461: ARF( IJ ) = DCONJG( AP( IJP ) )
462: IJP = IJP + 1
463: END DO
464: END DO
465: *
466: END IF
467: *
468: END IF
469: *
470: END IF
471: *
472: RETURN
473: *
474: * End of ZTPTTF
475: *
476: END
CVSweb interface <joel.bertrand@systella.fr>