page@swan.ulowell.edu (Bob Page) (11/03/88)
Submitted-by: strovink%galaxy-43@afit-ab.arpa (Mark A. Strovink) Posting-number: Volume 2, Issue 45 Archive-name: applications/matlab/src.5 # This is a shell archive. # Remove everything above and including the cut line. # Then run the rest of the file through sh. #----cut here-----cut here-----cut here-----cut here----# #!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # src-5 # This archive created: Wed Nov 2 16:20:35 1988 cat << \SHAR_EOF > src-5 IF (N .LT. KP1) GO TO 100 DO 90 J = KP1, N TR = AR(K,J) TI = AI(K,J) AR(K,J) = 0.0D0 AI(K,J) = 0.0D0 CALL WAXPY(K,TR,TI,AR(1,K),AI(1,K),1,AR(1,J),AI(1,J),1) 90 CONTINUE 100 CONTINUE 110 CONTINUE C C FORM INVERSE(U)*INVERSE(L) C NM1 = N - 1 IF (NM1 .LT. 1) GO TO 150 DO 140 KB = 1, NM1 K = N - KB KP1 = K + 1 DO 120 I = KP1, N WORKR(I) = AR(I,K) WORKI(I) = AI(I,K) AR(I,K) = 0.0D0 AI(I,K) = 0.0D0 120 CONTINUE DO 130 J = KP1, N TR = WORKR(J) TI = WORKI(J) CALL WAXPY(N,TR,TI,AR(1,J),AI(1,J),1,AR(1,K),AI(1,K),1) 130 CONTINUE L = IPVT(K) IF (L .NE. K) * CALL WSWAP(N,AR(1,K),AI(1,K),1,AR(1,L),AI(1,L),1) 140 CONTINUE 150 CONTINUE 160 CONTINUE RETURN END SUBROUTINE WPOFA(AR,AI,LDA,N,INFO) DOUBLE PRECISION AR(LDA,1),AI(LDA,1) DOUBLE PRECISION S,TR,TI,WDOTCR,WDOTCI DO 30 J = 1, N INFO = J S = 0.0D0 JM1 = J-1 IF (JM1 .LT. 1) GO TO 20 DO 10 K = 1, JM1 TR = AR(K,J)-WDOTCR(K-1,AR(1,K),AI(1,K),1,AR(1,J),AI(1,J),1) TI = AI(K,J)-WDOTCI(K-1,AR(1,K),AI(1,K),1,AR(1,J),AI(1,J),1) CALL WDIV(TR,TI,AR(K,K),AI(K,K),TR,TI) AR(K,J) = TR AI(K,J) = TI S = S + TR*TR + TI*TI 10 CONTINUE 20 CONTINUE S = AR(J,J) - S IF (S.LE.0.0D0 .OR. AI(J,J).NE.0.0D0) GO TO 40 AR(J,J) = DSQRT(S) 30 CONTINUE INFO = 0 40 RETURN END SUBROUTINE RREF(AR,AI,LDA,M,N,EPS) DOUBLE PRECISION AR(LDA,1),AI(LDA,1),EPS,TOL,TR,TI,WASUM TOL = 0.0D0 DO 10 J = 1, N TOL = DMAX1(TOL,WASUM(M,AR(1,J),AI(1,J),1)) 10 CONTINUE TOL = EPS*DFLOAT(2*MAX0(M,N))*TOL K = 1 L = 1 20 IF (K.GT.M .OR. L.GT.N) RETURN I = IWAMAX(M-K+1,AR(K,L),AI(K,L),1) + K-1 IF (DABS(AR(I,L))+DABS(AI(I,L)) .GT. TOL) GO TO 30 CALL WSET(M-K+1,0.0D0,0.0D0,AR(K,L),AI(K,L),1) L = L+1 GO TO 20 30 CALL WSWAP(N-L+1,AR(I,L),AI(I,L),LDA,AR(K,L),AI(K,L),LDA) CALL WDIV(1.0D0,0.0D0,AR(K,L),AI(K,L),TR,TI) CALL WSCAL(N-L+1,TR,TI,AR(K,L),AI(K,L),LDA) AR(K,L) = 1.0D0 AI(K,L) = 0.0D0 DO 40 I = 1, M TR = -AR(I,L) TI = -AI(I,L) IF (I .NE. K) CALL WAXPY(N-L+1,TR,TI, $ AR(K,L),AI(K,L),LDA,AR(I,L),AI(I,L),LDA) 40 CONTINUE K = K+1 L = L+1 GO TO 20 END SUBROUTINE HILBER(A,LDA,N) DOUBLE PRECISION A(LDA,N) C GENERATE INVERSE HILBERT MATRIX DOUBLE PRECISION P,R P = DFLOAT(N) DO 20 I = 1, N IF (I.NE.1) P = (DFLOAT(N-I+1)*P*DFLOAT(N+I-1))/DFLOAT(I-1)**2 R = P*P A(I,I) = R/DFLOAT(2*I-1) IF (I.EQ.N) GO TO 20 IP1 = I+1 DO 10 J = IP1, N R = -(DFLOAT(N-J+1)*R*(N+J-1))/DFLOAT(J-1)**2 A(I,J) = R/DFLOAT(I+J-1) A(J,I) = A(I,J) 10 CONTINUE 20 CONTINUE RETURN END SUBROUTINE HTRIDI(NM,N,AR,AI,D,E,E2,TAU) C INTEGER I,J,K,L,N,II,NM,JP1 DOUBLE PRECISION AR(NM,N),AI(NM,N),D(N),E(N),E2(N),TAU(2,N) DOUBLE PRECISION F,G,H,FI,GI,HH,SI,SCALE DOUBLE PRECISION FLOP,PYTHAG C C THIS SUBROUTINE IS A TRANSLATION OF A COMPLEX ANALOGUE OF C THE ALGOL PROCEDURE TRED1, NUM. MATH. 11, 181-195(1968) C BY MARTIN, REINSCH, AND WILKINSON. C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971). C C THIS SUBROUTINE REDUCES A COMPLEX HERMITIAN MATRIX C TO A REAL SYMMETRIC TRIDIAGONAL MATRIX USING C UNITARY SIMILARITY TRANSFORMATIONS. C C ON INPUT. C C NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL C ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM C DIMENSION STATEMENT. C C N IS THE ORDER OF THE MATRIX. C C AR AND AI CONTAIN THE REAL AND IMAGINARY PARTS, C RESPECTIVELY, OF THE COMPLEX HERMITIAN INPUT MATRIX. C ONLY THE LOWER TRIANGLE OF THE MATRIX NEED BE SUPPLIED. C C ON OUTPUT. C C AR AND AI CONTAIN INFORMATION ABOUT THE UNITARY TRANS- C FORMATIONS USED IN THE REDUCTION IN THEIR FULL LOWER C TRIANGLES. THEIR STRICT UPPER TRIANGLES AND THE C DIAGONAL OF AR ARE UNALTERED. C C D CONTAINS THE DIAGONAL ELEMENTS OF THE THE TRIDIAGONAL MATRIX. C C E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE TRIDIAGONAL C MATRIX IN ITS LAST N-1 POSITIONS. E(1) IS SET TO ZERO. C C E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E. C E2 MAY COINCIDE WITH E IF THE SQUARES ARE NOT NEEDED. C C TAU CONTAINS FURTHER INFORMATION ABOUT THE TRANSFORMATIONS. C C MODIFIED TO GET RID OF ALL COMPLEX ARITHMETIC, C. MOLER, 6/27/79. C C QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO B. S. GARBOW, C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY C C ------------------------------------------------------------------ C TAU(1,N) = 1.0D0 TAU(2,N) = 0.0D0 C DO 100 I = 1, N 100 D(I) = AR(I,I) C .......... FOR I=N STEP -1 UNTIL 1 DO -- .......... DO 300 II = 1, N I = N + 1 - II L = I - 1 H = 0.0D0 SCALE = 0.0D0 IF (L .LT. 1) GO TO 130 C .......... SCALE ROW (ALGOL TOL THEN NOT NEEDED) .......... DO 120 K = 1, L 120 SCALE = FLOP(SCALE + DABS(AR(I,K)) + DABS(AI(I,K))) C IF (SCALE .NE. 0.0D0) GO TO 140 TAU(1,L) = 1.0D0 TAU(2,L) = 0.0D0 130 E(I) = 0.0D0 E2(I) = 0.0D0 GO TO 290 C 140 DO 150 K = 1, L AR(I,K) = FLOP(AR(I,K)/SCALE) AI(I,K) = FLOP(AI(I,K)/SCALE) H = FLOP(H + AR(I,K)*AR(I,K) + AI(I,K)*AI(I,K)) 150 CONTINUE C E2(I) = FLOP(SCALE*SCALE*H) G = FLOP(DSQRT(H)) E(I) = FLOP(SCALE*G) F = PYTHAG(AR(I,L),AI(I,L)) C .......... FORM NEXT DIAGONAL ELEMENT OF MATRIX T .......... IF (F .EQ. 0.0D0) GO TO 160 TAU(1,L) = FLOP((AI(I,L)*TAU(2,I) - AR(I,L)*TAU(1,I))/F) SI = FLOP((AR(I,L)*TAU(2,I) + AI(I,L)*TAU(1,I))/F) H = FLOP(H + F*G) G = FLOP(1.0D0 + G/F) AR(I,L) = FLOP(G*AR(I,L)) AI(I,L) = FLOP(G*AI(I,L)) IF (L .EQ. 1) GO TO 270 GO TO 170 160 TAU(1,L) = -TAU(1,I) SI = TAU(2,I) AR(I,L) = G 170 F = 0.0D0 C DO 240 J = 1, L G = 0.0D0 GI = 0.0D0 C .......... FORM ELEMENT OF A*U .......... DO 180 K = 1, J G = FLOP(G + AR(J,K)*AR(I,K) + AI(J,K)*AI(I,K)) GI = FLOP(GI - AR(J,K)*AI(I,K) + AI(J,K)*AR(I,K)) 180 CONTINUE C JP1 = J + 1 IF (L .LT. JP1) GO TO 220 C DO 200 K = JP1, L G = FLOP(G + AR(K,J)*AR(I,K) - AI(K,J)*AI(I,K)) GI = FLOP(GI - AR(K,J)*AI(I,K) - AI(K,J)*AR(I,K)) 200 CONTINUE C .......... FORM ELEMENT OF P .......... 220 E(J) = FLOP(G/H) TAU(2,J) = FLOP(GI/H) F = FLOP(F + E(J)*AR(I,J) - TAU(2,J)*AI(I,J)) 240 CONTINUE C HH = FLOP(F/(H + H)) C .......... FORM REDUCED A .......... DO 260 J = 1, L F = AR(I,J) G = FLOP(E(J) - HH*F) E(J) = G FI = -AI(I,J) GI = FLOP(TAU(2,J) - HH*FI) TAU(2,J) = -GI C DO 260 K = 1, J AR(J,K) = FLOP(AR(J,K) - F*E(K) - G*AR(I,K) X + FI*TAU(2,K) + GI*AI(I,K)) AI(J,K) = FLOP(AI(J,K) - F*TAU(2,K) - G*AI(I,K) X - FI*E(K) - GI*AR(I,K)) 260 CONTINUE C 270 DO 280 K = 1, L AR(I,K) = FLOP(SCALE*AR(I,K)) AI(I,K) = FLOP(SCALE*AI(I,K)) 280 CONTINUE C TAU(2,L) = -SI 290 HH = D(I) D(I) = AR(I,I) AR(I,I) = HH AI(I,I) = FLOP(SCALE*DSQRT(H)) 300 CONTINUE C RETURN END SUBROUTINE HTRIBK(NM,N,AR,AI,TAU,M,ZR,ZI) C INTEGER I,J,K,L,M,N,NM DOUBLE PRECISION AR(NM,N),AI(NM,N),TAU(2,N),ZR(NM,M),ZI(NM,M) DOUBLE PRECISION H,S,SI,FLOP C C THIS SUBROUTINE IS A TRANSLATION OF A COMPLEX ANALOGUE OF C THE ALGOL PROCEDURE TRBAK1, NUM. MATH. 11, 181-195(1968) C BY MARTIN, REINSCH, AND WILKINSON. C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971). C C THIS SUBROUTINE FORMS THE EIGENVECTORS OF A COMPLEX HERMITIAN C MATRIX BY BACK TRANSFORMING THOSE OF THE CORRESPONDING C REAL SYMMETRIC TRIDIAGONAL MATRIX DETERMINED BY HTRIDI. C C ON INPUT. C C NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL C ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM C DIMENSION STATEMENT. C C N IS THE ORDER OF THE MATRIX. C C AR AND AI CONTAIN INFORMATION ABOUT THE UNITARY TRANS- C FORMATIONS USED IN THE REDUCTION BY HTRIDI IN THEIR C FULL LOWER TRIANGLES EXCEPT FOR THE DIAGONAL OF AR. C C TAU CONTAINS FURTHER INFORMATION ABOUT THE TRANSFORMATIONS. C C M IS THE NUMBER OF EIGENVECTORS TO BE BACK TRANSFORMED. C C ZR CONTAINS THE EIGENVECTORS TO BE BACK TRANSFORMED C IN ITS FIRST M COLUMNS. C C ON OUTPUT. C C ZR AND ZI CONTAIN THE REAL AND IMAGINARY PARTS, C RESPECTIVELY, OF THE TRANSFORMED EIGENVECTORS C IN THEIR FIRST M COLUMNS. C C NOTE THAT THE LAST COMPONENT OF EACH RETURNED VECTOR C IS REAL AND THAT VECTOR EUCLIDEAN NORMS ARE PRESERVED. C C QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO B. S. GARBOW, C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY C C ------------------------------------------------------------------ C IF (M .EQ. 0) GO TO 200 C .......... TRANSFORM THE EIGENVECTORS OF THE REAL SYMMETRIC C TRIDIAGONAL MATRIX TO THOSE OF THE HERMITIAN C TRIDIAGONAL MATRIX. .......... DO 50 K = 1, N C DO 50 J = 1, M ZI(K,J) = FLOP(-ZR(K,J)*TAU(2,K)) ZR(K,J) = FLOP(ZR(K,J)*TAU(1,K)) 50 CONTINUE C IF (N .EQ. 1) GO TO 200 C .......... RECOVER AND APPLY THE HOUSEHOLDER MATRICES .......... DO 140 I = 2, N L = I - 1 H = AI(I,I) IF (H .EQ. 0.0D0) GO TO 140 C DO 130 J = 1, M S = 0.0D0 SI = 0.0D0 C DO 110 K = 1, L S = FLOP(S + AR(I,K)*ZR(K,J) - AI(I,K)*ZI(K,J)) SI = FLOP(SI + AR(I,K)*ZI(K,J) + AI(I,K)*ZR(K,J)) 110 CONTINUE C .......... DOUBLE DIVISIONS AVOID POSSIBLE UNDERFLOW .......... S = FLOP((S/H)/H) SI = FLOP((SI/H)/H) C DO 120 K = 1, L ZR(K,J) = FLOP(ZR(K,J) - S*AR(I,K) - SI*AI(I,K)) ZI(K,J) = FLOP(ZI(K,J) - SI*AR(I,K) + S*AI(I,K)) 120 CONTINUE C 130 CONTINUE C 140 CONTINUE C 200 RETURN END SUBROUTINE IMTQL2(NM,N,D,E,Z,IERR,JOB) C INTEGER I,J,K,L,M,N,II,NM,MML,IERR DOUBLE PRECISION D(N),E(N),Z(NM,N) DOUBLE PRECISION B,C,F,G,P,R,S DOUBLE PRECISION FLOP C C THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE IMTQL2, C NUM. MATH. 12, 377-383(1968) BY MARTIN AND WILKINSON, C AS MODIFIED IN NUM. MATH. 15, 450(1970) BY DUBRULLE. C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 241-248(1971). C C THIS SUBROUTINE FINDS THE EIGENVALUES AND EIGENVECTORS C OF A SYMMETRIC TRIDIAGONAL MATRIX BY THE IMPLICIT QL METHOD. C THE EIGENVECTORS OF A FULL SYMMETRIC MATRIX CAN ALSO C BE FOUND IF TRED2 HAS BEEN USED TO REDUCE THIS C FULL MATRIX TO TRIDIAGONAL FORM. C C ON INPUT. C C NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL C ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM C DIMENSION STATEMENT. C C N IS THE ORDER OF THE MATRIX. C C D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX. C C E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE INPUT MATRIX C IN ITS LAST N-1 POSITIONS. E(1) IS ARBITRARY. C C Z CONTAINS THE TRANSFORMATION MATRIX PRODUCED IN THE C REDUCTION BY TRED2, IF PERFORMED. IF THE EIGENVECTORS C OF THE TRIDIAGONAL MATRIX ARE DESIRED, Z MUST CONTAIN C THE IDENTITY MATRIX. C C ON OUTPUT. C C D CONTAINS THE EIGENVALUES IN ASCENDING ORDER. IF AN C ERROR EXIT IS MADE, THE EIGENVALUES ARE CORRECT BUT C UNORDERED FOR INDICES 1,2,...,IERR-1. C C E HAS BEEN DESTROYED. C C Z CONTAINS ORTHONORMAL EIGENVECTORS OF THE SYMMETRIC C TRIDIAGONAL (OR FULL) MATRIX. IF AN ERROR EXIT IS MADE, C Z CONTAINS THE EIGENVECTORS ASSOCIATED WITH THE STORED C EIGENVALUES. C C IERR IS SET TO C ZERO FOR NORMAL RETURN, C J IF THE J-TH EIGENVALUE HAS NOT BEEN C DETERMINED AFTER 30 ITERATIONS. C C QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO B. S. GARBOW, C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY C C ------------------------------------------------------------------ C C C***** C MODIFIED BY C. MOLER TO ELIMINATE MACHEP 11/22/78 C MODIFIED TO ADD JOB PARAMETER 08/27/79 C***** IERR = 0 IF (N .EQ. 1) GO TO 1001 C DO 100 I = 2, N 100 E(I-1) = E(I) C E(N) = 0.0D0 C DO 240 L = 1, N J = 0 C .......... LOOK FOR SMALL SUB-DIAGONAL ELEMENT .......... 105 DO 110 M = L, N IF (M .EQ. N) GO TO 120 C***** P = FLOP(DABS(D(M)) + DABS(D(M+1))) S = FLOP(P + DABS(E(M))) IF (P .EQ. S) GO TO 120 C***** 110 CONTINUE C 120 P = D(L) IF (M .EQ. L) GO TO 240 IF (J .EQ. 30) GO TO 1000 J = J + 1 C .......... FORM SHIFT .......... G = FLOP((D(L+1) - P)/(2.0D0*E(L))) R = FLOP(DSQRT(G*G+1.0D0)) G = FLOP(D(M) - P + E(L)/(G + DSIGN(R,G))) S = 1.0D0 C = 1.0D0 P = 0.0D0 MML = M - L C .......... FOR I=M-1 STEP -1 UNTIL L DO -- .......... DO 200 II = 1, MML I = M - II F = FLOP(S*E(I)) B = FLOP(C*E(I)) IF (DABS(F) .LT. DABS(G)) GO TO 150 C = FLOP(G/F) R = FLOP(DSQRT(C*C+1.0D0)) E(I+1) = FLOP(F*R) S = FLOP(1.0D0/R) C = FLOP(C*S) GO TO 160 150 S = FLOP(F/G) R = FLOP(DSQRT(S*S+1.0D0)) E(I+1) = FLOP(G*R) C = FLOP(1.0D0/R) S = FLOP(S*C) 160 G = FLOP(D(I+1) - P) R = FLOP((D(I) - G)*S + 2.0D0*C*B) P = FLOP(S*R) D(I+1) = G + P G = FLOP(C*R - B) IF (JOB .EQ. 0) GO TO 185 C .......... FORM VECTOR .......... DO 180 K = 1, N F = Z(K,I+1) Z(K,I+1) = FLOP(S*Z(K,I) + C*F) Z(K,I) = FLOP(C*Z(K,I) - S*F) 180 CONTINUE 185 CONTINUE C 200 CONTINUE C D(L) = FLOP(D(L) - P) E(L) = G E(M) = 0.0D0 GO TO 105 240 CONTINUE C .......... ORDER EIGENVALUES AND EIGENVECTORS .......... DO 300 II = 2, N I = II - 1 K = I P = D(I) C DO 260 J = II, N IF (D(J) .GE. P) GO TO 260 K = J P = D(J) 260 CONTINUE C IF (K .EQ. I) GO TO 300 D(K) = D(I) D(I) = P C IF (JOB .EQ. 0) GO TO 285 DO 280 J = 1, N P = Z(J,I) Z(J,I) = Z(J,K) Z(J,K) = P 280 CONTINUE 285 CONTINUE C 300 CONTINUE C GO TO 1001 C .......... SET ERROR -- NO CONVERGENCE TO AN C EIGENVALUE AFTER 30 ITERATIONS .......... 1000 IERR = L 1001 RETURN END SUBROUTINE CORTH(NM,N,LOW,IGH,AR,AI,ORTR,ORTI) C INTEGER I,J,M,N,II,JJ,LA,MP,NM,IGH,KP1,LOW DOUBLE PRECISION AR(NM,N),AI(NM,N),ORTR(IGH),ORTI(IGH) DOUBLE PRECISION F,G,H,FI,FR,SCALE DOUBLE PRECISION FLOP,PYTHAG C C THIS SUBROUTINE IS A TRANSLATION OF A COMPLEX ANALOGUE OF C THE ALGOL PROCEDURE ORTHES, NUM. MATH. 12, 349-368(1968) C BY MARTIN AND WILKINSON. C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 339-358(1971). C C GIVEN A COMPLEX GENERAL MATRIX, THIS SUBROUTINE C REDUCES A SUBMATRIX SITUATED IN ROWS AND COLUMNS C LOW THROUGH IGH TO UPPER HESSENBERG FORM BY C UNITARY SIMILARITY TRANSFORMATIONS. C C ON INPUT. C C NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL C ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM C DIMENSION STATEMENT. C C N IS THE ORDER OF THE MATRIX. C C LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING C SUBROUTINE CBAL. IF CBAL HAS NOT BEEN USED, C SET LOW=1, IGH=N. C C AR AND AI CONTAIN THE REAL AND IMAGINARY PARTS, C RESPECTIVELY, OF THE COMPLEX INPUT MATRIX. C C ON OUTPUT. C C AR AND AI CONTAIN THE REAL AND IMAGINARY PARTS, C RESPECTIVELY, OF THE HESSENBERG MATRIX. INFORMATION C ABOUT THE UNITARY TRANSFORMATIONS USED IN THE REDUCTION C IS STORED IN THE REMAINING TRIANGLES UNDER THE C HESSENBERG MATRIX. C C ORTR AND ORTI CONTAIN FURTHER INFORMATION ABOUT THE C TRANSFORMATIONS. ONLY ELEMENTS LOW THROUGH IGH ARE USED. C C QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO B. S. GARBOW, C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY C C ------------------------------------------------------------------ C LA = IGH - 1 KP1 = LOW + 1 IF (LA .LT. KP1) GO TO 200 C DO 180 M = KP1, LA H = 0.0D0 ORTR(M) = 0.0D0 ORTI(M) = 0.0D0 SCALE = 0.0D0 C .......... SCALE COLUMN (ALGOL TOL THEN NOT NEEDED) .......... DO 90 I = M, IGH 90 SCALE = FLOP(SCALE + DABS(AR(I,M-1)) + DABS(AI(I,M-1))) C IF (SCALE .EQ. 0.0D0) GO TO 180 MP = M + IGH C .......... FOR I=IGH STEP -1 UNTIL M DO -- .......... DO 100 II = M, IGH I = MP - II ORTR(I) = FLOP(AR(I,M-1)/SCALE) ORTI(I) = FLOP(AI(I,M-1)/SCALE) H = FLOP(H + ORTR(I)*ORTR(I) + ORTI(I)*ORTI(I)) 100 CONTINUE C G = FLOP(DSQRT(H)) F = PYTHAG(ORTR(M),ORTI(M)) IF (F .EQ. 0.0D0) GO TO 103 H = FLOP(H + F*G) G = FLOP(G/F) ORTR(M) = FLOP((1.0D0 + G)*ORTR(M)) ORTI(M) = FLOP((1.0D0 + G)*ORTI(M)) GO TO 105 C 103 ORTR(M) = G AR(M,M-1) = SCALE C .......... FORM (I-(U*UT)/H)*A .......... 105 DO 130 J = M, N FR = 0.0D0 FI = 0.0D0 C .......... FOR I=IGH STEP -1 UNTIL M DO -- .......... DO 110 II = M, IGH I = MP - II FR = FLOP(FR + ORTR(I)*AR(I,J) + ORTI(I)*AI(I,J)) FI = FLOP(FI + ORTR(I)*AI(I,J) - ORTI(I)*AR(I,J)) 110 CONTINUE C FR = FLOP(FR/H) FI = FLOP(FI/H) C DO 120 I = M, IGH AR(I,J) = FLOP(AR(I,J) - FR*ORTR(I) + FI*ORTI(I)) AI(I,J) = FLOP(AI(I,J) - FR*ORTI(I) - FI*ORTR(I)) 120 CONTINUE C 130 CONTINUE C .......... FORM (I-(U*UT)/H)*A*(I-(U*UT)/H) .......... DO 160 I = 1, IGH FR = 0.0D0 FI = 0.0D0 C .......... FOR J=IGH STEP -1 UNTIL M DO -- .......... DO 140 JJ = M, IGH J = MP - JJ FR = FLOP(FR + ORTR(J)*AR(I,J) - ORTI(J)*AI(I,J)) FI = FLOP(FI + ORTR(J)*AI(I,J) + ORTI(J)*AR(I,J)) 140 CONTINUE C FR = FLOP(FR/H) FI = FLOP(FI/H) C DO 150 J = M, IGH AR(I,J) = FLOP(AR(I,J) - FR*ORTR(J) - FI*ORTI(J)) AI(I,J) = FLOP(AI(I,J) + FR*ORTI(J) - FI*ORTR(J)) 150 CONTINUE C 160 CONTINUE C ORTR(M) = FLOP(SCALE*ORTR(M)) ORTI(M) = FLOP(SCALE*ORTI(M)) AR(M,M-1) = FLOP(-G*AR(M,M-1)) AI(M,M-1) = FLOP(-G*AI(M,M-1)) 180 CONTINUE C 200 RETURN END SUBROUTINE COMQR3(NM,N,LOW,IGH,ORTR,ORTI,HR,HI,WR,WI,ZR,ZI,IERR * ,JOB) C***** C MODIFICATION OF EISPACK COMQR2 TO ADD JOB PARAMETER C JOB = 0 OUTPUT H = SCHUR TRIANGULAR FORM, Z NOT USED C = 1 OUTPUT H = SCHUR FORM, Z = UNITARY SIMILARITY C = 2 SAME AS COMQR2 C = 3 OUTPUT H = HESSENBERG FORM, Z = UNITARY SIMILARITY C ALSO ELIMINATE MACHEP C C. MOLER, 11/22/78 AND 09/14/80 C OVERFLOW CONTROL IN EIGENVECTOR BACKSUBSTITUTION, 3/16/82 C***** C INTEGER I,J,K,L,M,N,EN,II,JJ,LL,NM,NN,IGH,IP1, X ITN,ITS,LOW,LP1,ENM1,IEND,IERR DOUBLE PRECISION HR(NM,N),HI(NM,N),WR(N),WI(N),ZR(NM,N),ZI(NM,N), X ORTR(IGH),ORTI(IGH) DOUBLE PRECISION SI,SR,TI,TR,XI,XR,YI,YR,ZZI,ZZR,NORM DOUBLE PRECISION FLOP,PYTHAG C C THIS SUBROUTINE IS A TRANSLATION OF A UNITARY ANALOGUE OF THE C ALGOL PROCEDURE COMLR2, NUM. MATH. 16, 181-204(1970) BY PETERS C AND WILKINSON. C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 372-395(1971). C THE UNITARY ANALOGUE SUBSTITUTES THE QR ALGORITHM OF FRANCIS C (COMP. JOUR. 4, 332-345(1962)) FOR THE LR ALGORITHM. C C THIS SUBROUTINE FINDS THE EIGENVALUES AND EIGENVECTORS C OF A COMPLEX UPPER HESSENBERG MATRIX BY THE QR C METHOD. THE EIGENVECTORS OF A COMPLEX GENERAL MATRIX C CAN ALSO BE FOUND IF CORTH HAS BEEN USED TO REDUCE C THIS GENERAL MATRIX TO HESSENBERG FORM. C C ON INPUT. C C NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL C ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM C DIMENSION STATEMENT. C C N IS THE ORDER OF THE MATRIX. C C LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING C SUBROUTINE CBAL. IF CBAL HAS NOT BEEN USED, C SET LOW=1, IGH=N. C C ORTR AND ORTI CONTAIN INFORMATION ABOUT THE UNITARY TRANS- C FORMATIONS USED IN THE REDUCTION BY CORTH, IF PERFORMED. C ONLY ELEMENTS LOW THROUGH IGH ARE USED. IF THE EIGENVECTORS C OF THE HESSENBERG MATRIX ARE DESIRED, SET ORTR(J) AND C ORTI(J) TO 0.0D0 FOR THESE ELEMENTS. C C HR AND HI CONTAIN THE REAL AND IMAGINARY PARTS, C RESPECTIVELY, OF THE COMPLEX UPPER HESSENBERG MATRIX. C THEIR LOWER TRIANGLES BELOW THE SUBDIAGONAL CONTAIN FURTHER C INFORMATION ABOUT THE TRANSFORMATIONS WHICH WERE USED IN THE C REDUCTION BY CORTH, IF PERFORMED. IF THE EIGENVECTORS OF C THE HESSENBERG MATRIX ARE DESIRED, THESE ELEMENTS MAY BE C ARBITRARY. C C ON OUTPUT. C C ORTR, ORTI, AND THE UPPER HESSENBERG PORTIONS OF HR AND HI C HAVE BEEN DESTROYED. C C WR AND WI CONTAIN THE REAL AND IMAGINARY PARTS, C RESPECTIVELY, OF THE EIGENVALUES. IF AN ERROR C EXIT IS MADE, THE EIGENVALUES SHOULD BE CORRECT C FOR INDICES IERR+1,...,N. C C ZR AND ZI CONTAIN THE REAL AND IMAGINARY PARTS, C RESPECTIVELY, OF THE EIGENVECTORS. THE EIGENVECTORS C ARE UNNORMALIZED. IF AN ERROR EXIT IS MADE, NONE OF C THE EIGENVECTORS HAS BEEN FOUND. C C IERR IS SET TO C ZERO FOR NORMAL RETURN, C J IF THE J-TH EIGENVALUE HAS NOT BEEN C DETERMINED AFTER A TOTAL OF 30*N ITERATIONS. C C MODIFIED TO GET RID OF ALL COMPLEX ARITHMETIC, C. MOLER, 6/27/79. C C QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO B. S. GARBOW, C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY C C ------------------------------------------------------------------ C IERR = 0 C***** IF (JOB .EQ. 0) GO TO 150 C***** C .......... INITIALIZE EIGENVECTOR MATRIX .......... DO 100 I = 1, N C DO 100 J = 1, N ZR(I,J) = 0.0D0 ZI(I,J) = 0.0D0 IF (I .EQ. J) ZR(I,J) = 1.0D0 100 CONTINUE C .......... FORM THE MATRIX OF ACCUMULATED TRANSFORMATIONS C FROM THE INFORMATION LEFT BY CORTH .......... IEND = IGH - LOW - 1 IF (IEND) 180, 150, 105 C .......... FOR I=IGH-1 STEP -1 UNTIL LOW+1 DO -- .......... 105 DO 140 II = 1, IEND I = IGH - II IF (ORTR(I) .EQ. 0.0D0 .AND. ORTI(I) .EQ. 0.0D0) GO TO 140 IF (HR(I,I-1) .EQ. 0.0D0 .AND. HI(I,I-1) .EQ. 0.0D0) GO TO 140 C .......... NORM BELOW IS NEGATIVE OF H FORMED IN CORTH .......... NORM = FLOP(HR(I,I-1)*ORTR(I) + HI(I,I-1)*ORTI(I)) IP1 = I + 1 C DO 110 K = IP1, IGH ORTR(K) = HR(K,I-1) ORTI(K) = HI(K,I-1) 110 CONTINUE C DO 130 J = I, IGH SR = 0.0D0 SI = 0.0D0 C DO 115 K = I, IGH SR = FLOP(SR + ORTR(K)*ZR(K,J) + ORTI(K)*ZI(K,J)) SI = FLOP(SI + ORTR(K)*ZI(K,J) - ORTI(K)*ZR(K,J)) 115 CONTINUE C SR = FLOP(SR/NORM) SI = FLOP(SI/NORM) C DO 120 K = I, IGH ZR(K,J) = FLOP(ZR(K,J) + SR*ORTR(K) - SI*ORTI(K)) ZI(K,J) = FLOP(ZI(K,J) + SR*ORTI(K) + SI*ORTR(K)) 120 CONTINUE C 130 CONTINUE C 140 CONTINUE C***** IF (JOB .EQ. 3) GO TO 1001 C***** C .......... CREATE REAL SUBDIAGONAL ELEMENTS .......... 150 L = LOW + 1 C DO 170 I = L, IGH LL = MIN0(I+1,IGH) IF (HI(I,I-1) .EQ. 0.0D0) GO TO 170 NORM = PYTHAG(HR(I,I-1),HI(I,I-1)) YR = FLOP(HR(I,I-1)/NORM) YI = FLOP(HI(I,I-1)/NORM) HR(I,I-1) = NORM HI(I,I-1) = 0.0D0 C DO 155 J = I, N SI = FLOP(YR*HI(I,J) - YI*HR(I,J)) HR(I,J) = FLOP(YR*HR(I,J) + YI*HI(I,J)) HI(I,J) = SI 155 CONTINUE C DO 160 J = 1, LL SI = FLOP(YR*HI(J,I) + YI*HR(J,I)) HR(J,I) = FLOP(YR*HR(J,I) - YI*HI(J,I)) HI(J,I) = SI 160 CONTINUE C***** IF (JOB .EQ. 0) GO TO 170 C***** DO 165 J = LOW, IGH SI = FLOP(YR*ZI(J,I) + YI*ZR(J,I)) ZR(J,I) = FLOP(YR*ZR(J,I) - YI*ZI(J,I)) ZI(J,I) = SI 165 CONTINUE C 170 CONTINUE C .......... STORE ROOTS ISOLATED BY CBAL .......... 180 DO 200 I = 1, N IF (I .GE. LOW .AND. I .LE. IGH) GO TO 200 WR(I) = HR(I,I) WI(I) = HI(I,I) 200 CONTINUE C EN = IGH TR = 0.0D0 TI = 0.0D0 ITN = 30*N C .......... SEARCH FOR NEXT EIGENVALUE .......... 220 IF (EN .LT. LOW) GO TO 680 ITS = 0 ENM1 = EN - 1 C .......... LOOK FOR SINGLE SMALL SUB-DIAGONAL ELEMENT C FOR L=EN STEP -1 UNTIL LOW DO -- .......... 240 DO 260 LL = LOW, EN L = EN + LOW - LL IF (L .EQ. LOW) GO TO 300 C***** XR = FLOP(DABS(HR(L-1,L-1)) + DABS(HI(L-1,L-1)) X + DABS(HR(L,L)) +DABS(HI(L,L))) YR = FLOP(XR + DABS(HR(L,L-1))) IF (XR .EQ. YR) GO TO 300 C***** 260 CONTINUE C .......... FORM SHIFT .......... 300 IF (L .EQ. EN) GO TO 660 IF (ITN .EQ. 0) GO TO 1000 IF (ITS .EQ. 10 .OR. ITS .EQ. 20) GO TO 320 SR = HR(EN,EN) SI = HI(EN,EN) XR = FLOP(HR(ENM1,EN)*HR(EN,ENM1)) XI = FLOP(HI(ENM1,EN)*HR(EN,ENM1)) IF (XR .EQ. 0.0D0 .AND. XI .EQ. 0.0D0) GO TO 340 YR = FLOP((HR(ENM1,ENM1) - SR)/2.0D0) YI = FLOP((HI(ENM1,ENM1) - SI)/2.0D0) CALL WSQRT(YR**2-YI**2+XR,2.0D0*YR*YI+XI,ZZR,ZZI) IF (YR*ZZR + YI*ZZI .GE. 0.0D0) GO TO 310 ZZR = -ZZR ZZI = -ZZI 310 CALL WDIV(XR,XI,YR+ZZR,YI+ZZI,ZZR,ZZI) SR = FLOP(SR - ZZR) SI = FLOP(SI - ZZI) GO TO 340 C .......... FORM EXCEPTIONAL SHIFT .......... 320 SR = FLOP(DABS(HR(EN,ENM1)) + DABS(HR(ENM1,EN-2))) SI = 0.0D0 C 340 DO 360 I = LOW, EN HR(I,I) = FLOP(HR(I,I) - SR) HI(I,I) = FLOP(HI(I,I) - SI) 360 CONTINUE C TR = FLOP(TR + SR) TI = FLOP(TI + SI) ITS = ITS + 1 ITN = ITN - 1 C .......... REDUCE TO TRIANGLE (ROWS) .......... LP1 = L + 1 C DO 500 I = LP1, EN SR = HR(I,I-1) HR(I,I-1) = 0.0D0 NORM = FLOP(DABS(HR(I-1,I-1)) + DABS(HI(I-1,I-1)) + DABS(SR)) NORM = FLOP(NORM*DSQRT((HR(I-1,I-1)/NORM)**2 + X (HI(I-1,I-1)/NORM)**2 + (SR/NORM)**2)) XR = FLOP(HR(I-1,I-1)/NORM) WR(I-1) = XR XI = FLOP(HI(I-1,I-1)/NORM) WI(I-1) = XI HR(I-1,I-1) = NORM HI(I-1,I-1) = 0.0D0 HI(I,I-1) = FLOP(SR/NORM) C DO 490 J = I, N YR = HR(I-1,J) YI = HI(I-1,J) ZZR = HR(I,J) ZZI = HI(I,J) HR(I-1,J) = FLOP(XR*YR + XI*YI + HI(I,I-1)*ZZR) HI(I-1,J) = FLOP(XR*YI - XI*YR + HI(I,I-1)*ZZI) HR(I,J) = FLOP(XR*ZZR - XI*ZZI - HI(I,I-1)*YR) HI(I,J) = FLOP(XR*ZZI + XI*ZZR - HI(I,I-1)*YI) 490 CONTINUE C 500 CONTINUE C SI = HI(EN,EN) IF (SI .EQ. 0.0D0) GO TO 540 NORM = PYTHAG(HR(EN,EN),SI) SR = FLOP(HR(EN,EN)/NORM) SI = FLOP(SI/NORM) HR(EN,EN) = NORM HI(EN,EN) = 0.0D0 IF (EN .EQ. N) GO TO 540 IP1 = EN + 1 C DO 520 J = IP1, N YR = HR(EN,J) YI = HI(EN,J) HR(EN,J) = FLOP(SR*YR + SI*YI) HI(EN,J) = FLOP(SR*YI - SI*YR) 520 CONTINUE C .......... INVERSE OPERATION (COLUMNS) .......... 540 DO 600 J = LP1, EN XR = WR(J-1) XI = WI(J-1) C DO 580 I = 1, J YR = HR(I,J-1) YI = 0.0D0 ZZR = HR(I,J) ZZI = HI(I,J) IF (I .EQ. J) GO TO 560 YI = HI(I,J-1) HI(I,J-1) = FLOP(XR*YI + XI*YR + HI(J,J-1)*ZZI) 560 HR(I,J-1) = FLOP(XR*YR - XI*YI + HI(J,J-1)*ZZR) HR(I,J) = FLOP(XR*ZZR + XI*ZZI - HI(J,J-1)*YR) HI(I,J) = FLOP(XR*ZZI - XI*ZZR - HI(J,J-1)*YI) 580 CONTINUE C***** IF (JOB .EQ. 0) GO TO 600 C***** DO 590 I = LOW, IGH YR = ZR(I,J-1) YI = ZI(I,J-1) ZZR = ZR(I,J) ZZI = ZI(I,J) ZR(I,J-1) = FLOP(XR*YR - XI*YI + HI(J,J-1)*ZZR) ZI(I,J-1) = FLOP(XR*YI + XI*YR + HI(J,J-1)*ZZI) ZR(I,J) = FLOP(XR*ZZR + XI*ZZI - HI(J,J-1)*YR) ZI(I,J) = FLOP(XR*ZZI - XI*ZZR - HI(J,J-1)*YI) 590 CONTINUE C 600 CONTINUE C IF (SI .EQ. 0.0D0) GO TO 240 C DO 630 I = 1, EN YR = HR(I,EN) YI = HI(I,EN) HR(I,EN) = FLOP(SR*YR - SI*YI) HI(I,EN) = FLOP(SR*YI + SI*YR) 630 CONTINUE C***** IF (JOB .EQ. 0) GO TO 240 C***** DO 640 I = LOW, IGH YR = ZR(I,EN) YI = ZI(I,EN) ZR(I,EN) = FLOP(SR*YR - SI*YI) ZI(I,EN) = FLOP(SR*YI + SI*YR) 640 CONTINUE C GO TO 240 C .......... A ROOT FOUND .......... 660 HR(EN,EN) = FLOP(HR(EN,EN) + TR) WR(EN) = HR(EN,EN) HI(EN,EN) = FLOP(HI(EN,EN) + TI) WI(EN) = HI(EN,EN) EN = ENM1 GO TO 220 C .......... ALL ROOTS FOUND. BACKSUBSTITUTE TO FIND C VECTORS OF UPPER TRIANGULAR FORM .......... C C***** THE FOLLOWING SECTION CHANGED FOR OVERFLOW CONTROL C C. MOLER, 3/16/82 C 680 IF (JOB .NE. 2) GO TO 1001 C NORM = 0.0D0 DO 720 I = 1, N DO 720 J = I, N TR = FLOP(DABS(HR(I,J))) + FLOP(DABS(HI(I,J))) IF (TR .GT. NORM) NORM = TR 720 CONTINUE IF (N .EQ. 1 .OR. NORM .EQ. 0.0D0) GO TO 1001 C .......... FOR EN=N STEP -1 UNTIL 2 DO -- .......... DO 800 NN = 2, N EN = N + 2 - NN XR = WR(EN) XI = WI(EN) HR(EN,EN) = 1.0D0 HI(EN,EN) = 0.0D0 ENM1 = EN - 1 C .......... FOR I=EN-1 STEP -1 UNTIL 1 DO -- .......... DO 780 II = 1, ENM1 I = EN - II ZZR = 0.0D0 ZZI = 0.0D0 IP1 = I + 1 DO 740 J = IP1, EN ZZR = FLOP(ZZR + HR(I,J)*HR(J,EN) - HI(I,J)*HI(J,EN)) ZZI = FLOP(ZZI + HR(I,J)*HI(J,EN) + HI(I,J)*HR(J,EN)) 740 CONTINUE YR = FLOP(XR - WR(I)) YI = FLOP(XI - WI(I)) IF (YR .NE. 0.0D0 .OR. YI .NE. 0.0D0) GO TO 765 YR = NORM 760 YR = FLOP(YR/100.0D0) YI = FLOP(NORM + YR) IF (YI .NE. NORM) GO TO 760 YI = 0.0D0 765 CONTINUE CALL WDIV(ZZR,ZZI,YR,YI,HR(I,EN),HI(I,EN)) TR = FLOP(DABS(HR(I,EN))) + FLOP(DABS(HI(I,EN))) IF (TR .EQ. 0.0D0) GO TO 780 IF (TR + 1.0D0/TR .GT. TR) GO TO 780 DO 770 J = I, EN HR(J,EN) = FLOP(HR(J,EN)/TR) HI(J,EN) = FLOP(HI(J,EN)/TR) 770 CONTINUE 780 CONTINUE C 800 CONTINUE C***** C .......... END BACKSUBSTITUTION .......... ENM1 = N - 1 C .......... VECTORS OF ISOLATED ROOTS .......... DO 840 I = 1, ENM1 IF (I .GE. LOW .AND. I .LE. IGH) GO TO 840 IP1 = I + 1 C DO 820 J = IP1, N ZR(I,J) = HR(I,J) ZI(I,J) = HI(I,J) 820 CONTINUE C 840 CONTINUE C .......... MULTIPLY BY TRANSFORMATION MATRIX TO GIVE C VECTORS OF ORIGINAL FULL MATRIX. C FOR J=N STEP -1 UNTIL LOW+1 DO -- .......... DO 880 JJ = LOW, ENM1 J = N + LOW - JJ M = MIN0(J,IGH) C DO 880 I = LOW, IGH ZZR = 0.0D0 ZZI = 0.0D0 C DO 860 K = LOW, M ZZR = FLOP(ZZR + ZR(I,K)*HR(K,J) - ZI(I,K)*HI(K,J)) ZZI = FLOP(ZZI + ZR(I,K)*HI(K,J) + ZI(I,K)*HR(K,J)) 860 CONTINUE C ZR(I,J) = ZZR ZI(I,J) = ZZI 880 CONTINUE C GO TO 1001 C .......... SET ERROR -- NO CONVERGENCE TO AN C EIGENVALUE AFTER 30 ITERATIONS .......... 1000 IERR = EN 1001 RETURN END SUBROUTINE WSVDC(XR,XI,LDX,N,P,SR,SI,ER,EI,UR,UI,LDU,VR,VI,LDV, * WORKR,WORKI,JOB,INFO) INTEGER LDX,N,P,LDU,LDV,JOB,INFO DOUBLE PRECISION XR(LDX,1),XI(LDX,1),SR(1),SI(1),ER(1),EI(1), * UR(LDU,1),UI(LDU,1),VR(LDV,1),VI(LDV,1), * WORKR(1),WORKI(1) C C C WSVDC IS A SUBROUTINE TO REDUCE A DOUBLE-COMPLEX NXP MATRIX X BY C UNITARY TRANSFORMATIONS U AND V TO DIAGONAL FORM. THE C DIAGONAL ELEMENTS S(I) ARE THE SINGULAR VALUES OF X. THE C COLUMNS OF U ARE THE CORRESPONDING LEFT SINGULAR VECTORS, C AND THE COLUMNS OF V THE RIGHT SINGULAR VECTORS. C C ON ENTRY C C X DOUBLE-COMPLEX(LDX,P), WHERE LDX.GE.N. C X CONTAINS THE MATRIX WHOSE SINGULAR VALUE C DECOMPOSITION IS TO BE COMPUTED. X IS C DESTROYED BY WSVDC. C C LDX INTEGER. C LDX IS THE LEADING DIMENSION OF THE ARRAY X. C C N INTEGER. C N IS THE NUMBER OF COLUMNS OF THE MATRIX X. C C P INTEGER. C P IS THE NUMBER OF ROWS OF THE MATRIX X. C C LDU INTEGER. C LDU IS THE LEADING DIMENSION OF THE ARRAY U C (SEE BELOW). C C LDV INTEGER. C LDV IS THE LEADING DIMENSION OF THE ARRAY V C (SEE BELOW). C C WORK DOUBLE-COMPLEX(N). C WORK IS A SCRATCH ARRAY. C C JOB INTEGER. C JOB CONTROLS THE COMPUTATION OF THE SINGULAR C VECTORS. IT HAS THE DECIMAL EXPANSION AB C WITH THE FOLLOWING MEANING C C A.EQ.0 DO NOT COMPUTE THE LEFT SINGULAR C VECTORS. C A.EQ.1 RETURN THE N LEFT SINGULAR VECTORS C IN U. C A.GE.2 RETURNS THE FIRST MIN(N,P) C LEFT SINGULAR VECTORS IN U. C B.EQ.0 DO NOT COMPUTE THE RIGHT SINGULAR C VECTORS. C B.EQ.1 RETURN THE RIGHT SINGULAR VECTORS C IN V. C C ON RETURN C C S DOUBLE-COMPLEX(MM), WHERE MM=MIN(N+1,P). C THE FIRST MIN(N,P) ENTRIES OF S CONTAIN THE C SINGULAR VALUES OF X ARRANGED IN DESCENDING C ORDER OF MAGNITUDE. C C E DOUBLE-COMPLEX(P). C E ORDINARILY CONTAINS ZEROS. HOWEVER SEE THE C DISCUSSION OF INFO FOR EXCEPTIONS. C C U DOUBLE-COMPLEX(LDU,K), WHERE LDU.GE.N. C IF JOBA.EQ.1 THEN K.EQ.N, C IF JOBA.EQ.2 THEN K.EQ.MIN(N,P). C U CONTAINS THE MATRIX OF RIGHT SINGULAR VECTORS. C U IS NOT REFERENCED IF JOBA.EQ.0. IF N.LE.P C OR IF JOBA.GT.2, THEN U MAY BE IDENTIFIED WITH X C IN THE SUBROUTINE CALL. C C V DOUBLE-COMPLEX(LDV,P), WHERE LDV.GE.P. C V CONTAINS THE MATRIX OF RIGHT SINGULAR VECTORS. C V IS NOT REFERENCED IF JOBB.EQ.0. IF P.LE.N, C THEN V MAY BE IDENTIFIED WHTH X IN THE C SUBROUTINE CALL. C C INFO INTEGER. C THE SINGULAR VALUES (AND THEIR CORRESPONDING C SINGULAR VECTORS) S(INFO+1),S(INFO+2),...,S(M) C ARE CORRECT (HERE M=MIN(N,P)). THUS IF C INFO.EQ.0, ALL THE SINGULAR VALUES AND THEIR C VECTORS ARE CORRECT. IN ANY EVENT, THE MATRIX C B = CTRANS(U)*X*V IS THE BIDIAGONAL MATRIX C WITH THE ELEMENTS OF S ON ITS DIAGONAL AND THE C ELEMENTS OF E ON ITS SUPER-DIAGONAL (CTRANS(U) C IS THE CONJUGATE-TRANSPOSE OF U). THUS THE C SINGULAR VALUES OF X AND B ARE THE SAME. C C LINPACK. THIS VERSION DATED 07/03/79 . C G.W. STEWART, UNIVERSITY OF MARYLAND, ARGONNE NATIONAL LAB. C C WSVDC USES THE FOLLOWING FUNCTIONS AND SUBPROGRAMS. C C BLAS WAXPY,PYTHAG,WDOTCR,WDOTCI,WSCAL,WSWAP,WNRM2,RROTG C FORTRAN DABS,DIMAG,DMAX1 C FORTRAN MAX0,MIN0,MOD,DSQRT C C INTERNAL VARIABLES C INTEGER I,ITER,J,JOBU,K,KASE,KK,L,LL,LLS,LM1,LP1,LS,LU,M,MAXIT, * MM,MM1,MP1,NCT,NCTP1,NCU,NRT,NRTP1 DOUBLE PRECISION PYTHAG,WDOTCR,WDOTCI,TR,TI,RR,RI DOUBLE PRECISION B,C,CS,EL,EMM1,F,G,WNRM2,SCALE,SHIFT,SL,SM,SN, * SMM1,T1,TEST,ZTEST,SMALL,FLOP LOGICAL WANTU,WANTV C DOUBLE PRECISION ZDUMR,ZDUMI DOUBLE PRECISION CABS1 CABS1(ZDUMR,ZDUMI) = DABS(ZDUMR) + DABS(ZDUMI) C C SET THE MAXIMUM NUMBER OF ITERATIONS. C MAXIT = 75 C C SMALL NUMBER, ROUGHLY MACHINE EPSILON, USED TO AVOID UNDERFLOW C SHAR_EOF # End of shell archive exit 0 -- Bob Page, U of Lowell CS Dept. page@swan.ulowell.edu ulowell!page Have five nice days.