--- /dev/null
+C 10 AUG 94 - MWS - INCREASE NUMBER OF DAF RECORDS
+C 31 MAR 94 - MWS - ADD A VARIABLE TO END OF MACHSW COMMON
+C 26 JUN 93 - MWS - ETRED3: ADD RETURN FOR SPECIAL CASE N=1
+C 4 JAN 92 - TLW - MAKE WRITES PARALLEL;ADD COMMON PAR
+C 30 AUG 91 - MWS - JACDIA: LIMIT ITERATIONS, USE EPSLON IN TEST.
+C 14 JUL 91 - MWS - JACOBI DIAGONALIZATION ALLOWS FOR LDVEC.NE.N
+C 29 JAN 91 - TLW - GLDIAG: CHANGED COMMON DIAGSW TO MACHSW
+C 29 OCT 90 - STE - FIX JACDIA UNDEFINED VARIABLE BUG
+C 14 SEP 90 - MK - NEW JACOBI DIAGONALIZATION (KDIAG=3)
+C 27 MAR 88 - MWS - ALLOW FOR VECTOR ROUTINE IN GLDIAG
+C 11 AUG 87 - MWS - SANITIZE CONSTANTS IN EQLRAT
+C 15 FEB 87 - STE - FIX EINVIT SUB-MATRIX LOOP LIMIT
+C SCRATCH ARRAYS ARE N*8 REAL AND N INTEGER
+C 8 DEC 86 - STE - USE PERF INDEX FROM ESTPI1 TO JUDGE EINVIT FAILURE
+C 30 NOV 86 - STE - DELETE LIGENB, MAKE EVVRSP DEFAULT
+C (GIVEIS FAILS ON CRAY FOR BENCHMC AND BENCHCI)
+C 7 JUL 86 - JAB - SANITIZE FLOATING POINT CONSTANTS
+C 11 OCT 85 - STE - LIGENB,TQL2: USE DROT,DSWAP; TINVTB: SCALE VECTOR
+C BEFORE NORMALIZING; GENERIC FUNCTIONS
+C 24 FEB 84 - STE - INITIALIZE INDEX ARRAY FOR LIGENB IN GLDIAG
+C 1 DEC 83 - STE - CHANGE MACHEP FROM 2**-54 TO 2**-50
+C 28 SEP 82 - MWS - CONVERT TO IBM
+C
+C*MODULE EIGEN *DECK EINVIT
+ SUBROUTINE EINVIT(NM,N,D,E,E2,M,W,IND,Z,IERR,RV1,RV2,RV3,RV4,RV6)
+C*
+C* AUTHORS-
+C* THIS IS A MODIFICATION OF TINVIT FROM EISPACK EDITION 3
+C* DATED AUGUST 1983.
+C* TINVIT IS A TRANSLATION OF THE INVERSE ITERATION TECHNIQUE
+C* IN THE ALGOL PROCEDURE TRISTURM BY PETERS AND WILKINSON.
+C* HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 418-439(1971).
+C* THIS VERSION IS BY S. T. ELBERT (AMES LABORATORY-USDOE)
+C*
+C* PURPOSE -
+C* THIS ROUTINE FINDS THOSE EIGENVECTORS OF A TRIDIAGONAL
+C* SYMMETRIC MATRIX CORRESPONDING TO SPECIFIED EIGENVALUES.
+C*
+C* METHOD -
+C* INVERSE ITERATION.
+C*
+C* ON ENTRY -
+C* NM - INTEGER
+C* MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
+C* ARRAY PARAMETERS AS DECLARED IN THE CALLING ROUTINE
+C* DIMENSION STATEMENT.
+C* N - INTEGER
+C* D - W.P. REAL (N)
+C* CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX.
+C* E - W.P. REAL (N)
+C* CONTAINS THE SUBDIAGONAL ELEMENTS OF THE INPUT MATRIX
+C* IN ITS LAST N-1 POSITIONS. E(1) IS ARBITRARY.
+C* E2 - W.P. REAL (N)
+C* CONTAINS THE SQUARES OF CORRESPONDING ELEMENTS OF E,
+C* WITH ZEROS CORRESPONDING TO NEGLIGIBLE ELEMENTS OF E.
+C* E(I) IS CONSIDERED NEGLIGIBLE IF IT IS NOT LARGER THAN
+C* THE PRODUCT OF THE RELATIVE MACHINE PRECISION AND THE
+C* SUM OF THE MAGNITUDES OF D(I) AND D(I-1). E2(1) MUST
+C* CONTAIN 0.0 IF THE EIGENVALUES ARE IN ASCENDING ORDER,
+C* OR 2.0 IF THE EIGENVALUES ARE IN DESCENDING ORDER.
+C* IF TQLRAT, BISECT, TRIDIB, OR IMTQLV
+C* HAS BEEN USED TO FIND THE EIGENVALUES, THEIR
+C* OUTPUT E2 ARRAY IS EXACTLY WHAT IS EXPECTED HERE.
+C* M - INTEGER
+C* THE NUMBER OF SPECIFIED EIGENVECTORS.
+C* W - W.P. REAL (M)
+C* CONTAINS THE M EIGENVALUES IN ASCENDING
+C* OR DESCENDING ORDER.
+C* IND - INTEGER (M)
+C* CONTAINS IN FIRST M POSITIONS THE SUBMATRIX INDICES
+C* ASSOCIATED WITH THE CORRESPONDING EIGENVALUES IN W --
+C* 1 FOR EIGENVALUES BELONGING TO THE FIRST SUBMATRIX
+C* FROM THE TOP, 2 FOR THOSE BELONGING TO THE SECOND
+C* SUBMATRIX, ETC.
+C* IERR - INTEGER (LOGICAL UNIT NUMBER)
+C* LOGICAL UNIT FOR ERROR MESSAGES
+C*
+C* ON EXIT -
+C* ALL INPUT ARRAYS ARE UNALTERED.
+C* Z - W.P. REAL (NM,M)
+C* CONTAINS THE ASSOCIATED SET OF ORTHONORMAL
+C* EIGENVECTORS. ANY VECTOR WHICH WHICH FAILS TO CONVERGE
+C* IS LEFT AS IS (BUT NORMALIZED) WHEN ITERATING STOPPED.
+C* IERR - INTEGER
+C* SET TO
+C* ZERO FOR NORMAL RETURN,
+C* -R IF THE EIGENVECTOR CORRESPONDING TO THE R-TH
+C* EIGENVALUE FAILS TO CONVERGE IN 5 ITERATIONS.
+C* (ONLY LAST FAILURE TO CONVERGE IS REPORTED)
+C*
+C* RV1, RV2, RV3, RV4, AND RV6 ARE TEMPORARY STORAGE ARRAYS.
+C*
+C* RV1 - W.P. REAL (N)
+C* DIAGONAL ELEMENTS OF U FROM LU DECOMPOSITION
+C* RV2 - W.P. REAL (N)
+C* SUPER(1)-DIAGONAL ELEMENTS OF U FROM LU DECOMPOSITION
+C* RV3 - W.P. REAL (N)
+C* SUPER(2)-DIAGONAL ELEMENTS OF U FROM LU DECOMPOSITION
+C* RV4 - W.P. REAL (N)
+C* ELEMENTS DEFINING L IN LU DECOMPOSITION
+C* RV6 - W.P. REAL (N)
+C* APPROXIMATE EIGENVECTOR
+C*
+C* DIFFERENCES FROM EISPACK 3 -
+C* EPS3 IS SCALED BY EPSCAL (ENHANCES CONVERGENCE, BUT
+C* LOWERS ACCURACY)!
+C* ONE MORE ITERATION (MINIMUM 2) IS PERFORMED AFTER CONVERGENCE
+C* (ENHANCES ACCURACY)!
+C* REPLACE LOOP WITH PYTHAG WITH SINGLE CALL TO DNRM2!
+C* IF NOT CONVERGED, USE PERFORMANCE INDEX TO DECIDE ON ERROR
+C* VALUE SETTING, BUT DO NOT STOP!
+C* L.U. FOR ERROR MESSAGES PASSED THROUGH IERR
+C* USE PARAMETER STATEMENTS AND GENERIC INTRINSIC FUNCTIONS
+C* USE LEVEL 1 BLAS
+C* USE IF-THEN-ELSE TO CLARIFY LOGIC
+C* LOOP OVER SUBSPACES MADE INTO DO LOOP.
+C* LOOP OVER INVERSE ITERATIONS MADE INTO DO LOOP
+C* ZERO ONLY REQUIRED PORTIONS OF OUTPUT VECTOR
+C*
+C* NOTE -
+C* QUESTIONS AND COMMENTS CONCERNING EISPACK SHOULD BE DIRECTED TO
+C* B. S. GARBOW, APPLIED MATH. DIVISION, ARGONNE NATIONAL LAB.
+C*
+C
+ LOGICAL CONVGD,GOPARR,DSKWRK,MASWRK
+C
+ INTEGER GROUP,I,IERR,ITS,J,JJ,M,N,NM,P,Q,R,S,SUBMAT,TAG
+ INTEGER IND(M)
+C
+ DOUBLE PRECISION D(N),E(N),E2(N),W(M),Z(NM,M)
+ DOUBLE PRECISION RV1(N),RV2(N),RV3(N),RV4(N),RV6(N)
+ DOUBLE PRECISION ANORM,EPS2,EPS3,EPS4,NORM,ORDER,RHO,U,UK,V
+ DOUBLE PRECISION X0,X1,XU
+ DOUBLE PRECISION EPSCAL,GRPTOL,HUNDRD,ONE,TEN,ZERO
+ DOUBLE PRECISION EPSLON, ESTPI1, DASUM, DDOT, DNRM2
+C
+ COMMON /PAR / ME,MASTER,NPROC,IBTYP,IPTIM,GOPARR,DSKWRK,MASWRK
+C
+ PARAMETER (ZERO = 0.0D+00, ONE = 1.0D+00, GRPTOL = 0.001D+00)
+ PARAMETER (EPSCAL = 0.5D+00, HUNDRD = 100.0D+00, TEN = 10.0D+00)
+C
+ 001 FORMAT(' EIGENVECTOR ROUTINE EINVIT DID NOT CONVERGE FOR VECTOR'
+ * ,I5,'. NORM =',1P,E10.2,' PERFORMANCE INDEX =',E10.2/
+ * ' (AN ERROR HALT WILL OCCUR IF THE PI IS GREATER THAN 100)')
+C
+C-----------------------------------------------------------------------
+C
+ LUEMSG = IERR
+ IERR = 0
+ X0 = ZERO
+ UK = ZERO
+ NORM = ZERO
+ EPS2 = ZERO
+ EPS3 = ZERO
+ EPS4 = ZERO
+ GROUP = 0
+ TAG = 0
+ ORDER = ONE - E2(1)
+ Q = 0
+ DO 930 SUBMAT = 1, N
+ P = Q + 1
+C
+C .......... ESTABLISH AND PROCESS NEXT SUBMATRIX ..........
+C
+ DO 120 Q = P, N-1
+ IF (E2(Q+1) .EQ. ZERO) GO TO 140
+ 120 CONTINUE
+ Q = N
+C
+C .......... FIND VECTORS BY INVERSE ITERATION ..........
+C
+ 140 CONTINUE
+ TAG = TAG + 1
+ ANORM = ZERO
+ S = 0
+C
+ DO 920 R = 1, M
+ IF (IND(R) .NE. TAG) GO TO 920
+ ITS = 1
+ X1 = W(R)
+ IF (S .NE. 0) GO TO 510
+C
+C .......... CHECK FOR ISOLATED ROOT ..........
+C
+ XU = ONE
+ IF (P .EQ. Q) THEN
+ RV6(P) = ONE
+ CONVGD = .TRUE.
+ GO TO 860
+C
+ END IF
+ NORM = ABS(D(P))
+ DO 500 I = P+1, Q
+ NORM = MAX( NORM, ABS(D(I)) + ABS(E(I)) )
+ 500 CONTINUE
+C
+C .......... EPS2 IS THE CRITERION FOR GROUPING,
+C EPS3 REPLACES ZERO PIVOTS AND EQUAL
+C ROOTS ARE MODIFIED BY EPS3,
+C EPS4 IS TAKEN VERY SMALL TO AVOID OVERFLOW .........
+C
+ EPS2 = GRPTOL * NORM
+ EPS3 = EPSCAL * EPSLON(NORM)
+ UK = Q - P + 1
+ EPS4 = UK * EPS3
+ UK = EPS4 / SQRT(UK)
+ S = P
+ GROUP = 0
+ GO TO 520
+C
+C .......... LOOK FOR CLOSE OR COINCIDENT ROOTS ..........
+C
+ 510 IF (ABS(X1-X0) .GE. EPS2) THEN
+C
+C ROOTS ARE SEPERATE
+C
+ GROUP = 0
+ ELSE
+C
+C ROOTS ARE CLOSE
+C
+ GROUP = GROUP + 1
+ IF (ORDER * (X1 - X0) .LE. EPS3) X1 = X0 + ORDER * EPS3
+ END IF
+C
+C .......... ELIMINATION WITH INTERCHANGES AND
+C INITIALIZATION OF VECTOR ..........
+C
+ 520 CONTINUE
+C
+ U = D(P) - X1
+ V = E(P+1)
+ RV6(P) = UK
+ DO 550 I = P+1, Q
+ RV6(I) = UK
+ IF (ABS(E(I)) .GT. ABS(U)) THEN
+C
+C EXCHANGE ROWS BEFORE ELIMINATION
+C
+C *** WARNING -- A DIVIDE CHECK MAY OCCUR HERE IF
+C E2 ARRAY HAS NOT BEEN SPECIFIED CORRECTLY .......
+C
+ XU = U / E(I)
+ RV4(I) = XU
+ RV1(I-1) = E(I)
+ RV2(I-1) = D(I) - X1
+ RV3(I-1) = E(I+1)
+ U = V - XU * RV2(I-1)
+ V = -XU * RV3(I-1)
+C
+ ELSE
+C
+C STRAIGHT ELIMINATION
+C
+ XU = E(I) / U
+ RV4(I) = XU
+ RV1(I-1) = U
+ RV2(I-1) = V
+ RV3(I-1) = ZERO
+ U = D(I) - X1 - XU * V
+ V = E(I+1)
+ END IF
+ 550 CONTINUE
+C
+ IF (ABS(U) .LE. EPS3) U = EPS3
+ RV1(Q) = U
+ RV2(Q) = ZERO
+ RV3(Q) = ZERO
+C
+C DO INVERSE ITERATIONS
+C
+ CONVGD = .FALSE.
+ DO 800 ITS = 1, 5
+ IF (ITS .EQ. 1) GO TO 600
+C
+C .......... FORWARD SUBSTITUTION ..........
+C
+ IF (NORM .EQ. ZERO) THEN
+ RV6(S) = EPS4
+ S = S + 1
+ IF (S .GT. Q) S = P
+ ELSE
+ XU = EPS4 / NORM
+ CALL DSCAL (Q-P+1, XU, RV6(P), 1)
+ END IF
+C
+C ... ELIMINATION OPERATIONS ON NEXT VECTOR
+C
+ DO 590 I = P+1, Q
+ U = RV6(I)
+C
+C IF RV1(I-1) .EQ. E(I), A ROW INTERCHANGE
+C WAS PERFORMED EARLIER IN THE
+C TRIANGULARIZATION PROCESS ..........
+C
+ IF (RV1(I-1) .EQ. E(I)) THEN
+ U = RV6(I-1)
+ RV6(I-1) = RV6(I)
+ ELSE
+ U = RV6(I)
+ END IF
+ RV6(I) = U - RV4(I) * RV6(I-1)
+ 590 CONTINUE
+ 600 CONTINUE
+C
+C .......... BACK SUBSTITUTION
+C
+ RV6(Q) = RV6(Q) / RV1(Q)
+ V = U
+ U = RV6(Q)
+ NORM = ABS(U)
+ DO 620 I = Q-1, P, -1
+ RV6(I) = (RV6(I) - U * RV2(I) - V * RV3(I)) / RV1(I)
+ V = U
+ U = RV6(I)
+ NORM = NORM + ABS(U)
+ 620 CONTINUE
+ IF (GROUP .EQ. 0) GO TO 700
+C
+C ....... ORTHOGONALIZE WITH RESPECT TO PREVIOUS
+C MEMBERS OF GROUP ..........
+C
+ J = R
+ DO 680 JJ = 1, GROUP
+ 630 J = J - 1
+ IF (IND(J) .NE. TAG) GO TO 630
+ CALL DAXPY(Q-P+1, -DDOT(Q-P+1,RV6(P),1,Z(P,J),1),
+ * Z(P,J),1,RV6(P),1)
+ 680 CONTINUE
+ NORM = DASUM(Q-P+1, RV6(P), 1)
+ 700 CONTINUE
+C
+ IF (CONVGD) GO TO 840
+ IF (NORM .GE. ONE) CONVGD = .TRUE.
+ 800 CONTINUE
+C
+C .......... NORMALIZE SO THAT SUM OF SQUARES IS
+C 1 AND EXPAND TO FULL ORDER ..........
+C
+ 840 CONTINUE
+C
+ XU = ONE / DNRM2(Q-P+1,RV6(P),1)
+C
+ 860 CONTINUE
+ DO 870 I = 1, P-1
+ Z(I,R) = ZERO
+ 870 CONTINUE
+ DO 890 I = P,Q
+ Z(I,R) = RV6(I) * XU
+ 890 CONTINUE
+ DO 900 I = Q+1, N
+ Z(I,R) = ZERO
+ 900 CONTINUE
+C
+ IF (.NOT.CONVGD) THEN
+ RHO = ESTPI1(Q-P+1,X1,D(P),E(P),Z(P,R),ANORM)
+ IF (RHO .GE. TEN .AND. LUEMSG .GT. 0 .AND. MASWRK)
+ * WRITE(LUEMSG,001) R,NORM,RHO
+C
+C *** SET ERROR -- NON-CONVERGED EIGENVECTOR ..........
+C
+ IF (RHO .GT. HUNDRD) IERR = -R
+ END IF
+C
+ X0 = X1
+ 920 CONTINUE
+C
+ IF (Q .EQ. N) GO TO 940
+ 930 CONTINUE
+ 940 CONTINUE
+ RETURN
+ END
+C*MODULE EIGEN *DECK ELAUM
+ SUBROUTINE ELAU(HINV,L,D,A,E)
+C
+ DOUBLE PRECISION A(*)
+ DOUBLE PRECISION D(L)
+ DOUBLE PRECISION E(L)
+ DOUBLE PRECISION F
+ DOUBLE PRECISION G
+ DOUBLE PRECISION HALF
+ DOUBLE PRECISION HH
+ DOUBLE PRECISION HINV
+ DOUBLE PRECISION ZERO
+C
+ PARAMETER (ZERO = 0.0D+00, HALF = 0.5D+00)
+C
+ JL = L
+ E(1) = A(1) * D(1)
+ JK = 2
+ DO 210 J = 2, JL
+ F = D(J)
+ G = ZERO
+ JM1 = J - 1
+C
+ DO 200 K = 1, JM1
+ G = G + A(JK) * D(K)
+ E(K) = E(K) + A(JK) * F
+ JK = JK + 1
+ 200 CONTINUE
+C
+ E(J) = G + A(JK) * F
+ JK = JK + 1
+ 210 CONTINUE
+C
+C .......... FORM P ..........
+C
+ F = ZERO
+ DO 245 J = 1, L
+ E(J) = E(J) * HINV
+ F = F + E(J) * D(J)
+ 245 CONTINUE
+C
+C .......... FORM Q ..........
+C
+ HH = F * HALF * HINV
+ DO 250 J = 1, L
+ 250 E(J) = E(J) - HH * D(J)
+C
+ RETURN
+ END
+C*MODULE EIGEN *DECK EPSLON
+ DOUBLE PRECISION FUNCTION EPSLON (X)
+C*
+C* AUTHORS -
+C* THIS ROUTINE WAS TAKEN FROM EISPACK EDITION 3 DATED 4/6/83
+C* THIS VERSION IS BY S. T. ELBERT, AMES LABORATORY-USDOE NOV 1986
+C*
+C* PURPOSE -
+C* ESTIMATE UNIT ROUNDOFF IN QUANTITIES OF SIZE X.
+C*
+C* ON ENTRY -
+C* X - WORKING PRECISION REAL
+C* VALUES TO FIND EPSLON FOR
+C*
+C* ON EXIT -
+C* EPSLON - WORKING PRECISION REAL
+C* SMALLEST POSITIVE VALUE SUCH THAT X+EPSLON .NE. ZERO
+C*
+C* QUALIFICATIONS -
+C* THIS ROUTINE SHOULD PERFORM PROPERLY ON ALL SYSTEMS
+C* SATISFYING THE FOLLOWING TWO ASSUMPTIONS,
+C* 1. THE BASE USED IN REPRESENTING FLOATING POINT
+C* NUMBERS IS NOT A POWER OF THREE.
+C* 2. THE QUANTITY A IN STATEMENT 10 IS REPRESENTED TO
+C* THE ACCURACY USED IN FLOATING POINT VARIABLES
+C* THAT ARE STORED IN MEMORY.
+C* THE STATEMENT NUMBER 10 AND THE GO TO 10 ARE INTENDED TO
+C* FORCE OPTIMIZING COMPILERS TO GENERATE CODE SATISFYING
+C* ASSUMPTION 2.
+C* UNDER THESE ASSUMPTIONS, IT SHOULD BE TRUE THAT,
+C* A IS NOT EXACTLY EQUAL TO FOUR-THIRDS,
+C* B HAS A ZERO FOR ITS LAST BIT OR DIGIT,
+C* C IS NOT EXACTLY EQUAL TO ONE,
+C* EPS MEASURES THE SEPARATION OF 1.0 FROM
+C* THE NEXT LARGER FLOATING POINT NUMBER.
+C* THE DEVELOPERS OF EISPACK WOULD APPRECIATE BEING INFORMED
+C* ABOUT ANY SYSTEMS WHERE THESE ASSUMPTIONS DO NOT HOLD.
+C*
+C* DIFFERENCES FROM EISPACK 3 -
+C* USE IS MADE OF PARAMETER STATEMENTS AND INTRINSIC FUNCTIONS
+C* --NO EXECUTEABLE CODE CHANGES--
+C*
+C* NOTE -
+C* QUESTIONS AND COMMENTS CONCERNING EISPACK SHOULD BE DIRECTED TO
+C* B. S. GARBOW, APPLIED MATH. DIVISION, ARGONNE NATIONAL LAB.
+C
+ DOUBLE PRECISION A,B,C,EPS,X
+ DOUBLE PRECISION ZERO, ONE, THREE, FOUR
+C
+ PARAMETER (ZERO=0.0D+00, ONE=1.0D+00, THREE=3.0D+00, FOUR=4.0D+00)
+C
+C-----------------------------------------------------------------------
+C
+ A = FOUR/THREE
+ 10 B = A - ONE
+ C = B + B + B
+ EPS = ABS(C - ONE)
+ IF (EPS .EQ. ZERO) GO TO 10
+ EPSLON = EPS*ABS(X)
+ RETURN
+ END
+C*MODULE EIGEN *DECK EQLRAT
+ SUBROUTINE EQLRAT(N,DIAG,E,E2IN,D,IND,IERR,E2)
+C*
+C* AUTHORS -
+C* THIS IS A MODIFICATION OF ROUTINE EQLRAT FROM EISPACK EDITION 3
+C* DATED AUGUST 1983.
+C* TQLRAT IS A TRANSLATION OF THE ALGOL PROCEDURE TQLRAT,
+C* ALGORITHM 464, COMM. ACM 16, 689(1973) BY REINSCH.
+C* THIS VERSION IS BY S. T. ELBERT (AMES LABORATORY-USDOE)
+C*
+C* PURPOSE -
+C* THIS ROUTINE FINDS THE EIGENVALUES OF A SYMMETRIC
+C* TRIDIAGONAL MATRIX
+C*
+C* METHOD -
+C* RATIONAL QL
+C*
+C* ON ENTRY -
+C* N - INTEGER
+C* THE ORDER OF THE MATRIX.
+C* D - W.P. REAL (N)
+C* CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX.
+C* E2 - W.P. REAL (N)
+C* CONTAINS THE SQUARES OF THE SUBDIAGONAL ELEMENTS OF
+C* THE INPUT MATRIX IN ITS LAST N-1 POSITIONS.
+C* E2(1) IS ARBITRARY.
+C*
+C* ON EXIT -
+C* D - W.P. REAL (N)
+C* CONTAINS THE EIGENVALUES IN ASCENDING ORDER. IF AN
+C* ERROR EXIT IS MADE, THE EIGENVALUES ARE CORRECT AND
+C* ORDERED FOR INDICES 1,2,...IERR-1, BUT MAY NOT BE
+C* THE SMALLEST EIGENVALUES.
+C* E2 - W.P. REAL (N)
+C* DESTROYED.
+C* IERR - INTEGER
+C* SET TO
+C* ZERO FOR NORMAL RETURN,
+C* J IF THE J-TH EIGENVALUE HAS NOT BEEN
+C* DETERMINED AFTER 30 ITERATIONS.
+C*
+C* DIFFERENCES FROM EISPACK 3 -
+C* G=G+B INSTEAD OF IF(G.EQ.0) G=B ; B=B/4
+C* F77 BACKWARD LOOPS INSTEAD OF F66 CONSTRUCT
+C* GENERIC INTRINSIC FUNCTIONS
+C* ARRARY IND ADDED FOR USE BY EINVIT
+C*
+C* NOTE -
+C* QUESTIONS AND COMMENTS CONCERNING EISPACK SHOULD BE DIRECTED TO
+C* B. S. GARBOW, APPLIED MATH. DIVISION, ARGONNE NATIONAL LAB.
+C
+ INTEGER I,J,L,M,N,II,L1,IERR
+ INTEGER IND(N)
+C
+ DOUBLE PRECISION D(N),E(N),E2(N),DIAG(N),E2IN(N)
+ DOUBLE PRECISION B,C,F,G,H,P,R,S,T,EPSLON
+ DOUBLE PRECISION SCALE,ZERO,ONE
+C
+ PARAMETER (ZERO = 0.0D+00, SCALE= 1.0D+00/64.0D+00, ONE = 1.0D+00)
+C
+C-----------------------------------------------------------------------
+ IERR = 0
+ D(1)=DIAG(1)
+ IND(1) = 1
+ K = 0
+ ITAG = 0
+ IF (N .EQ. 1) GO TO 1001
+C
+ DO 100 I = 2, N
+ D(I)=DIAG(I)
+ 100 E2(I-1) = E2IN(I)
+C
+ F = ZERO
+ T = ZERO
+ B = EPSLON(ONE)
+ C = B *B
+ B = B * SCALE
+ E2(N) = ZERO
+C
+ DO 290 L = 1, N
+ H = ABS(D(L)) + ABS(E(L))
+ IF (T .GE. H) GO TO 105
+ T = H
+ B = EPSLON(T)
+ C = B * B
+ B = B * SCALE
+ 105 CONTINUE
+C .......... LOOK FOR SMALL SQUARED SUB-DIAGONAL ELEMENT ..........
+ M = L - 1
+ 110 M = M + 1
+ IF (E2(M) .GT. C) GO TO 110
+C .......... E2(N) IS ALWAYS ZERO, SO THERE IS AN EXIT
+C FROM THE LOOP ..........
+C
+ IF (M .LE. K) GO TO 125
+ IF (M .NE. N) E2IN(M+1) = ZERO
+ K = M
+ ITAG = ITAG + 1
+ 125 CONTINUE
+ IF (M .EQ. L) GO TO 210
+C
+C ITERATE
+C
+ DO 205 J = 1, 30
+C .......... FORM SHIFT ..........
+ L1 = L + 1
+ S = SQRT(E2(L))
+ G = D(L)
+ P = (D(L1) - G) / (2.0D+00 * S)
+ R = SQRT(P*P+1.0D+00)
+ D(L) = S / (P + SIGN(R,P))
+ H = G - D(L)
+C
+ DO 140 I = L1, N
+ 140 D(I) = D(I) - H
+C
+ F = F + H
+C .......... RATIONAL QL TRANSFORMATION ..........
+ G = D(M) + B
+ H = G
+ S = ZERO
+ DO 200 I = M-1,L,-1
+ P = G * H
+ R = P + E2(I)
+ E2(I+1) = S * R
+ S = E2(I) / R
+ D(I+1) = H + S * (H + D(I))
+ G = D(I) - E2(I) / G + B
+ H = G * P / R
+ 200 CONTINUE
+C
+ E2(L) = S * G
+ D(L) = H
+C .......... GUARD AGAINST UNDERFLOW IN CONVERGENCE TEST
+ IF (H .EQ. ZERO) GO TO 210
+ IF (ABS(E2(L)) .LE. ABS(C/H)) GO TO 210
+ E2(L) = H * E2(L)
+ IF (E2(L) .EQ. ZERO) GO TO 210
+ 205 CONTINUE
+C .......... SET ERROR -- NO CONVERGENCE TO AN
+C EIGENVALUE AFTER 30 ITERATIONS ..........
+ IERR = L
+ GO TO 1001
+C
+C CONVERGED
+C
+ 210 P = D(L) + F
+C .......... ORDER EIGENVALUES ..........
+ I = 1
+ IF (L .EQ. 1) GO TO 250
+ IF (P .LT. D(1)) GO TO 230
+ I = L
+C .......... LOOP TO FIND ORDERED POSITION
+ 220 I = I - 1
+ IF (P .LT. D(I)) GO TO 220
+C
+ I = I + 1
+ IF (I .EQ. L) GO TO 250
+ 230 CONTINUE
+ DO 240 II = L, I+1, -1
+ D(II) = D(II-1)
+ IND(II) = IND(II-1)
+ 240 CONTINUE
+C
+ 250 CONTINUE
+ D(I) = P
+ IND(I) = ITAG
+ 290 CONTINUE
+C
+ 1001 RETURN
+ END
+C*MODULE EIGEN *DECK ESTPI1
+ DOUBLE PRECISION FUNCTION ESTPI1 (N,EVAL,D,E,X,ANORM)
+C*
+C* AUTHOR -
+C* STEPHEN T. ELBERT (AMES LABORATORY-USDOE) DATE: 5 DEC 1986
+C*
+C* PURPOSE -
+C* EVALUATE SYMMETRIC TRIDIAGONAL MATRIX PERFORMANCE INDEX
+C* * * * * *
+C* FOR 1 EIGENVECTOR
+C* *
+C*
+C* METHOD -
+C* THIS ROUTINE FORMS THE 1-NORM OF THE RESIDUAL MATRIX A*X-X*EVAL
+C* WHERE A IS A SYMMETRIC TRIDIAGONAL MATRIX STORED
+C* IN THE DIAGONAL (D) AND SUB-DIAGONAL (E) VECTORS, EVAL IS THE
+C* EIGENVALUE OF AN EIGENVECTOR OF A, NAMELY X.
+C* THIS NORM IS SCALED BY MACHINE ACCURACY FOR THE PROBLEM SIZE.
+C* ALL NORMS APPEARING IN THE COMMENTS BELOW ARE 1-NORMS.
+C*
+C* ON ENTRY -
+C* N - INTEGER
+C* THE ORDER OF THE MATRIX A.
+C* EVAL - W.P. REAL
+C* THE EIGENVALUE CORRESPONDING TO VECTOR X.
+C* D - W.P. REAL (N)
+C* THE DIAGONAL VECTOR OF A.
+C* E - W.P. REAL (N)
+C* THE SUB-DIAGONAL VECTOR OF A.
+C* X - W.P. REAL (N)
+C* AN EIGENVECTOR OF A.
+C* ANORM - W.P. REAL
+C* THE NORM OF A IF IT HAS BEEN PREVIOUSLY COMPUTED.
+C*
+C* ON EXIT -
+C* ANORM - W.P. REAL
+C* THE NORM OF A, COMPUTED IF INITIALLY ZERO.
+C* ESTPI1 - W.P. REAL
+C* !!A*X-X*EVAL!! / (EPSLON(10*N)*!!A!!*!!X!!);
+C* WHERE EPSLON(X) IS THE SMALLEST NUMBER SUCH THAT
+C* X + EPSLON(X) .NE. X
+C*
+C* ESTPI1 .LT. 1 == SATISFACTORY PERFORMANCE
+C* .GE. 1 AND .LE. 100 == MARGINAL PERFORMANCE
+C* .GT. 100 == POOR PERFORMANCE
+C* (SEE LECT. NOTES IN COMP. SCI. VOL.6 PP 124-125)
+C
+ DOUBLE PRECISION ANORM,EVAL,RNORM,SIZE,XNORM
+ DOUBLE PRECISION D(N), E(N), X(N)
+ DOUBLE PRECISION EPSLON, ONE, ZERO
+C
+ PARAMETER (ZERO = 0.0D+00, ONE = 1.0D+00)
+C
+C-----------------------------------------------------------------------
+C
+ ESTPI1 = ZERO
+ IF( N .LE. 1 ) RETURN
+ SIZE = 10 * N
+ IF (ANORM .EQ. ZERO) THEN
+C
+C COMPUTE NORM OF A
+C
+ ANORM = MAX( ABS(D(1)) + ABS(E(2))
+ * ,ABS(D(N)) + ABS(E(N)))
+ DO 110 I = 2, N-1
+ ANORM = MAX( ANORM, ABS(E(I))+ABS(D(I))+ABS(E(I+1)))
+ 110 CONTINUE
+ IF(ANORM .EQ. ZERO) ANORM = ONE
+ END IF
+C
+C COMPUTE NORMS OF RESIDUAL AND EIGENVECTOR
+C
+ XNORM = ABS(X(1)) + ABS(X(N))
+ RNORM = ABS( (D(1)-EVAL)*X(1) + E(2)*X(2))
+ * +ABS( (D(N)-EVAL)*X(N) + E(N)*X(N-1))
+ DO 120 I = 2, N-1
+ XNORM = XNORM + ABS(X(I))
+ RNORM = RNORM + ABS(E(I)*X(I-1) + (D(I)-EVAL)*X(I)
+ * + E(I+1)*X(I+1))
+ 120 CONTINUE
+C
+ ESTPI1 = RNORM / (EPSLON(SIZE)*ANORM*XNORM)
+ RETURN
+ END
+C*MODULE EIGEN *DECK ETRBK3
+ SUBROUTINE ETRBK3(NM,N,NV,A,M,Z)
+C*
+C* AUTHORS-
+C* THIS IS A MODIFICATION OF ROUTINE TRBAK3 FROM EISPACK EDITION 3
+C* DATED AUGUST 1983.
+C* EISPACK TRBAK3 IS A TRANSLATION OF THE ALGOL PROCEDURE TRBAK3,
+C* NUM. MATH. 11, 181-195(1968) BY MARTIN, REINSCH, AND WILKINSON.
+C* HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971).
+C* THIS VERSION IS BY S. T. ELBERT (AMES LABORATORY-USDOE)
+C*
+C* PURPOSE -
+C* THIS ROUTINE FORMS THE EIGENVECTORS OF A REAL SYMMETRIC
+C* MATRIX BY BACK TRANSFORMING THOSE OF THE CORRESPONDING
+C* SYMMETRIC TRIDIAGONAL MATRIX DETERMINED BY ETRED3.
+C*
+C* METHOD -
+C* THE CALCULATION IS CARRIED OUT BY FORMING THE MATRIX PRODUCT
+C* Q*Z
+C* WHERE Q IS A PRODUCT OF THE ORTHOGONAL SYMMETRIC MATRICES
+C* Q = PROD(I)[1 - U(I)*.TRANSPOSE.U(I)*H(I)]
+C* U IS THE AUGMENTED SUB-DIAGONAL ROWS OF A AND
+C* Z IS THE SET OF EIGENVECTORS OF THE TRIDIAGONAL
+C* MATRIX F WHICH WAS FORMED FROM THE ORIGINAL SYMMETRIC
+C* MATRIX C BY THE SIMILARITY TRANSFORMATION
+C* F = Q(TRANSPOSE) C Q
+C* NOTE THAT ETRBK3 PRESERVES VECTOR EUCLIDEAN NORMS.
+C*
+C*
+C* COMPLEXITY -
+C* M*N**2
+C*
+C* ON ENTRY-
+C* NM - INTEGER
+C* MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
+C* ARRAY PARAMETERS AS DECLARED IN THE CALLING ROUTINE
+C* DIMENSION STATEMENT.
+C* N - INTEGER
+C* THE ORDER OF THE MATRIX A.
+C* NV - INTEGER
+C* MUST BE SET TO THE DIMENSION OF THE ARRAY A AS
+C* DECLARED IN THE CALLING ROUTINE DIMENSION STATEMENT.
+C* A - W.P. REAL (NV)
+C* CONTAINS INFORMATION ABOUT THE ORTHOGONAL
+C* TRANSFORMATIONS USED IN THE REDUCTION BY ETRED3 IN
+C* ITS FIRST NV = N*(N+1)/2 POSITIONS.
+C* M - INTEGER
+C* THE NUMBER OF EIGENVECTORS TO BE BACK TRANSFORMED.
+C* Z - W.P REAL (NM,M)
+C* CONTAINS THE EIGENVECTORS TO BE BACK TRANSFORMED
+C* IN ITS FIRST M COLUMNS.
+C*
+C* ON EXIT-
+C* Z - W.P. REAL (NM,M)
+C* CONTAINS THE TRANSFORMED EIGENVECTORS
+C* IN ITS FIRST M COLUMNS.
+C*
+C* DIFFERENCES WITH EISPACK 3 -
+C* THE TWO INNER LOOPS ARE REPLACED BY DDOT AND DAXPY.
+C* MULTIPLICATION USED INSTEAD OF DIVISION TO FIND S.
+C* OUTER LOOP RANGE CHANGED FROM 2,N TO 3,N.
+C* ADDRESS POINTERS FOR A SIMPLIFIED.
+C*
+C* NOTE -
+C* QUESTIONS AND COMMENTS CONCERNING EISPACK SHOULD BE DIRECTED TO
+C* B. S. GARBOW, APPLIED MATH. DIVISION, ARGONNE NATIONAL LAB.
+C
+ INTEGER I,II,IM1,IZ,J,M,N,NM,NV
+C
+ DOUBLE PRECISION A(NV),Z(NM,M)
+ DOUBLE PRECISION H,S,DDOT,ZERO
+C
+ PARAMETER (ZERO = 0.0D+00)
+C
+C-----------------------------------------------------------------------
+C
+ IF (M .EQ. 0) RETURN
+ IF (N .LE. 2) RETURN
+C
+ II=3
+ DO 140 I = 3, N
+ IZ=II+1
+ II=II+I
+ H = A(II)
+ IF (H .EQ. ZERO) GO TO 140
+ IM1 = I - 1
+ DO 130 J = 1, M
+ S = -( DDOT(IM1,A(IZ),1,Z(1,J),1) * H) * H
+ CALL DAXPY(IM1,S,A(IZ),1,Z(1,J),1)
+ 130 CONTINUE
+ 140 CONTINUE
+ RETURN
+ END
+C*MODULE EIGEN *DECK ETRED3
+ SUBROUTINE ETRED3(N,NV,A,D,E,E2)
+C*
+C* AUTHORS -
+C* THIS IS A MODIFICATION OF ROUTINE TRED3 FROM EISPACK EDITION 3
+C* DATED AUGUST 1983.
+C* EISPACK TRED3 IS A TRANSLATION OF THE ALGOL PROCEDURE TRED3,
+C* NUM. MATH. 11, 181-195(1968) BY MARTIN, REINSCH, AND WILKINSON.
+C* HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971).
+C* THIS VERSION IS BY S. T. ELBERT, AMES LABORATORY-USDOE JUN 1986
+C*
+C* PURPOSE -
+C* THIS ROUTINE REDUCES A REAL SYMMETRIC (PACKED) MATRIX, STORED
+C* AS A ONE-DIMENSIONAL ARRAY, TO A SYMMETRIC TRIDIAGONAL MATRIX
+C* USING ORTHOGONAL SIMILARITY TRANSFORMATIONS, PRESERVING THE
+C* INFORMATION ABOUT THE TRANSFORMATIONS IN A.
+C*
+C* METHOD -
+C* THE TRIDIAGONAL REDUCTION IS PERFORMED IN THE FOLLOWING WAY.
+C* STARTING WITH J=N, THE ELEMENTS IN THE J-TH ROW TO THE
+C* LEFT OF THE DIAGONAL ARE FIRST SCALED, TO AVOID POSSIBLE
+C* UNDERFLOW IN THE TRANSFORMATION THAT MIGHT RESULT IN SEVERE
+C* DEPARTURE FROM ORTHOGONALITY. THE SUM OF SQUARES SIGMA OF
+C* THESE SCALED ELEMENTS IS NEXT FORMED. THEN, A VECTOR U AND
+C* A SCALAR
+C* H = U(TRANSPOSE) * U / 2
+C* DEFINE A REFLECTION OPERATOR
+C* P = I - U * U(TRANSPOSE) / H
+C* WHICH IS ORTHOGONAL AND SYMMETRIC AND FOR WHICH THE
+C* SIMILIARITY TRANSFORMATION PAP ELIMINATES THE ELEMENTS IN
+C* THE J-TH ROW OF A TO THE LEFT OF THE SUBDIAGONAL AND THE
+C* SYMMETRICAL ELEMENTS IN THE J-TH COLUMN.
+C*
+C* THE NON-ZERO COMPONENTS OF U ARE THE ELEMENTS OF THE J-TH
+C* ROW TO THE LEFT OF THE DIAGONAL WITH THE LAST OF THEM
+C* AUGMENTED BY THE SQUARE ROOT OF SIGMA PREFIXED BY THE SIGN
+C* OF THE SUBDIAGONAL ELEMENT. BY STORING THE TRANSFORMED SUB-
+C* DIAGONAL ELEMENT IN E(J) AND NOT OVERWRITING THE ROW
+C* ELEMENTS ELIMINATED IN THE TRANSFORMATION, FULL INFORMATION
+C* ABOUT P IS SAVE FOR LATER USE IN ETRBK3.
+C*
+C* THE TRANSFORMATION SETS E2(J) EQUAL TO SIGMA AND E(J)
+C* EQUAL TO THE SQUARE ROOT OF SIGMA PREFIXED BY THE SIGN
+C* OF THE REPLACED SUBDIAGONAL ELEMENT.
+C*
+C* THE ABOVE STEPS ARE REPEATED ON FURTHER ROWS OF THE
+C* TRANSFORMED A IN REVERSE ORDER UNTIL A IS REDUCED TO TRI-
+C* DIAGONAL FORM, THAT IS, REPEATED FOR J = N-1,N-2,...,3.
+C*
+C* COMPLEXITY -
+C* 2/3 N**3
+C*
+C* ON ENTRY-
+C* N - INTEGER
+C* THE ORDER OF THE MATRIX.
+C* NV - INTEGER
+C* MUST BE SET TO THE DIMENSION OF THE ARRAY PARAMETER A
+C* AS DECLARED IN THE CALLING ROUTINE DIMENSION STATEMENT
+C* A - W.P. REAL (NV)
+C* CONTAINS THE LOWER TRIANGLE OF THE REAL SYMMETRIC
+C* INPUT MATRIX, STORED ROW-WISE AS A ONE-DIMENSIONAL
+C* ARRAY, IN ITS FIRST N*(N+1)/2 POSITIONS.
+C*
+C* ON EXIT-
+C* A - W.P. REAL (NV)
+C* CONTAINS INFORMATION ABOUT THE ORTHOGONAL
+C* TRANSFORMATIONS USED IN THE REDUCTION.
+C* D - W.P. REAL (N)
+C* CONTAINS THE DIAGONAL ELEMENTS OF THE TRIDIAGONAL
+C* MATRIX.
+C* E - W.P. REAL (N)
+C* CONTAINS THE SUBDIAGONAL ELEMENTS OF THE TRIDIAGONAL
+C* MATRIX IN ITS LAST N-1 POSITIONS. E(1) IS SET TO ZERO
+C* E2 - W.P. REAL (N)
+C* CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF
+C* E. MAY COINCIDE WITH E IF THE SQUARES ARE NOT NEEDED.
+C*
+C* DIFFERENCES FROM EISPACK 3 -
+C* OUTER LOOP CHANGED FROM II=1,N TO I=N,3,-1
+C* PARAMETER STATEMENT AND GENERIC INTRINSIC FUNCTIONS USED
+C* SCALE.NE.0 TEST NOW SPOTS TRI-DIAGONAL FORM
+C* VALUES LESS THAN EPSLON CLEARED TO ZERO
+C* USE BLAS(1)
+C* U NOT COPIED TO D, LEFT IN A
+C* E2 COMPUTED FROM E
+C* INNER LOOPS SPLIT INTO ROUTINES ELAU AND FREDA
+C* INVERSE OF H STORED INSTEAD OF H
+C*
+C* NOTE -
+C* QUESTIONS AND COMMENTS CONCERNING EISPACK SHOULD BE DIRECTED TO
+C* B. S. GARBOW, APPLIED MATH. DIVISION, ARGONNE NATIONAL LAB.
+C
+ INTEGER I,IIA,IZ0,L,N,NV
+C
+ DOUBLE PRECISION A(NV),D(N),E(N),E2(N)
+ DOUBLE PRECISION AIIMAX,F,G,H,HROOT,SCALE,SCALEI
+ DOUBLE PRECISION DASUM, DNRM2
+ DOUBLE PRECISION ONE, ZERO
+C
+ PARAMETER (ZERO = 0.0D+00, ONE = 1.0D+00)
+C
+C-----------------------------------------------------------------------
+C
+ IF (N .LE. 2) GO TO 310
+ IZ0 = (N*N+N)/2
+ AIIMAX = ABS(A(IZ0))
+ DO 300 I = N, 3, -1
+ L = I - 1
+ IIA = IZ0
+ IZ0 = IZ0 - I
+ AIIMAX = MAX(AIIMAX, ABS(A(IIA)))
+ SCALE = DASUM (L, A(IZ0+1), 1)
+ IF(SCALE .EQ. ABS(A(IIA-1)) .OR. AIIMAX+SCALE .EQ. AIIMAX) THEN
+C
+C THIS ROW IS ALREADY IN TRI-DIAGONAL FORM
+C
+ D(I) = A(IIA)
+ IF (AIIMAX+D(I) .EQ. AIIMAX) D(I) = ZERO
+ E(I) = A(IIA-1)
+ IF (AIIMAX+E(I) .EQ. AIIMAX) E(I) = ZERO
+ E2(I) = E(I)*E(I)
+ A(IIA) = ZERO
+ GO TO 300
+C
+ END IF
+C
+ SCALEI = ONE / SCALE
+ CALL DSCAL(L,SCALEI,A(IZ0+1),1)
+ HROOT = DNRM2(L,A(IZ0+1),1)
+C
+ F = A(IZ0+L)
+ G = -SIGN(HROOT,F)
+ E(I) = SCALE * G
+ E2(I) = E(I)*E(I)
+ H = HROOT*HROOT - F * G
+ A(IZ0+L) = F - G
+ D(I) = A(IIA)
+ A(IIA) = ONE / SQRT(H)
+C .......... FORM P THEN Q IN E(1:L) ..........
+ CALL ELAU(ONE/H,L,A(IZ0+1),A,E)
+C .......... FORM REDUCED A ..........
+ CALL FREDA(L,A(IZ0+1),A,E)
+C
+ 300 CONTINUE
+ 310 CONTINUE
+ E(1) = ZERO
+ E2(1)= ZERO
+ D(1) = A(1)
+ IF(N.EQ.1) RETURN
+C
+ E(2) = A(2)
+ E2(2)= A(2)*A(2)
+ D(2) = A(3)
+ RETURN
+ END
+C*MODULE EIGEN *DECK EVVRSP
+ SUBROUTINE EVVRSP(MSGFL,N,NVECT,LENA,NV,A,B,IND,ROOT,
+ * VECT,IORDER,IERR)
+C*
+C* AUTHOR: S. T. ELBERT, AMES LABORATORY-USDOE, JUNE 1985
+C*
+C* PURPOSE -
+C* FINDS (ALL) EIGENVALUES AND (SOME OR ALL) EIGENVECTORS
+C* * * *
+C* OF A REAL SYMMETRIC PACKED MATRIX.
+C* * * *
+C*
+C* METHOD -
+C* THE METHOD AS PRESENTED IN THIS ROUTINE CONSISTS OF FOUR STEPS:
+C* FIRST, THE INPUT MATRIX IS REDUCED TO TRIDIAGONAL FORM BY THE
+C* HOUSEHOLDER TECHNIQUE (ORTHOGONAL SIMILARITY TRANSFORMATIONS).
+C* SECOND, THE ROOTS ARE LOCATED USING THE RATIONAL QL METHOD.
+C* THIRD, THE VECTORS OF THE TRIDIAGONAL FORM ARE EVALUATED BY THE
+C* INVERSE ITERATION TECHNIQUE. VECTORS FOR DEGENERATE OR NEAR-
+C* DEGENERATE ROOTS ARE FORCED TO BE ORTHOGONAL.
+C* FOURTH, THE TRIDIAGONAL VECTORS ARE ROTATED TO VECTORS OF THE
+C* ORIGINAL ARRAY.
+C*
+C* THESE ROUTINES ARE MODIFICATIONS OF THE EISPACK 3
+C* ROUTINES TRED3, TQLRAT, TINVIT AND TRBAK3
+C*
+C* FOR FURTHER DETAILS, SEE EISPACK USERS GUIDE, B. T. SMITH
+C* ET AL, SPRINGER-VERLAG, LECTURE NOTES IN COMPUTER SCIENCE,
+C* VOL. 6, 2-ND EDITION, 1976. ANOTHER GOOD REFERENCE IS
+C* THE SYMMETRIC EIGENVALUE PROBLEM BY B. N. PARLETT
+C* PUBLISHED BY PRENTICE-HALL, INC., ENGLEWOOD CLIFFS, N.J. (1980)
+C*
+C* ON ENTRY -
+C* MSGFL - INTEGER (LOGICAL UNIT NO.)
+C* FILE WHERE ERROR MESSAGES WILL BE PRINTED.
+C* IF MSGFL IS 0, ERROR MESSAGES WILL BE PRINTED ON LU 6.
+C* IF MSGFL IS NEGATIVE, NO ERROR MESSAGES PRINTED.
+C* N - INTEGER
+C* ORDER OF MATRIX A.
+C* NVECT - INTEGER
+C* NUMBER OF VECTORS DESIRED. 0 .LE. NVECT .LE. N.
+C* LENA - INTEGER
+C* DIMENSION OF A IN CALLING ROUTINE. MUST NOT BE LESS
+C* THAN (N*N+N)/2.
+C* NV - INTEGER
+C* ROW DIMENSION OF VECT IN CALLING ROUTINE. N .LE. NV.
+C* A - WORKING PRECISION REAL (LENA)
+C* INPUT MATRIX, ROWS OF THE LOWER TRIANGLE PACKED INTO
+C* LINEAR ARRAY OF DIMENSION N*(N+1)/2. THE PACKED ORDER
+C* IS A(1,1), A(2,1), A(2,2), A(3,1), A(3,2), ...
+C* B - WORKING PRECISION REAL (N,8)
+C* SCRATCH ARRAY, 8*N ELEMENTS
+C* IND - INTEGER (N)
+C* SCRATCH ARRAY OF LENGTH N.
+C* IORDER - INTEGER
+C* ROOT ORDERING FLAG.
+C* = 0, ROOTS WILL BE PUT IN ASCENDING ORDER.
+C* = 2, ROOTS WILL BE PUT IN DESCENDING ORDER.
+C*
+C* ON EXIT -
+C* A - DESTORYED. NOW HOLDS REFLECTION OPERATORS.
+C* ROOT - WORKING PRECISION REAL (N)
+C* ALL EIGENVALUES IN ASCENDING OR DESCENDING ORDER.
+C* IF IORDER = 0, ROOT(1) .LE. ... .LE. ROOT(N)
+C* IF IORDER = 2, ROOT(1) .GE. ... .GE. ROOT(N)
+C* VECT - WORKING PRECISION REAL (NV,NVECT)
+C* EIGENVECTORS FOR ROOT(1), ..., ROOT(NVECT).
+C* IERR - INTEGER
+C* = 0 IF NO ERROR DETECTED,
+C* = K IF ITERATION FOR K-TH EIGENVALUE FAILED,
+C* = -K IF ITERATION FOR K-TH EIGENVECTOR FAILED.
+C* (FAILURES SHOULD BE VERY RARE. CONTACT C. MOLER.)
+C*
+C
+ LOGICAL GOPARR,DSKWRK,MASWRK
+C
+ DOUBLE PRECISION A(LENA)
+ DOUBLE PRECISION B(N,8)
+ DOUBLE PRECISION ROOT(N)
+ DOUBLE PRECISION T
+ DOUBLE PRECISION VECT(NV,*)
+C
+ INTEGER IND(N)
+C
+ COMMON /PAR / ME,MASTER,NPROC,IBTYP,IPTIM,GOPARR,DSKWRK,MASWRK
+C
+ 900 FORMAT(26H0*** EVVRSP PARAMETERS ***/
+ + 14H *** N = ,I8,4H ***/
+ + 14H *** NVECT = ,I8,4H ***/
+ + 14H *** LENA = ,I8,4H ***/
+ + 14H *** NV = ,I8,4H ***/
+ + 14H *** IORDER = ,I8,4H ***/
+ + 14H *** IERR = ,I8,4H ***)
+ 901 FORMAT(37H VALUE OF LENA IS LESS THAN (N*N+N)/2)
+ 902 FORMAT(39H EQLRAT HAS FAILED TO CONVERGE FOR ROOT,I5)
+ 903 FORMAT(18H NV IS LESS THAN N)
+ 904 FORMAT(41H EINVIT HAS FAILED TO CONVERGE FOR VECTOR,I5)
+ 905 FORMAT(51H VALUE OF IORDER MUST BE 0 (SMALLEST ROOT FIRST) OR
+ * ,23H 2 (LARGEST ROOT FIRST))
+ 906 FORMAT(' VALUE OF N IS LESS THAN OR EQUAL ZERO')
+C
+C-----------------------------------------------------------------------
+C
+ LMSGFL=MSGFL
+ IF (MSGFL .EQ. 0) LMSGFL=6
+ IERR = N - 1
+ IF (N .LE. 0) GO TO 800
+ IERR = N + 1
+ IF ( (N*N+N)/2 .GT. LENA) GO TO 810
+C
+C REDUCE REAL SYMMETRIC MATRIX A TO TRIDIAGONAL FORM
+C
+ CALL ETRED3(N,LENA,A,B(1,1),B(1,2),B(1,3))
+C
+C FIND ALL EIGENVALUES OF TRIDIAGONAL MATRIX
+C
+ CALL EQLRAT(N,B(1,1),B(1,2),B(1,3),ROOT,IND,IERR,B(1,4))
+ IF (IERR .NE. 0) GO TO 820
+C
+C CHECK THE DESIRED ORDER OF THE EIGENVALUES
+C
+ B(1,3) = IORDER
+ IF (IORDER .EQ. 0) GO TO 300
+ IF (IORDER .NE. 2) GO TO 850
+C
+C ORDER ROOTS IN DESCENDING ORDER (LARGEST FIRST)...
+C TURN ROOT AND IND ARRAYS END FOR END
+C
+ DO 210 I = 1, N/2
+ J = N+1-I
+ T = ROOT(I)
+ ROOT(I) = ROOT(J)
+ ROOT(J) = T
+ L = IND(I)
+ IND(I) = IND(J)
+ IND(J) = L
+ 210 CONTINUE
+C
+C FIND I AND J MARKING THE START AND END OF A SEQUENCE
+C OF DEGENERATE ROOTS
+C
+ I=0
+ 220 CONTINUE
+ I = I+1
+ IF (I .GT. N) GO TO 300
+ DO 230 J=I,N
+ IF (ROOT(J) .NE. ROOT(I)) GO TO 240
+ 230 CONTINUE
+ J = N+1
+ 240 CONTINUE
+ J = J-1
+ IF (J .EQ. I) GO TO 220
+C
+C TURN AROUND IND BETWEEN I AND J
+C
+ JSV = J
+ KLIM = (J-I+1)/2
+ DO 250 K=1,KLIM
+ L = IND(J)
+ IND(J) = IND(I)
+ IND(I) = L
+ I = I+1
+ J = J-1
+ 250 CONTINUE
+ I = JSV
+ GO TO 220
+C
+ 300 CONTINUE
+C
+ IF (NVECT .LE. 0) RETURN
+ IF (NV .LT. N) GO TO 830
+C
+C FIND EIGENVECTORS OF TRI-DIAGONAL MATRIX VIA INVERSE ITERATION
+C
+ IERR = LMSGFL
+ CALL EINVIT(NV,N,B(1,1),B(1,2),B(1,3),NVECT,ROOT,IND,
+ + VECT,IERR,B(1,4),B(1,5),B(1,6),B(1,7),B(1,8))
+ IF (IERR .NE. 0) GO TO 840
+C
+C FIND EIGENVECTORS OF SYMMETRIC MATRIX VIA BACK TRANSFORMATION
+C
+ 400 CONTINUE
+ CALL ETRBK3(NV,N,LENA,A,NVECT,VECT)
+ RETURN
+C
+C ERROR MESSAGE SECTION
+C
+ 800 IF (LMSGFL .LT. 0) RETURN
+ IF (MASWRK) WRITE(LMSGFL,906)
+ GO TO 890
+C
+ 810 IF (LMSGFL .LT. 0) RETURN
+ IF (MASWRK) WRITE(LMSGFL,901)
+ GO TO 890
+C
+ 820 IF (LMSGFL .LT. 0) RETURN
+ IF (MASWRK) WRITE(LMSGFL,902) IERR
+ GO TO 890
+C
+ 830 IF (LMSGFL .LT. 0) RETURN
+ IF (MASWRK) WRITE(LMSGFL,903)
+ GO TO 890
+C
+ 840 CONTINUE
+ IF ((LMSGFL .GT. 0).AND.MASWRK) WRITE(LMSGFL,904) -IERR
+ GO TO 400
+C
+ 850 IERR=-1
+ IF (LMSGFL .LT. 0) RETURN
+ IF (MASWRK) WRITE(LMSGFL,905)
+ GO TO 890
+C
+ 890 CONTINUE
+ IF (MASWRK) WRITE(LMSGFL,900) N,NVECT,LENA,NV,IORDER,IERR
+ RETURN
+ END
+C*MODULE EIGEN *DECK FREDA
+ SUBROUTINE FREDA(L,D,A,E)
+C
+ DOUBLE PRECISION A(*)
+ DOUBLE PRECISION D(L)
+ DOUBLE PRECISION E(L)
+ DOUBLE PRECISION F
+ DOUBLE PRECISION G
+C
+ JK = 1
+C
+C .......... FORM REDUCED A ..........
+C
+ DO 280 J = 1, L
+ F = D(J)
+ G = E(J)
+C
+ DO 260 K = 1, J
+ A(JK) = A(JK) - F * E(K) - G * D(K)
+ JK = JK + 1
+ 260 CONTINUE
+C
+ 280 CONTINUE
+ RETURN
+ END
+C*MODULE EIGEN *DECK GIVEIS
+ SUBROUTINE GIVEIS(N,NVECT,NV,A,B,INDB,ROOT,VECT,IERR)
+ IMPLICIT DOUBLE PRECISION(A-H,O-Z)
+ DIMENSION A(*),B(N,8),INDB(N),ROOT(N),VECT(NV,NVECT)
+C
+C EISPACK-BASED SUBSTITUTE FOR QCPE ROUTINE GIVENS.
+C FINDS ALL EIGENVALUES AND SOME EIGENVECTORS OF A REAL SYMMETRIC
+C MATRIX. AUTHOR.. C. MOLER AND D. SPANGLER, N.R.C.C., 4/1/79.
+C
+C INPUT..
+C N = ORDER OF MATRIX .
+C NVECT = NUMBER OF VECTORS DESIRED. 0 .LE. NVECT .LE. N .
+C NV = LEADING DIMENSION OF VECT .
+C A = INPUT MATRIX, COLUMNS OF THE UPPER TRIANGLE PACKED INTO
+C LINEAR ARRAY OF DIMENSION N*(N+1)/2 .
+C B = SCRATCH ARRAY, 8*N ELEMENTS (NOTE THIS IS MORE THAN
+C PREVIOUS VERSIONS OF GIVENS.)
+C IND = INDEX ARRAY OF N ELEMENTS
+C
+C OUTPUT..
+C A DESTROYED .
+C ROOT = ALL EIGENVALUES, ROOT(1) .LE. ... .LE. ROOT(N) .
+C (FOR OTHER ORDERINGS, SEE BELOW.)
+C VECT = EIGENVECTORS FOR ROOT(1),..., ROOT(NVECT) .
+C IERR = 0 IF NO ERROR DETECTED,
+C = K IF ITERATION FOR K-TH EIGENVALUE FAILED,
+C = -K IF ITERATION FOR K-TH EIGENVECTOR FAILED.
+C (FAILURES SHOULD BE VERY RARE. CONTACT MOLER.)
+C
+C CALLS MODIFIED EISPACK ROUTINES TRED3B, IMTQLV, TINVTB, AND
+C TRBK3B. THE ROUTINES TRED3B, TINVTB, AND TRBK3B.
+C THE ORIGINAL EISPACK ROUTINES TRED3, TINVIT, AND TRBAK3
+C WERE MODIFIED BY THE INTRODUCTION OF TWO ROUTINES FROM THE
+C BLAS LIBRARY - DDOT AND DAXPY.
+C
+C IF TINVIT FAILS TO CONVERGE, TQL2 IS CALLED
+C
+C SEE EISPACK USERS GUIDE, B. T. SMITH ET AL, SPRINGER-VERLAG
+C LECTURE NOTES IN COMPUTER SCIENCE, VOL. 6, 2-ND EDITION, 1976 .
+C NOTE THAT IMTQLV AND TINVTB HAVE INTERNAL MACHINE
+C DEPENDENT CONSTANTS.
+C
+ DATA ONE, ZERO /1.0D+00, 0.0D+00/
+ CALL TRED3B(N,(N*N+N)/2,A,B(1,1),B(1,2),B(1,3))
+ CALL IMTQLV(N,B(1,1),B(1,2),B(1,3),ROOT,INDB,IERR,B(1,4))
+ IF (IERR .NE. 0) RETURN
+C
+C TO REORDER ROOTS...
+C K = N/2
+C B(1,3) = 2.0D+00
+C DO 50 I = 1, K
+C J = N+1-I
+C T = ROOT(I)
+C ROOT(I) = ROOT(J)
+C ROOT(J) = T
+C 50 CONTINUE
+C
+ IF (NVECT .LE. 0) RETURN
+ CALL TINVTB(NV,N,B(1,1),B(1,2),B(1,3),NVECT,ROOT,INDB,VECT,IERR,
+ + B(1,4),B(1,5),B(1,6),B(1,7),B(1,8))
+ IF (IERR .EQ. 0) GO TO 160
+C
+C IF INVERSE ITERATION GIVES AN ERROR IN DETERMINING THE
+C EIGENVECTORS, TRY THE QL ALGORITHM IF ALL THE EIGENVECTORS
+C ARE DESIRED.
+C
+ IF (NVECT .NE. N) RETURN
+ DO 120 I = 1, NVECT
+ DO 100 J = 1, N
+ VECT(I,J) = ZERO
+ 100 CONTINUE
+ VECT(I,I) = ONE
+ 120 CONTINUE
+ CALL TQL2 (NV,N,B(1,1),B(1,2),VECT,IERR)
+ DO 140 I = 1, NVECT
+ ROOT(I) = B(I,1)
+ 140 CONTINUE
+ IF (IERR .NE. 0) RETURN
+ 160 CALL TRBK3B(NV,N,(N*N+N)/2,A,NVECT,VECT)
+ RETURN
+ END
+C*MODULE EIGEN *DECK GLDIAG
+ SUBROUTINE GLDIAG(LDVECT,NVECT,N,H,WRK,EIG,VECTOR,IERR,IWRK)
+C
+ IMPLICIT DOUBLE PRECISION (A-H,O-Z)
+C
+ LOGICAL GOPARR,DSKWRK,MASWRK
+C
+ DIMENSION H(*),WRK(N,8),EIG(N),VECTOR(LDVECT,NVECT),IWRK(N)
+C
+ COMMON /IOFILE/ IR,IW,IP,IJK,IPK,IDAF,NAV,IODA(400)
+ COMMON /MACHSW/ KDIAG,ICORFL,IXDR
+ COMMON /PAR / ME,MASTER,NPROC,IBTYP,IPTIM,GOPARR,DSKWRK,MASWRK
+C
+C ----- GENERAL ROUTINE TO DIAGONALIZE A SYMMETRIC MATRIX -----
+C IF KDIAG = 0, USE A ROUTINE FROM THE VECTOR LIBRARY,
+C IF AVAILABLE (SEE THE SUBROUTINE 'GLDIAG'
+C IN VECTOR.SRC), OR EVVRSP OTHERWISE
+C = 1, USE EVVRSP
+C = 2, USE GIVEIS
+C = 3, USE JACOBI
+C
+C N = DIMENSION (ORDER) OF MATRIX TO BE SOLVED
+C LDVECT = LEADING DIMENSION OF VECTOR
+C NVECT = NUMBER OF VECTORS DESIRED
+C H = MATRIX TO BE DIAGONALIZED
+C WRK = N*8 W.P. REAL WORDS OF SCRATCH SPACE
+C EIG = EIGENVECTORS (OUTPUT)
+C VECTOR = EIGENVECTORS (OUTPUT)
+C IERR = ERROR FLAG (OUTPUT)
+C IWRK = N INTEGER WORDS OF SCRATCH SPACE
+C
+ IERR = 0
+C
+C ----- USE STEVE ELBERT'S ROUTINE -----
+C
+ IF(KDIAG.LE.1 .OR. KDIAG.GT.3) THEN
+ LENH = (N*N+N)/2
+ KORDER =0
+ CALL EVVRSP(IW,N,NVECT,LENH,LDVECT,H,WRK,IWRK,EIG,VECTOR
+ * ,KORDER,IERR)
+ END IF
+C
+C ----- USE MODIFIED EISPAK ROUTINE -----
+C
+ IF(KDIAG.EQ.2)
+ * CALL GIVEIS(N,NVECT,LDVECT,H,WRK,IWRK,EIG,VECTOR,IERR)
+C
+C ----- USE JACOBI ROTATION ROUTINE -----
+C
+ IF(KDIAG.EQ.3) THEN
+ IF(NVECT.EQ.N) THEN
+ CALL JACDG(H,VECTOR,EIG,IWRK,WRK,LDVECT,N)
+ ELSE
+ IF (MASWRK) WRITE(IW,9000) N,NVECT,LDVECT
+ CALL ABRT
+ END IF
+ END IF
+ RETURN
+C
+ 9000 FORMAT(1X,'IN -GLDIAG-, N,NVECT,LDVECT=',3I8/
+ * 1X,'THE JACOBI CODE CANNOT COPE WITH N.NE.NVECT!'/
+ * 1X,'SO THIS RUN DOES NOT PERMIT KDIAG=3.')
+ END
+C*MODULE EIGEN *DECK IMTQLV
+ SUBROUTINE IMTQLV(N,D,E,E2,W,IND,IERR,RV1)
+ IMPLICIT DOUBLE PRECISION(A-H,O-Z)
+ INTEGER TAG
+ DOUBLE PRECISION MACHEP
+ DIMENSION D(N),E(N),E2(N),W(N),RV1(N),IND(N)
+C
+C THIS ROUTINE IS A VARIANT OF IMTQL1 WHICH IS A TRANSLATION OF
+C ALGOL PROCEDURE IMTQL1, NUM. MATH. 12, 377-383(1968) BY MARTIN AND
+C WILKINSON, 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 ROUTINE FINDS THE EIGENVALUES OF A SYMMETRIC TRIDIAGONAL
+C MATRIX BY THE IMPLICIT QL METHOD AND ASSOCIATES WITH THEM
+C THEIR CORRESPONDING SUBMATRIX INDICES.
+C
+C ON INPUT-
+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 E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E.
+C E2(1) IS ARBITRARY.
+C
+C ON OUTPUT-
+C
+C D AND E ARE UNALTERED,
+C
+C ELEMENTS OF E2, CORRESPONDING TO ELEMENTS OF E REGARDED
+C AS NEGLIGIBLE, HAVE BEEN REPLACED BY ZERO CAUSING THE
+C MATRIX TO SPLIT INTO A DIRECT SUM OF SUBMATRICES.
+C E2(1) IS ALSO SET TO ZERO,
+C
+C W CONTAINS THE EIGENVALUES IN ASCENDING ORDER. IF AN
+C ERROR EXIT IS MADE, THE EIGENVALUES ARE CORRECT AND
+C ORDERED FOR INDICES 1,2,...IERR-1, BUT MAY NOT BE
+C THE SMALLEST EIGENVALUES,
+C
+C IND CONTAINS THE SUBMATRIX INDICES ASSOCIATED WITH THE
+C CORRESPONDING EIGENVALUES IN W -- 1 FOR EIGENVALUES
+C BELONGING TO THE FIRST SUBMATRIX FROM THE TOP,
+C 2 FOR THOSE BELONGING TO THE SECOND SUBMATRIX, ETC.,
+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 RV1 IS A TEMPORARY STORAGE ARRAY.
+C
+C QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO B. S. GARBOW,
+C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY
+C
+C ------------------------------------------------------------------
+C
+C ********** MACHEP IS A MACHINE DEPENDENT PARAMETER SPECIFYING
+C THE RELATIVE PRECISION OF FLOATING POINT ARITHMETIC.
+C
+C **********
+ MACHEP = 2.0D+00**(-50)
+C
+ IERR = 0
+ K = 0
+ TAG = 0
+C
+ DO 100 I = 1, N
+ W(I) = D(I)
+ IF (I .NE. 1) RV1(I-1) = E(I)
+ 100 CONTINUE
+C
+ E2(1) = 0.0D+00
+ RV1(N) = 0.0D+00
+C
+ DO 360 L = 1, N
+ J = 0
+C ********** LOOK FOR SMALL SUB-DIAGONAL ELEMENT **********
+ 120 DO 140 M = L, N
+ IF (M .EQ. N) GO TO 160
+ IF (ABS(RV1(M)) .LE. MACHEP * (ABS(W(M)) + ABS(W(M+1)))) GO TO
+ + 160
+C ********** GUARD AGAINST UNDERFLOWED ELEMENT OF E2 **********
+ IF (E2(M+1) .EQ. 0.0D+00) GO TO 180
+ 140 CONTINUE
+C
+ 160 IF (M .LE. K) GO TO 200
+ IF (M .NE. N) E2(M+1) = 0.0D+00
+ 180 K = M
+ TAG = TAG + 1
+ 200 P = W(L)
+ IF (M .EQ. L) GO TO 280
+ IF (J .EQ. 30) GO TO 380
+ J = J + 1
+C ********** FORM SHIFT **********
+ G = (W(L+1) - P) / (2.0D+00 * RV1(L))
+ R = SQRT(G*G+1.0D+00)
+ G = W(M) - P + RV1(L) / (G + SIGN(R,G))
+ S = 1.0D+00
+ C = 1.0D+00
+ P = 0.0D+00
+ MML = M - L
+C ********** FOR I=M-1 STEP -1 UNTIL L DO -- **********
+ DO 260 II = 1, MML
+ I = M - II
+ F = S * RV1(I)
+ B = C * RV1(I)
+ IF (ABS(F) .LT. ABS(G)) GO TO 220
+ C = G / F
+ R = SQRT(C*C+1.0D+00)
+ RV1(I+1) = F * R
+ S = 1.0D+00 / R
+ C = C * S
+ GO TO 240
+ 220 S = F / G
+ R = SQRT(S*S+1.0D+00)
+ RV1(I+1) = G * R
+ C = 1.0D+00 / R
+ S = S * C
+ 240 G = W(I+1) - P
+ R = (W(I) - G) * S + 2.0D+00 * C * B
+ P = S * R
+ W(I+1) = G + P
+ G = C * R - B
+ 260 CONTINUE
+C
+ W(L) = W(L) - P
+ RV1(L) = G
+ RV1(M) = 0.0D+00
+ GO TO 120
+C ********** ORDER EIGENVALUES **********
+ 280 IF (L .EQ. 1) GO TO 320
+C ********** FOR I=L STEP -1 UNTIL 2 DO -- **********
+ DO 300 II = 2, L
+ I = L + 2 - II
+ IF (P .GE. W(I-1)) GO TO 340
+ W(I) = W(I-1)
+ IND(I) = IND(I-1)
+ 300 CONTINUE
+C
+ 320 I = 1
+ 340 W(I) = P
+ IND(I) = TAG
+ 360 CONTINUE
+C
+ GO TO 400
+C ********** SET ERROR -- NO CONVERGENCE TO AN
+C EIGENVALUE AFTER 30 ITERATIONS **********
+ 380 IERR = L
+ 400 RETURN
+C ********** LAST CARD OF IMTQLV **********
+ END
+C*MODULE EIGEN *DECK JACDG
+ SUBROUTINE JACDG(A,VEC,EIG,JBIG,BIG,LDVEC,N)
+C
+ IMPLICIT DOUBLE PRECISION(A-H,O-Z)
+C
+ DIMENSION A(*),VEC(LDVEC,N),EIG(N),JBIG(N),BIG(N)
+C
+ PARAMETER (ONE=1.0D+00)
+C
+C ----- JACOBI DIAGONALIZATION OF SYMMETRIC MATRIX -----
+C SYMMETRIC MATRIX -A- OF DIMENSION -N- IS DESTROYED ON EXIT.
+C ALL EIGENVECTORS ARE FOUND, SO -VEC- MUST BE SQUARE,
+C UNLESS SOMEONE TAKES THE TROUBLE TO LOOK AT -NMAX- BELOW.
+C -BIG- AND -JBIG- ARE SCRATCH WORK ARRAYS.
+C
+ CALL VCLR(VEC,1,LDVEC*N)
+ DO 20 I = 1,N
+ VEC(I,I) = ONE
+ 20 CONTINUE
+C
+ NB1 = N
+ NB2 = (NB1*NB1+NB1)/2
+ NMIN = 1
+ NMAX = NB1
+C
+ CALL JACDIA(A,VEC,NB1,NB2,LDVEC,NMIN,NMAX,BIG,JBIG)
+C
+ DO 30 I=1,N
+ EIG(I) = A((I*I+I)/2)
+ 30 CONTINUE
+C
+ CALL JACORD(VEC,EIG,NB1,LDVEC)
+ RETURN
+ END
+C*MODULE EIGEN *DECK JACDIA
+ SUBROUTINE JACDIA(F,VEC,NB1,NB2,LDVEC,NMIN,NMAX,BIG,JBIG)
+ IMPLICIT DOUBLE PRECISION(A-H,O-Z)
+ LOGICAL GOPARR,DSKWRK,MASWRK
+ DIMENSION F(NB2),VEC(LDVEC,NB1),BIG(NB1),JBIG(NB1)
+C
+ COMMON /PAR / ME,MASTER,NPROC,IBTYP,IPTIM,GOPARR,DSKWRK,MASWRK
+C
+ PARAMETER (ROOT2=0.707106781186548D+00 )
+ PARAMETER (ZERO=0.0D+00, ONE=1.0D+00, D1050=1.05D+00,
+ * D1500=1.5D+00, D3875=3.875D+00,
+ * D0500=0.5D+00, D1375=1.375D+00, D0250=0.25D+00 )
+ PARAMETER (C2=1.0D-12, C3=4.0D-16,
+ * C4=2.0D-16, C5=8.0D-09, C6=3.0D-06 )
+C
+C F IS THE MATRIX TO BE DIAGONALIZED, F IS STORED TRIANGULAR
+C VEC IS THE ARRAY OF EIGENVECTORS, DIMENSION NB1*NB1
+C BIG AND JBIG ARE TEMPORARY SCRATCH AREAS OF DIMENSION NB1
+C THE ROTATIONS AMONG THE FIRST NMIN BASIS FUNCTIONS ARE NOT
+C ACCOUNTED FOR.
+C THE ROTATIONS AMONG THE LAST NB1-NMAX BASIS FUNCTIONS ARE NOT
+C ACCOUNTED FOR.
+C
+ IEAA=0
+ IEAB=0
+ TT=ZERO
+ EPS = 64.0D+00*EPSLON(ONE)
+C
+C LOOP OVER COLUMNS (K) OF TRIANGULAR MATRIX TO DETERMINE
+C LARGEST OFF-DIAGONAL ELEMENTS IN ROW(I).
+C
+ DO 20 I=1,NB1
+ BIG(I)=ZERO
+ JBIG(I)=0
+ IF(I.LT.NMIN .OR. I.EQ.1) GO TO 20
+ II = (I*I-I)/2
+ J=MIN(I-1,NMAX)
+ DO 10 K=1,J
+ IF(ABS(BIG(I)).GE.ABS(F(II+K))) GO TO 10
+ BIG(I)=F(II+K)
+ JBIG(I)=K
+ 10 CONTINUE
+ 20 CONTINUE
+C
+C ----- 2X2 JACOBI ITERATIONS BEGIN HERE -----
+C
+ MAXIT=MAX(NB2*20,500)
+ ITER=0
+ 30 CONTINUE
+ ITER=ITER+1
+C
+C FIND SMALLEST DIAGONAL ELEMENT
+C
+ SD=D1050
+ JJ=0
+ DO 40 J=1,NB1
+ JJ=JJ+J
+ SD= MIN(SD,ABS(F(JJ)))
+ 40 CONTINUE
+ TEST = MAX(EPS, C2*MAX(SD,C6))
+C
+C FIND LARGEST OFF-DIAGONAL ELEMENT
+C
+ T=ZERO
+ I1=MAX(2,NMIN)
+ IB = I1
+ DO 50 I=I1,NB1
+ IF(T.GE.ABS(BIG(I))) GO TO 50
+ T= ABS(BIG(I))
+ IB=I
+ 50 CONTINUE
+C
+C TEST FOR CONVERGENCE, THEN DETERMINE ROTATION.
+C
+ IF(T.LT.TEST) RETURN
+C ******
+C
+ IF(ITER.GT.MAXIT) THEN
+ IF (MASWRK) THEN
+ WRITE(6,*) 'JACOBI DIAGONALIZATION FAILS, DIMENSION=',NB1
+ WRITE(6,9020) ITER,T,TEST,SD
+ ENDIF
+ CALL ABRT
+ STOP
+ END IF
+C
+ IA=JBIG(IB)
+ IAA=IA*(IA-1)/2
+ IBB=IB*(IB-1)/2
+ DIF=F(IAA+IA)-F(IBB+IB)
+ IF(ABS(DIF).GT.C3*T) GO TO 70
+ SX=ROOT2
+ CX=ROOT2
+ GO TO 110
+ 70 T2X2=BIG(IB)/DIF
+ T2X25=T2X2*T2X2
+ IF(T2X25 . GT . C4) GO TO 80
+ CX=ONE
+ SX=T2X2
+ GO TO 110
+ 80 IF(T2X25 . GT . C5) GO TO 90
+ SX=T2X2*(ONE-D1500*T2X25)
+ CX=ONE-D0500*T2X25
+ GO TO 110
+ 90 IF(T2X25 . GT . C6) GO TO 100
+ CX=ONE+T2X25*(T2X25*D1375 - D0500)
+ SX= T2X2*(ONE + T2X25*(T2X25*D3875 - D1500))
+ GO TO 110
+ 100 T=D0250 / SQRT(D0250 + T2X25)
+ CX= SQRT(D0500 + T)
+ SX= SIGN( SQRT(D0500 - T),T2X2)
+ 110 IEAR=IAA+1
+ IEBR=IBB+1
+C
+ DO 230 IR=1,NB1
+ T=F(IEAR)*SX
+ F(IEAR)=F(IEAR)*CX+F(IEBR)*SX
+ F(IEBR)=T-F(IEBR)*CX
+ IF(IR-IA) 220,120,130
+ 120 TT=F(IEBR)
+ IEAA=IEAR
+ IEAB=IEBR
+ F(IEBR)=BIG(IB)
+ IEAR=IEAR+IR-1
+ IF(JBIG(IR)) 200,220,200
+ 130 T=F(IEAR)
+ IT=IA
+ IEAR=IEAR+IR-1
+ IF(IR-IB) 180,150,160
+ 150 F(IEAA)=F(IEAA)*CX+F(IEAB)*SX
+ F(IEAB)=TT*CX+F(IEBR)*SX
+ F(IEBR)=TT*SX-F(IEBR)*CX
+ IEBR=IEBR+IR-1
+ GO TO 200
+ 160 IF( ABS(T) . GE . ABS(F(IEBR))) GO TO 170
+ IF(IB.GT.NMAX) GO TO 170
+ T=F(IEBR)
+ IT=IB
+ 170 IEBR=IEBR+IR-1
+ 180 IF( ABS(T) . LT . ABS(BIG(IR))) GO TO 190
+ BIG(IR) = T
+ JBIG(IR) = IT
+ GO TO 220
+ 190 IF(IA . NE . JBIG(IR) . AND . IB . NE . JBIG(IR)) GO TO 220
+ 200 KQ=IEAR-IR-IA+1
+ BIG(IR)=ZERO
+ IR1=MIN(IR-1,NMAX)
+ DO 210 I=1,IR1
+ K=KQ+I
+ IF(ABS(BIG(IR)) . GE . ABS(F(K))) GO TO 210
+ BIG(IR) = F(K)
+ JBIG(IR)=I
+ 210 CONTINUE
+ 220 IEAR=IEAR+1
+ 230 IEBR=IEBR+1
+C
+ DO 240 I=1,NB1
+ T1=VEC(I,IA)*CX + VEC(I,IB)*SX
+ T2=VEC(I,IA)*SX - VEC(I,IB)*CX
+ VEC(I,IA)=T1
+ VEC(I,IB)=T2
+ 240 CONTINUE
+ GO TO 30
+C
+ 9020 FORMAT(1X,'ITER=',I6,' T,TEST,SD=',1P,3E20.10)
+ END
+C*MODULE EIGEN *DECK JACORD
+ SUBROUTINE JACORD(VEC,EIG,N,LDVEC)
+ IMPLICIT DOUBLE PRECISION(A-H,O-Z)
+ DIMENSION VEC(LDVEC,N),EIG(N)
+C
+C ---- SORT EIGENDATA INTO ASCENDING ORDER -----
+C
+ DO 290 I = 1, N
+ JJ = I
+ DO 270 J = I, N
+ IF (EIG(J) .LT. EIG(JJ)) JJ = J
+ 270 CONTINUE
+ IF (JJ .EQ. I) GO TO 290
+ T = EIG(JJ)
+ EIG(JJ) = EIG(I)
+ EIG(I) = T
+ DO 280 J = 1, N
+ T = VEC(J,JJ)
+ VEC(J,JJ) = VEC(J,I)
+ VEC(J,I) = T
+ 280 CONTINUE
+ 290 CONTINUE
+ RETURN
+ END
+C*MODULE EIGEN *DECK TINVTB
+ SUBROUTINE TINVTB(NM,N,D,E,E2,M,W,IND,Z,
+ * IERR,RV1,RV2,RV3,RV4,RV6)
+ IMPLICIT DOUBLE PRECISION(A-H,O-Z)
+ DIMENSION D(N),E(N),E2(N),W(M),Z(NM,M),
+ * RV1(N),RV2(N),RV3(N),RV4(N),RV6(N),IND(M)
+ DOUBLE PRECISION MACHEP,NORM
+ INTEGER P,Q,R,S,TAG,GROUP
+C ------------------------------------------------------------------
+C
+C THIS ROUTINE IS A TRANSLATION OF THE INVERSE ITERATION TECH-
+C NIQUE IN THE ALGOL PROCEDURE TRISTURM BY PETERS AND WILKINSON.
+C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 418-439(1971).
+C
+C THIS ROUTINE FINDS THOSE EIGENVECTORS OF A TRIDIAGONAL
+C SYMMETRIC MATRIX CORRESPONDING TO SPECIFIED EIGENVALUES,
+C USING INVERSE ITERATION.
+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 ROUTINE
+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 E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E,
+C WITH ZEROS CORRESPONDING TO NEGLIGIBLE ELEMENTS OF E.
+C E(I) IS CONSIDERED NEGLIGIBLE IF IT IS NOT LARGER THAN
+C THE PRODUCT OF THE RELATIVE MACHINE PRECISION AND THE SUM
+C OF THE MAGNITUDES OF D(I) AND D(I-1). E2(1) MUST CONTAIN
+C 0.0 IF THE EIGENVALUES ARE IN ASCENDING ORDER, OR 2.0
+C IF THE EIGENVALUES ARE IN DESCENDING ORDER. IF BISECT,
+C TRIDIB, OR IMTQLV HAS BEEN USED TO FIND THE EIGENVALUES,
+C THEIR OUTPUT E2 ARRAY IS EXACTLY WHAT IS EXPECTED HERE,
+C
+C M IS THE NUMBER OF SPECIFIED EIGENVALUES,
+C
+C W CONTAINS THE M EIGENVALUES IN ASCENDING OR DESCENDING ORDER,
+C
+C IND CONTAINS IN ITS FIRST M POSITIONS THE SUBMATRIX INDICES
+C ASSOCIATED WITH THE CORRESPONDING EIGENVALUES IN W --
+C 1 FOR EIGENVALUES BELONGING TO THE FIRST SUBMATRIX FROM
+C THE TOP, 2 FOR THOSE BELONGING TO THE SECOND SUBMATRIX, ETC.
+C
+C ON OUTPUT-
+C
+C ALL INPUT ARRAYS ARE UNALTERED,
+C
+C Z CONTAINS THE ASSOCIATED SET OF ORTHONORMAL EIGENVECTORS.
+C ANY VECTOR WHICH FAILS TO CONVERGE IS SET TO ZERO,
+C
+C IERR IS SET TO
+C ZERO FOR NORMAL RETURN,
+C -R IF THE EIGENVECTOR CORRESPONDING TO THE R-TH
+C EIGENVALUE FAILS TO CONVERGE IN 5 ITERATIONS,
+C
+C RV1, RV2, RV3, RV4, AND RV6 ARE TEMPORARY STORAGE ARRAYS.
+C
+C QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO B. S. GARBOW,
+C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY
+C
+C ------------------------------------------------------------------
+C
+C ********** MACHEP IS A MACHINE DEPENDENT PARAMETER SPECIFYING
+C THE RELATIVE PRECISION OF FLOATING POINT ARITHMETIC.
+C
+C **********
+ MACHEP = 2.0D+00**(-50)
+C
+ IERR = 0
+ IF (M .EQ. 0) GO TO 680
+ TAG = 0
+ ORDER = 1.0D+00 - E2(1)
+ XU = 0.0D+00
+ UK = 0.0D+00
+ X0 = 0.0D+00
+ U = 0.0D+00
+ EPS2 = 0.0D+00
+ EPS3 = 0.0D+00
+ EPS4 = 0.0D+00
+ GROUP = 0
+ Q = 0
+C ********** ESTABLISH AND PROCESS NEXT SUBMATRIX **********
+ 100 P = Q + 1
+ IP = P + 1
+C
+ DO 120 Q = P, N
+ IF (Q .EQ. N) GO TO 140
+ IF (E2(Q+1) .EQ. 0.0D+00) GO TO 140
+ 120 CONTINUE
+C ********** FIND VECTORS BY INVERSE ITERATION **********
+ 140 TAG = TAG + 1
+ IQMP = Q - P + 1
+ S = 0
+C
+ DO 660 R = 1, M
+ IF (IND(R) .NE. TAG) GO TO 660
+ ITS = 1
+ X1 = W(R)
+ IF (S .NE. 0) GO TO 220
+C ********** CHECK FOR ISOLATED ROOT **********
+ XU = 1.0D+00
+ IF (P .NE. Q) GO TO 160
+ RV6(P) = 1.0D+00
+ GO TO 600
+ 160 NORM = ABS(D(P))
+C
+ DO 180 I = IP, Q
+ 180 NORM = NORM + ABS(D(I)) + ABS(E(I))
+C ********** EPS2 IS THE CRITERION FOR GROUPING,
+C EPS3 REPLACES ZERO PIVOTS AND EQUAL
+C ROOTS ARE MODIFIED BY EPS3,
+C EPS4 IS TAKEN VERY SMALL TO AVOID OVERFLOW **********
+ EPS2 = 1.0D-03 * NORM
+ EPS3 = MACHEP * NORM
+ UK = IQMP
+ EPS4 = UK * EPS3
+ UK = EPS4 / SQRT(UK)
+ S = P
+ 200 GROUP = 0
+ GO TO 240
+C ********** LOOK FOR CLOSE OR COINCIDENT ROOTS **********
+ 220 IF (ABS(X1-X0) .GE. EPS2) GO TO 200
+ GROUP = GROUP + 1
+ IF (ORDER * (X1 - X0) .LE. 0.0D+00) X1 = X0 + ORDER * EPS3
+C ********** ELIMINATION WITH INTERCHANGES AND
+C INITIALIZATION OF VECTOR **********
+ 240 V = 0.0D+00
+C
+ DO 300 I = P, Q
+ RV6(I) = UK
+ IF (I .EQ. P) GO TO 280
+ IF (ABS(E(I)) .LT. ABS(U)) GO TO 260
+C ********** WARNING -- A DIVIDE CHECK MAY OCCUR HERE IF
+C E2 ARRAY HAS NOT BEEN SPECIFIED CORRECTLY **********
+ XU = U / E(I)
+ RV4(I) = XU
+ RV1(I-1) = E(I)
+ RV2(I-1) = D(I) - X1
+ RV3(I-1) = 0.0D+00
+ IF (I .NE. Q) RV3(I-1) = E(I+1)
+ U = V - XU * RV2(I-1)
+ V = -XU * RV3(I-1)
+ GO TO 300
+ 260 XU = E(I) / U
+ RV4(I) = XU
+ RV1(I-1) = U
+ RV2(I-1) = V
+ RV3(I-1) = 0.0D+00
+ 280 U = D(I) - X1 - XU * V
+ IF (I .NE. Q) V = E(I+1)
+ 300 CONTINUE
+C
+ IF (U .EQ. 0.0D+00) U = EPS3
+ RV1(Q) = U
+ RV2(Q) = 0.0D+00
+ RV3(Q) = 0.0D+00
+C ********** BACK SUBSTITUTION
+C FOR I=Q STEP -1 UNTIL P DO -- **********
+ 320 DO 340 II = P, Q
+ I = P + Q - II
+ RV6(I) = (RV6(I) - U * RV2(I) - V * RV3(I)) / RV1(I)
+ V = U
+ U = RV6(I)
+ 340 CONTINUE
+C ********** ORTHOGONALIZE WITH RESPECT TO PREVIOUS
+C MEMBERS OF GROUP **********
+ IF (GROUP .EQ. 0) GO TO 400
+ J = R
+C
+ DO 380 JJ = 1, GROUP
+ 360 J = J - 1
+ IF (IND(J) .NE. TAG) GO TO 360
+ XU = DDOT(IQMP,RV6(P),1,Z(P,J),1)
+C
+ CALL DAXPY(IQMP,-XU,Z(P,J),1,RV6(P),1)
+C
+ 380 CONTINUE
+C
+ 400 NORM = 0.0D+00
+C
+ DO 420 I = P, Q
+ 420 NORM = NORM + ABS(RV6(I))
+C
+ IF (NORM .GE. 1.0D+00) GO TO 560
+C ********** FORWARD SUBSTITUTION **********
+ IF (ITS .EQ. 5) GO TO 540
+ IF (NORM .NE. 0.0D+00) GO TO 440
+ RV6(S) = EPS4
+ S = S + 1
+ IF (S .GT. Q) S = P
+ GO TO 480
+ 440 XU = EPS4 / NORM
+C
+ DO 460 I = P, Q
+ 460 RV6(I) = RV6(I) * XU
+C ********** ELIMINATION OPERATIONS ON NEXT VECTOR
+C ITERATE **********
+ 480 DO 520 I = IP, Q
+ U = RV6(I)
+C ********** IF RV1(I-1) .EQ. E(I), A ROW INTERCHANGE
+C WAS PERFORMED EARLIER IN THE
+C TRIANGULARIZATION PROCESS **********
+ IF (RV1(I-1) .NE. E(I)) GO TO 500
+ U = RV6(I-1)
+ RV6(I-1) = RV6(I)
+ 500 RV6(I) = U - RV4(I) * RV6(I-1)
+ 520 CONTINUE
+C
+ ITS = ITS + 1
+ GO TO 320
+C ********** SET ERROR -- NON-CONVERGED EIGENVECTOR **********
+ 540 IERR = -R
+ XU = 0.0D+00
+ GO TO 600
+C ********** NORMALIZE SO THAT SUM OF SQUARES IS
+C 1 AND EXPAND TO FULL ORDER **********
+ 560 U = 0.0D+00
+C
+ DO 580 I = P, Q
+ RV6(I) = RV6(I) / NORM
+ 580 U = U + RV6(I)**2
+C
+ XU = 1.0D+00 / SQRT(U)
+C
+ 600 DO 620 I = 1, N
+ 620 Z(I,R) = 0.0D+00
+C
+ DO 640 I = P, Q
+ 640 Z(I,R) = RV6(I) * XU
+C
+ X0 = X1
+ 660 CONTINUE
+C
+ IF (Q .LT. N) GO TO 100
+ 680 RETURN
+C ********** LAST CARD OF TINVIT **********
+ END
+C*MODULE EIGEN *DECK TQL2
+C
+C ------------------------------------------------------------------
+C
+ SUBROUTINE TQL2(NM,N,D,E,Z,IERR)
+ IMPLICIT DOUBLE PRECISION(A-H,O-Z)
+ DOUBLE PRECISION MACHEP
+ DIMENSION D(N),E(N),Z(NM,N)
+C
+C THIS ROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TQL2,
+C NUM. MATH. 11, 293-306(1968) BY BOWDLER, MARTIN, REINSCH, AND
+C WILKINSON.
+C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 227-240(1971).
+C
+C THIS ROUTINE FINDS THE EIGENVALUES AND EIGENVECTORS
+C OF A SYMMETRIC TRIDIAGONAL MATRIX BY THE 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 ROUTINE
+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 ********** MACHEP IS A MACHINE DEPENDENT PARAMETER SPECIFYING
+C THE RELATIVE PRECISION OF FLOATING POINT ARITHMETIC.
+C
+C **********
+ MACHEP = 2.0D+00**(-50)
+C
+ IERR = 0
+ IF (N .EQ. 1) GO TO 400
+C
+ DO 100 I = 2, N
+ 100 E(I-1) = E(I)
+C
+ F = 0.0D+00
+ B = 0.0D+00
+ E(N) = 0.0D+00
+C
+ DO 300 L = 1, N
+ J = 0
+ H = MACHEP * (ABS(D(L)) + ABS(E(L)))
+ IF (B .LT. H) B = H
+C ********** LOOK FOR SMALL SUB-DIAGONAL ELEMENT **********
+ DO 120 M = L, N
+ IF (ABS(E(M)) .LE. B) GO TO 140
+C ********** E(N) IS ALWAYS ZERO, SO THERE IS NO EXIT
+C THROUGH THE BOTTOM OF THE LOOP **********
+ 120 CONTINUE
+C
+ 140 IF (M .EQ. L) GO TO 280
+ 160 IF (J .EQ. 30) GO TO 380
+ J = J + 1
+C ********** FORM SHIFT **********
+ L1 = L + 1
+ G = D(L)
+ P = (D(L1) - G) / (2.0D+00 * E(L))
+ R = SQRT(P*P+1.0D+00)
+ D(L) = E(L) / (P + SIGN(R,P))
+ H = G - D(L)
+C
+ DO 180 I = L1, N
+ 180 D(I) = D(I) - H
+C
+ F = F + H
+C ********** QL TRANSFORMATION **********
+ P = D(M)
+ C = 1.0D+00
+ S = 0.0D+00
+ MML = M - L
+C ********** FOR I=M-1 STEP -1 UNTIL L DO -- **********
+ DO 260 II = 1, MML
+ I = M - II
+ G = C * E(I)
+ H = C * P
+ IF (ABS(P) .LT. ABS(E(I))) GO TO 200
+ C = E(I) / P
+ R = SQRT(C*C+1.0D+00)
+ E(I+1) = S * P * R
+ S = C / R
+ C = 1.0D+00 / R
+ GO TO 220
+ 200 C = P / E(I)
+ R = SQRT(C*C+1.0D+00)
+ E(I+1) = S * E(I) * R
+ S = 1.0D+00 / R
+ C = C * S
+ 220 P = C * D(I) - S * G
+ D(I+1) = H + S * (C * G + S * D(I))
+C ********** FORM VECTOR **********
+ CALL DROT(N,Z(1,I+1),1,Z(1,I),1,C,S)
+C
+ 260 CONTINUE
+C
+ E(L) = S * P
+ D(L) = C * P
+ IF (ABS(E(L)) .GT. B) GO TO 160
+ 280 D(L) = D(L) + F
+ 300 CONTINUE
+C ********** ORDER EIGENVALUES AND EIGENVECTORS **********
+ DO 360 II = 2, N
+ I = II - 1
+ K = I
+ P = D(I)
+C
+ DO 320 J = II, N
+ IF (D(J) .GE. P) GO TO 320
+ K = J
+ P = D(J)
+ 320 CONTINUE
+C
+ IF (K .EQ. I) GO TO 360
+ D(K) = D(I)
+ D(I) = P
+C
+ CALL DSWAP(N,Z(1,I),1,Z(1,K),1)
+C
+ 360 CONTINUE
+C
+ GO TO 400
+C ********** SET ERROR -- NO CONVERGENCE TO AN
+C EIGENVALUE AFTER 30 ITERATIONS **********
+ 380 IERR = L
+ 400 RETURN
+C ********** LAST CARD OF TQL2 **********
+ END
+C*MODULE EIGEN *DECK TRBK3B
+C
+C ------------------------------------------------------------------
+C
+ SUBROUTINE TRBK3B(NM,N,NV,A,M,Z)
+ IMPLICIT DOUBLE PRECISION(A-H,O-Z)
+ DIMENSION A(NV),Z(NM,M)
+C
+C THIS ROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TRBAK3,
+C NUM. MATH. 11, 181-195(1968) BY MARTIN, REINSCH, AND WILKINSON.
+C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971).
+C
+C THIS ROUTINE FORMS THE EIGENVECTORS OF A REAL SYMMETRIC
+C MATRIX BY BACK TRANSFORMING THOSE OF THE CORRESPONDING
+C SYMMETRIC TRIDIAGONAL MATRIX DETERMINED BY TRED3B.
+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 ROUTINE
+C DIMENSION STATEMENT,
+C
+C N IS THE ORDER OF THE MATRIX,
+C
+C NV MUST BE SET TO THE DIMENSION OF THE ARRAY PARAMETER A
+C AS DECLARED IN THE CALLING ROUTINE DIMENSION STATEMENT,
+C
+C A CONTAINS INFORMATION ABOUT THE ORTHOGONAL TRANSFORMATIONS
+C USED IN THE REDUCTION BY TRED3B IN ITS FIRST
+C N*(N+1)/2 POSITIONS,
+C
+C M IS THE NUMBER OF EIGENVECTORS TO BE BACK TRANSFORMED,
+C
+C Z CONTAINS THE EIGENVECTORS TO BE BACK TRANSFORMED
+C IN ITS FIRST M COLUMNS.
+C
+C ON OUTPUT-
+C
+C Z CONTAINS THE TRANSFORMED EIGENVECTORS
+C IN ITS FIRST M COLUMNS.
+C
+C NOTE THAT TRBAK3 PRESERVES VECTOR EUCLIDEAN NORMS.
+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 140
+ IF (N .EQ. 1) GO TO 140
+C
+ DO 120 I = 2, N
+ L = I - 1
+ IZ = (I * L) / 2
+ IK = IZ + I
+ H = A(IK)
+ IF (H .EQ. 0.0D+00) GO TO 120
+C
+ DO 100 J = 1, M
+ S = -DDOT(L,A(IZ+1),1,Z(1,J),1)
+C
+C ********** DOUBLE DIVISION AVOIDS POSSIBLE UNDERFLOW **********
+ S = (S / H) / H
+C
+ CALL DAXPY(L,S,A(IZ+1),1,Z(1,J),1)
+C
+ 100 CONTINUE
+C
+ 120 CONTINUE
+C
+ 140 RETURN
+C ********** LAST CARD OF TRBAK3 **********
+ END
+C*MODULE EIGEN *DECK TRED3B
+C
+C ------------------------------------------------------------------
+C
+ SUBROUTINE TRED3B(N,NV,A,D,E,E2)
+ IMPLICIT DOUBLE PRECISION(A-H,O-Z)
+ DIMENSION A(NV),D(N),E(N),E2(N)
+C
+C THIS ROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TRED3,
+C NUM. MATH. 11, 181-195(1968) BY MARTIN, REINSCH, AND WILKINSON.
+C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971).
+C
+C THIS ROUTINE REDUCES A REAL SYMMETRIC MATRIX, STORED AS
+C A ONE-DIMENSIONAL ARRAY, TO A SYMMETRIC TRIDIAGONAL MATRIX
+C USING ORTHOGONAL SIMILARITY TRANSFORMATIONS.
+C
+C ON INPUT-
+C
+C N IS THE ORDER OF THE MATRIX,
+C
+C NV MUST BE SET TO THE DIMENSION OF THE ARRAY PARAMETER A
+C AS DECLARED IN THE CALLING ROUTINE DIMENSION STATEMENT,
+C
+C A CONTAINS THE LOWER TRIANGLE OF THE REAL SYMMETRIC
+C INPUT MATRIX, STORED ROW-WISE AS A ONE-DIMENSIONAL
+C ARRAY, IN ITS FIRST N*(N+1)/2 POSITIONS.
+C
+C ON OUTPUT-
+C
+C A CONTAINS INFORMATION ABOUT THE ORTHOGONAL
+C TRANSFORMATIONS USED IN THE REDUCTION,
+C
+C D CONTAINS THE DIAGONAL ELEMENTS OF 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 QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO B. S. GARBOW,
+C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY
+C
+C ------------------------------------------------------------------
+C
+C ********** FOR I=N STEP -1 UNTIL 1 DO -- **********
+ DO 300 II = 1, N
+ I = N + 1 - II
+ L = I - 1
+ IZ = (I * L) / 2
+ H = 0.0D+00
+ SCALE = 0.0D+00
+ IF (L .LT. 1) GO TO 120
+C ********** SCALE ROW (ALGOL TOL THEN NOT NEEDED) **********
+ DO 100 K = 1, L
+ IZ = IZ + 1
+ D(K) = A(IZ)
+ SCALE = SCALE + ABS(D(K))
+ 100 CONTINUE
+C
+ IF (SCALE .NE. 0.0D+00) GO TO 140
+ 120 E(I) = 0.0D+00
+ E2(I) = 0.0D+00
+ GO TO 280
+C
+ 140 DO 160 K = 1, L
+ D(K) = D(K) / SCALE
+ H = H + D(K) * D(K)
+ 160 CONTINUE
+C
+ E2(I) = SCALE * SCALE * H
+ F = D(L)
+ G = -SIGN(SQRT(H),F)
+ E(I) = SCALE * G
+ H = H - F * G
+ D(L) = F - G
+ A(IZ) = SCALE * D(L)
+ IF (L .EQ. 1) GO TO 280
+ F = 0.0D+00
+C
+ JK = 1
+ DO 220 J = 1, L
+ JM1 = J - 1
+ DT = D(J)
+ G = 0.0D+00
+C ********** FORM ELEMENT OF A*U **********
+ IF (JM1 .EQ. 0) GO TO 200
+ DO 180 K = 1, JM1
+ E(K) = E(K) + DT * A(JK)
+ G = G + D(K) * A(JK)
+ JK = JK + 1
+ 180 CONTINUE
+ 200 E(J) = G + A(JK) * DT
+ JK = JK + 1
+C ********** FORM ELEMENT OF P **********
+ 220 CONTINUE
+ F = 0.0D+00
+ DO 240 J = 1, L
+ E(J) = E(J) / H
+ F = F + E(J) * D(J)
+ 240 CONTINUE
+C
+ HH = F / (H + H)
+ JK = 0
+C ********** FORM REDUCED A **********
+ DO 260 J = 1, L
+ F = D(J)
+ G = E(J) - HH * F
+ E(J) = G
+C
+ DO 260 K = 1, J
+ JK = JK + 1
+ A(JK) = A(JK) - F * E(K) - G * D(K)
+ 260 CONTINUE
+C
+ 280 D(I) = A(IZ+1)
+ A(IZ+1) = SCALE * SQRT(H)
+ 300 CONTINUE
+C
+ RETURN
+C ********** LAST CARD OF TRED3 **********
+ END