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 A( LDA, * ), B( LDB, * )
165
166
167
168
169
170 COMPLEX CONE
171 parameter( cone = ( 1.0e+0, 0.0e+0 ) )
172
173
174 LOGICAL NOUNIT
175 INTEGER J, K, KP
176 COMPLEX D11, D12, D21, D22, T1, T2
177
178
179 LOGICAL LSAME
181
182
184
185
186 INTRINSIC abs, 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,
'T' ) )
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(
'CLAVSY ', -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 cscal( nrhs, a( k, k ), b( k, 1 ), ldb )
245
246
247
248 IF( k.GT.1 ) THEN
249
250
251
252 CALL cgeru( k-1, nrhs, cone, 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 cswap( 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 = 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 cgeru( k-1, nrhs, cone, a( 1, k ), 1, b( k, 1 ),
288 $ ldb, b( 1, 1 ), ldb )
289 CALL cgeru( k-1, nrhs, cone, 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 cswap( 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 cscal( 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 cgeru( n-k, nrhs, cone, a( k+1, k ), 1,
335 $ b( k, 1 ), ldb, b( k+1, 1 ), ldb )
336
337
338
339
340 IF( kp.NE.k )
341 $
CALL cswap( 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 = 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 cgeru( n-k, nrhs, cone, a( k+1, k ), 1,
371 $ b( k, 1 ), ldb, b( k+1, 1 ), ldb )
372 CALL cgeru( n-k, nrhs, cone, 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 cswap( 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 IF(
lsame( trans,
'T' ) )
THEN
393
394
395
396
397
398 IF(
lsame( uplo,
'U' ) )
THEN
399
400
401
402 k = n
403 70 IF( k.LT.1 )
404 $ GO TO 90
405
406
407
408 IF( ipiv( k ).GT.0 ) THEN
409 IF( k.GT.1 ) THEN
410
411
412
413 kp = ipiv( k )
414 IF( kp.NE.k )
415 $
CALL cswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
416
417
418
419 CALL cgemv(
'Transpose', k-1, nrhs, cone, b, ldb,
420 $ a( 1, k ), 1, cone, b( k, 1 ), ldb )
421 END IF
422 IF( nounit )
423 $
CALL cscal( nrhs, a( k, k ), b( k, 1 ), ldb )
424 k = k - 1
425
426
427
428 ELSE
429 IF( k.GT.2 ) THEN
430
431
432
433 kp = abs( ipiv( k ) )
434 IF( kp.NE.k-1 )
435 $
CALL cswap( nrhs, b( k-1, 1 ), ldb, b( kp, 1 ),
436 $ ldb )
437
438
439
440 CALL cgemv(
'Transpose', k-2, nrhs, cone, b, ldb,
441 $ a( 1, k ), 1, cone, b( k, 1 ), ldb )
442 CALL cgemv(
'Transpose', k-2, nrhs, cone, b, ldb,
443 $ a( 1, k-1 ), 1, cone, b( k-1, 1 ), ldb )
444 END IF
445
446
447
448 IF( nounit ) THEN
449 d11 = a( k-1, k-1 )
450 d22 = a( k, k )
451 d12 = a( k-1, k )
452 d21 = d12
453 DO 80 j = 1, nrhs
454 t1 = b( k-1, j )
455 t2 = b( k, j )
456 b( k-1, j ) = d11*t1 + d12*t2
457 b( k, j ) = d21*t1 + d22*t2
458 80 CONTINUE
459 END IF
460 k = k - 2
461 END IF
462 GO TO 70
463 90 CONTINUE
464
465
466
467
468
469 ELSE
470
471
472
473 k = 1
474 100 CONTINUE
475 IF( k.GT.n )
476 $ GO TO 120
477
478
479
480 IF( ipiv( k ).GT.0 ) THEN
481 IF( k.LT.n ) THEN
482
483
484
485 kp = ipiv( k )
486 IF( kp.NE.k )
487 $
CALL cswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
488
489
490
491 CALL cgemv(
'Transpose', n-k, nrhs, cone, b( k+1, 1 ),
492 $ ldb, a( k+1, k ), 1, cone, b( k, 1 ), ldb )
493 END IF
494 IF( nounit )
495 $
CALL cscal( nrhs, a( k, k ), b( k, 1 ), ldb )
496 k = k + 1
497
498
499
500 ELSE
501 IF( k.LT.n-1 ) THEN
502
503
504
505 kp = abs( ipiv( k ) )
506 IF( kp.NE.k+1 )
507 $
CALL cswap( nrhs, b( k+1, 1 ), ldb, b( kp, 1 ),
508 $ ldb )
509
510
511
512 CALL cgemv(
'Transpose', n-k-1, nrhs, cone,
513 $ b( k+2, 1 ), ldb, a( k+2, k+1 ), 1, cone,
514 $ b( k+1, 1 ), ldb )
515 CALL cgemv(
'Transpose', n-k-1, nrhs, cone,
516 $ b( k+2, 1 ), ldb, a( k+2, k ), 1, cone,
517 $ b( k, 1 ), ldb )
518 END IF
519
520
521
522 IF( nounit ) THEN
523 d11 = a( k, k )
524 d22 = a( k+1, k+1 )
525 d21 = a( k+1, k )
526 d12 = d21
527 DO 110 j = 1, nrhs
528 t1 = b( k, j )
529 t2 = b( k+1, j )
530 b( k, j ) = d11*t1 + d12*t2
531 b( k+1, j ) = d21*t1 + d22*t2
532 110 CONTINUE
533 END IF
534 k = k + 2
535 END IF
536 GO TO 100
537 120 CONTINUE
538 END IF
539 END IF
540 RETURN
541
542
543
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