176
177
178
179
180
181
182 CHARACTER UPLO
183 INTEGER INFO, KB, LDA, LDW, N, NB
184
185
186 INTEGER IPIV( * )
187 COMPLEX A( LDA, * ), W( LDW, * )
188
189
190
191
192
193 REAL ZERO, ONE
194 parameter( zero = 0.0e+0, one = 1.0e+0 )
195 COMPLEX CONE
196 parameter( cone = ( 1.0e+0, 0.0e+0 ) )
197 REAL EIGHT, SEVTEN
198 parameter( eight = 8.0e+0, sevten = 17.0e+0 )
199
200
201 INTEGER IMAX, J, JJ, JMAX, JP, K, KK, KKW, KP,
202 $ KSTEP, KW
203 REAL ABSAKK, ALPHA, COLMAX, R1, ROWMAX, T
204 COMPLEX D11, D21, D22, Z
205
206
207 LOGICAL LSAME
208 INTEGER ICAMAX
210
211
214
215
216 INTRINSIC abs, aimag, conjg, max, min, real, sqrt
217
218
219 REAL CABS1
220
221
222 cabs1( z ) = abs( real( z ) ) + abs( aimag( z ) )
223
224
225
226 info = 0
227
228
229
230 alpha = ( one+sqrt( sevten ) ) / eight
231
232 IF(
lsame( uplo,
'U' ) )
THEN
233
234
235
236
237
238
239
240 k = n
241 10 CONTINUE
242
243
244
245 kw = nb + k - n
246
247
248
249 IF( ( k.LE.n-nb+1 .AND. nb.LT.n ) .OR. k.LT.1 )
250 $ GO TO 30
251
252 kstep = 1
253
254
255
256 CALL ccopy( k-1, a( 1, k ), 1, w( 1, kw ), 1 )
257 w( k, kw ) = real( a( k, k ) )
258 IF( k.LT.n ) THEN
259 CALL cgemv(
'No transpose', k, n-k, -cone, a( 1, k+1 ),
260 $ lda,
261 $ w( k, kw+1 ), ldw, cone, w( 1, kw ), 1 )
262 w( k, kw ) = real( w( k, kw ) )
263 END IF
264
265
266
267
268 absakk = abs( real( w( k, kw ) ) )
269
270
271
272
273
274 IF( k.GT.1 ) THEN
275 imax =
icamax( k-1, w( 1, kw ), 1 )
276 colmax = cabs1( w( imax, kw ) )
277 ELSE
278 colmax = zero
279 END IF
280
281 IF( max( absakk, colmax ).EQ.zero ) THEN
282
283
284
285 IF( info.EQ.0 )
286 $ info = k
287 kp = k
288 a( k, k ) = real( a( k, k ) )
289 ELSE
290
291
292
293
294
295
296 IF( absakk.GE.alpha*colmax ) THEN
297
298
299
300 kp = k
301 ELSE
302
303
304
305
306
307
308 CALL ccopy( imax-1, a( 1, imax ), 1, w( 1, kw-1 ), 1 )
309 w( imax, kw-1 ) = real( a( imax, imax ) )
310 CALL ccopy( k-imax, a( imax, imax+1 ), lda,
311 $ w( imax+1, kw-1 ), 1 )
312 CALL clacgv( k-imax, w( imax+1, kw-1 ), 1 )
313 IF( k.LT.n ) THEN
314 CALL cgemv(
'No transpose', k, n-k, -cone,
315 $ a( 1, k+1 ), lda, w( imax, kw+1 ), ldw,
316 $ cone, w( 1, kw-1 ), 1 )
317 w( imax, kw-1 ) = real( w( imax, kw-1 ) )
318 END IF
319
320
321
322
323
324 jmax = imax +
icamax( k-imax, w( imax+1, kw-1 ), 1 )
325 rowmax = cabs1( w( jmax, kw-1 ) )
326 IF( imax.GT.1 ) THEN
327 jmax =
icamax( imax-1, w( 1, kw-1 ), 1 )
328 rowmax = max( rowmax, cabs1( w( jmax, kw-1 ) ) )
329 END IF
330
331
332 IF( absakk.GE.alpha*colmax*( colmax / rowmax ) ) THEN
333
334
335
336 kp = k
337
338
339 ELSE IF( abs( real( w( imax, kw-1 ) ) ).GE.alpha*rowmax )
340 $ THEN
341
342
343
344
345 kp = imax
346
347
348
349 CALL ccopy( k, w( 1, kw-1 ), 1, w( 1, kw ), 1 )
350
351
352 ELSE
353
354
355
356
357 kp = imax
358 kstep = 2
359 END IF
360
361
362
363
364 END IF
365
366
367
368
369
370
371
372 kk = k - kstep + 1
373
374
375
376 kkw = nb + kk - n
377
378
379
380
381 IF( kp.NE.kk ) THEN
382
383
384
385
386
387
388 a( kp, kp ) = real( a( kk, kk ) )
389 CALL ccopy( kk-1-kp, a( kp+1, kk ), 1, a( kp, kp+1 ),
390 $ lda )
391 CALL clacgv( kk-1-kp, a( kp, kp+1 ), lda )
392 IF( kp.GT.1 )
393 $
CALL ccopy( kp-1, a( 1, kk ), 1, a( 1, kp ), 1 )
394
395
396
397
398
399
400 IF( k.LT.n )
401 $
CALL cswap( n-k, a( kk, k+1 ), lda, a( kp, k+1 ),
402 $ lda )
403 CALL cswap( n-kk+1, w( kk, kkw ), ldw, w( kp, kkw ),
404 $ ldw )
405 END IF
406
407 IF( kstep.EQ.1 ) THEN
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425 CALL ccopy( k, w( 1, kw ), 1, a( 1, k ), 1 )
426 IF( k.GT.1 ) THEN
427
428
429
430
431
432 r1 = one / real( a( k, k ) )
433 CALL csscal( k-1, r1, a( 1, k ), 1 )
434
435
436
437 CALL clacgv( k-1, w( 1, kw ), 1 )
438 END IF
439
440 ELSE
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457 IF( k.GT.2 ) THEN
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501 d21 = w( k-1, kw )
502 d11 = w( k, kw ) / conjg( d21 )
503 d22 = w( k-1, kw-1 ) / d21
504 t = one / ( real( d11*d22 )-one )
505 d21 = t / d21
506
507
508
509
510
511 DO 20 j = 1, k - 2
512 a( j, k-1 ) = d21*( d11*w( j, kw-1 )-w( j, kw ) )
513 a( j, k ) = conjg( d21 )*
514 $ ( d22*w( j, kw )-w( j, kw-1 ) )
515 20 CONTINUE
516 END IF
517
518
519
520 a( k-1, k-1 ) = w( k-1, kw-1 )
521 a( k-1, k ) = w( k-1, kw )
522 a( k, k ) = w( k, kw )
523
524
525
526 CALL clacgv( k-1, w( 1, kw ), 1 )
527 CALL clacgv( k-2, w( 1, kw-1 ), 1 )
528
529 END IF
530
531 END IF
532
533
534
535 IF( kstep.EQ.1 ) THEN
536 ipiv( k ) = kp
537 ELSE
538 ipiv( k ) = -kp
539 ipiv( k-1 ) = -kp
540 END IF
541
542
543
544 k = k - kstep
545 GO TO 10
546
547 30 CONTINUE
548
549
550
551
552
553
554
555 CALL cgemmtr(
'Upper',
'No transpose',
'Transpose', k, n-k,
556 $ -cone, a( 1, k+1 ), lda, w( 1, kw+1 ), ldw,
557 $ cone, a( 1, 1 ), lda )
558
559
560
561
562 j = k + 1
563 60 CONTINUE
564
565
566
567
568
569 jj = j
570 jp = ipiv( j )
571 IF( jp.LT.0 ) THEN
572 jp = -jp
573
574 j = j + 1
575 END IF
576
577
578 j = j + 1
579 IF( jp.NE.jj .AND. j.LE.n )
580 $
CALL cswap( n-j+1, a( jp, j ), lda, a( jj, j ), lda )
581 IF( j.LE.n )
582 $ GO TO 60
583
584
585
586 kb = n - k
587
588 ELSE
589
590
591
592
593
594
595
596 k = 1
597 70 CONTINUE
598
599
600
601 IF( ( k.GE.nb .AND. nb.LT.n ) .OR. k.GT.n )
602 $ GO TO 90
603
604 kstep = 1
605
606
607
608 w( k, k ) = real( a( k, k ) )
609 IF( k.LT.n )
610 $
CALL ccopy( n-k, a( k+1, k ), 1, w( k+1, k ), 1 )
611 CALL cgemv(
'No transpose', n-k+1, k-1, -cone, a( k, 1 ),
612 $ lda,
613 $ w( k, 1 ), ldw, cone, w( k, k ), 1 )
614 w( k, k ) = real( w( k, k ) )
615
616
617
618
619 absakk = abs( real( w( k, k ) ) )
620
621
622
623
624
625 IF( k.LT.n ) THEN
626 imax = k +
icamax( n-k, w( k+1, k ), 1 )
627 colmax = cabs1( w( imax, k ) )
628 ELSE
629 colmax = zero
630 END IF
631
632 IF( max( absakk, colmax ).EQ.zero ) THEN
633
634
635
636 IF( info.EQ.0 )
637 $ info = k
638 kp = k
639 a( k, k ) = real( a( k, k ) )
640 ELSE
641
642
643
644
645
646
647 IF( absakk.GE.alpha*colmax ) THEN
648
649
650
651 kp = k
652 ELSE
653
654
655
656
657
658
659 CALL ccopy( imax-k, a( imax, k ), lda, w( k, k+1 ),
660 $ 1 )
661 CALL clacgv( imax-k, w( k, k+1 ), 1 )
662 w( imax, k+1 ) = real( a( imax, imax ) )
663 IF( imax.LT.n )
664 $
CALL ccopy( n-imax, a( imax+1, imax ), 1,
665 $ w( imax+1, k+1 ), 1 )
666 CALL cgemv(
'No transpose', n-k+1, k-1, -cone, a( k,
667 $ 1 ),
668 $ lda, w( imax, 1 ), ldw, cone, w( k, k+1 ),
669 $ 1 )
670 w( imax, k+1 ) = real( w( imax, k+1 ) )
671
672
673
674
675
676 jmax = k - 1 +
icamax( imax-k, w( k, k+1 ), 1 )
677 rowmax = cabs1( w( jmax, k+1 ) )
678 IF( imax.LT.n ) THEN
679 jmax = imax +
icamax( n-imax, w( imax+1, k+1 ), 1 )
680 rowmax = max( rowmax, cabs1( w( jmax, k+1 ) ) )
681 END IF
682
683
684 IF( absakk.GE.alpha*colmax*( colmax / rowmax ) ) THEN
685
686
687
688 kp = k
689
690
691 ELSE IF( abs( real( w( imax, k+1 ) ) ).GE.alpha*rowmax )
692 $ THEN
693
694
695
696
697 kp = imax
698
699
700
701 CALL ccopy( n-k+1, w( k, k+1 ), 1, w( k, k ), 1 )
702
703
704 ELSE
705
706
707
708
709 kp = imax
710 kstep = 2
711 END IF
712
713
714
715
716 END IF
717
718
719
720
721
722
723
724 kk = k + kstep - 1
725
726
727
728
729 IF( kp.NE.kk ) THEN
730
731
732
733
734
735
736 a( kp, kp ) = real( a( kk, kk ) )
737 CALL ccopy( kp-kk-1, a( kk+1, kk ), 1, a( kp, kk+1 ),
738 $ lda )
739 CALL clacgv( kp-kk-1, a( kp, kk+1 ), lda )
740 IF( kp.LT.n )
741 $
CALL ccopy( n-kp, a( kp+1, kk ), 1, a( kp+1, kp ),
742 $ 1 )
743
744
745
746
747
748
749 IF( k.GT.1 )
750 $
CALL cswap( k-1, a( kk, 1 ), lda, a( kp, 1 ), lda )
751 CALL cswap( kk, w( kk, 1 ), ldw, w( kp, 1 ), ldw )
752 END IF
753
754 IF( kstep.EQ.1 ) THEN
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772 CALL ccopy( n-k+1, w( k, k ), 1, a( k, k ), 1 )
773 IF( k.LT.n ) THEN
774
775
776
777
778
779 r1 = one / real( a( k, k ) )
780 CALL csscal( n-k, r1, a( k+1, k ), 1 )
781
782
783
784 CALL clacgv( n-k, w( k+1, k ), 1 )
785 END IF
786
787 ELSE
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804 IF( k.LT.n-1 ) THEN
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848 d21 = w( k+1, k )
849 d11 = w( k+1, k+1 ) / d21
850 d22 = w( k, k ) / conjg( d21 )
851 t = one / ( real( d11*d22 )-one )
852 d21 = t / d21
853
854
855
856
857
858 DO 80 j = k + 2, n
859 a( j, k ) = conjg( d21 )*
860 $ ( d11*w( j, k )-w( j, k+1 ) )
861 a( j, k+1 ) = d21*( d22*w( j, k+1 )-w( j, k ) )
862 80 CONTINUE
863 END IF
864
865
866
867 a( k, k ) = w( k, k )
868 a( k+1, k ) = w( k+1, k )
869 a( k+1, k+1 ) = w( k+1, k+1 )
870
871
872
873 CALL clacgv( n-k, w( k+1, k ), 1 )
874 CALL clacgv( n-k-1, w( k+2, k+1 ), 1 )
875
876 END IF
877
878 END IF
879
880
881
882 IF( kstep.EQ.1 ) THEN
883 ipiv( k ) = kp
884 ELSE
885 ipiv( k ) = -kp
886 ipiv( k+1 ) = -kp
887 END IF
888
889
890
891 k = k + kstep
892 GO TO 70
893
894 90 CONTINUE
895
896
897
898
899
900
901
902 CALL cgemmtr(
'Lower',
'No transpose',
'Transpose', n-k+1,
903 $ k-1, -cone, a( k, 1 ), lda, w( k, 1 ), ldw,
904 $ cone, a( k, k ), lda )
905
906
907
908
909 j = k - 1
910 120 CONTINUE
911
912
913
914
915
916 jj = j
917 jp = ipiv( j )
918 IF( jp.LT.0 ) THEN
919 jp = -jp
920
921 j = j - 1
922 END IF
923
924
925 j = j - 1
926 IF( jp.NE.jj .AND. j.GE.1 )
927 $
CALL cswap( j, a( jp, 1 ), lda, a( jj, 1 ), lda )
928 IF( j.GE.1 )
929 $ GO TO 120
930
931
932
933 kb = k - 1
934
935 END IF
936 RETURN
937
938
939
subroutine ccopy(n, cx, incx, cy, incy)
CCOPY
subroutine cgemmtr(uplo, transa, transb, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
CGEMMTR
subroutine cgemv(trans, m, n, alpha, a, lda, x, incx, beta, y, incy)
CGEMV
integer function icamax(n, cx, incx)
ICAMAX
subroutine clacgv(n, x, incx)
CLACGV conjugates a complex vector.
logical function lsame(ca, cb)
LSAME
subroutine csscal(n, sa, cx, incx)
CSSCAL
subroutine cswap(n, cx, incx, cy, incy)
CSWAP