353
354
355
356
357
358 IMPLICIT NONE
359
360 INTEGER INFO, LDA, LDV, LWORK, LRWORK, M, MV, N
361 CHARACTER*1 JOBA, JOBU, JOBV
362
363
364 COMPLEX*16 A( LDA, * ), V( LDV, * ), CWORK( LWORK )
365 DOUBLE PRECISION RWORK( LRWORK ), SVA( N )
366
367
368
369
370
371 DOUBLE PRECISION ZERO, HALF, ONE
372 parameter( zero = 0.0d0, half = 0.5d0, one = 1.0d0)
373 COMPLEX*16 CZERO, CONE
374 parameter( czero = (0.0d0, 0.0d0), cone = (1.0d0, 0.0d0) )
375 INTEGER NSWEEP
376 parameter( nsweep = 30 )
377
378
379 COMPLEX*16 AAPQ, OMPQ
380 DOUBLE PRECISION AAPP, AAPP0, AAPQ1, AAQQ, APOAQ, AQOAP, BIG,
381 $ BIGTHETA, CS, CTOL, EPSLN, MXAAPQ,
382 $ MXSINJ, ROOTBIG, ROOTEPS, ROOTSFMIN, ROOTTOL,
383 $ SKL, SFMIN, SMALL, SN, T, TEMP1, THETA, THSIGN,
384 $ TOL
385 INTEGER BLSKIP, EMPTSW, i, ibr, IERR, igl, IJBLSK, ir1,
386 $ ISWROT, jbc, jgl, KBL, LKAHEAD, MVL, N2, N34,
387 $ N4, NBL, NOTROT, p, PSKIPPED, q, ROWSKIP,
388 $ SWBAND, MINMN, LWMIN, LRWMIN
389 LOGICAL APPLV, GOSCALE, LOWER, LQUERY, LSVEC, NOSCALE,
390 $ ROTOK, RSVEC, UCTOL, UPPER
391
392
393
394 INTRINSIC abs, max, min, conjg, dble, sign, sqrt
395
396
397
398
399 DOUBLE PRECISION DZNRM2
400 COMPLEX*16 ZDOTC
402 INTEGER IDAMAX
404
405 DOUBLE PRECISION DLAMCH
407 LOGICAL LSAME
409
410
411
412
414
418
419
420
421
422
423 lsvec =
lsame( jobu,
'U' ) .OR.
lsame( jobu,
'F' )
424 uctol =
lsame( jobu,
'C' )
425 rsvec =
lsame( jobv,
'V' ) .OR.
lsame( jobv,
'J' )
426 applv =
lsame( jobv,
'A' )
427 upper =
lsame( joba,
'U' )
428 lower =
lsame( joba,
'L' )
429
430 minmn = min( m, n )
431 IF( minmn.EQ.0 ) THEN
432 lwmin = 1
433 lrwmin = 1
434 ELSE
435 lwmin = m+n
436 lrwmin = max( 6, n )
437 END IF
438
439 lquery = ( lwork.EQ.-1 ) .OR. ( lrwork.EQ.-1 )
440 IF( .NOT.( upper .OR. lower .OR.
lsame( joba,
'G' ) ) )
THEN
441 info = -1
442 ELSE IF( .NOT.( lsvec .OR.
443 $ uctol .OR.
444 $
lsame( jobu,
'N' ) ) )
THEN
445 info = -2
446 ELSE IF( .NOT.( rsvec .OR.
447 $ applv .OR.
448 $
lsame( jobv,
'N' ) ) )
THEN
449 info = -3
450 ELSE IF( m.LT.0 ) THEN
451 info = -4
452 ELSE IF( ( n.LT.0 ) .OR. ( n.GT.m ) ) THEN
453 info = -5
454 ELSE IF( lda.LT.m ) THEN
455 info = -7
456 ELSE IF( mv.LT.0 ) THEN
457 info = -9
458 ELSE IF( ( rsvec .AND. ( ldv.LT.n ) ) .OR.
459 $ ( applv .AND. ( ldv.LT.mv ) ) ) THEN
460 info = -11
461 ELSE IF( uctol .AND. ( rwork( 1 ).LE.one ) ) THEN
462 info = -12
463 ELSE IF( lwork.LT.lwmin .AND. ( .NOT.lquery ) ) THEN
464 info = -13
465 ELSE IF( lrwork.LT.lrwmin .AND. ( .NOT.lquery ) ) THEN
466 info = -15
467 ELSE
468 info = 0
469 END IF
470
471
472 IF( info.NE.0 ) THEN
473 CALL xerbla(
'ZGESVJ', -info )
474 RETURN
475 ELSE IF( lquery ) THEN
476 cwork( 1 ) = lwmin
477 rwork( 1 ) = real( lrwmin )
478 RETURN
479 END IF
480
481
482
483 IF( minmn.EQ.0 ) RETURN
484
485
486
487
488
489
490
491
492 IF( uctol ) THEN
493
494 ctol = rwork( 1 )
495 ELSE
496
497 IF( lsvec .OR. rsvec .OR. applv ) THEN
498 ctol = sqrt( dble( m ) )
499 ELSE
500 ctol = dble( m )
501 END IF
502 END IF
503
504
505
506 epsln =
dlamch(
'Epsilon' )
507 rooteps = sqrt( epsln )
508 sfmin =
dlamch(
'SafeMinimum' )
509 rootsfmin = sqrt( sfmin )
510 small = sfmin / epsln
511 big =
dlamch(
'Overflow' )
512
513 rootbig = one / rootsfmin
514
515 bigtheta = one / rooteps
516
517 tol = ctol*epsln
518 roottol = sqrt( tol )
519
520 IF( dble( m )*epsln.GE.one ) THEN
521 info = -4
522 CALL xerbla(
'ZGESVJ', -info )
523 RETURN
524 END IF
525
526
527
528 IF( rsvec ) THEN
529 mvl = n
530 CALL zlaset(
'A', mvl, n, czero, cone, v, ldv )
531 ELSE IF( applv ) THEN
532 mvl = mv
533 END IF
534 rsvec = rsvec .OR. applv
535
536
537
538
539
540
541
542
543
544
545 skl = one / sqrt( dble( m )*dble( n ) )
546 noscale = .true.
547 goscale = .true.
548
549 IF( lower ) THEN
550
551 DO 1874 p = 1, n
552 aapp = zero
553 aaqq = one
554 CALL zlassq( m-p+1, a( p, p ), 1, aapp, aaqq )
555 IF( aapp.GT.big ) THEN
556 info = -6
557 CALL xerbla(
'ZGESVJ', -info )
558 RETURN
559 END IF
560 aaqq = sqrt( aaqq )
561 IF( ( aapp.LT.( big / aaqq ) ) .AND. noscale ) THEN
562 sva( p ) = aapp*aaqq
563 ELSE
564 noscale = .false.
565 sva( p ) = aapp*( aaqq*skl )
566 IF( goscale ) THEN
567 goscale = .false.
568 DO 1873 q = 1, p - 1
569 sva( q ) = sva( q )*skl
570 1873 CONTINUE
571 END IF
572 END IF
573 1874 CONTINUE
574 ELSE IF( upper ) THEN
575
576 DO 2874 p = 1, n
577 aapp = zero
578 aaqq = one
579 CALL zlassq( p, a( 1, p ), 1, aapp, aaqq )
580 IF( aapp.GT.big ) THEN
581 info = -6
582 CALL xerbla(
'ZGESVJ', -info )
583 RETURN
584 END IF
585 aaqq = sqrt( aaqq )
586 IF( ( aapp.LT.( big / aaqq ) ) .AND. noscale ) THEN
587 sva( p ) = aapp*aaqq
588 ELSE
589 noscale = .false.
590 sva( p ) = aapp*( aaqq*skl )
591 IF( goscale ) THEN
592 goscale = .false.
593 DO 2873 q = 1, p - 1
594 sva( q ) = sva( q )*skl
595 2873 CONTINUE
596 END IF
597 END IF
598 2874 CONTINUE
599 ELSE
600
601 DO 3874 p = 1, n
602 aapp = zero
603 aaqq = one
604 CALL zlassq( m, a( 1, p ), 1, aapp, aaqq )
605 IF( aapp.GT.big ) THEN
606 info = -6
607 CALL xerbla(
'ZGESVJ', -info )
608 RETURN
609 END IF
610 aaqq = sqrt( aaqq )
611 IF( ( aapp.LT.( big / aaqq ) ) .AND. noscale ) THEN
612 sva( p ) = aapp*aaqq
613 ELSE
614 noscale = .false.
615 sva( p ) = aapp*( aaqq*skl )
616 IF( goscale ) THEN
617 goscale = .false.
618 DO 3873 q = 1, p - 1
619 sva( q ) = sva( q )*skl
620 3873 CONTINUE
621 END IF
622 END IF
623 3874 CONTINUE
624 END IF
625
626 IF( noscale )skl = one
627
628
629
630
631
632 aapp = zero
633 aaqq = big
634 DO 4781 p = 1, n
635 IF( sva( p ).NE.zero )aaqq = min( aaqq, sva( p ) )
636 aapp = max( aapp, sva( p ) )
637 4781 CONTINUE
638
639
640
641 IF( aapp.EQ.zero ) THEN
642 IF( lsvec )
CALL zlaset(
'G', m, n, czero, cone, a, lda )
643 rwork( 1 ) = one
644 rwork( 2 ) = zero
645 rwork( 3 ) = zero
646 rwork( 4 ) = zero
647 rwork( 5 ) = zero
648 rwork( 6 ) = zero
649 RETURN
650 END IF
651
652
653
654 IF( n.EQ.1 ) THEN
655 IF( lsvec )
CALL zlascl(
'G', 0, 0, sva( 1 ), skl, m, 1,
656 $ a( 1, 1 ), lda, ierr )
657 rwork( 1 ) = one / skl
658 IF( sva( 1 ).GE.sfmin ) THEN
659 rwork( 2 ) = one
660 ELSE
661 rwork( 2 ) = zero
662 END IF
663 rwork( 3 ) = zero
664 rwork( 4 ) = zero
665 rwork( 5 ) = zero
666 rwork( 6 ) = zero
667 RETURN
668 END IF
669
670
671
672
673 sn = sqrt( sfmin / epsln )
674 temp1 = sqrt( big / dble( n ) )
675 IF( ( aapp.LE.sn ) .OR. ( aaqq.GE.temp1 ) .OR.
676 $ ( ( sn.LE.aaqq ) .AND. ( aapp.LE.temp1 ) ) ) THEN
677 temp1 = min( big, temp1 / aapp )
678
679
680 ELSE IF( ( aaqq.LE.sn ) .AND. ( aapp.LE.temp1 ) ) THEN
681 temp1 = min( sn / aaqq, big / (aapp*sqrt( dble(n)) ) )
682
683
684 ELSE IF( ( aaqq.GE.sn ) .AND. ( aapp.GE.temp1 ) ) THEN
685 temp1 = max( sn / aaqq, temp1 / aapp )
686
687
688 ELSE IF( ( aaqq.LE.sn ) .AND. ( aapp.GE.temp1 ) ) THEN
689 temp1 = min( sn / aaqq, big / ( sqrt( dble( n ) )*aapp ) )
690
691
692 ELSE
693 temp1 = one
694 END IF
695
696
697
698 IF( temp1.NE.one ) THEN
699 CALL dlascl(
'G', 0, 0, one, temp1, n, 1, sva, n, ierr )
700 END IF
701 skl = temp1*skl
702 IF( skl.NE.one ) THEN
703 CALL zlascl( joba, 0, 0, one, skl, m, n, a, lda, ierr )
704 skl = one / skl
705 END IF
706
707
708
709 emptsw = ( n*( n-1 ) ) / 2
710 notrot = 0
711
712 DO 1868 q = 1, n
713 cwork( q ) = cone
714 1868 CONTINUE
715
716
717
718 swband = 3
719
720
721
722
723
724
725
726 kbl = min( 8, n )
727
728
729
730
731
732 nbl = n / kbl
733 IF( ( nbl*kbl ).NE.n )nbl = nbl + 1
734
735 blskip = kbl**2
736
737
738 rowskip = min( 5, kbl )
739
740
741 lkahead = 1
742
743
744
745
746
747
748
749 IF( ( lower .OR. upper ) .AND. ( n.GT.max( 64, 4*kbl ) ) ) THEN
750
751
752 n4 = n / 4
753 n2 = n / 2
754 n34 = 3*n4
755 IF( applv ) THEN
756 q = 0
757 ELSE
758 q = 1
759 END IF
760
761 IF( lower ) THEN
762
763
764
765
766
767
768
769
770
771 CALL zgsvj0( jobv, m-n34, n-n34, a( n34+1, n34+1 ), lda,
772 $ cwork( n34+1 ), sva( n34+1 ), mvl,
773 $ v( n34*q+1, n34+1 ), ldv, epsln, sfmin, tol,
774 $ 2, cwork( n+1 ), lwork-n, ierr )
775
776 CALL zgsvj0( jobv, m-n2, n34-n2, a( n2+1, n2+1 ), lda,
777 $ cwork( n2+1 ), sva( n2+1 ), mvl,
778 $ v( n2*q+1, n2+1 ), ldv, epsln, sfmin, tol, 2,
779 $ cwork( n+1 ), lwork-n, ierr )
780
781 CALL zgsvj1( jobv, m-n2, n-n2, n4, a( n2+1, n2+1 ), lda,
782 $ cwork( n2+1 ), sva( n2+1 ), mvl,
783 $ v( n2*q+1, n2+1 ), ldv, epsln, sfmin, tol, 1,
784 $ cwork( n+1 ), lwork-n, ierr )
785
786 CALL zgsvj0( jobv, m-n4, n2-n4, a( n4+1, n4+1 ), lda,
787 $ cwork( n4+1 ), sva( n4+1 ), mvl,
788 $ v( n4*q+1, n4+1 ), ldv, epsln, sfmin, tol, 1,
789 $ cwork( n+1 ), lwork-n, ierr )
790
791 CALL zgsvj0( jobv, m, n4, a, lda, cwork, sva, mvl, v,
792 $ ldv,
793 $ epsln, sfmin, tol, 1, cwork( n+1 ), lwork-n,
794 $ ierr )
795
796 CALL zgsvj1( jobv, m, n2, n4, a, lda, cwork, sva, mvl, v,
797 $ ldv, epsln, sfmin, tol, 1, cwork( n+1 ),
798 $ lwork-n, ierr )
799
800
801 ELSE IF( upper ) THEN
802
803
804 CALL zgsvj0( jobv, n4, n4, a, lda, cwork, sva, mvl, v,
805 $ ldv,
806 $ epsln, sfmin, tol, 2, cwork( n+1 ), lwork-n,
807 $ ierr )
808
809 CALL zgsvj0( jobv, n2, n4, a( 1, n4+1 ), lda,
810 $ cwork( n4+1 ),
811 $ sva( n4+1 ), mvl, v( n4*q+1, n4+1 ), ldv,
812 $ epsln, sfmin, tol, 1, cwork( n+1 ), lwork-n,
813 $ ierr )
814
815 CALL zgsvj1( jobv, n2, n2, n4, a, lda, cwork, sva, mvl,
816 $ v,
817 $ ldv, epsln, sfmin, tol, 1, cwork( n+1 ),
818 $ lwork-n, ierr )
819
820 CALL zgsvj0( jobv, n2+n4, n4, a( 1, n2+1 ), lda,
821 $ cwork( n2+1 ), sva( n2+1 ), mvl,
822 $ v( n2*q+1, n2+1 ), ldv, epsln, sfmin, tol, 1,
823 $ cwork( n+1 ), lwork-n, ierr )
824
825 END IF
826
827 END IF
828
829
830
831 DO 1993 i = 1, nsweep
832
833
834
835 mxaapq = zero
836 mxsinj = zero
837 iswrot = 0
838
839 notrot = 0
840 pskipped = 0
841
842
843
844
845
846
847 DO 2000 ibr = 1, nbl
848
849 igl = ( ibr-1 )*kbl + 1
850
851 DO 1002 ir1 = 0, min( lkahead, nbl-ibr )
852
853 igl = igl + ir1*kbl
854
855 DO 2001 p = igl, min( igl+kbl-1, n-1 )
856
857
858
859 q =
idamax( n-p+1, sva( p ), 1 ) + p - 1
860 IF( p.NE.q ) THEN
861 CALL zswap( m, a( 1, p ), 1, a( 1, q ), 1 )
862 IF( rsvec )
CALL zswap( mvl, v( 1, p ), 1,
863 $ v( 1, q ), 1 )
864 temp1 = sva( p )
865 sva( p ) = sva( q )
866 sva( q ) = temp1
867 aapq = cwork(p)
868 cwork(p) = cwork(q)
869 cwork(q) = aapq
870 END IF
871
872 IF( ir1.EQ.0 ) THEN
873
874
875
876
877
878
879
880
881
882
883
884
885
886 IF( ( sva( p ).LT.rootbig ) .AND.
887 $ ( sva( p ).GT.rootsfmin ) ) THEN
888 sva( p ) =
dznrm2( m, a( 1, p ), 1 )
889 ELSE
890 temp1 = zero
891 aapp = one
892 CALL zlassq( m, a( 1, p ), 1, temp1, aapp )
893 sva( p ) = temp1*sqrt( aapp )
894 END IF
895 aapp = sva( p )
896 ELSE
897 aapp = sva( p )
898 END IF
899
900 IF( aapp.GT.zero ) THEN
901
902 pskipped = 0
903
904 DO 2002 q = p + 1, min( igl+kbl-1, n )
905
906 aaqq = sva( q )
907
908 IF( aaqq.GT.zero ) THEN
909
910 aapp0 = aapp
911 IF( aaqq.GE.one ) THEN
912 rotok = ( small*aapp ).LE.aaqq
913 IF( aapp.LT.( big / aaqq ) ) THEN
914 aapq = (
zdotc( m, a( 1, p ), 1,
915 $ a( 1, q ), 1 ) / aaqq ) / aapp
916 ELSE
917 CALL zcopy( m, a( 1, p ), 1,
918 $ cwork(n+1), 1 )
919 CALL zlascl(
'G', 0, 0, aapp, one,
920 $ m, 1, cwork(n+1), lda, ierr )
921 aapq =
zdotc( m, cwork(n+1), 1,
922 $ a( 1, q ), 1 ) / aaqq
923 END IF
924 ELSE
925 rotok = aapp.LE.( aaqq / small )
926 IF( aapp.GT.( small / aaqq ) ) THEN
927 aapq = (
zdotc( m, a( 1, p ), 1,
928 $ a( 1, q ), 1 ) / aapp ) / aaqq
929 ELSE
930 CALL zcopy( m, a( 1, q ), 1,
931 $ cwork(n+1), 1 )
932 CALL zlascl(
'G', 0, 0, aaqq,
933 $ one, m, 1,
934 $ cwork(n+1), lda, ierr )
935 aapq =
zdotc( m, a(1, p ), 1,
936 $ cwork(n+1), 1 ) / aapp
937 END IF
938 END IF
939
940
941
942 aapq1 = -abs(aapq)
943 mxaapq = max( mxaapq, -aapq1 )
944
945
946
947 IF( abs( aapq1 ).GT.tol ) THEN
948 ompq = aapq / abs(aapq)
949
950
951
952
953 IF( ir1.EQ.0 ) THEN
954 notrot = 0
955 pskipped = 0
956 iswrot = iswrot + 1
957 END IF
958
959 IF( rotok ) THEN
960
961 aqoap = aaqq / aapp
962 apoaq = aapp / aaqq
963 theta = -half*abs( aqoap-apoaq )/aapq1
964
965 IF( abs( theta ).GT.bigtheta ) THEN
966
967 t = half / theta
968 cs = one
969
970 CALL zrot( m, a(1,p), 1, a(1,q),
971 $ 1,
972 $ cs, conjg(ompq)*t )
973 IF ( rsvec ) THEN
974 CALL zrot( mvl, v(1,p), 1,
975 $ v(1,q), 1, cs, conjg(ompq)*t )
976 END IF
977
978 sva( q ) = aaqq*sqrt( max( zero,
979 $ one+t*apoaq*aapq1 ) )
980 aapp = aapp*sqrt( max( zero,
981 $ one-t*aqoap*aapq1 ) )
982 mxsinj = max( mxsinj, abs( t ) )
983
984 ELSE
985
986
987
988 thsign = -sign( one, aapq1 )
989 t = one / ( theta+thsign*
990 $ sqrt( one+theta*theta ) )
991 cs = sqrt( one / ( one+t*t ) )
992 sn = t*cs
993
994 mxsinj = max( mxsinj, abs( sn ) )
995 sva( q ) = aaqq*sqrt( max( zero,
996 $ one+t*apoaq*aapq1 ) )
997 aapp = aapp*sqrt( max( zero,
998 $ one-t*aqoap*aapq1 ) )
999
1000 CALL zrot( m, a(1,p), 1, a(1,q),
1001 $ 1,
1002 $ cs, conjg(ompq)*sn )
1003 IF ( rsvec ) THEN
1004 CALL zrot( mvl, v(1,p), 1,
1005 $ v(1,q), 1, cs, conjg(ompq)*sn )
1006 END IF
1007 END IF
1008 cwork(p) = -cwork(q) * ompq
1009
1010 ELSE
1011
1012 CALL zcopy( m, a( 1, p ), 1,
1013 $ cwork(n+1), 1 )
1014 CALL zlascl(
'G', 0, 0, aapp, one,
1015 $ m,
1016 $ 1, cwork(n+1), lda,
1017 $ ierr )
1018 CALL zlascl(
'G', 0, 0, aaqq, one,
1019 $ m,
1020 $ 1, a( 1, q ), lda, ierr )
1021 CALL zaxpy( m, -aapq, cwork(n+1), 1,
1022 $ a( 1, q ), 1 )
1023 CALL zlascl(
'G', 0, 0, one, aaqq,
1024 $ m,
1025 $ 1, a( 1, q ), lda, ierr )
1026 sva( q ) = aaqq*sqrt( max( zero,
1027 $ one-aapq1*aapq1 ) )
1028 mxsinj = max( mxsinj, sfmin )
1029 END IF
1030
1031
1032
1033
1034
1035 IF( ( sva( q ) / aaqq )**2.LE.rooteps )
1036 $ THEN
1037 IF( ( aaqq.LT.rootbig ) .AND.
1038 $ ( aaqq.GT.rootsfmin ) ) THEN
1039 sva( q ) =
dznrm2( m, a( 1, q ),
1040 $ 1 )
1041 ELSE
1042 t = zero
1043 aaqq = one
1044 CALL zlassq( m, a( 1, q ), 1, t,
1045 $ aaqq )
1046 sva( q ) = t*sqrt( aaqq )
1047 END IF
1048 END IF
1049 IF( ( aapp / aapp0 ).LE.rooteps ) THEN
1050 IF( ( aapp.LT.rootbig ) .AND.
1051 $ ( aapp.GT.rootsfmin ) ) THEN
1052 aapp =
dznrm2( m, a( 1, p ), 1 )
1053 ELSE
1054 t = zero
1055 aapp = one
1056 CALL zlassq( m, a( 1, p ), 1, t,
1057 $ aapp )
1058 aapp = t*sqrt( aapp )
1059 END IF
1060 sva( p ) = aapp
1061 END IF
1062
1063 ELSE
1064
1065 IF( ir1.EQ.0 )notrot = notrot + 1
1066
1067 pskipped = pskipped + 1
1068 END IF
1069 ELSE
1070
1071 IF( ir1.EQ.0 )notrot = notrot + 1
1072 pskipped = pskipped + 1
1073 END IF
1074
1075 IF( ( i.LE.swband ) .AND.
1076 $ ( pskipped.GT.rowskip ) ) THEN
1077 IF( ir1.EQ.0 )aapp = -aapp
1078 notrot = 0
1079 GO TO 2103
1080 END IF
1081
1082 2002 CONTINUE
1083
1084
1085 2103 CONTINUE
1086
1087
1088 sva( p ) = aapp
1089
1090 ELSE
1091 sva( p ) = aapp
1092 IF( ( ir1.EQ.0 ) .AND. ( aapp.EQ.zero ) )
1093 $ notrot = notrot + min( igl+kbl-1, n ) - p
1094 END IF
1095
1096 2001 CONTINUE
1097
1098
1099 1002 CONTINUE
1100
1101
1102
1103
1104 igl = ( ibr-1 )*kbl + 1
1105
1106 DO 2010 jbc = ibr + 1, nbl
1107
1108 jgl = ( jbc-1 )*kbl + 1
1109
1110
1111
1112 ijblsk = 0
1113 DO 2100 p = igl, min( igl+kbl-1, n )
1114
1115 aapp = sva( p )
1116 IF( aapp.GT.zero ) THEN
1117
1118 pskipped = 0
1119
1120 DO 2200 q = jgl, min( jgl+kbl-1, n )
1121
1122 aaqq = sva( q )
1123 IF( aaqq.GT.zero ) THEN
1124 aapp0 = aapp
1125
1126
1127
1128
1129
1130 IF( aaqq.GE.one ) THEN
1131 IF( aapp.GE.aaqq ) THEN
1132 rotok = ( small*aapp ).LE.aaqq
1133 ELSE
1134 rotok = ( small*aaqq ).LE.aapp
1135 END IF
1136 IF( aapp.LT.( big / aaqq ) ) THEN
1137 aapq = (
zdotc( m, a( 1, p ), 1,
1138 $ a( 1, q ), 1 ) / aaqq ) / aapp
1139 ELSE
1140 CALL zcopy( m, a( 1, p ), 1,
1141 $ cwork(n+1), 1 )
1142 CALL zlascl(
'G', 0, 0, aapp,
1143 $ one, m, 1,
1144 $ cwork(n+1), lda, ierr )
1145 aapq =
zdotc( m, cwork(n+1), 1,
1146 $ a( 1, q ), 1 ) / aaqq
1147 END IF
1148 ELSE
1149 IF( aapp.GE.aaqq ) THEN
1150 rotok = aapp.LE.( aaqq / small )
1151 ELSE
1152 rotok = aaqq.LE.( aapp / small )
1153 END IF
1154 IF( aapp.GT.( small / aaqq ) ) THEN
1155 aapq = (
zdotc( m, a( 1, p ), 1,
1156 $ a( 1, q ), 1 ) / max(aaqq,aapp) )
1157 $ / min(aaqq,aapp)
1158 ELSE
1159 CALL zcopy( m, a( 1, q ), 1,
1160 $ cwork(n+1), 1 )
1161 CALL zlascl(
'G', 0, 0, aaqq,
1162 $ one, m, 1,
1163 $ cwork(n+1), lda, ierr )
1164 aapq =
zdotc( m, a( 1, p ), 1,
1165 $ cwork(n+1), 1 ) / aapp
1166 END IF
1167 END IF
1168
1169
1170
1171 aapq1 = -abs(aapq)
1172 mxaapq = max( mxaapq, -aapq1 )
1173
1174
1175
1176 IF( abs( aapq1 ).GT.tol ) THEN
1177 ompq = aapq / abs(aapq)
1178 notrot = 0
1179
1180 pskipped = 0
1181 iswrot = iswrot + 1
1182
1183 IF( rotok ) THEN
1184
1185 aqoap = aaqq / aapp
1186 apoaq = aapp / aaqq
1187 theta = -half*abs( aqoap-apoaq )/ aapq1
1188 IF( aaqq.GT.aapp0 )theta = -theta
1189
1190 IF( abs( theta ).GT.bigtheta ) THEN
1191 t = half / theta
1192 cs = one
1193 CALL zrot( m, a(1,p), 1, a(1,q),
1194 $ 1,
1195 $ cs, conjg(ompq)*t )
1196 IF( rsvec ) THEN
1197 CALL zrot( mvl, v(1,p), 1,
1198 $ v(1,q), 1, cs, conjg(ompq)*t )
1199 END IF
1200 sva( q ) = aaqq*sqrt( max( zero,
1201 $ one+t*apoaq*aapq1 ) )
1202 aapp = aapp*sqrt( max( zero,
1203 $ one-t*aqoap*aapq1 ) )
1204 mxsinj = max( mxsinj, abs( t ) )
1205 ELSE
1206
1207
1208
1209 thsign = -sign( one, aapq1 )
1210 IF( aaqq.GT.aapp0 )thsign = -thsign
1211 t = one / ( theta+thsign*
1212 $ sqrt( one+theta*theta ) )
1213 cs = sqrt( one / ( one+t*t ) )
1214 sn = t*cs
1215 mxsinj = max( mxsinj, abs( sn ) )
1216 sva( q ) = aaqq*sqrt( max( zero,
1217 $ one+t*apoaq*aapq1 ) )
1218 aapp = aapp*sqrt( max( zero,
1219 $ one-t*aqoap*aapq1 ) )
1220
1221 CALL zrot( m, a(1,p), 1, a(1,q),
1222 $ 1,
1223 $ cs, conjg(ompq)*sn )
1224 IF( rsvec ) THEN
1225 CALL zrot( mvl, v(1,p), 1,
1226 $ v(1,q), 1, cs, conjg(ompq)*sn )
1227 END IF
1228 END IF
1229 cwork(p) = -cwork(q) * ompq
1230
1231 ELSE
1232
1233 IF( aapp.GT.aaqq ) THEN
1234 CALL zcopy( m, a( 1, p ), 1,
1235 $ cwork(n+1), 1 )
1236 CALL zlascl(
'G', 0, 0, aapp,
1237 $ one,
1238 $ m, 1, cwork(n+1),lda,
1239 $ ierr )
1240 CALL zlascl(
'G', 0, 0, aaqq,
1241 $ one,
1242 $ m, 1, a( 1, q ), lda,
1243 $ ierr )
1244 CALL zaxpy( m, -aapq, cwork(n+1),
1245 $ 1, a( 1, q ), 1 )
1246 CALL zlascl(
'G', 0, 0, one,
1247 $ aaqq,
1248 $ m, 1, a( 1, q ), lda,
1249 $ ierr )
1250 sva( q ) = aaqq*sqrt( max( zero,
1251 $ one-aapq1*aapq1 ) )
1252 mxsinj = max( mxsinj, sfmin )
1253 ELSE
1254 CALL zcopy( m, a( 1, q ), 1,
1255 $ cwork(n+1), 1 )
1256 CALL zlascl(
'G', 0, 0, aaqq,
1257 $ one,
1258 $ m, 1, cwork(n+1),lda,
1259 $ ierr )
1260 CALL zlascl(
'G', 0, 0, aapp,
1261 $ one,
1262 $ m, 1, a( 1, p ), lda,
1263 $ ierr )
1264 CALL zaxpy( m, -conjg(aapq),
1265 $ cwork(n+1), 1, a( 1, p ), 1 )
1266 CALL zlascl(
'G', 0, 0, one,
1267 $ aapp,
1268 $ m, 1, a( 1, p ), lda,
1269 $ ierr )
1270 sva( p ) = aapp*sqrt( max( zero,
1271 $ one-aapq1*aapq1 ) )
1272 mxsinj = max( mxsinj, sfmin )
1273 END IF
1274 END IF
1275
1276
1277
1278
1279 IF( ( sva( q ) / aaqq )**2.LE.rooteps )
1280 $ THEN
1281 IF( ( aaqq.LT.rootbig ) .AND.
1282 $ ( aaqq.GT.rootsfmin ) ) THEN
1283 sva( q ) =
dznrm2( m, a( 1, q ),
1284 $ 1)
1285 ELSE
1286 t = zero
1287 aaqq = one
1288 CALL zlassq( m, a( 1, q ), 1, t,
1289 $ aaqq )
1290 sva( q ) = t*sqrt( aaqq )
1291 END IF
1292 END IF
1293 IF( ( aapp / aapp0 )**2.LE.rooteps ) THEN
1294 IF( ( aapp.LT.rootbig ) .AND.
1295 $ ( aapp.GT.rootsfmin ) ) THEN
1296 aapp =
dznrm2( m, a( 1, p ), 1 )
1297 ELSE
1298 t = zero
1299 aapp = one
1300 CALL zlassq( m, a( 1, p ), 1, t,
1301 $ aapp )
1302 aapp = t*sqrt( aapp )
1303 END IF
1304 sva( p ) = aapp
1305 END IF
1306
1307 ELSE
1308 notrot = notrot + 1
1309
1310 pskipped = pskipped + 1
1311 ijblsk = ijblsk + 1
1312 END IF
1313 ELSE
1314 notrot = notrot + 1
1315 pskipped = pskipped + 1
1316 ijblsk = ijblsk + 1
1317 END IF
1318
1319 IF( ( i.LE.swband ) .AND. ( ijblsk.GE.blskip ) )
1320 $ THEN
1321 sva( p ) = aapp
1322 notrot = 0
1323 GO TO 2011
1324 END IF
1325 IF( ( i.LE.swband ) .AND.
1326 $ ( pskipped.GT.rowskip ) ) THEN
1327 aapp = -aapp
1328 notrot = 0
1329 GO TO 2203
1330 END IF
1331
1332 2200 CONTINUE
1333
1334 2203 CONTINUE
1335
1336 sva( p ) = aapp
1337
1338 ELSE
1339
1340 IF( aapp.EQ.zero )notrot = notrot +
1341 $ min( jgl+kbl-1, n ) - jgl + 1
1342 IF( aapp.LT.zero )notrot = 0
1343
1344 END IF
1345
1346 2100 CONTINUE
1347
1348 2010 CONTINUE
1349
1350 2011 CONTINUE
1351
1352 DO 2012 p = igl, min( igl+kbl-1, n )
1353 sva( p ) = abs( sva( p ) )
1354 2012 CONTINUE
1355
1356 2000 CONTINUE
1357
1358
1359
1360 IF( ( sva( n ).LT.rootbig ) .AND. ( sva( n ).GT.rootsfmin ) )
1361 $ THEN
1362 sva( n ) =
dznrm2( m, a( 1, n ), 1 )
1363 ELSE
1364 t = zero
1365 aapp = one
1366 CALL zlassq( m, a( 1, n ), 1, t, aapp )
1367 sva( n ) = t*sqrt( aapp )
1368 END IF
1369
1370
1371
1372 IF( ( i.LT.swband ) .AND. ( ( mxaapq.LE.roottol ) .OR.
1373 $ ( iswrot.LE.n ) ) )swband = i
1374
1375 IF( ( i.GT.swband+1 ) .AND. ( mxaapq.LT.sqrt( dble( n ) )*
1376 $ tol ) .AND. ( dble( n )*mxaapq*mxsinj.LT.tol ) ) THEN
1377 GO TO 1994
1378 END IF
1379
1380 IF( notrot.GE.emptsw )GO TO 1994
1381
1382 1993 CONTINUE
1383
1384
1385
1386 info = nsweep - 1
1387 GO TO 1995
1388
1389 1994 CONTINUE
1390
1391
1392
1393 info = 0
1394
1395 1995 CONTINUE
1396
1397
1398
1399
1400 n2 = 0
1401 n4 = 0
1402 DO 5991 p = 1, n - 1
1403 q =
idamax( n-p+1, sva( p ), 1 ) + p - 1
1404 IF( p.NE.q ) THEN
1405 temp1 = sva( p )
1406 sva( p ) = sva( q )
1407 sva( q ) = temp1
1408 CALL zswap( m, a( 1, p ), 1, a( 1, q ), 1 )
1409 IF( rsvec )
CALL zswap( mvl, v( 1, p ), 1, v( 1, q ), 1 )
1410 END IF
1411 IF( sva( p ).NE.zero ) THEN
1412 n4 = n4 + 1
1413 IF( sva( p )*skl.GT.sfmin )n2 = n2 + 1
1414 END IF
1415 5991 CONTINUE
1416 IF( sva( n ).NE.zero ) THEN
1417 n4 = n4 + 1
1418 IF( sva( n )*skl.GT.sfmin )n2 = n2 + 1
1419 END IF
1420
1421
1422
1423 IF( lsvec .OR. uctol ) THEN
1424 DO 1998 p = 1, n4
1425
1426 CALL zlascl(
'G',0,0, sva(p), one, m, 1, a(1,p), m,
1427 $ ierr )
1428 1998 CONTINUE
1429 END IF
1430
1431
1432
1433 IF( rsvec ) THEN
1434 DO 2399 p = 1, n
1435 temp1 = one /
dznrm2( mvl, v( 1, p ), 1 )
1436 CALL zdscal( mvl, temp1, v( 1, p ), 1 )
1437 2399 CONTINUE
1438 END IF
1439
1440
1441 IF( ( ( skl.GT.one ) .AND. ( sva( 1 ).LT.( big / skl ) ) )
1442 $ .OR. ( ( skl.LT.one ) .AND. ( sva( max( n2, 1 ) ) .GT.
1443 $ ( sfmin / skl ) ) ) ) THEN
1444 DO 2400 p = 1, n
1445 sva( p ) = skl*sva( p )
1446 2400 CONTINUE
1447 skl = one
1448 END IF
1449
1450 rwork( 1 ) = skl
1451
1452
1453
1454
1455 rwork( 2 ) = dble( n4 )
1456
1457
1458 rwork( 3 ) = dble( n2 )
1459
1460
1461
1462
1463 rwork( 4 ) = dble( i )
1464
1465
1466 rwork( 5 ) = mxaapq
1467
1468
1469
1470 rwork( 6 ) = mxsinj
1471
1472
1473
1474 RETURN
1475
1476
1477
subroutine xerbla(srname, info)
subroutine zaxpy(n, za, zx, incx, zy, incy)
ZAXPY
subroutine zcopy(n, zx, incx, zy, incy)
ZCOPY
complex *16 function zdotc(n, zx, incx, zy, incy)
ZDOTC
subroutine zgsvj0(jobv, m, n, a, lda, d, sva, mv, v, ldv, eps, sfmin, tol, nsweep, work, lwork, info)
ZGSVJ0 pre-processor for the routine zgesvj.
subroutine zgsvj1(jobv, m, n, n1, a, lda, d, sva, mv, v, ldv, eps, sfmin, tol, nsweep, work, lwork, info)
ZGSVJ1 pre-processor for the routine zgesvj, applies Jacobi rotations targeting only particular pivot...
integer function idamax(n, dx, incx)
IDAMAX
double precision function dlamch(cmach)
DLAMCH
subroutine zlascl(type, kl, ku, cfrom, cto, m, n, a, lda, info)
ZLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine dlascl(type, kl, ku, cfrom, cto, m, n, a, lda, info)
DLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine zlaset(uplo, m, n, alpha, beta, a, lda)
ZLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine zlassq(n, x, incx, scale, sumsq)
ZLASSQ updates a sum of squares represented in scaled form.
logical function lsame(ca, cb)
LSAME
real(wp) function dznrm2(n, x, incx)
DZNRM2
subroutine zrot(n, cx, incx, cy, incy, c, s)
ZROT applies a plane rotation with real cosine and complex sine to a pair of complex vectors.
subroutine zdscal(n, da, zx, incx)
ZDSCAL
subroutine zswap(n, zx, incx, zy, incy)
ZSWAP