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