00001 SUBROUTINE ZHETRS2( UPLO, N, NRHS, A, LDA, IPIV, B, LDB,
00002 $ WORK, INFO )
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 CHARACTER UPLO
00014 INTEGER INFO, LDA, LDB, N, NRHS
00015
00016
00017 INTEGER IPIV( * )
00018 DOUBLE COMPLEX A( LDA, * ), B( LDB, * ), WORK( * )
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071 DOUBLE COMPLEX ONE
00072 PARAMETER ( ONE = (1.0D+0,0.0D+0) )
00073
00074
00075 LOGICAL UPPER
00076 INTEGER I, IINFO, J, K, KP
00077 DOUBLE PRECISION S
00078 DOUBLE COMPLEX AK, AKM1, AKM1K, BK, BKM1, DENOM
00079
00080
00081 LOGICAL LSAME
00082 EXTERNAL LSAME
00083
00084
00085 EXTERNAL ZLACGV, ZSCAL, ZSYCONV, ZSWAP, ZTRSM, XERBLA
00086
00087
00088 INTRINSIC DBLE, DCONJG, MAX
00089
00090
00091
00092 INFO = 0
00093 UPPER = LSAME( UPLO, 'U' )
00094 IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
00095 INFO = -1
00096 ELSE IF( N.LT.0 ) THEN
00097 INFO = -2
00098 ELSE IF( NRHS.LT.0 ) THEN
00099 INFO = -3
00100 ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
00101 INFO = -5
00102 ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
00103 INFO = -8
00104 END IF
00105 IF( INFO.NE.0 ) THEN
00106 CALL XERBLA( 'ZHETRS2', -INFO )
00107 RETURN
00108 END IF
00109
00110
00111
00112 IF( N.EQ.0 .OR. NRHS.EQ.0 )
00113 $ RETURN
00114
00115
00116
00117 CALL ZSYCONV( UPLO, 'C', N, A, LDA, IPIV, WORK, IINFO )
00118
00119 IF( UPPER ) THEN
00120
00121
00122
00123
00124 K=N
00125 DO WHILE ( K .GE. 1 )
00126 IF( IPIV( K ).GT.0 ) THEN
00127
00128
00129 KP = IPIV( K )
00130 IF( KP.NE.K )
00131 $ CALL ZSWAP( NRHS, B( K, 1 ), LDB, B( KP, 1 ), LDB )
00132 K=K-1
00133 ELSE
00134
00135
00136 KP = -IPIV( K )
00137 IF( KP.EQ.-IPIV( K-1 ) )
00138 $ CALL ZSWAP( NRHS, B( K-1, 1 ), LDB, B( KP, 1 ), LDB )
00139 K=K-2
00140 END IF
00141 END DO
00142
00143
00144
00145 CALL ZTRSM('L','U','N','U',N,NRHS,ONE,A,N,B,N)
00146
00147
00148
00149 I=N
00150 DO WHILE ( I .GE. 1 )
00151 IF( IPIV(I) .GT. 0 ) THEN
00152 S = DBLE( ONE ) / DBLE( A( I, I ) )
00153 CALL ZDSCAL( NRHS, S, B( I, 1 ), LDB )
00154 ELSEIF ( I .GT. 1) THEN
00155 IF ( IPIV(I-1) .EQ. IPIV(I) ) THEN
00156 AKM1K = WORK(I)
00157 AKM1 = A( I-1, I-1 ) / AKM1K
00158 AK = A( I, I ) / DCONJG( AKM1K )
00159 DENOM = AKM1*AK - ONE
00160 DO 15 J = 1, NRHS
00161 BKM1 = B( I-1, J ) / AKM1K
00162 BK = B( I, J ) / DCONJG( AKM1K )
00163 B( I-1, J ) = ( AK*BKM1-BK ) / DENOM
00164 B( I, J ) = ( AKM1*BK-BKM1 ) / DENOM
00165 15 CONTINUE
00166 I = I - 1
00167 ENDIF
00168 ENDIF
00169 I = I - 1
00170 END DO
00171
00172
00173
00174 CALL ZTRSM('L','U','C','U',N,NRHS,ONE,A,N,B,N)
00175
00176
00177
00178 K=1
00179 DO WHILE ( K .LE. N )
00180 IF( IPIV( K ).GT.0 ) THEN
00181
00182
00183 KP = IPIV( K )
00184 IF( KP.NE.K )
00185 $ CALL ZSWAP( NRHS, B( K, 1 ), LDB, B( KP, 1 ), LDB )
00186 K=K+1
00187 ELSE
00188
00189
00190 KP = -IPIV( K )
00191 IF( K .LT. N .AND. KP.EQ.-IPIV( K+1 ) )
00192 $ CALL ZSWAP( NRHS, B( K, 1 ), LDB, B( KP, 1 ), LDB )
00193 K=K+2
00194 ENDIF
00195 END DO
00196
00197 ELSE
00198
00199
00200
00201
00202 K=1
00203 DO WHILE ( K .LE. N )
00204 IF( IPIV( K ).GT.0 ) THEN
00205
00206
00207 KP = IPIV( K )
00208 IF( KP.NE.K )
00209 $ CALL ZSWAP( NRHS, B( K, 1 ), LDB, B( KP, 1 ), LDB )
00210 K=K+1
00211 ELSE
00212
00213
00214 KP = -IPIV( K+1 )
00215 IF( KP.EQ.-IPIV( K ) )
00216 $ CALL ZSWAP( NRHS, B( K+1, 1 ), LDB, B( KP, 1 ), LDB )
00217 K=K+2
00218 ENDIF
00219 END DO
00220
00221
00222
00223 CALL ZTRSM('L','L','N','U',N,NRHS,ONE,A,N,B,N)
00224
00225
00226
00227 I=1
00228 DO WHILE ( I .LE. N )
00229 IF( IPIV(I) .GT. 0 ) THEN
00230 S = DBLE( ONE ) / DBLE( A( I, I ) )
00231 CALL ZDSCAL( NRHS, S, B( I, 1 ), LDB )
00232 ELSE
00233 AKM1K = WORK(I)
00234 AKM1 = A( I, I ) / DCONJG( AKM1K )
00235 AK = A( I+1, I+1 ) / AKM1K
00236 DENOM = AKM1*AK - ONE
00237 DO 25 J = 1, NRHS
00238 BKM1 = B( I, J ) / DCONJG( AKM1K )
00239 BK = B( I+1, J ) / AKM1K
00240 B( I, J ) = ( AK*BKM1-BK ) / DENOM
00241 B( I+1, J ) = ( AKM1*BK-BKM1 ) / DENOM
00242 25 CONTINUE
00243 I = I + 1
00244 ENDIF
00245 I = I + 1
00246 END DO
00247
00248
00249
00250 CALL ZTRSM('L','L','C','U',N,NRHS,ONE,A,N,B,N)
00251
00252
00253
00254 K=N
00255 DO WHILE ( K .GE. 1 )
00256 IF( IPIV( K ).GT.0 ) THEN
00257
00258
00259 KP = IPIV( K )
00260 IF( KP.NE.K )
00261 $ CALL ZSWAP( NRHS, B( K, 1 ), LDB, B( KP, 1 ), LDB )
00262 K=K-1
00263 ELSE
00264
00265
00266 KP = -IPIV( K )
00267 IF( K.GT.1 .AND. KP.EQ.-IPIV( K-1 ) )
00268 $ CALL ZSWAP( NRHS, B( K, 1 ), LDB, B( KP, 1 ), LDB )
00269 K=K-2
00270 ENDIF
00271 END DO
00272
00273 END IF
00274
00275
00276
00277 CALL ZSYCONV( UPLO, 'R', N, A, LDA, IPIV, WORK, IINFO )
00278
00279 RETURN
00280
00281
00282
00283 END