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