home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / INFO / FORTRAN / LLSQ.ZIP / SVDRS.FOR < prev   
Encoding:
Text File  |  1984-02-23  |  33.1 KB  |  414 lines

  1. C     SUBROUTINE SVDRS (A,MDA,MM,NN,B,MDB,NB,S)                         SVD00100
  2. C     C.L.LAWSON AND R.J.HANSON, JET PROPULSION LABORATORY, 1974 MAR 1  SVD00200
  3. C     TO APPEAR IN 'SOLVING LEAST SQUARES PROBLEMS', PRENTICE-HALL, 1974SVD00300
  4. C          SINGULAR VALUE DECOMPOSITION ALSO TREATING RIGHT SIDE VECTOR.SVD00400
  5. C                                                                       SVD00500
  6. C     THE ARRAY S OCCUPIES 3*N CELLS.                                   SVD00600
  7. C     A OCCUPIES M*N CELLS                                              SVD00700
  8. C     B OCCUPIES M*NB CELLS.                                            SVD00800
  9. C                                                                       SVD00900
  10. C     SPECIAL SINGULAR VALUE DECOMPOSITION SUBROUTINE.                  SVD01000
  11. C     WE HAVE THE M X N MATRIX A AND THE SYSTEM A*X=B TO SOLVE.         SVD01100
  12. C     EITHER M .GE. N  OR  M .LT. N IS PERMITTED.                       SVD01200
  13. C                       THE SINGULAR VALUE DECOMPOSITION                SVD01300
  14. C     A = U*S*V**(T) IS MADE IN SUCH A WAY THAT ONE GETS                SVD01400
  15. C        (1) THE MATRIX V IN THE FIRST N ROWS AND COLUMNS OF A.         SVD01500
  16. C        (2) THE DIAGONAL MATRIX OF ORDERED SINGULAR VALUES IN          SVD01600
  17. C            THE FIRST N CELLS OF THE ARRAY S(IP), IP .GE. 3*N.         SVD01700
  18. C        (3) THE MATRIX PRODUCT U**(T)*B=G GETS PLACED BACK IN B.       SVD01800
  19. C        (4) THE USER MUST COMPLETE THE SOLUTION AND DO HIS OWN         SVD01900
  20. C            SINGULAR VALUE ANALYSIS.                                   SVD02000
  21. C     *******                                                           SVD02100
  22. C     GIVE SPECIAL                                                      SVD02200
  23. C     TREATMENT TO ROWS AND COLUMNS WHICH ARE ENTIRELY ZERO.  THIS      SVD02300
  24. C     CAUSES CERTAIN ZERO SING. VALS. TO APPEAR AS EXACT ZEROS RATHER   SVD02400
  25. C     THAN AS ABOUT ETA TIMES THE LARGEST SING. VAL.   IT SIMILARLY     SVD02500
  26. C     CLEANS UP THE ASSOCIATED COLUMNS OF U AND V.                      SVD02600
  27. C     METHOD..                                                          SVD02700
  28. C      1. EXCHANGE COLS OF A TO PACK NONZERO COLS TO THE LEFT.          SVD02800
  29. C         SET N = NO. OF NONZERO COLS.                                  SVD02900
  30. C         USE LOCATIONS A(1,NN),A(1,NN-1),...,A(1,N+1) TO RECORD THE    SVD03000
  31. C         COL PERMUTATIONS.                                             SVD03100
  32. C      2. EXCHANGE ROWS OF A TO PACK NONZERO ROWS TO THE TOP.           SVD03200
  33. C         QUIT PACKING IF FIND N NONZERO ROWS.  MAKE SAME ROW EXCHANGES SVD03300
  34. C         IN B.  SET M SO THAT ALL NONZERO ROWS OF THE PERMUTED A       SVD03400
  35. C         ARE IN FIRST M ROWS.  IF M .LE. N THEN ALL M ROWS ARE         SVD03500
  36. C         NONZERO.  IF M .GT. N THEN      THE FIRST N ROWS ARE KNOWN    SVD03600
  37. C         TO BE NONZERO,AND ROWS N+1 THRU M MAY BE ZERO OR NONZERO.     SVD03700
  38. C      3. APPLY ORIGINAL ALGORITHM TO THE M BY N PROBLEM.               SVD03800
  39. C      4. MOVE PERMUTATION RECORD FROM A(,) TO S(I),I=N+1,...,NN.       SVD03900
  40. C      5. BUILD V UP FROM  N BY N  TO  NN BY NN  BY PLACING ONES ON     SVD04000
  41. C         THE DIAGONAL AND ZEROS ELSEWHERE.  THIS IS ONLY PARTLY DONE   SVD04100
  42. C         EXPLICITLY.  IT IS COMPLETED DURING STEP 6.                   SVD04200
  43. C      6. EXCHANGE ROWS OF V TO COMPENSATE FOR COL EXCHANGES OF STEP 2. SVD04300
  44. C      7. PLACE ZEROS IN  S(I),I=N+1,NN  TO REPRESENT ZERO SING VALS.   SVD04400
  45. C                                                                       SVD04500
  46.       SUBROUTINE SVDRS (A,MDA,MM,NN,B,MDB,NB,S)                         SVD04600
  47.       DIMENSION A(MDA,NN),B(MDB,NB),S(NN,3)                             SVD04700
  48.       ZERO=0.                                                           SVD04800
  49.       ONE=1.                                                            SVD04900
  50. C                                                                       SVD05000
  51. C                             BEGIN.. SPECIAL FOR ZERO ROWS AND COLS.   SVD05100
  52. C                                                                       SVD05200
  53. C                             PACK THE NONZERO COLS TO THE LEFT         SVD05300
  54. C                                                                       SVD05400
  55.       N=NN                                                              SVD05500
  56.       IF (N.LE.0.OR.MM.LE.0) RETURN                                     SVD05600
  57.       J=N                                                               SVD05700
  58.    10 CONTINUE                                                          SVD05800
  59.           DO 20 I=1,MM                                                  SVD05900
  60.           IF (A(I,J)) 50,20,50                                          SVD06000
  61.    20     CONTINUE                                                      SVD06100
  62. C                                                                       SVD06200
  63. C         COL J  IS ZERO. EXCHANGE IT WITH COL N.                       SVD06300
  64. C                                                                       SVD06400
  65.       IF (J.EQ.N) GO TO 40                                              SVD06500
  66.           DO 30 I=1,MM                                                  SVD06600
  67.    30     A(I,J)=A(I,N)                                                 SVD06700
  68.    40 CONTINUE                                                          SVD06800
  69.       A(1,N)=J                                                          SVD06900
  70.       N=N-1                                                             SVD07000
  71.    50 CONTINUE                                                          SVD07100
  72.       J=J-1                                                             SVD07200
  73.       IF (J.GE.1) GO TO 10                                              SVD07300
  74. C                             IF N=0 THEN A IS ENTIRELY ZERO AND SVD    SVD07400
  75. C                             COMPUTATION CAN BE SKIPPED                SVD07500
  76.       NS=0                                                              SVD07600
  77.       IF (N.EQ.0) GO TO 240                                             SVD07700
  78. C                             PACK NONZERO ROWS TO THE TOP              SVD07800
  79. C                             QUIT PACKING IF FIND N NONZERO ROWS       SVD07900
  80.       I=1                                                               SVD08000
  81.       M=MM                                                              SVD08100
  82.    60 IF (I.GT.N.OR.I.GE.M) GO TO 150                                   SVD08200
  83.       IF (A(I,I)) 90,70,90                                              SVD08300
  84.    70     DO 80 J=1,N                                                   SVD08400
  85.           IF (A(I,J)) 90,80,90                                          SVD08500
  86.    80     CONTINUE                                                      SVD08600
  87.       GO TO 100                                                         SVD08700
  88.    90 I=I+1                                                             SVD08800
  89.       GO TO 60                                                          SVD08900
  90. C                             ROW I IS ZERO                             SVD09000
  91. C                             EXCHANGE ROWS I AND M                     SVD09100
  92.   100 IF(NB.LE.0) GO TO 115                                             SVD09200
  93.           DO 110 J=1,NB                                                 SVD09300
  94.           T=B(I,J)                                                      SVD09400
  95.           B(I,J)=B(M,J)                                                 SVD09500
  96.   110     B(M,J)=T                                                      SVD09600
  97.   115     DO 120 J=1,N                                                  SVD09700
  98.   120     A(I,J)=A(M,J)                                                 SVD09800
  99.       IF (M.GT.N) GO TO 140                                             SVD09900
  100.           DO 130 J=1,N                                                  SVD10000
  101.   130     A(M,J)=ZERO                                                   SVD10100
  102.   140 CONTINUE                                                          SVD10200
  103. C                             EXCHANGE IS FINISHED                      SVD10300
  104.       M=M-1                                                             SVD10400
  105.       GO TO 60                                                          SVD10500
  106. C                                                                       SVD10600
  107.   150 CONTINUE                                                          SVD10700
  108. C                             END.. SPECIAL FOR ZERO ROWS AND COLUMNS   SVD10800
  109. C                             BEGIN.. SVD ALGORITHM                     SVD10900
  110. C     METHOD..                                                          SVD11000
  111. C     (1)     REDUCE THE MATRIX TO UPPER BIDIAGONAL FORM WITH           SVD11100
  112. C     HOUSEHOLDER TRANSFORMATIONS.                                      SVD11200
  113. C          H(N)...H(1)AQ(1)...Q(N-2) = (D**T,0)**T                      SVD11300
  114. C     WHERE D IS UPPER BIDIAGONAL.                                      SVD11400
  115. C                                                                       SVD11500
  116. C     (2)     APPLY H(N)...H(1) TO B.  HERE H(N)...H(1)*B REPLACES B    SVD11600
  117. C     IN STORAGE.                                                       SVD11700
  118. C                                                                       SVD11800
  119. C     (3)     THE MATRIX PRODUCT W= Q(1)...Q(N-2) OVERWRITES THE FIRST  SVD11900
  120. C     N ROWS OF A IN STORAGE.                                           SVD12000
  121. C                                                                       SVD12100
  122. C     (4)     AN SVD FOR D IS COMPUTED.  HERE K ROTATIONS RI AND PI ARE SVD12200
  123. C     COMPUTED SO THAT                                                  SVD12300
  124. C          RK...R1*D*P1**(T)...PK**(T) = DIAG(S1,...,SM)                SVD12400
  125. C     TO WORKING ACCURACY.  THE SI ARE NONNEGATIVE AND NONINCREASING.   SVD12500
  126. C     HERE RK...R1*B OVERWRITES B IN STORAGE WHILE                      SVD12600
  127. C     A*P1**(T)...PK**(T)  OVERWRITES A IN STORAGE.                     SVD12700
  128. C                                                                       SVD12800
  129. C     (5)     IT FOLLOWS THAT,WITH THE PROPER DEFINITIONS,              SVD12900
  130. C     U**(T)*B OVERWRITES B, WHILE V OVERWRITES THE FIRST N ROW AND     SVD13000
  131. C     COLUMNS OF A.                                                     SVD13100
  132. C                                                                       SVD13200
  133.       L=MIN0(M,N)                                                       SVD13300
  134. C             THE FOLLOWING LOOP REDUCES A TO UPPER BIDIAGONAL AND      SVD13400
  135. C             ALSO APPLIES THE PREMULTIPLYING TRANSFORMATIONS TO B.     SVD13500
  136. C                                                                       SVD13600
  137.           DO 170 J=1,L                                                  SVD13700
  138.           IF (J.GE.M) GO TO 160                                         SVD13800
  139.           CALL H12 (1,J,J+1,M,A(1,J),1,T,A(1,J+1),1,MDA,N-J)            SVD13900
  140.           CALL H12 (2,J,J+1,M,A(1,J),1,T,B,1,MDB,NB)                    SVD14000
  141.   160     IF (J.GE.N-1) GO TO 170                                       SVD14100
  142.           CALL H12 (1,J+1,J+2,N,A(J,1),MDA,S(J,3),A(J+1,1),MDA,1,M-J)   SVD14200
  143.   170     CONTINUE                                                      SVD14300
  144. C                                                                       SVD14400
  145. C     COPY THE BIDIAGONAL MATRIX INTO THE ARRAY S() FOR QRBD.           SVD14500
  146. C                                                                       SVD14600
  147.       IF (N.EQ.1) GO TO 190                                             SVD14700
  148.           DO 180 J=2,N                                                  SVD14800
  149.           S(J,1)=A(J,J)                                                 SVD14900
  150.   180     S(J,2)=A(J-1,J)                                               SVD15000
  151.   190 S(1,1)=A(1,1)                                                     SVD15100
  152. C                                                                       SVD15200
  153.       NS=N                                                              SVD15300
  154.       IF (M.GE.N) GO TO 200                                             SVD15400
  155.       NS=M+1                                                            SVD15500
  156.       S(NS,1)=ZERO                                                      SVD15600
  157.       S(NS,2)=A(M,M+1)                                                  SVD15700
  158.   200 CONTINUE                                                          SVD15800
  159. C                                                                       SVD15900
  160. C     CONSTRUCT THE EXPLICIT N BY N PRODUCT MATRIX, W=Q1*Q2*...*QL*I    SVD16000
  161. C     IN THE ARRAY A().                                                 SVD16100
  162. C                                                                       SVD16200
  163.           DO 230 K=1,N                                                  SVD16300
  164.           I=N+1-K                                                       SVD16400
  165.           IF(I.GT.MIN0(M,N-2)) GO TO 210                                SVD16500
  166.           CALL H12 (2,I+1,I+2,N,A(I,1),MDA,S(I,3),A(1,I+1),1,MDA,N-I)   SVD16600
  167.   210         DO 220 J=1,N                                              SVD16700
  168.   220         A(I,J)=ZERO                                               SVD16800
  169.   230     A(I,I)=ONE                                                    SVD16900
  170. C                                                                       SVD17000
  171. C          COMPUTE THE SVD OF THE BIDIAGONAL MATRIX                     SVD17100
  172. C                                                                       SVD17200
  173.       CALL QRBD (IPASS,S(1,1),S(1,2),NS,A,MDA,N,B,MDB,NB)               SVD17300
  174. C                                                                       SVD17400
  175.       GO TO (240,310), IPASS                                            SVD17500
  176.   240 CONTINUE                                                          SVD17600
  177.       IF (NS.GE.N) GO TO 260                                            SVD17700
  178.       NSP1=NS+1                                                         SVD17800
  179.           DO 250 J=NSP1,N                                               SVD17900
  180.   250     S(J,1)=ZERO                                                   SVD18000
  181.   260 CONTINUE                                                          SVD18100
  182.       IF (N.EQ.NN) RETURN                                               SVD18200
  183.       NP1=N+1                                                           SVD18300
  184. C                                  MOVE RECORD OF PERMUTATIONS          SVD18400
  185. C                                  AND STORE ZEROS                      SVD18500
  186.           DO 280 J=NP1,NN                                               SVD18600
  187.           S(J,1)=A(1,J)                                                 SVD18700
  188.               DO 270 I=1,N                                              SVD18800
  189.   270         A(I,J)=ZERO                                               SVD18900
  190.   280     CONTINUE                                                      SVD19000
  191. C                             PERMUTE ROWS AND SET ZERO SINGULAR VALUES.SVD19100
  192.           DO 300 K=NP1,NN                                               SVD19200
  193.           I=S(K,1)                                                      SVD19300
  194.           S(K,1)=ZERO                                                   SVD19400
  195.               DO 290 J=1,NN                                             SVD19500
  196.               A(K,J)=A(I,J)                                             SVD19600
  197.   290         A(I,J)=ZERO                                               SVD19700
  198.           A(I,K)=ONE                                                    SVD19800
  199.   300     CONTINUE                                                      SVD19900
  200. C                             END.. SPECIAL FOR ZERO ROWS AND COLUMNS   SVD20000
  201.       RETURN                                                            SVD20100
  202.   310 WRITE (6,320)                                                     SVD20200
  203.       STOP                                                              SVD20300
  204.   320 FORMAT (49H CONVERGENCE FAILURE IN QR BIDIAGONAL SVD ROUTINE)     SVD20400
  205.       END                                                               SVD20500
  206. C     SUBROUTINE QRBD (IPASS,Q,E,NN,V,MDV,NRV,C,MDC,NCC)                QBD00100
  207. C     C.L.LAWSON AND R.J.HANSON, JET PROPULSION LABORATORY, 1973 JUN 12 QBD00200
  208. C     TO APPEAR IN 'SOLVING LEAST SQUARES PROBLEMS', PRENTICE-HALL, 1974QBD00300
  209. C          QR ALGORITHM FOR SINGULAR VALUES OF A BIDIAGONAL MATRIX.     QBD00400
  210. C                                                                       QBD00500
  211. C     THE BIDIAGONAL MATRIX                                             QBD00600
  212. C                                                                       QBD00700
  213. C                       (Q1,E2,0...    )                                QBD00800
  214. C                       (   Q2,E3,0... )                                QBD00900
  215. C                D=     (       .      )                                QBD01000
  216. C                       (         .   0)                                QBD01100
  217. C                       (           .EN)                                QBD01200
  218. C                       (          0,QN)                                QBD01300
  219. C                                                                       QBD01400
  220. C                 IS PRE AND POST MULTIPLIED BY                         QBD01500
  221. C                 ELEMENTARY ROTATION MATRICES                          QBD01600
  222. C                 RI AND PI SO THAT                                     QBD01700
  223. C                                                                       QBD01800
  224. C                 RK...R1*D*P1**(T)...PK**(T) = DIAG(S1,...,SN)         QBD01900
  225. C                                                                       QBD02000
  226. C                 TO WITHIN WORKING ACCURACY.                           QBD02100
  227. C                                                                       QBD02200
  228. C  1. EI AND QI OCCUPY E(I) AND Q(I) AS INPUT.                          QBD02300
  229. C                                                                       QBD02400
  230. C  2. RM...R1*C REPLACES 'C' IN STORAGE AS OUTPUT.                      QBD02500
  231. C                                                                       QBD02600
  232. C  3. V*P1**(T)...PM**(T) REPLACES 'V' IN STORAGE AS OUTPUT.            QBD02700
  233. C                                                                       QBD02800
  234. C  4. SI OCCUPIES Q(I) AS OUTPUT.                                       QBD02900
  235. C                                                                       QBD03000
  236. C  5. THE SI'S ARE NONINCREASING AND NONNEGATIVE.                       QBD03100
  237. C                                                                       QBD03200
  238. C     THIS CODE IS BASED ON THE PAPER AND 'ALGOL' CODE..                QBD03300
  239. C REF..                                                                 QBD03400
  240. C  1. REINSCH,C.H. AND GOLUB,G.H. 'SINGULAR VALUE DECOMPOSITION         QBD03500
  241. C     AND LEAST SQUARES SOLUTIONS' (NUMER. MATH.), VOL. 14,(1970).      QBD03600
  242. C                                                                       QBD03700
  243.       SUBROUTINE QRBD (IPASS,Q,E,NN,V,MDV,NRV,C,MDC,NCC)                QBD03800
  244.       LOGICAL WNTV ,HAVERS,FAIL                                         QBD03900
  245.       DIMENSION Q(NN),E(NN),V(MDV,NN),C(MDC,NCC)                        QBD04000
  246.       ZERO=0.                                                           QBD04100
  247.       ONE=1.                                                            QBD04200
  248.       TWO=2.                                                            QBD04300
  249. C                                                                       QBD04400
  250.       N=NN                                                              QBD04500
  251.       IPASS=1                                                           QBD04600
  252.       IF (N.LE.0) RETURN                                                QBD04700
  253.       N10=10*N                                                          QBD04800
  254.       WNTV=NRV.GT.0                                                     QBD04900
  255.       HAVERS=NCC.GT.0                                                   QBD05000
  256.       FAIL=.FALSE.                                                      QBD05100
  257.       NQRS=0                                                            QBD05200
  258.       E(1)=ZERO                                                         QBD05300
  259.       DNORM=ZERO                                                        QBD05400
  260.            DO 10 J=1,N                                                  QBD05500
  261.    10      DNORM=AMAX1(ABS(Q(J))+ABS(E(J)),DNORM)                       QBD05600
  262.            DO 200 KK=1,N                                                QBD05700
  263.            K=N+1-KK                                                     QBD05800
  264. C                                                                       QBD05900
  265. C     TEST FOR SPLITTING OR RANK DEFICIENCIES..                         QBD06000
  266. C         FIRST MAKE TEST FOR LAST DIAGONAL TERM, Q(K), BEING SMALL.    QBD06100
  267.    20       IF(K.EQ.1) GO TO 50                                         QBD06200
  268.             IF(DIFF(DNORM+Q(K),DNORM)) 50,25,50                         QBD06300
  269. C                                                                       QBD06400
  270. C     SINCE Q(K) IS SMALL WE WILL MAKE A SPECIAL PASS TO                QBD06500
  271. C     TRANSFORM E(K) TO ZERO.                                           QBD06600
  272. C                                                                       QBD06700
  273.    25      CS=ZERO                                                      QBD06800
  274.            SN=-ONE                                                      QBD06900
  275.                 DO 40 II=2,K                                            QBD07000
  276.                 I=K+1-II                                                QBD07100
  277.                 F=-SN*E(I+1)                                            QBD07200
  278.                 E(I+1)=CS*E(I+1)                                        QBD07300
  279.                 CALL G1 (Q(I),F,CS,SN,Q(I))                             QBD07400
  280. C         TRANSFORMATION CONSTRUCTED TO ZERO POSITION (I,K).            QBD07500
  281. C                                                                       QBD07600
  282.                 IF (.NOT.WNTV) GO TO 40                                 QBD07700
  283.                      DO 30 J=1,NRV                                      QBD07800
  284.    30                CALL G2 (CS,SN,V(J,I),V(J,K))                      QBD07900
  285. C              ACCUMULATE RT. TRANSFORMATIONS IN V.                     QBD08000
  286. C                                                                       QBD08100
  287.    40           CONTINUE                                                QBD08200
  288. C                                                                       QBD08300
  289. C         THE MATRIX IS NOW BIDIAGONAL, AND OF LOWER ORDER              QBD08400
  290. C         SINCE E(K) .EQ. ZERO..                                        QBD08500
  291. C                                                                       QBD08600
  292.    50           DO 60 LL=1,K                                            QBD08700
  293.                 L=K+1-LL                                                QBD08800
  294.                 IF(DIFF(DNORM+E(L),DNORM)) 55,100,55                    QBD08900
  295.    55           IF(DIFF(DNORM+Q(L-1),DNORM)) 60,70,60                   QBD09000
  296.    60           CONTINUE                                                QBD09100
  297. C     THIS LOOP CAN'T COMPLETE SINCE E(1) = ZERO.                       QBD09200
  298. C                                                                       QBD09300
  299.            GO TO 100                                                    QBD09400
  300. C                                                                       QBD09500
  301. C         CANCELLATION OF E(L), L.GT.1.                                 QBD09600
  302.    70      CS=ZERO                                                      QBD09700
  303.            SN=-ONE                                                      QBD09800
  304.                 DO 90 I=L,K                                             QBD09900
  305.                 F=-SN*E(I)                                              QBD10000
  306.                 E(I)=CS*E(I)                                            QBD10100
  307.                 IF(DIFF(DNORM+F,DNORM)) 75,100,75                       QBD10200
  308.    75           CALL G1 (Q(I),F,CS,SN,Q(I))                             QBD10300
  309.                 IF (.NOT.HAVERS) GO TO 90                               QBD10400
  310.                      DO 80 J=1,NCC                                      QBD10500
  311.    80                CALL G2 (CS,SN,C(I,J),C(L-1,J))                    QBD10600
  312.    90           CONTINUE                                                QBD10700
  313. C                                                                       QBD10800
  314. C         TEST FOR CONVERGENCE..                                        QBD10900
  315.   100      Z=Q(K)                                                       QBD11000
  316.            IF (L.EQ.K) GO TO 170                                        QBD11100
  317. C                                                                       QBD11200
  318. C         SHIFT FROM BOTTOM 2 BY 2 MINOR OF B**(T)*B.                   QBD11300
  319.            X=Q(L)                                                       QBD11400
  320.            Y=Q(K-1)                                                     QBD11500
  321.            G=E(K-1)                                                     QBD11600
  322.            H=E(K)                                                       QBD11700
  323.            F=((Y-Z)*(Y+Z)+(G-H)*(G+H))/(TWO*H*Y)                        QBD11800
  324.            G=SQRT(ONE+F**2)                                             QBD11900
  325.            IF (F.LT.ZERO) GO TO 110                                     QBD12000
  326.            T=F+G                                                        QBD12100
  327.            GO TO 120                                                    QBD12200
  328.   110      T=F-G                                                        QBD12300
  329.   120      F=((X-Z)*(X+Z)+H*(Y/T-H))/X                                  QBD12400
  330. C                                                                       QBD12500
  331. C         NEXT QR SWEEP..                                               QBD12600
  332.            CS=ONE                                                       QBD12700
  333.            SN=ONE                                                       QBD12800
  334.            LP1=L+1                                                      QBD12900
  335.                 DO 160 I=LP1,K                                          QBD13000
  336.                 G=E(I)                                                  QBD13100
  337.                 Y=Q(I)                                                  QBD13200
  338.                 H=SN*G                                                  QBD13300
  339.                 G=CS*G                                                  QBD13400
  340.                 CALL G1 (F,H,CS,SN,E(I-1))                              QBD13500
  341.                 F=X*CS+G*SN                                             QBD13600
  342.                 G=-X*SN+G*CS                                            QBD13700
  343.                 H=Y*SN                                                  QBD13800
  344.                 Y=Y*CS                                                  QBD13900
  345.                 IF (.NOT.WNTV) GO TO 140                                QBD14000
  346. C                                                                       QBD14100
  347. C              ACCUMULATE ROTATIONS (FROM THE RIGHT) IN 'V'             QBD14200
  348.                      DO 130 J=1,NRV                                     QBD14300
  349.   130                CALL G2 (CS,SN,V(J,I-1),V(J,I))                    QBD14400
  350.   140           CALL G1 (F,H,CS,SN,Q(I-1))                              QBD14500
  351.                 F=CS*G+SN*Y                                             QBD14600
  352.                 X=-SN*G+CS*Y                                            QBD14700
  353.                 IF (.NOT.HAVERS) GO TO 160                              QBD14800
  354.                      DO 150 J=1,NCC                                     QBD14900
  355.   150                CALL G2 (CS,SN,C(I-1,J),C(I,J))                    QBD15000
  356. C              APPLY ROTATIONS FROM THE LEFT TO                         QBD15100
  357. C              RIGHT HAND SIDES IN 'C'..                                QBD15200
  358. C                                                                       QBD15300
  359.   160           CONTINUE                                                QBD15400
  360.            E(L)=ZERO                                                    QBD15500
  361.            E(K)=F                                                       QBD15600
  362.            Q(K)=X                                                       QBD15700
  363.            NQRS=NQRS+1                                                  QBD15800
  364.            IF (NQRS.LE.N10) GO TO 20                                    QBD15900
  365. C          RETURN TO 'TEST FOR SPLITTING'.                              QBD16000
  366. C                                                                       QBD16100
  367.            FAIL=.TRUE.                                                  QBD16200
  368. C     ..                                                                QBD16300
  369. C     CUTOFF FOR CONVERGENCE FAILURE. 'NQRS' WILL BE 2*N USUALLY.       QBD16400
  370.   170      IF (Z.GE.ZERO) GO TO 190                                     QBD16500
  371.            Q(K)=-Z                                                      QBD16600
  372.            IF (.NOT.WNTV) GO TO 190                                     QBD16700
  373.                 DO 180 J=1,NRV                                          QBD16800
  374.   180           V(J,K)=-V(J,K)                                          QBD16900
  375.   190      CONTINUE                                                     QBD17000
  376. C         CONVERGENCE. Q(K) IS MADE NONNEGATIVE..                       QBD17100
  377. C                                                                       QBD17200
  378.   200      CONTINUE                                                     QBD17300
  379.       IF (N.EQ.1) RETURN                                                QBD17400
  380.            DO 210 I=2,N                                                 QBD17500
  381.            IF (Q(I).GT.Q(I-1)) GO TO 220                                QBD17600
  382.   210      CONTINUE                                                     QBD17700
  383.       IF (FAIL) IPASS=2                                                 QBD17800
  384.       RETURN                                                            QBD17900
  385. C     ..                                                                QBD18000
  386. C     EVERY SINGULAR VALUE IS IN ORDER..                                QBD18100
  387.   220      DO 270 I=2,N                                                 QBD18200
  388.            T=Q(I-1)                                                     QBD18300
  389.            K=I-1                                                        QBD18400
  390.                 DO 230 J=I,N                                            QBD18500
  391.                 IF (T.GE.Q(J)) GO TO 230                                QBD18600
  392.                 T=Q(J)                                                  QBD18700
  393.                 K=J                                                     QBD18800
  394.   230           CONTINUE                                                QBD18900
  395.            IF (K.EQ.I-1) GO TO 270                                      QBD19000
  396.            Q(K)=Q(I-1)                                                  QBD19100
  397.            Q(I-1)=T                                                     QBD19200
  398.            IF (.NOT.HAVERS) GO TO 250                                   QBD19300
  399.                 DO 240 J=1,NCC                                          QBD19400
  400.                 T=C(I-1,J)                                              QBD19500
  401.                 C(I-1,J)=C(K,J)                                         QBD19600
  402.   240           C(K,J)=T                                                QBD19700
  403.   250      IF (.NOT.WNTV) GO TO 270                                     QBD19800
  404.                 DO 260 J=1,NRV                                          QBD19900
  405.                 T=V(J,I-1)                                              QBD20000
  406.                 V(J,I-1)=V(J,K)                                         QBD20100
  407.   260           V(J,K)=T                                                QBD20200
  408.   270      CONTINUE                                                     QBD20300
  409. C         END OF ORDERING ALGORITHM.                                    QBD20400
  410. C                                                                       QBD20500
  411.       IF (FAIL) IPASS=2                                                 QBD20600
  412.       RETURN                                                            QBD20700
  413.       END                                                               QBD20800
  414.