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