00001 SUBROUTINE ZLAVHP( 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, ZLACGV, ZSCAL, ZSWAP
00123
00124
00125 INTRINSIC ABS, DCONJG, 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, 'C' ) )
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( 'ZLAVHP ', -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 = DCONJG( 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 = DCONJG( 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 ZLACGV( NRHS, B( K, 1 ), LDB )
00373 CALL ZGEMV( 'Conjugate', K-1, NRHS, ONE, B, LDB,
00374 $ A( KC ), 1, ONE, B( K, 1 ), LDB )
00375 CALL ZLACGV( NRHS, B( K, 1 ), LDB )
00376 END IF
00377 IF( NOUNIT )
00378 $ CALL ZSCAL( NRHS, A( KC+K-1 ), B( K, 1 ), LDB )
00379 K = K - 1
00380
00381
00382
00383 ELSE
00384 KCNEXT = KC - ( K-1 )
00385 IF( K.GT.2 ) THEN
00386
00387
00388
00389 KP = ABS( IPIV( K ) )
00390 IF( KP.NE.K-1 )
00391 $ CALL ZSWAP( NRHS, B( K-1, 1 ), LDB, B( KP, 1 ),
00392 $ LDB )
00393
00394
00395
00396 CALL ZLACGV( NRHS, B( K, 1 ), LDB )
00397 CALL ZGEMV( 'Conjugate', K-2, NRHS, ONE, B, LDB,
00398 $ A( KC ), 1, ONE, B( K, 1 ), LDB )
00399 CALL ZLACGV( NRHS, B( K, 1 ), LDB )
00400
00401 CALL ZLACGV( NRHS, B( K-1, 1 ), LDB )
00402 CALL ZGEMV( 'Conjugate', K-2, NRHS, ONE, B, LDB,
00403 $ A( KCNEXT ), 1, ONE, B( K-1, 1 ), LDB )
00404 CALL ZLACGV( NRHS, B( K-1, 1 ), LDB )
00405 END IF
00406
00407
00408
00409 IF( NOUNIT ) THEN
00410 D11 = A( KC-1 )
00411 D22 = A( KC+K-1 )
00412 D12 = A( KC+K-2 )
00413 D21 = DCONJG( D12 )
00414 DO 80 J = 1, NRHS
00415 T1 = B( K-1, J )
00416 T2 = B( K, J )
00417 B( K-1, J ) = D11*T1 + D12*T2
00418 B( K, J ) = D21*T1 + D22*T2
00419 80 CONTINUE
00420 END IF
00421 KC = KCNEXT
00422 K = K - 2
00423 END IF
00424 GO TO 70
00425 90 CONTINUE
00426
00427
00428
00429
00430
00431 ELSE
00432
00433
00434
00435 K = 1
00436 KC = 1
00437 100 CONTINUE
00438 IF( K.GT.N )
00439 $ GO TO 120
00440
00441
00442
00443 IF( IPIV( K ).GT.0 ) THEN
00444 IF( K.LT.N ) THEN
00445
00446
00447
00448 KP = IPIV( K )
00449 IF( KP.NE.K )
00450 $ CALL ZSWAP( NRHS, B( K, 1 ), LDB, B( KP, 1 ), LDB )
00451
00452
00453
00454 CALL ZLACGV( NRHS, B( K, 1 ), LDB )
00455 CALL ZGEMV( 'Conjugate', N-K, NRHS, ONE, B( K+1, 1 ),
00456 $ LDB, A( KC+1 ), 1, ONE, B( K, 1 ), LDB )
00457 CALL ZLACGV( NRHS, B( K, 1 ), LDB )
00458 END IF
00459 IF( NOUNIT )
00460 $ CALL ZSCAL( NRHS, A( KC ), B( K, 1 ), LDB )
00461 KC = KC + N - K + 1
00462 K = K + 1
00463
00464
00465
00466 ELSE
00467 KCNEXT = KC + N - K + 1
00468 IF( K.LT.N-1 ) THEN
00469
00470
00471
00472 KP = ABS( IPIV( K ) )
00473 IF( KP.NE.K+1 )
00474 $ CALL ZSWAP( NRHS, B( K+1, 1 ), LDB, B( KP, 1 ),
00475 $ LDB )
00476
00477
00478
00479 CALL ZLACGV( NRHS, B( K+1, 1 ), LDB )
00480 CALL ZGEMV( 'Conjugate', N-K-1, NRHS, ONE,
00481 $ B( K+2, 1 ), LDB, A( KCNEXT+1 ), 1, ONE,
00482 $ B( K+1, 1 ), LDB )
00483 CALL ZLACGV( NRHS, B( K+1, 1 ), LDB )
00484
00485 CALL ZLACGV( NRHS, B( K, 1 ), LDB )
00486 CALL ZGEMV( 'Conjugate', N-K-1, NRHS, ONE,
00487 $ B( K+2, 1 ), LDB, A( KC+2 ), 1, ONE,
00488 $ B( K, 1 ), LDB )
00489 CALL ZLACGV( NRHS, B( K, 1 ), LDB )
00490 END IF
00491
00492
00493
00494 IF( NOUNIT ) THEN
00495 D11 = A( KC )
00496 D22 = A( KCNEXT )
00497 D21 = A( KC+1 )
00498 D12 = DCONJG( D21 )
00499 DO 110 J = 1, NRHS
00500 T1 = B( K, J )
00501 T2 = B( K+1, J )
00502 B( K, J ) = D11*T1 + D12*T2
00503 B( K+1, J ) = D21*T1 + D22*T2
00504 110 CONTINUE
00505 END IF
00506 KC = KCNEXT + ( N-K )
00507 K = K + 2
00508 END IF
00509 GO TO 100
00510 120 CONTINUE
00511 END IF
00512
00513 END IF
00514 RETURN
00515
00516
00517
00518 END