LAPACK 3.3.0
|
00001 SUBROUTINE DTRTTF( TRANSR, UPLO, N, A, LDA, ARF, INFO ) 00002 * 00003 * -- LAPACK routine (version 3.3.0) -- 00004 * 00005 * -- Contributed by Fred Gustavson of the IBM Watson Research Center -- 00006 * November 2010 00007 * 00008 * -- LAPACK is a software package provided by Univ. of Tennessee, -- 00009 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- 00010 * 00011 * .. Scalar Arguments .. 00012 CHARACTER TRANSR, UPLO 00013 INTEGER INFO, N, LDA 00014 * .. 00015 * .. Array Arguments .. 00016 DOUBLE PRECISION A( 0: LDA-1, 0: * ), ARF( 0: * ) 00017 * .. 00018 * 00019 * Purpose 00020 * ======= 00021 * 00022 * DTRTTF copies a triangular matrix A from standard full format (TR) 00023 * to rectangular full packed format (TF) . 00024 * 00025 * Arguments 00026 * ========= 00027 * 00028 * TRANSR (input) CHARACTER*1 00029 * = 'N': ARF in Normal form is wanted; 00030 * = 'T': ARF in Transpose form is wanted. 00031 * 00032 * UPLO (input) CHARACTER*1 00033 * = 'U': Upper triangle of A is stored; 00034 * = 'L': Lower triangle of A is stored. 00035 * 00036 * N (input) INTEGER 00037 * The order of the matrix A. N >= 0. 00038 * 00039 * A (input) DOUBLE PRECISION array, dimension (LDA,N). 00040 * On entry, the triangular matrix A. If UPLO = 'U', the 00041 * leading N-by-N upper triangular part of the array A contains 00042 * the upper triangular matrix, and the strictly lower 00043 * triangular part of A is not referenced. If UPLO = 'L', the 00044 * leading N-by-N lower triangular part of the array A contains 00045 * the lower triangular matrix, and the strictly upper 00046 * triangular part of A is not referenced. 00047 * 00048 * LDA (input) INTEGER 00049 * The leading dimension of the matrix A. LDA >= max(1,N). 00050 * 00051 * ARF (output) DOUBLE PRECISION array, dimension (NT). 00052 * NT=N*(N+1)/2. On exit, the triangular matrix A in RFP format. 00053 * 00054 * INFO (output) INTEGER 00055 * = 0: successful exit 00056 * < 0: if INFO = -i, the i-th argument had an illegal value 00057 * 00058 * Further Details 00059 * =============== 00060 * 00061 * We first consider Rectangular Full Packed (RFP) Format when N is 00062 * even. We give an example where N = 6. 00063 * 00064 * AP is Upper AP is Lower 00065 * 00066 * 00 01 02 03 04 05 00 00067 * 11 12 13 14 15 10 11 00068 * 22 23 24 25 20 21 22 00069 * 33 34 35 30 31 32 33 00070 * 44 45 40 41 42 43 44 00071 * 55 50 51 52 53 54 55 00072 * 00073 * 00074 * Let TRANSR = 'N'. RFP holds AP as follows: 00075 * For UPLO = 'U' the upper trapezoid A(0:5,0:2) consists of the last 00076 * three columns of AP upper. The lower triangle A(4:6,0:2) consists of 00077 * the transpose of the first three columns of AP upper. 00078 * For UPLO = 'L' the lower trapezoid A(1:6,0:2) consists of the first 00079 * three columns of AP lower. The upper triangle A(0:2,0:2) consists of 00080 * the transpose of the last three columns of AP lower. 00081 * This covers the case N even and TRANSR = 'N'. 00082 * 00083 * RFP A RFP A 00084 * 00085 * 03 04 05 33 43 53 00086 * 13 14 15 00 44 54 00087 * 23 24 25 10 11 55 00088 * 33 34 35 20 21 22 00089 * 00 44 45 30 31 32 00090 * 01 11 55 40 41 42 00091 * 02 12 22 50 51 52 00092 * 00093 * Now let TRANSR = 'T'. RFP A in both UPLO cases is just the 00094 * transpose of RFP A above. One therefore gets: 00095 * 00096 * 00097 * RFP A RFP A 00098 * 00099 * 03 13 23 33 00 01 02 33 00 10 20 30 40 50 00100 * 04 14 24 34 44 11 12 43 44 11 21 31 41 51 00101 * 05 15 25 35 45 55 22 53 54 55 22 32 42 52 00102 * 00103 * 00104 * We then consider Rectangular Full Packed (RFP) Format when N is 00105 * odd. We give an example where N = 5. 00106 * 00107 * AP is Upper AP is Lower 00108 * 00109 * 00 01 02 03 04 00 00110 * 11 12 13 14 10 11 00111 * 22 23 24 20 21 22 00112 * 33 34 30 31 32 33 00113 * 44 40 41 42 43 44 00114 * 00115 * 00116 * Let TRANSR = 'N'. RFP holds AP as follows: 00117 * For UPLO = 'U' the upper trapezoid A(0:4,0:2) consists of the last 00118 * three columns of AP upper. The lower triangle A(3:4,0:1) consists of 00119 * the transpose of the first two columns of AP upper. 00120 * For UPLO = 'L' the lower trapezoid A(0:4,0:2) consists of the first 00121 * three columns of AP lower. The upper triangle A(0:1,1:2) consists of 00122 * the transpose of the last two columns of AP lower. 00123 * This covers the case N odd and TRANSR = 'N'. 00124 * 00125 * RFP A RFP A 00126 * 00127 * 02 03 04 00 33 43 00128 * 12 13 14 10 11 44 00129 * 22 23 24 20 21 22 00130 * 00 33 34 30 31 32 00131 * 01 11 44 40 41 42 00132 * 00133 * Now let TRANSR = 'T'. RFP A in both UPLO cases is just the 00134 * transpose of RFP A above. One therefore gets: 00135 * 00136 * RFP A RFP A 00137 * 00138 * 02 12 22 00 01 00 10 20 30 40 50 00139 * 03 13 23 33 11 33 11 21 31 41 51 00140 * 04 14 24 34 44 43 44 22 32 42 52 00141 * 00142 * Reference 00143 * ========= 00144 * 00145 * ===================================================================== 00146 * 00147 * .. 00148 * .. Local Scalars .. 00149 LOGICAL LOWER, NISODD, NORMALTRANSR 00150 INTEGER I, IJ, J, K, L, N1, N2, NT, NX2, NP1X2 00151 * .. 00152 * .. External Functions .. 00153 LOGICAL LSAME 00154 EXTERNAL LSAME 00155 * .. 00156 * .. External Subroutines .. 00157 EXTERNAL XERBLA 00158 * .. 00159 * .. Intrinsic Functions .. 00160 INTRINSIC MAX, MOD 00161 * .. 00162 * .. Executable Statements .. 00163 * 00164 * Test the input parameters. 00165 * 00166 INFO = 0 00167 NORMALTRANSR = LSAME( TRANSR, 'N' ) 00168 LOWER = LSAME( UPLO, 'L' ) 00169 IF( .NOT.NORMALTRANSR .AND. .NOT.LSAME( TRANSR, 'T' ) ) THEN 00170 INFO = -1 00171 ELSE IF( .NOT.LOWER .AND. .NOT.LSAME( UPLO, 'U' ) ) THEN 00172 INFO = -2 00173 ELSE IF( N.LT.0 ) THEN 00174 INFO = -3 00175 ELSE IF( LDA.LT.MAX( 1, N ) ) THEN 00176 INFO = -5 00177 END IF 00178 IF( INFO.NE.0 ) THEN 00179 CALL XERBLA( 'DTRTTF', -INFO ) 00180 RETURN 00181 END IF 00182 * 00183 * Quick return if possible 00184 * 00185 IF( N.LE.1 ) THEN 00186 IF( N.EQ.1 ) THEN 00187 ARF( 0 ) = A( 0, 0 ) 00188 END IF 00189 RETURN 00190 END IF 00191 * 00192 * Size of array ARF(0:nt-1) 00193 * 00194 NT = N*( N+1 ) / 2 00195 * 00196 * Set N1 and N2 depending on LOWER: for N even N1=N2=K 00197 * 00198 IF( LOWER ) THEN 00199 N2 = N / 2 00200 N1 = N - N2 00201 ELSE 00202 N1 = N / 2 00203 N2 = N - N1 00204 END IF 00205 * 00206 * If N is odd, set NISODD = .TRUE., LDA=N+1 and A is (N+1)--by--K2. 00207 * If N is even, set K = N/2 and NISODD = .FALSE., LDA=N and A is 00208 * N--by--(N+1)/2. 00209 * 00210 IF( MOD( N, 2 ).EQ.0 ) THEN 00211 K = N / 2 00212 NISODD = .FALSE. 00213 IF( .NOT.LOWER ) 00214 + NP1X2 = N + N + 2 00215 ELSE 00216 NISODD = .TRUE. 00217 IF( .NOT.LOWER ) 00218 + NX2 = N + N 00219 END IF 00220 * 00221 IF( NISODD ) THEN 00222 * 00223 * N is odd 00224 * 00225 IF( NORMALTRANSR ) THEN 00226 * 00227 * N is odd and TRANSR = 'N' 00228 * 00229 IF( LOWER ) THEN 00230 * 00231 * N is odd, TRANSR = 'N', and UPLO = 'L' 00232 * 00233 IJ = 0 00234 DO J = 0, N2 00235 DO I = N1, N2 + J 00236 ARF( IJ ) = A( N2+J, I ) 00237 IJ = IJ + 1 00238 END DO 00239 DO I = J, N - 1 00240 ARF( IJ ) = A( I, J ) 00241 IJ = IJ + 1 00242 END DO 00243 END DO 00244 * 00245 ELSE 00246 * 00247 * N is odd, TRANSR = 'N', and UPLO = 'U' 00248 * 00249 IJ = NT - N 00250 DO J = N - 1, N1, -1 00251 DO I = 0, J 00252 ARF( IJ ) = A( I, J ) 00253 IJ = IJ + 1 00254 END DO 00255 DO L = J - N1, N1 - 1 00256 ARF( IJ ) = A( J-N1, L ) 00257 IJ = IJ + 1 00258 END DO 00259 IJ = IJ - NX2 00260 END DO 00261 * 00262 END IF 00263 * 00264 ELSE 00265 * 00266 * N is odd and TRANSR = 'T' 00267 * 00268 IF( LOWER ) THEN 00269 * 00270 * N is odd, TRANSR = 'T', and UPLO = 'L' 00271 * 00272 IJ = 0 00273 DO J = 0, N2 - 1 00274 DO I = 0, J 00275 ARF( IJ ) = A( J, I ) 00276 IJ = IJ + 1 00277 END DO 00278 DO I = N1 + J, N - 1 00279 ARF( IJ ) = A( I, N1+J ) 00280 IJ = IJ + 1 00281 END DO 00282 END DO 00283 DO J = N2, N - 1 00284 DO I = 0, N1 - 1 00285 ARF( IJ ) = A( J, I ) 00286 IJ = IJ + 1 00287 END DO 00288 END DO 00289 * 00290 ELSE 00291 * 00292 * N is odd, TRANSR = 'T', and UPLO = 'U' 00293 * 00294 IJ = 0 00295 DO J = 0, N1 00296 DO I = N1, N - 1 00297 ARF( IJ ) = A( J, I ) 00298 IJ = IJ + 1 00299 END DO 00300 END DO 00301 DO J = 0, N1 - 1 00302 DO I = 0, J 00303 ARF( IJ ) = A( I, J ) 00304 IJ = IJ + 1 00305 END DO 00306 DO L = N2 + J, N - 1 00307 ARF( IJ ) = A( N2+J, L ) 00308 IJ = IJ + 1 00309 END DO 00310 END DO 00311 * 00312 END IF 00313 * 00314 END IF 00315 * 00316 ELSE 00317 * 00318 * N is even 00319 * 00320 IF( NORMALTRANSR ) THEN 00321 * 00322 * N is even and TRANSR = 'N' 00323 * 00324 IF( LOWER ) THEN 00325 * 00326 * N is even, TRANSR = 'N', and UPLO = 'L' 00327 * 00328 IJ = 0 00329 DO J = 0, K - 1 00330 DO I = K, K + J 00331 ARF( IJ ) = A( K+J, I ) 00332 IJ = IJ + 1 00333 END DO 00334 DO I = J, N - 1 00335 ARF( IJ ) = A( I, J ) 00336 IJ = IJ + 1 00337 END DO 00338 END DO 00339 * 00340 ELSE 00341 * 00342 * N is even, TRANSR = 'N', and UPLO = 'U' 00343 * 00344 IJ = NT - N - 1 00345 DO J = N - 1, K, -1 00346 DO I = 0, J 00347 ARF( IJ ) = A( I, J ) 00348 IJ = IJ + 1 00349 END DO 00350 DO L = J - K, K - 1 00351 ARF( IJ ) = A( J-K, L ) 00352 IJ = IJ + 1 00353 END DO 00354 IJ = IJ - NP1X2 00355 END DO 00356 * 00357 END IF 00358 * 00359 ELSE 00360 * 00361 * N is even and TRANSR = 'T' 00362 * 00363 IF( LOWER ) THEN 00364 * 00365 * N is even, TRANSR = 'T', and UPLO = 'L' 00366 * 00367 IJ = 0 00368 J = K 00369 DO I = K, N - 1 00370 ARF( IJ ) = A( I, J ) 00371 IJ = IJ + 1 00372 END DO 00373 DO J = 0, K - 2 00374 DO I = 0, J 00375 ARF( IJ ) = A( J, I ) 00376 IJ = IJ + 1 00377 END DO 00378 DO I = K + 1 + J, N - 1 00379 ARF( IJ ) = A( I, K+1+J ) 00380 IJ = IJ + 1 00381 END DO 00382 END DO 00383 DO J = K - 1, N - 1 00384 DO I = 0, K - 1 00385 ARF( IJ ) = A( J, I ) 00386 IJ = IJ + 1 00387 END DO 00388 END DO 00389 * 00390 ELSE 00391 * 00392 * N is even, TRANSR = 'T', and UPLO = 'U' 00393 * 00394 IJ = 0 00395 DO J = 0, K 00396 DO I = K, N - 1 00397 ARF( IJ ) = A( J, I ) 00398 IJ = IJ + 1 00399 END DO 00400 END DO 00401 DO J = 0, K - 2 00402 DO I = 0, J 00403 ARF( IJ ) = A( I, J ) 00404 IJ = IJ + 1 00405 END DO 00406 DO L = K + 1 + J, N - 1 00407 ARF( IJ ) = A( K+1+J, L ) 00408 IJ = IJ + 1 00409 END DO 00410 END DO 00411 * Note that here, on exit of the loop, J = K-1 00412 DO I = 0, J 00413 ARF( IJ ) = A( I, J ) 00414 IJ = IJ + 1 00415 END DO 00416 * 00417 END IF 00418 * 00419 END IF 00420 * 00421 END IF 00422 * 00423 RETURN 00424 * 00425 * End of DTRTTF 00426 * 00427 END