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