1*> \brief \b ZSYCONV 2* 3* =========== DOCUMENTATION =========== 4* 5* Online html documentation available at 6* http://www.netlib.org/lapack/explore-html/ 7* 8*> \htmlonly 9*> Download ZSYCONV + dependencies 10*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zsyconv.f"> 11*> [TGZ]</a> 12*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zsyconv.f"> 13*> [ZIP]</a> 14*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zsyconv.f"> 15*> [TXT]</a> 16*> \endhtmlonly 17* 18* Definition: 19* =========== 20* 21* SUBROUTINE ZSYCONV( UPLO, WAY, N, A, LDA, IPIV, E, INFO ) 22* 23* .. Scalar Arguments .. 24* CHARACTER UPLO, WAY 25* INTEGER INFO, LDA, N 26* .. 27* .. Array Arguments .. 28* INTEGER IPIV( * ) 29* COMPLEX*16 A( LDA, * ), E( * ) 30* .. 31* 32* 33*> \par Purpose: 34* ============= 35*> 36*> \verbatim 37*> 38*> ZSYCONV converts A given by ZHETRF into L and D or vice-versa. 39*> Get nondiagonal elements of D (returned in workspace) and 40*> apply or reverse permutation done in TRF. 41*> \endverbatim 42* 43* Arguments: 44* ========== 45* 46*> \param[in] UPLO 47*> \verbatim 48*> UPLO is CHARACTER*1 49*> Specifies whether the details of the factorization are stored 50*> as an upper or lower triangular matrix. 51*> = 'U': Upper triangular, form is A = U*D*U**T; 52*> = 'L': Lower triangular, form is A = L*D*L**T. 53*> \endverbatim 54*> 55*> \param[in] WAY 56*> \verbatim 57*> WAY is CHARACTER*1 58*> = 'C': Convert 59*> = 'R': Revert 60*> \endverbatim 61*> 62*> \param[in] N 63*> \verbatim 64*> N is INTEGER 65*> The order of the matrix A. N >= 0. 66*> \endverbatim 67*> 68*> \param[in,out] A 69*> \verbatim 70*> A is COMPLEX*16 array, dimension (LDA,N) 71*> The block diagonal matrix D and the multipliers used to 72*> obtain the factor U or L as computed by ZSYTRF. 73*> \endverbatim 74*> 75*> \param[in] LDA 76*> \verbatim 77*> LDA is INTEGER 78*> The leading dimension of the array A. LDA >= max(1,N). 79*> \endverbatim 80*> 81*> \param[in] IPIV 82*> \verbatim 83*> IPIV is INTEGER array, dimension (N) 84*> Details of the interchanges and the block structure of D 85*> as determined by ZSYTRF. 86*> \endverbatim 87*> 88*> \param[out] E 89*> \verbatim 90*> E is COMPLEX*16 array, dimension (N) 91*> E stores the supdiagonal/subdiagonal of the symmetric 1-by-1 92*> or 2-by-2 block diagonal matrix D in LDLT. 93*> \endverbatim 94*> 95*> \param[out] INFO 96*> \verbatim 97*> INFO is INTEGER 98*> = 0: successful exit 99*> < 0: if INFO = -i, the i-th argument had an illegal value 100*> \endverbatim 101* 102* Authors: 103* ======== 104* 105*> \author Univ. of Tennessee 106*> \author Univ. of California Berkeley 107*> \author Univ. of Colorado Denver 108*> \author NAG Ltd. 109* 110*> \date November 2015 111* 112*> \ingroup complex16SYcomputational 113* 114* ===================================================================== 115 SUBROUTINE ZSYCONV( UPLO, WAY, N, A, LDA, IPIV, E, INFO ) 116* 117* -- LAPACK computational routine (version 3.6.0) -- 118* -- LAPACK is a software package provided by Univ. of Tennessee, -- 119* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- 120* November 2015 121* 122* .. Scalar Arguments .. 123 CHARACTER UPLO, WAY 124 INTEGER INFO, LDA, N 125* .. 126* .. Array Arguments .. 127 INTEGER IPIV( * ) 128 COMPLEX*16 A( LDA, * ), E( * ) 129* .. 130* 131* ===================================================================== 132* 133* .. Parameters .. 134 COMPLEX*16 ZERO 135 PARAMETER ( ZERO = (0.0D+0,0.0D+0) ) 136* .. 137* .. External Functions .. 138 LOGICAL LSAME 139 EXTERNAL LSAME 140* 141* .. External Subroutines .. 142 EXTERNAL XERBLA 143* .. Local Scalars .. 144 LOGICAL UPPER, CONVERT 145 INTEGER I, IP, J 146 COMPLEX*16 TEMP 147* .. 148* .. Executable Statements .. 149* 150 INFO = 0 151 UPPER = LSAME( UPLO, 'U' ) 152 CONVERT = LSAME( WAY, 'C' ) 153 IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN 154 INFO = -1 155 ELSE IF( .NOT.CONVERT .AND. .NOT.LSAME( WAY, 'R' ) ) THEN 156 INFO = -2 157 ELSE IF( N.LT.0 ) THEN 158 INFO = -3 159 ELSE IF( LDA.LT.MAX( 1, N ) ) THEN 160 INFO = -5 161 162 END IF 163 IF( INFO.NE.0 ) THEN 164 CALL XERBLA( 'ZSYCONV', -INFO ) 165 RETURN 166 END IF 167* 168* Quick return if possible 169* 170 IF( N.EQ.0 ) 171 $ RETURN 172* 173 IF( UPPER ) THEN 174* 175* A is UPPER 176* 177 IF ( CONVERT ) THEN 178* 179* Convert A (A is upper) 180* 181* Convert VALUE 182* 183 I=N 184 E(1)=ZERO 185 DO WHILE ( I .GT. 1 ) 186 IF( IPIV(I) .LT. 0 ) THEN 187 E(I)=A(I-1,I) 188 E(I-1)=ZERO 189 A(I-1,I)=ZERO 190 I=I-1 191 ELSE 192 E(I)=ZERO 193 ENDIF 194 I=I-1 195 END DO 196* 197* Convert PERMUTATIONS 198* 199 I=N 200 DO WHILE ( I .GE. 1 ) 201 IF( IPIV(I) .GT. 0) THEN 202 IP=IPIV(I) 203 IF( I .LT. N) THEN 204 DO 12 J= I+1,N 205 TEMP=A(IP,J) 206 A(IP,J)=A(I,J) 207 A(I,J)=TEMP 208 12 CONTINUE 209 ENDIF 210 ELSE 211 IP=-IPIV(I) 212 IF( I .LT. N) THEN 213 DO 13 J= I+1,N 214 TEMP=A(IP,J) 215 A(IP,J)=A(I-1,J) 216 A(I-1,J)=TEMP 217 13 CONTINUE 218 ENDIF 219 I=I-1 220 ENDIF 221 I=I-1 222 END DO 223* 224 ELSE 225* 226* Revert A (A is upper) 227* 228* Revert PERMUTATIONS 229* 230 I=1 231 DO WHILE ( I .LE. N ) 232 IF( IPIV(I) .GT. 0 ) THEN 233 IP=IPIV(I) 234 IF( I .LT. N) THEN 235 DO J= I+1,N 236 TEMP=A(IP,J) 237 A(IP,J)=A(I,J) 238 A(I,J)=TEMP 239 END DO 240 ENDIF 241 ELSE 242 IP=-IPIV(I) 243 I=I+1 244 IF( I .LT. N) THEN 245 DO J= I+1,N 246 TEMP=A(IP,J) 247 A(IP,J)=A(I-1,J) 248 A(I-1,J)=TEMP 249 END DO 250 ENDIF 251 ENDIF 252 I=I+1 253 END DO 254* 255* Revert VALUE 256* 257 I=N 258 DO WHILE ( I .GT. 1 ) 259 IF( IPIV(I) .LT. 0 ) THEN 260 A(I-1,I)=E(I) 261 I=I-1 262 ENDIF 263 I=I-1 264 END DO 265 END IF 266* 267 ELSE 268* 269* A is LOWER 270* 271 IF ( CONVERT ) THEN 272* 273* Convert A (A is lower) 274* 275* Convert VALUE 276* 277 I=1 278 E(N)=ZERO 279 DO WHILE ( I .LE. N ) 280 IF( I.LT.N .AND. IPIV(I) .LT. 0 ) THEN 281 E(I)=A(I+1,I) 282 E(I+1)=ZERO 283 A(I+1,I)=ZERO 284 I=I+1 285 ELSE 286 E(I)=ZERO 287 ENDIF 288 I=I+1 289 END DO 290* 291* Convert PERMUTATIONS 292* 293 I=1 294 DO WHILE ( I .LE. N ) 295 IF( IPIV(I) .GT. 0 ) THEN 296 IP=IPIV(I) 297 IF (I .GT. 1) THEN 298 DO 22 J= 1,I-1 299 TEMP=A(IP,J) 300 A(IP,J)=A(I,J) 301 A(I,J)=TEMP 302 22 CONTINUE 303 ENDIF 304 ELSE 305 IP=-IPIV(I) 306 IF (I .GT. 1) THEN 307 DO 23 J= 1,I-1 308 TEMP=A(IP,J) 309 A(IP,J)=A(I+1,J) 310 A(I+1,J)=TEMP 311 23 CONTINUE 312 ENDIF 313 I=I+1 314 ENDIF 315 I=I+1 316 END DO 317* 318 ELSE 319* 320* Revert A (A is lower) 321* 322* Revert PERMUTATIONS 323* 324 I=N 325 DO WHILE ( I .GE. 1 ) 326 IF( IPIV(I) .GT. 0 ) THEN 327 IP=IPIV(I) 328 IF (I .GT. 1) THEN 329 DO J= 1,I-1 330 TEMP=A(I,J) 331 A(I,J)=A(IP,J) 332 A(IP,J)=TEMP 333 END DO 334 ENDIF 335 ELSE 336 IP=-IPIV(I) 337 I=I-1 338 IF (I .GT. 1) THEN 339 DO J= 1,I-1 340 TEMP=A(I+1,J) 341 A(I+1,J)=A(IP,J) 342 A(IP,J)=TEMP 343 END DO 344 ENDIF 345 ENDIF 346 I=I-1 347 END DO 348* 349* Revert VALUE 350* 351 I=1 352 DO WHILE ( I .LE. N-1 ) 353 IF( IPIV(I) .LT. 0 ) THEN 354 A(I+1,I)=E(I) 355 I=I+1 356 ENDIF 357 I=I+1 358 END DO 359 END IF 360 END IF 361* 362 RETURN 363* 364* End of ZSYCONV 365* 366 END 367