00001 SUBROUTINE ZLAVSP( 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*16 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*16 ONE
00110 PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ) )
00111
00112
00113 LOGICAL NOUNIT
00114 INTEGER J, K, KC, KCNEXT, KP
00115 COMPLEX*16 D11, D12, D21, D22, T1, T2
00116
00117
00118 LOGICAL LSAME
00119 EXTERNAL LSAME
00120
00121
00122 EXTERNAL XERBLA, ZGEMV, ZGERU, ZSCAL, ZSWAP
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( 'ZLAVSP ', -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 ZSCAL( NRHS, A( KC+K-1 ), B( K, 1 ), LDB )
00184
00185
00186
00187 IF( K.GT.1 ) THEN
00188
00189
00190
00191 CALL ZGERU( 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 ZSWAP( 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 ZGERU( K-1, NRHS, ONE, A( KC ), 1, B( K, 1 ),
00230 $ LDB, B( 1, 1 ), LDB )
00231 CALL ZGERU( 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 ZSWAP( 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 ZSCAL( 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 ZGERU( 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 ZSWAP( 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 ZGERU( N-K, NRHS, ONE, A( KC+1 ), 1, B( K, 1 ),
00318 $ LDB, B( K+1, 1 ), LDB )
00319 CALL ZGERU( 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 ZSWAP( 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 CONTINUE
00353 IF( K.LT.1 )
00354 $ GO TO 90
00355 KC = KC - K
00356
00357
00358
00359 IF( IPIV( K ).GT.0 ) THEN
00360 IF( K.GT.1 ) THEN
00361
00362
00363
00364 KP = IPIV( K )
00365 IF( KP.NE.K )
00366 $ CALL ZSWAP( NRHS, B( K, 1 ), LDB, B( KP, 1 ), LDB )
00367
00368
00369
00370
00371
00372 CALL ZGEMV( 'Transpose', K-1, NRHS, ONE, B, LDB,
00373 $ A( KC ), 1, ONE, B( K, 1 ), LDB )
00374 END IF
00375 IF( NOUNIT )
00376 $ CALL ZSCAL( NRHS, A( KC+K-1 ), B( K, 1 ), LDB )
00377 K = K - 1
00378
00379
00380
00381 ELSE
00382 KCNEXT = KC - ( K-1 )
00383 IF( K.GT.2 ) THEN
00384
00385
00386
00387 KP = ABS( IPIV( K ) )
00388 IF( KP.NE.K-1 )
00389 $ CALL ZSWAP( NRHS, B( K-1, 1 ), LDB, B( KP, 1 ),
00390 $ LDB )
00391
00392
00393
00394 CALL ZGEMV( 'Transpose', K-2, NRHS, ONE, B, LDB,
00395 $ A( KC ), 1, ONE, B( K, 1 ), LDB )
00396
00397 CALL ZGEMV( 'Transpose', K-2, NRHS, ONE, B, LDB,
00398 $ A( KCNEXT ), 1, ONE, B( K-1, 1 ), LDB )
00399 END IF
00400
00401
00402
00403 IF( NOUNIT ) THEN
00404 D11 = A( KC-1 )
00405 D22 = A( KC+K-1 )
00406 D12 = A( KC+K-2 )
00407 D21 = D12
00408 DO 80 J = 1, NRHS
00409 T1 = B( K-1, J )
00410 T2 = B( K, J )
00411 B( K-1, J ) = D11*T1 + D12*T2
00412 B( K, J ) = D21*T1 + D22*T2
00413 80 CONTINUE
00414 END IF
00415 KC = KCNEXT
00416 K = K - 2
00417 END IF
00418 GO TO 70
00419 90 CONTINUE
00420
00421
00422
00423
00424
00425 ELSE
00426
00427
00428
00429 K = 1
00430 KC = 1
00431 100 CONTINUE
00432 IF( K.GT.N )
00433 $ GO TO 120
00434
00435
00436
00437 IF( IPIV( K ).GT.0 ) THEN
00438 IF( K.LT.N ) THEN
00439
00440
00441
00442 KP = IPIV( K )
00443 IF( KP.NE.K )
00444 $ CALL ZSWAP( NRHS, B( K, 1 ), LDB, B( KP, 1 ), LDB )
00445
00446
00447
00448 CALL ZGEMV( 'Transpose', N-K, NRHS, ONE, B( K+1, 1 ),
00449 $ LDB, A( KC+1 ), 1, ONE, B( K, 1 ), LDB )
00450 END IF
00451 IF( NOUNIT )
00452 $ CALL ZSCAL( NRHS, A( KC ), B( K, 1 ), LDB )
00453 KC = KC + N - K + 1
00454 K = K + 1
00455
00456
00457
00458 ELSE
00459 KCNEXT = KC + N - K + 1
00460 IF( K.LT.N-1 ) THEN
00461
00462
00463
00464 KP = ABS( IPIV( K ) )
00465 IF( KP.NE.K+1 )
00466 $ CALL ZSWAP( NRHS, B( K+1, 1 ), LDB, B( KP, 1 ),
00467 $ LDB )
00468
00469
00470
00471 CALL ZGEMV( 'Transpose', N-K-1, NRHS, ONE,
00472 $ B( K+2, 1 ), LDB, A( KCNEXT+1 ), 1, ONE,
00473 $ B( K+1, 1 ), LDB )
00474
00475 CALL ZGEMV( 'Transpose', N-K-1, NRHS, ONE,
00476 $ B( K+2, 1 ), LDB, A( KC+2 ), 1, ONE,
00477 $ B( K, 1 ), LDB )
00478 END IF
00479
00480
00481
00482 IF( NOUNIT ) THEN
00483 D11 = A( KC )
00484 D22 = A( KCNEXT )
00485 D21 = A( KC+1 )
00486 D12 = D21
00487 DO 110 J = 1, NRHS
00488 T1 = B( K, J )
00489 T2 = B( K+1, J )
00490 B( K, J ) = D11*T1 + D12*T2
00491 B( K+1, J ) = D21*T1 + D22*T2
00492 110 CONTINUE
00493 END IF
00494 KC = KCNEXT + ( N-K )
00495 K = K + 2
00496 END IF
00497 GO TO 100
00498 120 CONTINUE
00499 END IF
00500
00501 END IF
00502 RETURN
00503
00504
00505
00506 END