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 A( LDA, * ), B( LDB, * )
167
168
169
170
171
172 COMPLEX CONE
173 parameter( cone = ( 1.0e+0, 0.0e+0 ) )
174
175
176 LOGICAL NOUNIT
177 INTEGER J, K, KP
178 COMPLEX 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(
'CLAVSY_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 cscal( nrhs, a( k, k ), b( k, 1 ), ldb )
247
248
249
250 IF( k.GT.1 ) THEN
251
252
253
254 CALL cgeru( 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 cswap( 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 cgeru( k-1, nrhs, cone, a( 1, k ), 1, b( k, 1 ),
290 $ ldb, b( 1, 1 ), ldb )
291 CALL cgeru( 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 cswap( 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 cswap( 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 cscal( 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 cgeru( 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 cswap( 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 cgeru( n-k, nrhs, cone, a( k+1, k ), 1,
383 $ b( k, 1 ), ldb, b( k+1, 1 ), ldb )
384 CALL cgeru( 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 cswap( 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 cswap( 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 IF( k.LT.1 )
425 $ GO TO 90
426
427
428
429 IF( ipiv( k ).GT.0 ) THEN
430 IF( k.GT.1 ) THEN
431
432
433
434 kp = ipiv( k )
435 IF( kp.NE.k )
436 $
CALL cswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
437
438
439
440 CALL cgemv(
'Transpose', k-1, nrhs, cone, b, ldb,
441 $ a( 1, k ), 1, cone, b( k, 1 ), ldb )
442 END IF
443 IF( nounit )
444 $
CALL cscal( nrhs, a( k, k ), b( k, 1 ), ldb )
445 k = k - 1
446
447
448
449 ELSE
450 IF( k.GT.2 ) THEN
451
452
453
454 kp = abs( ipiv( k ) )
455 IF( kp.NE.k )
456 $
CALL cswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
457
458
459
460 kp = abs( ipiv( k-1 ) )
461 IF( kp.NE.k-1 )
462 $
CALL cswap( nrhs, b( k-1, 1 ), ldb, b( kp, 1 ),
463 $ ldb )
464
465
466
467 CALL cgemv(
'Transpose', k-2, nrhs, cone, b, ldb,
468 $ a( 1, k ), 1, cone, b( k, 1 ), ldb )
469 CALL cgemv(
'Transpose', k-2, nrhs, cone, b, ldb,
470 $ a( 1, k-1 ), 1, cone, b( k-1, 1 ), ldb )
471 END IF
472
473
474
475 IF( nounit ) THEN
476 d11 = a( k-1, k-1 )
477 d22 = a( k, k )
478 d12 = a( k-1, k )
479 d21 = d12
480 DO 80 j = 1, nrhs
481 t1 = b( k-1, j )
482 t2 = b( k, j )
483 b( k-1, j ) = d11*t1 + d12*t2
484 b( k, j ) = d21*t1 + d22*t2
485 80 CONTINUE
486 END IF
487 k = k - 2
488 END IF
489 GO TO 70
490 90 CONTINUE
491
492
493
494
495
496 ELSE
497
498
499
500 k = 1
501 100 CONTINUE
502 IF( k.GT.n )
503 $ GO TO 120
504
505
506
507 IF( ipiv( k ).GT.0 ) THEN
508 IF( k.LT.n ) THEN
509
510
511
512 kp = ipiv( k )
513 IF( kp.NE.k )
514 $
CALL cswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
515
516
517
518 CALL cgemv(
'Transpose', n-k, nrhs, cone, b( k+1, 1 ),
519 $ ldb, a( k+1, k ), 1, cone, b( k, 1 ), ldb )
520 END IF
521 IF( nounit )
522 $
CALL cscal( nrhs, a( k, k ), b( k, 1 ), ldb )
523 k = k + 1
524
525
526
527 ELSE
528 IF( k.LT.n-1 ) THEN
529
530
531
532 kp = abs( ipiv( k ) )
533 IF( kp.NE.k )
534 $
CALL cswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
535
536
537
538 kp = abs( ipiv( k+1 ) )
539 IF( kp.NE.k+1 )
540 $
CALL cswap( nrhs, b( k+1, 1 ), ldb, b( kp, 1 ),
541 $ ldb )
542
543
544
545 CALL cgemv(
'Transpose', n-k-1, nrhs, cone,
546 $ b( k+2, 1 ), ldb, a( k+2, k+1 ), 1, cone,
547 $ b( k+1, 1 ), ldb )
548 CALL cgemv(
'Transpose', n-k-1, nrhs, cone,
549 $ b( k+2, 1 ), ldb, a( k+2, k ), 1, cone,
550 $ b( k, 1 ), ldb )
551 END IF
552
553
554
555 IF( nounit ) THEN
556 d11 = a( k, k )
557 d22 = a( k+1, k+1 )
558 d21 = a( k+1, k )
559 d12 = d21
560 DO 110 j = 1, nrhs
561 t1 = b( k, j )
562 t2 = b( k+1, j )
563 b( k, j ) = d11*t1 + d12*t2
564 b( k+1, j ) = d21*t1 + d22*t2
565 110 CONTINUE
566 END IF
567 k = k + 2
568 END IF
569 GO TO 100
570 120 CONTINUE
571 END IF
572 END IF
573 RETURN
574
575
576
subroutine xerbla(srname, info)
subroutine cgemv(trans, m, n, alpha, a, lda, x, incx, beta, y, incy)
CGEMV
subroutine cgeru(m, n, alpha, x, incx, y, incy, a, lda)
CGERU
logical function lsame(ca, cb)
LSAME
subroutine cscal(n, ca, cx, incx)
CSCAL
subroutine cswap(n, cx, incx, cy, incy)
CSWAP