00001 SUBROUTINE CHPTRS( UPLO, N, NRHS, AP, IPIV, B, LDB, INFO )
00002
00003
00004
00005
00006
00007
00008
00009 CHARACTER UPLO
00010 INTEGER INFO, LDB, N, NRHS
00011
00012
00013 INTEGER IPIV( * )
00014 COMPLEX AP( * ), B( LDB, * )
00015
00016
00017
00018
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 COMPLEX ONE
00064 PARAMETER ( ONE = ( 1.0E+0, 0.0E+0 ) )
00065
00066
00067 LOGICAL UPPER
00068 INTEGER J, K, KC, KP
00069 REAL S
00070 COMPLEX AK, AKM1, AKM1K, BK, BKM1, DENOM
00071
00072
00073 LOGICAL LSAME
00074 EXTERNAL LSAME
00075
00076
00077 EXTERNAL CGEMV, CGERU, CLACGV, CSSCAL, CSWAP, XERBLA
00078
00079
00080 INTRINSIC CONJG, MAX, REAL
00081
00082
00083
00084 INFO = 0
00085 UPPER = LSAME( UPLO, 'U' )
00086 IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
00087 INFO = -1
00088 ELSE IF( N.LT.0 ) THEN
00089 INFO = -2
00090 ELSE IF( NRHS.LT.0 ) THEN
00091 INFO = -3
00092 ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
00093 INFO = -7
00094 END IF
00095 IF( INFO.NE.0 ) THEN
00096 CALL XERBLA( 'CHPTRS', -INFO )
00097 RETURN
00098 END IF
00099
00100
00101
00102 IF( N.EQ.0 .OR. NRHS.EQ.0 )
00103 $ RETURN
00104
00105 IF( UPPER ) THEN
00106
00107
00108
00109
00110
00111
00112
00113
00114 K = N
00115 KC = N*( N+1 ) / 2 + 1
00116 10 CONTINUE
00117
00118
00119
00120 IF( K.LT.1 )
00121 $ GO TO 30
00122
00123 KC = KC - K
00124 IF( IPIV( K ).GT.0 ) THEN
00125
00126
00127
00128
00129
00130 KP = IPIV( K )
00131 IF( KP.NE.K )
00132 $ CALL CSWAP( NRHS, B( K, 1 ), LDB, B( KP, 1 ), LDB )
00133
00134
00135
00136
00137 CALL CGERU( K-1, NRHS, -ONE, AP( KC ), 1, B( K, 1 ), LDB,
00138 $ B( 1, 1 ), LDB )
00139
00140
00141
00142 S = REAL( ONE ) / REAL( AP( KC+K-1 ) )
00143 CALL CSSCAL( NRHS, S, B( K, 1 ), LDB )
00144 K = K - 1
00145 ELSE
00146
00147
00148
00149
00150
00151 KP = -IPIV( K )
00152 IF( KP.NE.K-1 )
00153 $ CALL CSWAP( NRHS, B( K-1, 1 ), LDB, B( KP, 1 ), LDB )
00154
00155
00156
00157
00158 CALL CGERU( K-2, NRHS, -ONE, AP( KC ), 1, B( K, 1 ), LDB,
00159 $ B( 1, 1 ), LDB )
00160 CALL CGERU( K-2, NRHS, -ONE, AP( KC-( K-1 ) ), 1,
00161 $ B( K-1, 1 ), LDB, B( 1, 1 ), LDB )
00162
00163
00164
00165 AKM1K = AP( KC+K-2 )
00166 AKM1 = AP( KC-1 ) / AKM1K
00167 AK = AP( KC+K-1 ) / CONJG( AKM1K )
00168 DENOM = AKM1*AK - ONE
00169 DO 20 J = 1, NRHS
00170 BKM1 = B( K-1, J ) / AKM1K
00171 BK = B( K, J ) / CONJG( AKM1K )
00172 B( K-1, J ) = ( AK*BKM1-BK ) / DENOM
00173 B( K, J ) = ( AKM1*BK-BKM1 ) / DENOM
00174 20 CONTINUE
00175 KC = KC - K + 1
00176 K = K - 2
00177 END IF
00178
00179 GO TO 10
00180 30 CONTINUE
00181
00182
00183
00184
00185
00186
00187 K = 1
00188 KC = 1
00189 40 CONTINUE
00190
00191
00192
00193 IF( K.GT.N )
00194 $ GO TO 50
00195
00196 IF( IPIV( K ).GT.0 ) THEN
00197
00198
00199
00200
00201
00202
00203 IF( K.GT.1 ) THEN
00204 CALL CLACGV( NRHS, B( K, 1 ), LDB )
00205 CALL CGEMV( 'Conjugate transpose', K-1, NRHS, -ONE, B,
00206 $ LDB, AP( KC ), 1, ONE, B( K, 1 ), LDB )
00207 CALL CLACGV( NRHS, B( K, 1 ), LDB )
00208 END IF
00209
00210
00211
00212 KP = IPIV( K )
00213 IF( KP.NE.K )
00214 $ CALL CSWAP( NRHS, B( K, 1 ), LDB, B( KP, 1 ), LDB )
00215 KC = KC + K
00216 K = K + 1
00217 ELSE
00218
00219
00220
00221
00222
00223
00224 IF( K.GT.1 ) THEN
00225 CALL CLACGV( NRHS, B( K, 1 ), LDB )
00226 CALL CGEMV( 'Conjugate transpose', K-1, NRHS, -ONE, B,
00227 $ LDB, AP( KC ), 1, ONE, B( K, 1 ), LDB )
00228 CALL CLACGV( NRHS, B( K, 1 ), LDB )
00229
00230 CALL CLACGV( NRHS, B( K+1, 1 ), LDB )
00231 CALL CGEMV( 'Conjugate transpose', K-1, NRHS, -ONE, B,
00232 $ LDB, AP( KC+K ), 1, ONE, B( K+1, 1 ), LDB )
00233 CALL CLACGV( NRHS, B( K+1, 1 ), LDB )
00234 END IF
00235
00236
00237
00238 KP = -IPIV( K )
00239 IF( KP.NE.K )
00240 $ CALL CSWAP( NRHS, B( K, 1 ), LDB, B( KP, 1 ), LDB )
00241 KC = KC + 2*K + 1
00242 K = K + 2
00243 END IF
00244
00245 GO TO 40
00246 50 CONTINUE
00247
00248 ELSE
00249
00250
00251
00252
00253
00254
00255
00256
00257 K = 1
00258 KC = 1
00259 60 CONTINUE
00260
00261
00262
00263 IF( K.GT.N )
00264 $ GO TO 80
00265
00266 IF( IPIV( K ).GT.0 ) THEN
00267
00268
00269
00270
00271
00272 KP = IPIV( K )
00273 IF( KP.NE.K )
00274 $ CALL CSWAP( NRHS, B( K, 1 ), LDB, B( KP, 1 ), LDB )
00275
00276
00277
00278
00279 IF( K.LT.N )
00280 $ CALL CGERU( N-K, NRHS, -ONE, AP( KC+1 ), 1, B( K, 1 ),
00281 $ LDB, B( K+1, 1 ), LDB )
00282
00283
00284
00285 S = REAL( ONE ) / REAL( AP( KC ) )
00286 CALL CSSCAL( NRHS, S, B( K, 1 ), LDB )
00287 KC = KC + N - K + 1
00288 K = K + 1
00289 ELSE
00290
00291
00292
00293
00294
00295 KP = -IPIV( K )
00296 IF( KP.NE.K+1 )
00297 $ CALL CSWAP( NRHS, B( K+1, 1 ), LDB, B( KP, 1 ), LDB )
00298
00299
00300
00301
00302 IF( K.LT.N-1 ) THEN
00303 CALL CGERU( N-K-1, NRHS, -ONE, AP( KC+2 ), 1, B( K, 1 ),
00304 $ LDB, B( K+2, 1 ), LDB )
00305 CALL CGERU( N-K-1, NRHS, -ONE, AP( KC+N-K+2 ), 1,
00306 $ B( K+1, 1 ), LDB, B( K+2, 1 ), LDB )
00307 END IF
00308
00309
00310
00311 AKM1K = AP( KC+1 )
00312 AKM1 = AP( KC ) / CONJG( AKM1K )
00313 AK = AP( KC+N-K+1 ) / AKM1K
00314 DENOM = AKM1*AK - ONE
00315 DO 70 J = 1, NRHS
00316 BKM1 = B( K, J ) / CONJG( AKM1K )
00317 BK = B( K+1, J ) / AKM1K
00318 B( K, J ) = ( AK*BKM1-BK ) / DENOM
00319 B( K+1, J ) = ( AKM1*BK-BKM1 ) / DENOM
00320 70 CONTINUE
00321 KC = KC + 2*( N-K ) + 1
00322 K = K + 2
00323 END IF
00324
00325 GO TO 60
00326 80 CONTINUE
00327
00328
00329
00330
00331
00332
00333 K = N
00334 KC = N*( N+1 ) / 2 + 1
00335 90 CONTINUE
00336
00337
00338
00339 IF( K.LT.1 )
00340 $ GO TO 100
00341
00342 KC = KC - ( N-K+1 )
00343 IF( IPIV( K ).GT.0 ) THEN
00344
00345
00346
00347
00348
00349
00350 IF( K.LT.N ) THEN
00351 CALL CLACGV( NRHS, B( K, 1 ), LDB )
00352 CALL CGEMV( 'Conjugate transpose', N-K, NRHS, -ONE,
00353 $ B( K+1, 1 ), LDB, AP( KC+1 ), 1, ONE,
00354 $ B( K, 1 ), LDB )
00355 CALL CLACGV( NRHS, B( K, 1 ), LDB )
00356 END IF
00357
00358
00359
00360 KP = IPIV( K )
00361 IF( KP.NE.K )
00362 $ CALL CSWAP( NRHS, B( K, 1 ), LDB, B( KP, 1 ), LDB )
00363 K = K - 1
00364 ELSE
00365
00366
00367
00368
00369
00370
00371 IF( K.LT.N ) THEN
00372 CALL CLACGV( NRHS, B( K, 1 ), LDB )
00373 CALL CGEMV( 'Conjugate transpose', N-K, NRHS, -ONE,
00374 $ B( K+1, 1 ), LDB, AP( KC+1 ), 1, ONE,
00375 $ B( K, 1 ), LDB )
00376 CALL CLACGV( NRHS, B( K, 1 ), LDB )
00377
00378 CALL CLACGV( NRHS, B( K-1, 1 ), LDB )
00379 CALL CGEMV( 'Conjugate transpose', N-K, NRHS, -ONE,
00380 $ B( K+1, 1 ), LDB, AP( KC-( N-K ) ), 1, ONE,
00381 $ B( K-1, 1 ), LDB )
00382 CALL CLACGV( NRHS, B( K-1, 1 ), LDB )
00383 END IF
00384
00385
00386
00387 KP = -IPIV( K )
00388 IF( KP.NE.K )
00389 $ CALL CSWAP( NRHS, B( K, 1 ), LDB, B( KP, 1 ), LDB )
00390 KC = KC - ( N-K+2 )
00391 K = K - 2
00392 END IF
00393
00394 GO TO 90
00395 100 CONTINUE
00396 END IF
00397
00398 RETURN
00399
00400
00401
00402 END