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