00001 SUBROUTINE CLAVSP( UPLO, TRANS, DIAG, N, NRHS, A, IPIV, B, LDB,
00002 $ INFO )
00003
00004
00005
00006
00007
00008
00009 CHARACTER DIAG, TRANS, UPLO
00010 INTEGER INFO, LDB, N, NRHS
00011
00012
00013 INTEGER IPIV( * )
00014 COMPLEX A( * ), 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
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109 COMPLEX ONE
00110 PARAMETER ( ONE = ( 1.0E+0, 0.0E+0 ) )
00111
00112
00113 LOGICAL NOUNIT
00114 INTEGER J, K, KC, KCNEXT, KP
00115 COMPLEX D11, D12, D21, D22, T1, T2
00116
00117
00118 LOGICAL LSAME
00119 EXTERNAL LSAME
00120
00121
00122 EXTERNAL CGEMV, CGERU, CSCAL, CSWAP, XERBLA
00123
00124
00125 INTRINSIC ABS, MAX
00126
00127
00128
00129
00130
00131 INFO = 0
00132 IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
00133 INFO = -1
00134 ELSE IF( .NOT.LSAME( TRANS, 'N' ) .AND. .NOT.LSAME( TRANS, 'T' ) )
00135 $ THEN
00136 INFO = -2
00137 ELSE IF( .NOT.LSAME( DIAG, 'U' ) .AND. .NOT.LSAME( DIAG, 'N' ) )
00138 $ THEN
00139 INFO = -3
00140 ELSE IF( N.LT.0 ) THEN
00141 INFO = -4
00142 ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
00143 INFO = -8
00144 END IF
00145 IF( INFO.NE.0 ) THEN
00146 CALL XERBLA( 'CLAVSP ', -INFO )
00147 RETURN
00148 END IF
00149
00150
00151
00152 IF( N.EQ.0 )
00153 $ RETURN
00154
00155 NOUNIT = LSAME( DIAG, 'N' )
00156
00157
00158
00159
00160
00161 IF( LSAME( TRANS, 'N' ) ) THEN
00162
00163
00164
00165
00166 IF( LSAME( UPLO, 'U' ) ) THEN
00167
00168
00169
00170 K = 1
00171 KC = 1
00172 10 CONTINUE
00173 IF( K.GT.N )
00174 $ GO TO 30
00175
00176
00177
00178 IF( IPIV( K ).GT.0 ) THEN
00179
00180
00181
00182 IF( NOUNIT )
00183 $ CALL CSCAL( NRHS, A( KC+K-1 ), B( K, 1 ), LDB )
00184
00185
00186
00187 IF( K.GT.1 ) THEN
00188
00189
00190
00191 CALL CGERU( K-1, NRHS, ONE, A( KC ), 1, B( K, 1 ),
00192 $ LDB, B( 1, 1 ), LDB )
00193
00194
00195
00196 KP = IPIV( K )
00197 IF( KP.NE.K )
00198 $ CALL CSWAP( NRHS, B( K, 1 ), LDB, B( KP, 1 ), LDB )
00199 END IF
00200 KC = KC + K
00201 K = K + 1
00202 ELSE
00203
00204
00205
00206 KCNEXT = KC + K
00207
00208
00209
00210 IF( NOUNIT ) THEN
00211 D11 = A( KCNEXT-1 )
00212 D22 = A( KCNEXT+K )
00213 D12 = A( KCNEXT+K-1 )
00214 D21 = D12
00215 DO 20 J = 1, NRHS
00216 T1 = B( K, J )
00217 T2 = B( K+1, J )
00218 B( K, J ) = D11*T1 + D12*T2
00219 B( K+1, J ) = D21*T1 + D22*T2
00220 20 CONTINUE
00221 END IF
00222
00223
00224
00225 IF( K.GT.1 ) THEN
00226
00227
00228
00229 CALL CGERU( K-1, NRHS, ONE, A( KC ), 1, B( K, 1 ),
00230 $ LDB, B( 1, 1 ), LDB )
00231 CALL CGERU( K-1, NRHS, ONE, A( KCNEXT ), 1,
00232 $ B( K+1, 1 ), LDB, B( 1, 1 ), LDB )
00233
00234
00235
00236 KP = ABS( IPIV( K ) )
00237 IF( KP.NE.K )
00238 $ CALL CSWAP( NRHS, B( K, 1 ), LDB, B( KP, 1 ), LDB )
00239 END IF
00240 KC = KCNEXT + K + 1
00241 K = K + 2
00242 END IF
00243 GO TO 10
00244 30 CONTINUE
00245
00246
00247
00248
00249 ELSE
00250
00251
00252
00253 K = N
00254 KC = N*( N+1 ) / 2 + 1
00255 40 CONTINUE
00256 IF( K.LT.1 )
00257 $ GO TO 60
00258 KC = KC - ( N-K+1 )
00259
00260
00261
00262
00263 IF( IPIV( K ).GT.0 ) THEN
00264
00265
00266
00267
00268
00269 IF( NOUNIT )
00270 $ CALL CSCAL( NRHS, A( KC ), B( K, 1 ), LDB )
00271
00272
00273
00274 IF( K.NE.N ) THEN
00275 KP = IPIV( K )
00276
00277
00278
00279 CALL CGERU( N-K, NRHS, ONE, A( KC+1 ), 1, B( K, 1 ),
00280 $ LDB, B( K+1, 1 ), LDB )
00281
00282
00283
00284
00285 IF( KP.NE.K )
00286 $ CALL CSWAP( NRHS, B( K, 1 ), LDB, B( KP, 1 ), LDB )
00287 END IF
00288 K = K - 1
00289
00290 ELSE
00291
00292
00293
00294 KCNEXT = KC - ( N-K+2 )
00295
00296
00297
00298 IF( NOUNIT ) THEN
00299 D11 = A( KCNEXT )
00300 D22 = A( KC )
00301 D21 = A( KCNEXT+1 )
00302 D12 = D21
00303 DO 50 J = 1, NRHS
00304 T1 = B( K-1, J )
00305 T2 = B( K, J )
00306 B( K-1, J ) = D11*T1 + D12*T2
00307 B( K, J ) = D21*T1 + D22*T2
00308 50 CONTINUE
00309 END IF
00310
00311
00312
00313 IF( K.NE.N ) THEN
00314
00315
00316
00317 CALL CGERU( N-K, NRHS, ONE, A( KC+1 ), 1, B( K, 1 ),
00318 $ LDB, B( K+1, 1 ), LDB )
00319 CALL CGERU( N-K, NRHS, ONE, A( KCNEXT+2 ), 1,
00320 $ B( K-1, 1 ), LDB, B( K+1, 1 ), LDB )
00321
00322
00323
00324
00325 KP = ABS( IPIV( K ) )
00326 IF( KP.NE.K )
00327 $ CALL CSWAP( NRHS, B( K, 1 ), LDB, B( KP, 1 ), LDB )
00328 END IF
00329 KC = KCNEXT
00330 K = K - 2
00331 END IF
00332 GO TO 40
00333 60 CONTINUE
00334 END IF
00335
00336
00337
00338
00339
00340 ELSE
00341
00342
00343
00344
00345
00346 IF( LSAME( UPLO, 'U' ) ) THEN
00347
00348
00349
00350 K = N
00351 KC = N*( N+1 ) / 2 + 1
00352 70 IF( K.LT.1 )
00353 $ GO TO 90
00354 KC = KC - K
00355
00356
00357
00358 IF( IPIV( K ).GT.0 ) THEN
00359 IF( K.GT.1 ) THEN
00360
00361
00362
00363 KP = IPIV( K )
00364 IF( KP.NE.K )
00365 $ CALL CSWAP( NRHS, B( K, 1 ), LDB, B( KP, 1 ), LDB )
00366
00367
00368
00369
00370
00371 CALL CGEMV( 'Transpose', K-1, NRHS, ONE, B, LDB,
00372 $ A( KC ), 1, ONE, B( K, 1 ), LDB )
00373 END IF
00374 IF( NOUNIT )
00375 $ CALL CSCAL( NRHS, A( KC+K-1 ), B( K, 1 ), LDB )
00376 K = K - 1
00377
00378
00379
00380 ELSE
00381 KCNEXT = KC - ( K-1 )
00382 IF( K.GT.2 ) THEN
00383
00384
00385
00386 KP = ABS( IPIV( K ) )
00387 IF( KP.NE.K-1 )
00388 $ CALL CSWAP( NRHS, B( K-1, 1 ), LDB, B( KP, 1 ),
00389 $ LDB )
00390
00391
00392
00393 CALL CGEMV( 'Transpose', K-2, NRHS, ONE, B, LDB,
00394 $ A( KC ), 1, ONE, B( K, 1 ), LDB )
00395
00396 CALL CGEMV( 'Transpose', K-2, NRHS, ONE, B, LDB,
00397 $ A( KCNEXT ), 1, ONE, B( K-1, 1 ), LDB )
00398 END IF
00399
00400
00401
00402 IF( NOUNIT ) THEN
00403 D11 = A( KC-1 )
00404 D22 = A( KC+K-1 )
00405 D12 = A( KC+K-2 )
00406 D21 = D12
00407 DO 80 J = 1, NRHS
00408 T1 = B( K-1, J )
00409 T2 = B( K, J )
00410 B( K-1, J ) = D11*T1 + D12*T2
00411 B( K, J ) = D21*T1 + D22*T2
00412 80 CONTINUE
00413 END IF
00414 KC = KCNEXT
00415 K = K - 2
00416 END IF
00417 GO TO 70
00418 90 CONTINUE
00419
00420
00421
00422
00423
00424 ELSE
00425
00426
00427
00428 K = 1
00429 KC = 1
00430 100 CONTINUE
00431 IF( K.GT.N )
00432 $ GO TO 120
00433
00434
00435
00436 IF( IPIV( K ).GT.0 ) THEN
00437 IF( K.LT.N ) THEN
00438
00439
00440
00441 KP = IPIV( K )
00442 IF( KP.NE.K )
00443 $ CALL CSWAP( NRHS, B( K, 1 ), LDB, B( KP, 1 ), LDB )
00444
00445
00446
00447 CALL CGEMV( 'Transpose', N-K, NRHS, ONE, B( K+1, 1 ),
00448 $ LDB, A( KC+1 ), 1, ONE, B( K, 1 ), LDB )
00449 END IF
00450 IF( NOUNIT )
00451 $ CALL CSCAL( NRHS, A( KC ), B( K, 1 ), LDB )
00452 KC = KC + N - K + 1
00453 K = K + 1
00454
00455
00456
00457 ELSE
00458 KCNEXT = KC + N - K + 1
00459 IF( K.LT.N-1 ) THEN
00460
00461
00462
00463 KP = ABS( IPIV( K ) )
00464 IF( KP.NE.K+1 )
00465 $ CALL CSWAP( NRHS, B( K+1, 1 ), LDB, B( KP, 1 ),
00466 $ LDB )
00467
00468
00469
00470 CALL CGEMV( 'Transpose', N-K-1, NRHS, ONE,
00471 $ B( K+2, 1 ), LDB, A( KCNEXT+1 ), 1, ONE,
00472 $ B( K+1, 1 ), LDB )
00473
00474 CALL CGEMV( 'Transpose', N-K-1, NRHS, ONE,
00475 $ B( K+2, 1 ), LDB, A( KC+2 ), 1, ONE,
00476 $ B( K, 1 ), LDB )
00477 END IF
00478
00479
00480
00481 IF( NOUNIT ) THEN
00482 D11 = A( KC )
00483 D22 = A( KCNEXT )
00484 D21 = A( KC+1 )
00485 D12 = D21
00486 DO 110 J = 1, NRHS
00487 T1 = B( K, J )
00488 T2 = B( K+1, J )
00489 B( K, J ) = D11*T1 + D12*T2
00490 B( K+1, J ) = D21*T1 + D22*T2
00491 110 CONTINUE
00492 END IF
00493 KC = KCNEXT + ( N-K )
00494 K = K + 2
00495 END IF
00496 GO TO 100
00497 120 CONTINUE
00498 END IF
00499
00500 END IF
00501 RETURN
00502
00503
00504
00505 END