1*> \brief \b ZTFTTR 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 ZTFTTR + dependencies 10*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/ztfttr.f"> 11*> [TGZ]</a> 12*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/ztfttr.f"> 13*> [ZIP]</a> 14*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/ztfttr.f"> 15*> [TXT]</a> 16*> \endhtmlonly 17* 18* Definition: 19* =========== 20* 21* SUBROUTINE ZTFTTR( 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*16 A( 0: LDA-1, 0: * ), ARF( 0: * ) 29* .. 30* 31* 32*> \par Purpose: 33* ============= 34*> 35*> \verbatim 36*> 37*> ZTFTTR 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*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] A 72*> \verbatim 73*> A is COMPLEX*16 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 complex16OTHERcomputational 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 ZTFTTR( 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*16 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 DCONJG, 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( 'ZTFTTR', -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 ) = DCONJG( 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 ) = DCONJG( 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 ) = DCONJG( 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 ) = DCONJG( 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 ) = DCONJG( 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 ) = DCONJG( 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 ) = DCONJG( 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 ) = DCONJG( 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 ) = DCONJG( 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 ) = DCONJG( 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 ) = DCONJG( 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 ) = DCONJG( 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 ) = DCONJG( 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 ZTFTTR 534* 535 END 536