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 CONE
171 parameter( cone = ( 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, 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(
'ZLAVSY ', -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, 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 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 = 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, cone, a( 1, k ), 1, b( k, 1 ),
288 $ ldb, b( 1, 1 ), ldb )
289 CALL zgeru( 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 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, 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 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 = 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, cone, a( k+1, k ), 1,
371 $ b( k, 1 ), ldb, b( k+1, 1 ), ldb )
372 CALL zgeru( 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 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 IF(
lsame( trans,
'T' ) )
THEN
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 CALL zgemv(
'Transpose', k-1, nrhs, cone, b, ldb,
421 $ a( 1, k ), 1, cone, b( k, 1 ), ldb )
422 END IF
423 IF( nounit )
424 $
CALL zscal( nrhs, a( k, k ), b( k, 1 ), ldb )
425 k = k - 1
426
427
428
429 ELSE
430 IF( k.GT.2 ) THEN
431
432
433
434 kp = abs( ipiv( k ) )
435 IF( kp.NE.k-1 )
436 $
CALL zswap( nrhs, b( k-1, 1 ), ldb, b( kp, 1 ),
437 $ ldb )
438
439
440
441 CALL zgemv(
'Transpose', k-2, nrhs, cone, b, ldb,
442 $ a( 1, k ), 1, cone, b( k, 1 ), ldb )
443 CALL zgemv(
'Transpose', k-2, nrhs, cone, b, ldb,
444 $ a( 1, k-1 ), 1, cone, b( k-1, 1 ), ldb )
445 END IF
446
447
448
449 IF( nounit ) THEN
450 d11 = a( k-1, k-1 )
451 d22 = a( k, k )
452 d12 = a( k-1, k )
453 d21 = d12
454 DO 80 j = 1, nrhs
455 t1 = b( k-1, j )
456 t2 = b( k, j )
457 b( k-1, j ) = d11*t1 + d12*t2
458 b( k, j ) = d21*t1 + d22*t2
459 80 CONTINUE
460 END IF
461 k = k - 2
462 END IF
463 GO TO 70
464 90 CONTINUE
465
466
467
468
469
470 ELSE
471
472
473
474 k = 1
475 100 CONTINUE
476 IF( k.GT.n )
477 $ GO TO 120
478
479
480
481 IF( ipiv( k ).GT.0 ) THEN
482 IF( k.LT.n ) THEN
483
484
485
486 kp = ipiv( k )
487 IF( kp.NE.k )
488 $
CALL zswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
489
490
491
492 CALL zgemv(
'Transpose', n-k, nrhs, cone, b( k+1, 1 ),
493 $ ldb, a( k+1, k ), 1, cone, b( k, 1 ), ldb )
494 END IF
495 IF( nounit )
496 $
CALL zscal( nrhs, a( k, k ), b( k, 1 ), ldb )
497 k = k + 1
498
499
500
501 ELSE
502 IF( k.LT.n-1 ) THEN
503
504
505
506 kp = abs( ipiv( k ) )
507 IF( kp.NE.k+1 )
508 $
CALL zswap( nrhs, b( k+1, 1 ), ldb, b( kp, 1 ),
509 $ ldb )
510
511
512
513 CALL zgemv(
'Transpose', n-k-1, nrhs, cone,
514 $ b( k+2, 1 ), ldb, a( k+2, k+1 ), 1, cone,
515 $ b( k+1, 1 ), ldb )
516 CALL zgemv(
'Transpose', n-k-1, nrhs, cone,
517 $ b( k+2, 1 ), ldb, a( k+2, k ), 1, cone,
518 $ b( k, 1 ), ldb )
519 END IF
520
521
522
523 IF( nounit ) THEN
524 d11 = a( k, k )
525 d22 = a( k+1, k+1 )
526 d21 = a( k+1, k )
527 d12 = d21
528 DO 110 j = 1, nrhs
529 t1 = b( k, j )
530 t2 = b( k+1, j )
531 b( k, j ) = d11*t1 + d12*t2
532 b( k+1, j ) = d21*t1 + d22*t2
533 110 CONTINUE
534 END IF
535 k = k + 2
536 END IF
537 GO TO 100
538 120 CONTINUE
539 END IF
540 END IF
541 RETURN
542
543
544
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