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