153
154
155
156
157
158
159 CHARACTER DIAG, TRANS, UPLO
160 INTEGER INFO, LDA, LDB, N, NRHS
161
162
163 INTEGER IPIV( * )
164 COMPLEX*16 A( LDA, * ), B( LDB, * )
165
166
167
168
169
170 COMPLEX*16 ONE
171 parameter( one = ( 1.0d+0, 0.0d+0 ) )
172
173
174 LOGICAL NOUNIT
175 INTEGER J, K, KP
176 COMPLEX*16 D11, D12, D21, D22, T1, T2
177
178
179 LOGICAL LSAME
181
182
184
185
186 INTRINSIC abs, dconjg, max
187
188
189
190
191
192 info = 0
193 IF( .NOT.
lsame( uplo,
'U' ) .AND. .NOT.
lsame( uplo,
'L' ) )
THEN
194 info = -1
195 ELSE IF( .NOT.
lsame( trans,
'N' ) .AND. .NOT.
lsame( trans,
'C' ) )
196 $ THEN
197 info = -2
198 ELSE IF( .NOT.
lsame( diag,
'U' ) .AND. .NOT.
lsame( diag,
'N' ) )
199 $ THEN
200 info = -3
201 ELSE IF( n.LT.0 ) THEN
202 info = -4
203 ELSE IF( lda.LT.max( 1, n ) ) THEN
204 info = -6
205 ELSE IF( ldb.LT.max( 1, n ) ) THEN
206 info = -9
207 END IF
208 IF( info.NE.0 ) THEN
209 CALL xerbla(
'ZLAVHE ', -info )
210 RETURN
211 END IF
212
213
214
215 IF( n.EQ.0 )
216 $ RETURN
217
218 nounit =
lsame( diag,
'N' )
219
220
221
222
223
224 IF(
lsame( trans,
'N' ) )
THEN
225
226
227
228
229 IF(
lsame( uplo,
'U' ) )
THEN
230
231
232
233 k = 1
234 10 CONTINUE
235 IF( k.GT.n )
236 $ GO TO 30
237 IF( ipiv( k ).GT.0 ) THEN
238
239
240
241
242
243 IF( nounit )
244 $
CALL zscal( nrhs, a( k, k ), b( k, 1 ), ldb )
245
246
247
248 IF( k.GT.1 ) THEN
249
250
251
252 CALL zgeru( k-1, nrhs, one, a( 1, k ), 1, b( k, 1 ),
253 $ ldb, b( 1, 1 ), ldb )
254
255
256
257 kp = ipiv( k )
258 IF( kp.NE.k )
259 $
CALL zswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
260 END IF
261 k = k + 1
262 ELSE
263
264
265
266
267
268 IF( nounit ) THEN
269 d11 = a( k, k )
270 d22 = a( k+1, k+1 )
271 d12 = a( k, k+1 )
272 d21 = dconjg( d12 )
273 DO 20 j = 1, nrhs
274 t1 = b( k, j )
275 t2 = b( k+1, j )
276 b( k, j ) = d11*t1 + d12*t2
277 b( k+1, j ) = d21*t1 + d22*t2
278 20 CONTINUE
279 END IF
280
281
282
283 IF( k.GT.1 ) THEN
284
285
286
287 CALL zgeru( k-1, nrhs, one, a( 1, k ), 1, b( k, 1 ),
288 $ ldb, b( 1, 1 ), ldb )
289 CALL zgeru( k-1, nrhs, one, a( 1, k+1 ), 1,
290 $ b( k+1, 1 ), ldb, b( 1, 1 ), ldb )
291
292
293
294 kp = abs( ipiv( k ) )
295 IF( kp.NE.k )
296 $
CALL zswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
297 END IF
298 k = k + 2
299 END IF
300 GO TO 10
301 30 CONTINUE
302
303
304
305
306 ELSE
307
308
309
310 k = n
311 40 CONTINUE
312 IF( k.LT.1 )
313 $ GO TO 60
314
315
316
317
318 IF( ipiv( k ).GT.0 ) THEN
319
320
321
322
323
324 IF( nounit )
325 $
CALL zscal( nrhs, a( k, k ), b( k, 1 ), ldb )
326
327
328
329 IF( k.NE.n ) THEN
330 kp = ipiv( k )
331
332
333
334 CALL zgeru( n-k, nrhs, one, a( k+1, k ), 1, b( k, 1 ),
335 $ ldb, b( k+1, 1 ), ldb )
336
337
338
339
340 IF( kp.NE.k )
341 $
CALL zswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
342 END IF
343 k = k - 1
344
345 ELSE
346
347
348
349
350
351 IF( nounit ) THEN
352 d11 = a( k-1, k-1 )
353 d22 = a( k, k )
354 d21 = a( k, k-1 )
355 d12 = dconjg( d21 )
356 DO 50 j = 1, nrhs
357 t1 = b( k-1, j )
358 t2 = b( k, j )
359 b( k-1, j ) = d11*t1 + d12*t2
360 b( k, j ) = d21*t1 + d22*t2
361 50 CONTINUE
362 END IF
363
364
365
366 IF( k.NE.n ) THEN
367
368
369
370 CALL zgeru( n-k, nrhs, one, a( k+1, k ), 1, b( k, 1 ),
371 $ ldb, b( k+1, 1 ), ldb )
372 CALL zgeru( n-k, nrhs, one, a( k+1, k-1 ), 1,
373 $ b( k-1, 1 ), ldb, b( k+1, 1 ), ldb )
374
375
376
377
378 kp = abs( ipiv( k ) )
379 IF( kp.NE.k )
380 $
CALL zswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
381 END IF
382 k = k - 2
383 END IF
384 GO TO 40
385 60 CONTINUE
386 END IF
387
388
389
390
391
392 ELSE
393
394
395
396
397
398 IF(
lsame( uplo,
'U' ) )
THEN
399
400
401
402 k = n
403 70 CONTINUE
404 IF( k.LT.1 )
405 $ GO TO 90
406
407
408
409 IF( ipiv( k ).GT.0 ) THEN
410 IF( k.GT.1 ) THEN
411
412
413
414 kp = ipiv( k )
415 IF( kp.NE.k )
416 $
CALL zswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
417
418
419
420
421
422 CALL zlacgv( nrhs, b( k, 1 ), ldb )
423 CALL zgemv(
'Conjugate', k-1, nrhs, one, b, ldb,
424 $ a( 1, k ), 1, one, b( k, 1 ), ldb )
425 CALL zlacgv( nrhs, b( k, 1 ), ldb )
426 END IF
427 IF( nounit )
428 $
CALL zscal( nrhs, a( k, k ), b( k, 1 ), ldb )
429 k = k - 1
430
431
432
433 ELSE
434 IF( k.GT.2 ) THEN
435
436
437
438 kp = abs( ipiv( k ) )
439 IF( kp.NE.k-1 )
440 $
CALL zswap( nrhs, b( k-1, 1 ), ldb, b( kp, 1 ),
441 $ ldb )
442
443
444
445
446
447
448 CALL zlacgv( nrhs, b( k, 1 ), ldb )
449 CALL zgemv(
'Conjugate', k-2, nrhs, one, b, ldb,
450 $ a( 1, k ), 1, one, b( k, 1 ), ldb )
451 CALL zlacgv( nrhs, b( k, 1 ), ldb )
452
453 CALL zlacgv( nrhs, b( k-1, 1 ), ldb )
454 CALL zgemv(
'Conjugate', k-2, nrhs, one, b, ldb,
455 $ a( 1, k-1 ), 1, one, b( k-1, 1 ), ldb )
456 CALL zlacgv( nrhs, b( k-1, 1 ), ldb )
457 END IF
458
459
460
461 IF( nounit ) THEN
462 d11 = a( k-1, k-1 )
463 d22 = a( k, k )
464 d12 = a( k-1, k )
465 d21 = dconjg( d12 )
466 DO 80 j = 1, nrhs
467 t1 = b( k-1, j )
468 t2 = b( k, j )
469 b( k-1, j ) = d11*t1 + d12*t2
470 b( k, j ) = d21*t1 + d22*t2
471 80 CONTINUE
472 END IF
473 k = k - 2
474 END IF
475 GO TO 70
476 90 CONTINUE
477
478
479
480
481
482 ELSE
483
484
485
486 k = 1
487 100 CONTINUE
488 IF( k.GT.n )
489 $ GO TO 120
490
491
492
493 IF( ipiv( k ).GT.0 ) THEN
494 IF( k.LT.n ) THEN
495
496
497
498 kp = ipiv( k )
499 IF( kp.NE.k )
500 $
CALL zswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
501
502
503
504 CALL zlacgv( nrhs, b( k, 1 ), ldb )
505 CALL zgemv(
'Conjugate', n-k, nrhs, one, b( k+1, 1 ),
506 $ ldb, a( k+1, k ), 1, one, b( k, 1 ), ldb )
507 CALL zlacgv( nrhs, b( k, 1 ), ldb )
508 END IF
509 IF( nounit )
510 $
CALL zscal( nrhs, a( k, k ), b( k, 1 ), ldb )
511 k = k + 1
512
513
514
515 ELSE
516 IF( k.LT.n-1 ) THEN
517
518
519
520 kp = abs( ipiv( k ) )
521 IF( kp.NE.k+1 )
522 $
CALL zswap( nrhs, b( k+1, 1 ), ldb, b( kp, 1 ),
523 $ ldb )
524
525
526
527 CALL zlacgv( nrhs, b( k+1, 1 ), ldb )
528 CALL zgemv(
'Conjugate', n-k-1, nrhs, one,
529 $ b( k+2, 1 ), ldb, a( k+2, k+1 ), 1, one,
530 $ b( k+1, 1 ), ldb )
531 CALL zlacgv( nrhs, b( k+1, 1 ), ldb )
532
533 CALL zlacgv( nrhs, b( k, 1 ), ldb )
534 CALL zgemv(
'Conjugate', n-k-1, nrhs, one,
535 $ b( k+2, 1 ), ldb, a( k+2, k ), 1, one,
536 $ b( k, 1 ), ldb )
537 CALL zlacgv( nrhs, b( k, 1 ), ldb )
538 END IF
539
540
541
542 IF( nounit ) THEN
543 d11 = a( k, k )
544 d22 = a( k+1, k+1 )
545 d21 = a( k+1, k )
546 d12 = dconjg( d21 )
547 DO 110 j = 1, nrhs
548 t1 = b( k, j )
549 t2 = b( k+1, j )
550 b( k, j ) = d11*t1 + d12*t2
551 b( k+1, j ) = d21*t1 + d22*t2
552 110 CONTINUE
553 END IF
554 k = k + 2
555 END IF
556 GO TO 100
557 120 CONTINUE
558 END IF
559
560 END IF
561 RETURN
562
563
564
subroutine xerbla(srname, info)
subroutine zgemv(trans, m, n, alpha, a, lda, x, incx, beta, y, incy)
ZGEMV
subroutine zgeru(m, n, alpha, x, incx, y, incy, a, lda)
ZGERU
subroutine zlacgv(n, x, incx)
ZLACGV conjugates a complex vector.
logical function lsame(ca, cb)
LSAME
subroutine zscal(n, za, zx, incx)
ZSCAL
subroutine zswap(n, zx, incx, zy, incy)
ZSWAP