source: tags/arb-7.0.1/EISPACK/eispack.f

Last change on this file was 2, checked in by oldcode, 25 years ago

Initial revision

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 348.0 KB
Line 
1      SUBROUTINE CDIV(AR,AI,BR,BI,CR,CI)
2      DOUBLE PRECISION AR,AI,BR,BI,CR,CI
3C
4C     COMPLEX DIVISION, (CR,CI) = (AR,AI)/(BR,BI)
5C
6      DOUBLE PRECISION S,ARS,AIS,BRS,BIS
7      S = DABS(BR) + DABS(BI)
8      ARS = AR/S
9      AIS = AI/S
10      BRS = BR/S
11      BIS = BI/S
12      S = BRS**2 + BIS**2
13      CR = (ARS*BRS + AIS*BIS)/S
14      CI = (AIS*BRS - ARS*BIS)/S
15      RETURN
16      END
17      SUBROUTINE CSROOT(XR,XI,YR,YI)
18      DOUBLE PRECISION XR,XI,YR,YI
19C
20C     (YR,YI) = COMPLEX DSQRT(XR,XI) 
21C     BRANCH CHOSEN SO THAT YR .GE. 0.0 AND SIGN(YI) .EQ. SIGN(XI)
22C
23      DOUBLE PRECISION S,TR,TI,PYTHAG
24      TR = XR
25      TI = XI
26      S = DSQRT(0.5D0*(PYTHAG(TR,TI) + DABS(TR)))
27      IF (TR .GE. 0.0D0) YR = S
28      IF (TI .LT. 0.0D0) S = -S
29      IF (TR .LE. 0.0D0) YI = S
30      IF (TR .LT. 0.0D0) YR = 0.5D0*(TI/YI)
31      IF (TR .GT. 0.0D0) YI = 0.5D0*(TI/YR)
32      RETURN
33      END
34      DOUBLE PRECISION FUNCTION EPSLON (X)
35      DOUBLE PRECISION X
36C
37C     ESTIMATE UNIT ROUNDOFF IN QUANTITIES OF SIZE X.
38C
39      DOUBLE PRECISION A,B,C,EPS
40C
41C     THIS PROGRAM SHOULD FUNCTION PROPERLY ON ALL SYSTEMS
42C     SATISFYING THE FOLLOWING TWO ASSUMPTIONS,
43C        1.  THE BASE USED IN REPRESENTING FLOATING POINT
44C            NUMBERS IS NOT A POWER OF THREE.
45C        2.  THE QUANTITY  A  IN STATEMENT 10 IS REPRESENTED TO
46C            THE ACCURACY USED IN FLOATING POINT VARIABLES
47C            THAT ARE STORED IN MEMORY.
48C     THE STATEMENT NUMBER 10 AND THE GO TO 10 ARE INTENDED TO
49C     FORCE OPTIMIZING COMPILERS TO GENERATE CODE SATISFYING
50C     ASSUMPTION 2.
51C     UNDER THESE ASSUMPTIONS, IT SHOULD BE TRUE THAT,
52C            A  IS NOT EXACTLY EQUAL TO FOUR-THIRDS,
53C            B  HAS A ZERO FOR ITS LAST BIT OR DIGIT,
54C            C  IS NOT EXACTLY EQUAL TO ONE,
55C            EPS  MEASURES THE SEPARATION OF 1.0 FROM
56C                 THE NEXT LARGER FLOATING POINT NUMBER.
57C     THE DEVELOPERS OF EISPACK WOULD APPRECIATE BEING INFORMED
58C     ABOUT ANY SYSTEMS WHERE THESE ASSUMPTIONS DO NOT HOLD.
59C
60C     THIS VERSION DATED 4/6/83.
61C
62      A = 4.0D0/3.0D0
63   10 B = A - 1.0D0
64      C = B + B + B
65      EPS = DABS(C-1.0D0)
66      IF (EPS .EQ. 0.0D0) GO TO 10
67      EPSLON = EPS*DABS(X)
68      RETURN
69      END
70      DOUBLE PRECISION FUNCTION PYTHAG(A,B)
71      DOUBLE PRECISION A,B
72C
73C     FINDS DSQRT(A**2+B**2) WITHOUT OVERFLOW OR DESTRUCTIVE UNDERFLOW
74C
75      DOUBLE PRECISION P,R,S,T,U
76      P = DMAX1(DABS(A),DABS(B))
77      IF (P .EQ. 0.0D0) GO TO 20
78      R = (DMIN1(DABS(A),DABS(B))/P)**2
79   10 CONTINUE
80         T = 4.0D0 + R
81         IF (T .EQ. 4.0D0) GO TO 20
82         S = R/T
83         U = 1.0D0 + 2.0D0*S
84         P = U*P
85         R = (S/U)**2 * R
86      GO TO 10
87   20 PYTHAG = P
88      RETURN
89      END
90      SUBROUTINE BAKVEC(NM,N,T,E,M,Z,IERR)
91C
92      INTEGER I,J,M,N,NM,IERR
93      DOUBLE PRECISION T(NM,3),E(N),Z(NM,M)
94C
95C     THIS SUBROUTINE FORMS THE EIGENVECTORS OF A NONSYMMETRIC
96C     TRIDIAGONAL MATRIX BY BACK TRANSFORMING THOSE OF THE
97C     CORRESPONDING SYMMETRIC MATRIX DETERMINED BY  FIGI.
98C
99C     ON INPUT
100C
101C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
102C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
103C          DIMENSION STATEMENT.
104C
105C        N IS THE ORDER OF THE MATRIX.
106C
107C        T CONTAINS THE NONSYMMETRIC MATRIX.  ITS SUBDIAGONAL IS
108C          STORED IN THE LAST N-1 POSITIONS OF THE FIRST COLUMN,
109C          ITS DIAGONAL IN THE N POSITIONS OF THE SECOND COLUMN,
110C          AND ITS SUPERDIAGONAL IN THE FIRST N-1 POSITIONS OF
111C          THE THIRD COLUMN.  T(1,1) AND T(N,3) ARE ARBITRARY.
112C
113C        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE SYMMETRIC
114C          MATRIX IN ITS LAST N-1 POSITIONS.  E(1) IS ARBITRARY.
115C
116C        M IS THE NUMBER OF EIGENVECTORS TO BE BACK TRANSFORMED.
117C
118C        Z CONTAINS THE EIGENVECTORS TO BE BACK TRANSFORMED
119C          IN ITS FIRST M COLUMNS.
120C
121C     ON OUTPUT
122C
123C        T IS UNALTERED.
124C
125C        E IS DESTROYED.
126C
127C        Z CONTAINS THE TRANSFORMED EIGENVECTORS
128C          IN ITS FIRST M COLUMNS.
129C
130C        IERR IS SET TO
131C          ZERO       FOR NORMAL RETURN,
132C          2*N+I      IF E(I) IS ZERO WITH T(I,1) OR T(I-1,3) NON-ZERO.
133C                     IN THIS CASE, THE SYMMETRIC MATRIX IS NOT SIMILAR
134C                     TO THE ORIGINAL MATRIX, AND THE EIGENVECTORS
135C                     CANNOT BE FOUND BY THIS PROGRAM.
136C
137C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
138C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
139C
140C     THIS VERSION DATED AUGUST 1983.
141C
142C     ------------------------------------------------------------------
143C
144      IERR = 0
145      IF (M .EQ. 0) GO TO 1001
146      E(1) = 1.0D0
147      IF (N .EQ. 1) GO TO 1001
148C
149      DO 100 I = 2, N
150         IF (E(I) .NE. 0.0D0) GO TO 80
151         IF (T(I,1) .NE. 0.0D0 .OR. T(I-1,3) .NE. 0.0D0) GO TO 1000
152         E(I) = 1.0D0
153         GO TO 100
154   80    E(I) = E(I-1) * E(I) / T(I-1,3)
155  100 CONTINUE
156C
157      DO 120 J = 1, M
158C
159         DO 120 I = 2, N
160         Z(I,J) = Z(I,J) * E(I)
161  120 CONTINUE
162C
163      GO TO 1001
164C     .......... SET ERROR -- EIGENVECTORS CANNOT BE
165C                FOUND BY THIS PROGRAM ..........
166 1000 IERR = 2 * N + I
167 1001 RETURN
168      END
169      SUBROUTINE BALANC(NM,N,A,LOW,IGH,SCALE)
170C
171      INTEGER I,J,K,L,M,N,JJ,NM,IGH,LOW,IEXC
172      DOUBLE PRECISION A(NM,N),SCALE(N)
173      DOUBLE PRECISION C,F,G,R,S,B2,RADIX
174      LOGICAL NOCONV
175C
176C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE BALANCE,
177C     NUM. MATH. 13, 293-304(1969) BY PARLETT AND REINSCH.
178C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 315-326(1971).
179C
180C     THIS SUBROUTINE BALANCES A REAL MATRIX AND ISOLATES
181C     EIGENVALUES WHENEVER POSSIBLE.
182C
183C     ON INPUT
184C
185C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
186C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
187C          DIMENSION STATEMENT.
188C
189C        N IS THE ORDER OF THE MATRIX.
190C
191C        A CONTAINS THE INPUT MATRIX TO BE BALANCED.
192C
193C     ON OUTPUT
194C
195C        A CONTAINS THE BALANCED MATRIX.
196C
197C        LOW AND IGH ARE TWO INTEGERS SUCH THAT A(I,J)
198C          IS EQUAL TO ZERO IF
199C           (1) I IS GREATER THAN J AND
200C           (2) J=1,...,LOW-1 OR I=IGH+1,...,N.
201C
202C        SCALE CONTAINS INFORMATION DETERMINING THE
203C           PERMUTATIONS AND SCALING FACTORS USED.
204C
205C     SUPPOSE THAT THE PRINCIPAL SUBMATRIX IN ROWS LOW THROUGH IGH
206C     HAS BEEN BALANCED, THAT P(J) DENOTES THE INDEX INTERCHANGED
207C     WITH J DURING THE PERMUTATION STEP, AND THAT THE ELEMENTS
208C     OF THE DIAGONAL MATRIX USED ARE DENOTED BY D(I,J).  THEN
209C        SCALE(J) = P(J),    FOR J = 1,...,LOW-1
210C                 = D(J,J),      J = LOW,...,IGH
211C                 = P(J)         J = IGH+1,...,N.
212C     THE ORDER IN WHICH THE INTERCHANGES ARE MADE IS N TO IGH+1,
213C     THEN 1 TO LOW-1.
214C
215C     NOTE THAT 1 IS RETURNED FOR IGH IF IGH IS ZERO FORMALLY.
216C
217C     THE ALGOL PROCEDURE EXC CONTAINED IN BALANCE APPEARS IN
218C     BALANC  IN LINE.  (NOTE THAT THE ALGOL ROLES OF IDENTIFIERS
219C     K,L HAVE BEEN REVERSED.)
220C
221C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
222C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
223C
224C     THIS VERSION DATED AUGUST 1983.
225C
226C     ------------------------------------------------------------------
227C
228      RADIX = 16.0D0
229C
230      B2 = RADIX * RADIX
231      K = 1
232      L = N
233      GO TO 100
234C     .......... IN-LINE PROCEDURE FOR ROW AND
235C                COLUMN EXCHANGE ..........
236   20 SCALE(M) = J
237      IF (J .EQ. M) GO TO 50
238C
239      DO 30 I = 1, L
240         F = A(I,J)
241         A(I,J) = A(I,M)
242         A(I,M) = F
243   30 CONTINUE
244C
245      DO 40 I = K, N
246         F = A(J,I)
247         A(J,I) = A(M,I)
248         A(M,I) = F
249   40 CONTINUE
250C
251   50 GO TO (80,130), IEXC
252C     .......... SEARCH FOR ROWS ISOLATING AN EIGENVALUE
253C                AND PUSH THEM DOWN ..........
254   80 IF (L .EQ. 1) GO TO 280
255      L = L - 1
256C     .......... FOR J=L STEP -1 UNTIL 1 DO -- ..........
257  100 DO 120 JJ = 1, L
258         J = L + 1 - JJ
259C
260         DO 110 I = 1, L
261            IF (I .EQ. J) GO TO 110
262            IF (A(J,I) .NE. 0.0D0) GO TO 120
263  110    CONTINUE
264C
265         M = L
266         IEXC = 1
267         GO TO 20
268  120 CONTINUE
269C
270      GO TO 140
271C     .......... SEARCH FOR COLUMNS ISOLATING AN EIGENVALUE
272C                AND PUSH THEM LEFT ..........
273  130 K = K + 1
274C
275  140 DO 170 J = K, L
276C
277         DO 150 I = K, L
278            IF (I .EQ. J) GO TO 150
279            IF (A(I,J) .NE. 0.0D0) GO TO 170
280  150    CONTINUE
281C
282         M = K
283         IEXC = 2
284         GO TO 20
285  170 CONTINUE
286C     .......... NOW BALANCE THE SUBMATRIX IN ROWS K TO L ..........
287      DO 180 I = K, L
288  180 SCALE(I) = 1.0D0
289C     .......... ITERATIVE LOOP FOR NORM REDUCTION ..........
290  190 NOCONV = .FALSE.
291C
292      DO 270 I = K, L
293         C = 0.0D0
294         R = 0.0D0
295C
296         DO 200 J = K, L
297            IF (J .EQ. I) GO TO 200
298            C = C + DABS(A(J,I))
299            R = R + DABS(A(I,J))
300  200    CONTINUE
301C     .......... GUARD AGAINST ZERO C OR R DUE TO UNDERFLOW ..........
302         IF (C .EQ. 0.0D0 .OR. R .EQ. 0.0D0) GO TO 270
303         G = R / RADIX
304         F = 1.0D0
305         S = C + R
306  210    IF (C .GE. G) GO TO 220
307         F = F * RADIX
308         C = C * B2
309         GO TO 210
310  220    G = R * RADIX
311  230    IF (C .LT. G) GO TO 240
312         F = F / RADIX
313         C = C / B2
314         GO TO 230
315C     .......... NOW BALANCE ..........
316  240    IF ((C + R) / F .GE. 0.95D0 * S) GO TO 270
317         G = 1.0D0 / F
318         SCALE(I) = SCALE(I) * F
319         NOCONV = .TRUE.
320C
321         DO 250 J = K, N
322  250    A(I,J) = A(I,J) * G
323C
324         DO 260 J = 1, L
325  260    A(J,I) = A(J,I) * F
326C
327  270 CONTINUE
328C
329      IF (NOCONV) GO TO 190
330C
331  280 LOW = K
332      IGH = L
333      RETURN
334      END
335      SUBROUTINE BALBAK(NM,N,LOW,IGH,SCALE,M,Z)
336C
337      INTEGER I,J,K,M,N,II,NM,IGH,LOW
338      DOUBLE PRECISION SCALE(N),Z(NM,M)
339      DOUBLE PRECISION S
340C
341C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE BALBAK,
342C     NUM. MATH. 13, 293-304(1969) BY PARLETT AND REINSCH.
343C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 315-326(1971).
344C
345C     THIS SUBROUTINE FORMS THE EIGENVECTORS OF A REAL GENERAL
346C     MATRIX BY BACK TRANSFORMING THOSE OF THE CORRESPONDING
347C     BALANCED MATRIX DETERMINED BY  BALANC.
348C
349C     ON INPUT
350C
351C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
352C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
353C          DIMENSION STATEMENT.
354C
355C        N IS THE ORDER OF THE MATRIX.
356C
357C        LOW AND IGH ARE INTEGERS DETERMINED BY  BALANC.
358C
359C        SCALE CONTAINS INFORMATION DETERMINING THE PERMUTATIONS
360C          AND SCALING FACTORS USED BY  BALANC.
361C
362C        M IS THE NUMBER OF COLUMNS OF Z TO BE BACK TRANSFORMED.
363C
364C        Z CONTAINS THE REAL AND IMAGINARY PARTS OF THE EIGEN-
365C          VECTORS TO BE BACK TRANSFORMED IN ITS FIRST M COLUMNS.
366C
367C     ON OUTPUT
368C
369C        Z CONTAINS THE REAL AND IMAGINARY PARTS OF THE
370C          TRANSFORMED EIGENVECTORS IN ITS FIRST M COLUMNS.
371C
372C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
373C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
374C
375C     THIS VERSION DATED AUGUST 1983.
376C
377C     ------------------------------------------------------------------
378C
379      IF (M .EQ. 0) GO TO 200
380      IF (IGH .EQ. LOW) GO TO 120
381C
382      DO 110 I = LOW, IGH
383         S = SCALE(I)
384C     .......... LEFT HAND EIGENVECTORS ARE BACK TRANSFORMED
385C                IF THE FOREGOING STATEMENT IS REPLACED BY
386C                S=1.0D0/SCALE(I). ..........
387         DO 100 J = 1, M
388  100    Z(I,J) = Z(I,J) * S
389C
390  110 CONTINUE
391C     ......... FOR I=LOW-1 STEP -1 UNTIL 1,
392C               IGH+1 STEP 1 UNTIL N DO -- ..........
393  120 DO 140 II = 1, N
394         I = II
395         IF (I .GE. LOW .AND. I .LE. IGH) GO TO 140
396         IF (I .LT. LOW) I = LOW - II
397         K = SCALE(I)
398         IF (K .EQ. I) GO TO 140
399C
400         DO 130 J = 1, M
401            S = Z(I,J)
402            Z(I,J) = Z(K,J)
403            Z(K,J) = S
404  130    CONTINUE
405C
406  140 CONTINUE
407C
408  200 RETURN
409      END
410      SUBROUTINE BANDR(NM,N,MB,A,D,E,E2,MATZ,Z)
411C
412      INTEGER J,K,L,N,R,I1,I2,J1,J2,KR,MB,MR,M1,NM,N2,R1,UGL,MAXL,MAXR
413      DOUBLE PRECISION A(NM,MB),D(N),E(N),E2(N),Z(NM,N)
414      DOUBLE PRECISION G,U,B1,B2,C2,F1,F2,S2,DMIN,DMINRT
415      LOGICAL MATZ
416C
417C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE BANDRD,
418C     NUM. MATH. 12, 231-241(1968) BY SCHWARZ.
419C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 273-283(1971).
420C
421C     THIS SUBROUTINE REDUCES A REAL SYMMETRIC BAND MATRIX
422C     TO A SYMMETRIC TRIDIAGONAL MATRIX USING AND OPTIONALLY
423C     ACCUMULATING ORTHOGONAL SIMILARITY TRANSFORMATIONS.
424C
425C     ON INPUT
426C
427C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
428C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
429C          DIMENSION STATEMENT.
430C
431C        N IS THE ORDER OF THE MATRIX.
432C
433C        MB IS THE (HALF) BAND WIDTH OF THE MATRIX, DEFINED AS THE
434C          NUMBER OF ADJACENT DIAGONALS, INCLUDING THE PRINCIPAL
435C          DIAGONAL, REQUIRED TO SPECIFY THE NON-ZERO PORTION OF THE
436C          LOWER TRIANGLE OF THE MATRIX.
437C
438C        A CONTAINS THE LOWER TRIANGLE OF THE SYMMETRIC BAND INPUT
439C          MATRIX STORED AS AN N BY MB ARRAY.  ITS LOWEST SUBDIAGONAL
440C          IS STORED IN THE LAST N+1-MB POSITIONS OF THE FIRST COLUMN,
441C          ITS NEXT SUBDIAGONAL IN THE LAST N+2-MB POSITIONS OF THE
442C          SECOND COLUMN, FURTHER SUBDIAGONALS SIMILARLY, AND FINALLY
443C          ITS PRINCIPAL DIAGONAL IN THE N POSITIONS OF THE LAST COLUMN.
444C          CONTENTS OF STORAGES NOT PART OF THE MATRIX ARE ARBITRARY.
445C
446C        MATZ SHOULD BE SET TO .TRUE. IF THE TRANSFORMATION MATRIX IS
447C          TO BE ACCUMULATED, AND TO .FALSE. OTHERWISE.
448C
449C     ON OUTPUT
450C
451C        A HAS BEEN DESTROYED, EXCEPT FOR ITS LAST TWO COLUMNS WHICH
452C          CONTAIN A COPY OF THE TRIDIAGONAL MATRIX.
453C
454C        D CONTAINS THE DIAGONAL ELEMENTS OF THE TRIDIAGONAL MATRIX.
455C
456C        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE TRIDIAGONAL
457C          MATRIX IN ITS LAST N-1 POSITIONS.  E(1) IS SET TO ZERO.
458C
459C        E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E.
460C          E2 MAY COINCIDE WITH E IF THE SQUARES ARE NOT NEEDED.
461C
462C        Z CONTAINS THE ORTHOGONAL TRANSFORMATION MATRIX PRODUCED IN
463C          THE REDUCTION IF MATZ HAS BEEN SET TO .TRUE.  OTHERWISE, Z
464C          IS NOT REFERENCED.
465C
466C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
467C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
468C
469C     THIS VERSION DATED AUGUST 1983.
470C
471C     ------------------------------------------------------------------
472C
473      DMIN = 2.0D0**(-64)
474      DMINRT = 2.0D0**(-32)
475C     .......... INITIALIZE DIAGONAL SCALING MATRIX ..........
476      DO 30 J = 1, N
477   30 D(J) = 1.0D0
478C
479      IF (.NOT. MATZ) GO TO 60
480C
481      DO 50 J = 1, N
482C
483         DO 40 K = 1, N
484   40    Z(J,K) = 0.0D0
485C
486         Z(J,J) = 1.0D0
487   50 CONTINUE
488C
489   60 M1 = MB - 1
490      IF (M1 - 1) 900, 800, 70
491   70 N2 = N - 2
492C
493      DO 700 K = 1, N2
494         MAXR = MIN0(M1,N-K)
495C     .......... FOR R=MAXR STEP -1 UNTIL 2 DO -- ..........
496         DO 600 R1 = 2, MAXR
497            R = MAXR + 2 - R1
498            KR = K + R
499            MR = MB - R
500            G = A(KR,MR)
501            A(KR-1,1) = A(KR-1,MR+1)
502            UGL = K
503C
504            DO 500 J = KR, N, M1
505               J1 = J - 1
506               J2 = J1 - 1
507               IF (G .EQ. 0.0D0) GO TO 600
508               B1 = A(J1,1) / G
509               B2 = B1 * D(J1) / D(J)
510               S2 = 1.0D0 / (1.0D0 + B1 * B2)
511               IF (S2 .GE. 0.5D0 ) GO TO 450
512               B1 = G / A(J1,1)
513               B2 = B1 * D(J) / D(J1)
514               C2 = 1.0D0 - S2
515               D(J1) = C2 * D(J1)
516               D(J) = C2 * D(J)
517               F1 = 2.0D0 * A(J,M1)
518               F2 = B1 * A(J1,MB)
519               A(J,M1) = -B2 * (B1 * A(J,M1) - A(J,MB)) - F2 + A(J,M1)
520               A(J1,MB) = B2 * (B2 * A(J,MB) + F1) + A(J1,MB)
521               A(J,MB) = B1 * (F2 - F1) + A(J,MB)
522C
523               DO 200 L = UGL, J2
524                  I2 = MB - J + L
525                  U = A(J1,I2+1) + B2 * A(J,I2)
526                  A(J,I2) = -B1 * A(J1,I2+1) + A(J,I2)
527                  A(J1,I2+1) = U
528  200          CONTINUE
529C
530               UGL = J
531               A(J1,1) = A(J1,1) + B2 * G
532               IF (J .EQ. N) GO TO 350
533               MAXL = MIN0(M1,N-J1)
534C
535               DO 300 L = 2, MAXL
536                  I1 = J1 + L
537                  I2 = MB - L
538                  U = A(I1,I2) + B2 * A(I1,I2+1)
539                  A(I1,I2+1) = -B1 * A(I1,I2) + A(I1,I2+1)
540                  A(I1,I2) = U
541  300          CONTINUE
542C
543               I1 = J + M1
544               IF (I1 .GT. N) GO TO 350
545               G = B2 * A(I1,1)
546  350          IF (.NOT. MATZ) GO TO 500
547C
548               DO 400 L = 1, N
549                  U = Z(L,J1) + B2 * Z(L,J)
550                  Z(L,J) = -B1 * Z(L,J1) + Z(L,J)
551                  Z(L,J1) = U
552  400          CONTINUE
553C
554               GO TO 500
555C
556  450          U = D(J1)
557               D(J1) = S2 * D(J)
558               D(J) = S2 * U
559               F1 = 2.0D0 * A(J,M1)
560               F2 = B1 * A(J,MB)
561               U = B1 * (F2 - F1) + A(J1,MB)
562               A(J,M1) = B2 * (B1 * A(J,M1) - A(J1,MB)) + F2 - A(J,M1)
563               A(J1,MB) = B2 * (B2 * A(J1,MB) + F1) + A(J,MB)
564               A(J,MB) = U
565C
566               DO 460 L = UGL, J2
567                  I2 = MB - J + L
568                  U = B2 * A(J1,I2+1) + A(J,I2)
569                  A(J,I2) = -A(J1,I2+1) + B1 * A(J,I2)
570                  A(J1,I2+1) = U
571  460          CONTINUE
572C
573               UGL = J
574               A(J1,1) = B2 * A(J1,1) + G
575               IF (J .EQ. N) GO TO 480
576               MAXL = MIN0(M1,N-J1)
577C
578               DO 470 L = 2, MAXL
579                  I1 = J1 + L
580                  I2 = MB - L
581                  U = B2 * A(I1,I2) + A(I1,I2+1)
582                  A(I1,I2+1) = -A(I1,I2) + B1 * A(I1,I2+1)
583                  A(I1,I2) = U
584  470          CONTINUE
585C
586               I1 = J + M1
587               IF (I1 .GT. N) GO TO 480
588               G = A(I1,1)
589               A(I1,1) = B1 * A(I1,1)
590  480          IF (.NOT. MATZ) GO TO 500
591C
592               DO 490 L = 1, N
593                  U = B2 * Z(L,J1) + Z(L,J)
594                  Z(L,J) = -Z(L,J1) + B1 * Z(L,J)
595                  Z(L,J1) = U
596  490          CONTINUE
597C
598  500       CONTINUE
599C
600  600    CONTINUE
601C
602         IF (MOD(K,64) .NE. 0) GO TO 700
603C     .......... RESCALE TO AVOID UNDERFLOW OR OVERFLOW ..........
604         DO 650 J = K, N
605            IF (D(J) .GE. DMIN) GO TO 650
606            MAXL = MAX0(1,MB+1-J)
607C
608            DO 610 L = MAXL, M1
609  610       A(J,L) = DMINRT * A(J,L)
610C
611            IF (J .EQ. N) GO TO 630
612            MAXL = MIN0(M1,N-J)
613C
614            DO 620 L = 1, MAXL
615               I1 = J + L
616               I2 = MB - L
617               A(I1,I2) = DMINRT * A(I1,I2)
618  620       CONTINUE
619C
620  630       IF (.NOT. MATZ) GO TO 645
621C
622            DO 640 L = 1, N
623  640       Z(L,J) = DMINRT * Z(L,J)
624C
625  645       A(J,MB) = DMIN * A(J,MB)
626            D(J) = D(J) / DMIN
627  650    CONTINUE
628C
629  700 CONTINUE
630C     .......... FORM SQUARE ROOT OF SCALING MATRIX ..........
631  800 DO 810 J = 2, N
632  810 E(J) = DSQRT(D(J))
633C
634      IF (.NOT. MATZ) GO TO 840
635C
636      DO 830 J = 1, N
637C
638         DO 820 K = 2, N
639  820    Z(J,K) = E(K) * Z(J,K)
640C
641  830 CONTINUE
642C
643  840 U = 1.0D0
644C
645      DO 850 J = 2, N
646         A(J,M1) = U * E(J) * A(J,M1)
647         U = E(J)
648         E2(J) = A(J,M1) ** 2
649         A(J,MB) = D(J) * A(J,MB)
650         D(J) = A(J,MB)
651         E(J) = A(J,M1)
652  850 CONTINUE
653C
654      D(1) = A(1,MB)
655      E(1) = 0.0D0
656      E2(1) = 0.0D0
657      GO TO 1001
658C
659  900 DO 950 J = 1, N
660         D(J) = A(J,MB)
661         E(J) = 0.0D0
662         E2(J) = 0.0D0
663  950 CONTINUE
664C
665 1001 RETURN
666      END
667      SUBROUTINE BANDV(NM,N,MBW,A,E21,M,W,Z,IERR,NV,RV,RV6)
668C
669      INTEGER I,J,K,M,N,R,II,IJ,JJ,KJ,MB,M1,NM,NV,IJ1,ITS,KJ1,MBW,M21,
670     X        IERR,MAXJ,MAXK,GROUP
671      DOUBLE PRECISION A(NM,MBW),W(M),Z(NM,M),RV(NV),RV6(N)
672      DOUBLE PRECISION U,V,UK,XU,X0,X1,E21,EPS2,EPS3,EPS4,NORM,ORDER,
673     X       EPSLON,PYTHAG
674C
675C     THIS SUBROUTINE FINDS THOSE EIGENVECTORS OF A REAL SYMMETRIC
676C     BAND MATRIX CORRESPONDING TO SPECIFIED EIGENVALUES, USING INVERSE
677C     ITERATION.  THE SUBROUTINE MAY ALSO BE USED TO SOLVE SYSTEMS
678C     OF LINEAR EQUATIONS WITH A SYMMETRIC OR NON-SYMMETRIC BAND
679C     COEFFICIENT MATRIX.
680C
681C     ON INPUT
682C
683C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
684C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
685C          DIMENSION STATEMENT.
686C
687C        N IS THE ORDER OF THE MATRIX.
688C
689C        MBW IS THE NUMBER OF COLUMNS OF THE ARRAY A USED TO STORE THE
690C          BAND MATRIX.  IF THE MATRIX IS SYMMETRIC, MBW IS ITS (HALF)
691C          BAND WIDTH, DENOTED MB AND DEFINED AS THE NUMBER OF ADJACENT
692C          DIAGONALS, INCLUDING THE PRINCIPAL DIAGONAL, REQUIRED TO
693C          SPECIFY THE NON-ZERO PORTION OF THE LOWER TRIANGLE OF THE
694C          MATRIX.  IF THE SUBROUTINE IS BEING USED TO SOLVE SYSTEMS
695C          OF LINEAR EQUATIONS AND THE COEFFICIENT MATRIX IS NOT
696C          SYMMETRIC, IT MUST HOWEVER HAVE THE SAME NUMBER OF ADJACENT
697C          DIAGONALS ABOVE THE MAIN DIAGONAL AS BELOW, AND IN THIS
698C          CASE, MBW=2*MB-1.
699C
700C        A CONTAINS THE LOWER TRIANGLE OF THE SYMMETRIC BAND INPUT
701C          MATRIX STORED AS AN N BY MB ARRAY.  ITS LOWEST SUBDIAGONAL
702C          IS STORED IN THE LAST N+1-MB POSITIONS OF THE FIRST COLUMN,
703C          ITS NEXT SUBDIAGONAL IN THE LAST N+2-MB POSITIONS OF THE
704C          SECOND COLUMN, FURTHER SUBDIAGONALS SIMILARLY, AND FINALLY
705C          ITS PRINCIPAL DIAGONAL IN THE N POSITIONS OF COLUMN MB.
706C          IF THE SUBROUTINE IS BEING USED TO SOLVE SYSTEMS OF LINEAR
707C          EQUATIONS AND THE COEFFICIENT MATRIX IS NOT SYMMETRIC, A IS
708C          N BY 2*MB-1 INSTEAD WITH LOWER TRIANGLE AS ABOVE AND WITH
709C          ITS FIRST SUPERDIAGONAL STORED IN THE FIRST N-1 POSITIONS OF
710C          COLUMN MB+1, ITS SECOND SUPERDIAGONAL IN THE FIRST N-2
711C          POSITIONS OF COLUMN MB+2, FURTHER SUPERDIAGONALS SIMILARLY,
712C          AND FINALLY ITS HIGHEST SUPERDIAGONAL IN THE FIRST N+1-MB
713C          POSITIONS OF THE LAST COLUMN.
714C          CONTENTS OF STORAGES NOT PART OF THE MATRIX ARE ARBITRARY.
715C
716C        E21 SPECIFIES THE ORDERING OF THE EIGENVALUES AND CONTAINS
717C            0.0D0 IF THE EIGENVALUES ARE IN ASCENDING ORDER, OR
718C            2.0D0 IF THE EIGENVALUES ARE IN DESCENDING ORDER.
719C          IF THE SUBROUTINE IS BEING USED TO SOLVE SYSTEMS OF LINEAR
720C          EQUATIONS, E21 SHOULD BE SET TO 1.0D0 IF THE COEFFICIENT
721C          MATRIX IS SYMMETRIC AND TO -1.0D0 IF NOT.
722C
723C        M IS THE NUMBER OF SPECIFIED EIGENVALUES OR THE NUMBER OF
724C          SYSTEMS OF LINEAR EQUATIONS.
725C
726C        W CONTAINS THE M EIGENVALUES IN ASCENDING OR DESCENDING ORDER.
727C          IF THE SUBROUTINE IS BEING USED TO SOLVE SYSTEMS OF LINEAR
728C          EQUATIONS (A-W(R)*I)*X(R)=B(R), WHERE I IS THE IDENTITY
729C          MATRIX, W(R) SHOULD BE SET ACCORDINGLY, FOR R=1,2,...,M.
730C
731C        Z CONTAINS THE CONSTANT MATRIX COLUMNS (B(R),R=1,2,...,M), IF
732C          THE SUBROUTINE IS USED TO SOLVE SYSTEMS OF LINEAR EQUATIONS.
733C
734C        NV MUST BE SET TO THE DIMENSION OF THE ARRAY PARAMETER RV
735C          AS DECLARED IN THE CALLING PROGRAM DIMENSION STATEMENT.
736C
737C     ON OUTPUT
738C
739C        A AND W ARE UNALTERED.
740C
741C        Z CONTAINS THE ASSOCIATED SET OF ORTHOGONAL EIGENVECTORS.
742C          ANY VECTOR WHICH FAILS TO CONVERGE IS SET TO ZERO.  IF THE
743C          SUBROUTINE IS USED TO SOLVE SYSTEMS OF LINEAR EQUATIONS,
744C          Z CONTAINS THE SOLUTION MATRIX COLUMNS (X(R),R=1,2,...,M).
745C
746C        IERR IS SET TO
747C          ZERO       FOR NORMAL RETURN,
748C          -R         IF THE EIGENVECTOR CORRESPONDING TO THE R-TH
749C                     EIGENVALUE FAILS TO CONVERGE, OR IF THE R-TH
750C                     SYSTEM OF LINEAR EQUATIONS IS NEARLY SINGULAR.
751C
752C        RV AND RV6 ARE TEMPORARY STORAGE ARRAYS.  NOTE THAT RV IS
753C          OF DIMENSION AT LEAST N*(2*MB-1).  IF THE SUBROUTINE
754C          IS BEING USED TO SOLVE SYSTEMS OF LINEAR EQUATIONS, THE
755C          DETERMINANT (UP TO SIGN) OF A-W(M)*I IS AVAILABLE, UPON
756C          RETURN, AS THE PRODUCT OF THE FIRST N ELEMENTS OF RV.
757C
758C     CALLS PYTHAG FOR  DSQRT(A*A + B*B) .
759C
760C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
761C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
762C
763C     THIS VERSION DATED AUGUST 1983.
764C
765C     ------------------------------------------------------------------
766C
767      IERR = 0
768      IF (M .EQ. 0) GO TO 1001
769      MB = MBW
770      IF (E21 .LT. 0.0D0) MB = (MBW + 1) / 2
771      M1 = MB - 1
772      M21 = M1 + MB
773      ORDER = 1.0D0 - DABS(E21)
774C     .......... FIND VECTORS BY INVERSE ITERATION ..........
775      DO 920 R = 1, M
776         ITS = 1
777         X1 = W(R)
778         IF (R .NE. 1) GO TO 100
779C     .......... COMPUTE NORM OF MATRIX ..........
780         NORM = 0.0D0
781C
782         DO 60 J = 1, MB
783            JJ = MB + 1 - J
784            KJ = JJ + M1
785            IJ = 1
786            V = 0.0D0
787C
788            DO 40 I = JJ, N
789               V = V + DABS(A(I,J))
790               IF (E21 .GE. 0.0D0) GO TO 40
791               V = V + DABS(A(IJ,KJ))
792               IJ = IJ + 1
793   40       CONTINUE
794C
795            NORM = DMAX1(NORM,V)
796   60    CONTINUE
797C
798         IF (E21 .LT. 0.0D0) NORM = 0.5D0 * NORM
799C     .......... EPS2 IS THE CRITERION FOR GROUPING,
800C                EPS3 REPLACES ZERO PIVOTS AND EQUAL
801C                ROOTS ARE MODIFIED BY EPS3,
802C                EPS4 IS TAKEN VERY SMALL TO AVOID OVERFLOW ..........
803         IF (NORM .EQ. 0.0D0) NORM = 1.0D0
804         EPS2 = 1.0D-3 * NORM * DABS(ORDER)
805         EPS3 = EPSLON(NORM)
806         UK = N
807         UK = DSQRT(UK)
808         EPS4 = UK * EPS3
809   80    GROUP = 0
810         GO TO 120
811C     .......... LOOK FOR CLOSE OR COINCIDENT ROOTS ..........
812  100    IF (DABS(X1-X0) .GE. EPS2) GO TO 80
813         GROUP = GROUP + 1
814         IF (ORDER * (X1 - X0) .LE. 0.0D0) X1 = X0 + ORDER * EPS3
815C     .......... EXPAND MATRIX, SUBTRACT EIGENVALUE,
816C                AND INITIALIZE VECTOR ..........
817  120    DO 200 I = 1, N
818            IJ = I + MIN0(0,I-M1) * N
819            KJ = IJ + MB * N
820            IJ1 = KJ + M1 * N
821            IF (M1 .EQ. 0) GO TO 180
822C
823            DO 150 J = 1, M1
824               IF (IJ .GT. M1) GO TO 125
825               IF (IJ .GT. 0) GO TO 130
826               RV(IJ1) = 0.0D0
827               IJ1 = IJ1 + N
828               GO TO 130
829  125          RV(IJ) = A(I,J)
830  130          IJ = IJ + N
831               II = I + J
832               IF (II .GT. N) GO TO 150
833               JJ = MB - J
834               IF (E21 .GE. 0.0D0) GO TO 140
835               II = I
836               JJ = MB + J
837  140          RV(KJ) = A(II,JJ)
838               KJ = KJ + N
839  150       CONTINUE
840C
841  180       RV(IJ) = A(I,MB) - X1
842            RV6(I) = EPS4
843            IF (ORDER .EQ. 0.0D0) RV6(I) = Z(I,R)
844  200    CONTINUE
845C
846         IF (M1 .EQ. 0) GO TO 600
847C     .......... ELIMINATION WITH INTERCHANGES ..........
848         DO 580 I = 1, N
849            II = I + 1
850            MAXK = MIN0(I+M1-1,N)
851            MAXJ = MIN0(N-I,M21-2) * N
852C
853            DO 360 K = I, MAXK
854               KJ1 = K
855               J = KJ1 + N
856               JJ = J + MAXJ
857C
858               DO 340 KJ = J, JJ, N
859                  RV(KJ1) = RV(KJ)
860                  KJ1 = KJ
861  340          CONTINUE
862C
863               RV(KJ1) = 0.0D0
864  360       CONTINUE
865C
866            IF (I .EQ. N) GO TO 580
867            U = 0.0D0
868            MAXK = MIN0(I+M1,N)
869            MAXJ = MIN0(N-II,M21-2) * N
870C
871            DO 450 J = I, MAXK
872               IF (DABS(RV(J)) .LT. DABS(U)) GO TO 450
873               U = RV(J)
874               K = J
875  450       CONTINUE
876C
877            J = I + N
878            JJ = J + MAXJ
879            IF (K .EQ. I) GO TO 520
880            KJ = K
881C
882            DO 500 IJ = I, JJ, N
883               V = RV(IJ)
884               RV(IJ) = RV(KJ)
885               RV(KJ) = V
886               KJ = KJ + N
887  500       CONTINUE
888C
889            IF (ORDER .NE. 0.0D0) GO TO 520
890            V = RV6(I)
891            RV6(I) = RV6(K)
892            RV6(K) = V
893  520       IF (U .EQ. 0.0D0) GO TO 580
894C
895            DO 560 K = II, MAXK
896               V = RV(K) / U
897               KJ = K
898C
899               DO 540 IJ = J, JJ, N
900                  KJ = KJ + N
901                  RV(KJ) = RV(KJ) - V * RV(IJ)
902  540          CONTINUE
903C
904               IF (ORDER .EQ. 0.0D0) RV6(K) = RV6(K) - V * RV6(I)
905  560       CONTINUE
906C
907  580    CONTINUE
908C     .......... BACK SUBSTITUTION
909C                FOR I=N STEP -1 UNTIL 1 DO -- ..........
910  600    DO 630 II = 1, N
911            I = N + 1 - II
912            MAXJ = MIN0(II,M21)
913            IF (MAXJ .EQ. 1) GO TO 620
914            IJ1 = I
915            J = IJ1 + N
916            JJ = J + (MAXJ - 2) * N
917C
918            DO 610 IJ = J, JJ, N
919               IJ1 = IJ1 + 1
920               RV6(I) = RV6(I) - RV(IJ) * RV6(IJ1)
921  610       CONTINUE
922C
923  620       V = RV(I)
924            IF (DABS(V) .GE. EPS3) GO TO 625
925C     .......... SET ERROR -- NEARLY SINGULAR LINEAR SYSTEM ..........
926            IF (ORDER .EQ. 0.0D0) IERR = -R
927            V = DSIGN(EPS3,V)
928  625       RV6(I) = RV6(I) / V
929  630    CONTINUE
930C
931         XU = 1.0D0
932         IF (ORDER .EQ. 0.0D0) GO TO 870
933C     .......... ORTHOGONALIZE WITH RESPECT TO PREVIOUS
934C                MEMBERS OF GROUP ..........
935         IF (GROUP .EQ. 0) GO TO 700
936C
937         DO 680 JJ = 1, GROUP
938            J = R - GROUP - 1 + JJ
939            XU = 0.0D0
940C
941            DO 640 I = 1, N
942  640       XU = XU + RV6(I) * Z(I,J)
943C
944            DO 660 I = 1, N
945  660       RV6(I) = RV6(I) - XU * Z(I,J)
946C
947  680    CONTINUE
948C
949  700    NORM = 0.0D0
950C
951         DO 720 I = 1, N
952  720    NORM = NORM + DABS(RV6(I))
953C
954         IF (NORM .GE. 0.1D0) GO TO 840
955C     .......... IN-LINE PROCEDURE FOR CHOOSING
956C                A NEW STARTING VECTOR ..........
957         IF (ITS .GE. N) GO TO 830
958         ITS = ITS + 1
959         XU = EPS4 / (UK + 1.0D0)
960         RV6(1) = EPS4
961C
962         DO 760 I = 2, N
963  760    RV6(I) = XU
964C
965         RV6(ITS) = RV6(ITS) - EPS4 * UK
966         GO TO 600
967C     .......... SET ERROR -- NON-CONVERGED EIGENVECTOR ..........
968  830    IERR = -R
969         XU = 0.0D0
970         GO TO 870
971C     .......... NORMALIZE SO THAT SUM OF SQUARES IS
972C                1 AND EXPAND TO FULL ORDER ..........
973  840    U = 0.0D0
974C
975         DO 860 I = 1, N
976  860    U = PYTHAG(U,RV6(I))
977C
978         XU = 1.0D0 / U
979C
980  870    DO 900 I = 1, N
981  900    Z(I,R) = RV6(I) * XU
982C
983         X0 = X1
984  920 CONTINUE
985C
986 1001 RETURN
987      END
988      SUBROUTINE BISECT(N,EPS1,D,E,E2,LB,UB,MM,M,W,IND,IERR,RV4,RV5)
989C
990      INTEGER I,J,K,L,M,N,P,Q,R,S,II,MM,M1,M2,TAG,IERR,ISTURM
991      DOUBLE PRECISION D(N),E(N),E2(N),W(MM),RV4(N),RV5(N)
992      DOUBLE PRECISION U,V,LB,T1,T2,UB,XU,X0,X1,EPS1,TST1,TST2,EPSLON
993      INTEGER IND(MM)
994C
995C     THIS SUBROUTINE IS A TRANSLATION OF THE BISECTION TECHNIQUE
996C     IN THE ALGOL PROCEDURE TRISTURM BY PETERS AND WILKINSON.
997C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 418-439(1971).
998C
999C     THIS SUBROUTINE FINDS THOSE EIGENVALUES OF A TRIDIAGONAL
1000C     SYMMETRIC MATRIX WHICH LIE IN A SPECIFIED INTERVAL,
1001C     USING BISECTION.
1002C
1003C     ON INPUT
1004C
1005C        N IS THE ORDER OF THE MATRIX.
1006C
1007C        EPS1 IS AN ABSOLUTE ERROR TOLERANCE FOR THE COMPUTED
1008C          EIGENVALUES.  IF THE INPUT EPS1 IS NON-POSITIVE,
1009C          IT IS RESET FOR EACH SUBMATRIX TO A DEFAULT VALUE,
1010C          NAMELY, MINUS THE PRODUCT OF THE RELATIVE MACHINE
1011C          PRECISION AND THE 1-NORM OF THE SUBMATRIX.
1012C
1013C        D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX.
1014C
1015C        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE INPUT MATRIX
1016C          IN ITS LAST N-1 POSITIONS.  E(1) IS ARBITRARY.
1017C
1018C        E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E.
1019C          E2(1) IS ARBITRARY.
1020C
1021C        LB AND UB DEFINE THE INTERVAL TO BE SEARCHED FOR EIGENVALUES.
1022C          IF LB IS NOT LESS THAN UB, NO EIGENVALUES WILL BE FOUND.
1023C
1024C        MM SHOULD BE SET TO AN UPPER BOUND FOR THE NUMBER OF
1025C          EIGENVALUES IN THE INTERVAL.  WARNING. IF MORE THAN
1026C          MM EIGENVALUES ARE DETERMINED TO LIE IN THE INTERVAL,
1027C          AN ERROR RETURN IS MADE WITH NO EIGENVALUES FOUND.
1028C
1029C     ON OUTPUT
1030C
1031C        EPS1 IS UNALTERED UNLESS IT HAS BEEN RESET TO ITS
1032C          (LAST) DEFAULT VALUE.
1033C
1034C        D AND E ARE UNALTERED.
1035C
1036C        ELEMENTS OF E2, CORRESPONDING TO ELEMENTS OF E REGARDED
1037C          AS NEGLIGIBLE, HAVE BEEN REPLACED BY ZERO CAUSING THE
1038C          MATRIX TO SPLIT INTO A DIRECT SUM OF SUBMATRICES.
1039C          E2(1) IS ALSO SET TO ZERO.
1040C
1041C        M IS THE NUMBER OF EIGENVALUES DETERMINED TO LIE IN (LB,UB).
1042C
1043C        W CONTAINS THE M EIGENVALUES IN ASCENDING ORDER.
1044C
1045C        IND CONTAINS IN ITS FIRST M POSITIONS THE SUBMATRIX INDICES
1046C          ASSOCIATED WITH THE CORRESPONDING EIGENVALUES IN W --
1047C          1 FOR EIGENVALUES BELONGING TO THE FIRST SUBMATRIX FROM
1048C          THE TOP, 2 FOR THOSE BELONGING TO THE SECOND SUBMATRIX, ETC..
1049C
1050C        IERR IS SET TO
1051C          ZERO       FOR NORMAL RETURN,
1052C          3*N+1      IF M EXCEEDS MM.
1053C
1054C        RV4 AND RV5 ARE TEMPORARY STORAGE ARRAYS.
1055C
1056C     THE ALGOL PROCEDURE STURMCNT CONTAINED IN TRISTURM
1057C     APPEARS IN BISECT IN-LINE.
1058C
1059C     NOTE THAT SUBROUTINE TQL1 OR IMTQL1 IS GENERALLY FASTER THAN
1060C     BISECT, IF MORE THAN N/4 EIGENVALUES ARE TO BE FOUND.
1061C
1062C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
1063C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
1064C
1065C     THIS VERSION DATED AUGUST 1983.
1066C
1067C     ------------------------------------------------------------------
1068C
1069      IERR = 0
1070      TAG = 0
1071      T1 = LB
1072      T2 = UB
1073C     .......... LOOK FOR SMALL SUB-DIAGONAL ENTRIES ..........
1074      DO 40 I = 1, N
1075         IF (I .EQ. 1) GO TO 20
1076         TST1 = DABS(D(I)) + DABS(D(I-1))
1077         TST2 = TST1 + DABS(E(I))
1078         IF (TST2 .GT. TST1) GO TO 40
1079   20    E2(I) = 0.0D0
1080   40 CONTINUE
1081C     .......... DETERMINE THE NUMBER OF EIGENVALUES
1082C                IN THE INTERVAL ..........
1083      P = 1
1084      Q = N
1085      X1 = UB
1086      ISTURM = 1
1087      GO TO 320
1088   60 M = S
1089      X1 = LB
1090      ISTURM = 2
1091      GO TO 320
1092   80 M = M - S
1093      IF (M .GT. MM) GO TO 980
1094      Q = 0
1095      R = 0
1096C     .......... ESTABLISH AND PROCESS NEXT SUBMATRIX, REFINING
1097C                INTERVAL BY THE GERSCHGORIN BOUNDS ..........
1098  100 IF (R .EQ. M) GO TO 1001
1099      TAG = TAG + 1
1100      P = Q + 1
1101      XU = D(P)
1102      X0 = D(P)
1103      U = 0.0D0
1104C
1105      DO 120 Q = P, N
1106         X1 = U
1107         U = 0.0D0
1108         V = 0.0D0
1109         IF (Q .EQ. N) GO TO 110
1110         U = DABS(E(Q+1))
1111         V = E2(Q+1)
1112  110    XU = DMIN1(D(Q)-(X1+U),XU)
1113         X0 = DMAX1(D(Q)+(X1+U),X0)
1114         IF (V .EQ. 0.0D0) GO TO 140
1115  120 CONTINUE
1116C
1117  140 X1 = EPSLON(DMAX1(DABS(XU),DABS(X0)))
1118      IF (EPS1 .LE. 0.0D0) EPS1 = -X1
1119      IF (P .NE. Q) GO TO 180
1120C     .......... CHECK FOR ISOLATED ROOT WITHIN INTERVAL ..........
1121      IF (T1 .GT. D(P) .OR. D(P) .GE. T2) GO TO 940
1122      M1 = P
1123      M2 = P
1124      RV5(P) = D(P)
1125      GO TO 900
1126  180 X1 = X1 * (Q - P + 1)
1127      LB = DMAX1(T1,XU-X1)
1128      UB = DMIN1(T2,X0+X1)
1129      X1 = LB
1130      ISTURM = 3
1131      GO TO 320
1132  200 M1 = S + 1
1133      X1 = UB
1134      ISTURM = 4
1135      GO TO 320
1136  220 M2 = S
1137      IF (M1 .GT. M2) GO TO 940
1138C     .......... FIND ROOTS BY BISECTION ..........
1139      X0 = UB
1140      ISTURM = 5
1141C
1142      DO 240 I = M1, M2
1143         RV5(I) = UB
1144         RV4(I) = LB
1145  240 CONTINUE
1146C     .......... LOOP FOR K-TH EIGENVALUE
1147C                FOR K=M2 STEP -1 UNTIL M1 DO --
1148C                (-DO- NOT USED TO LEGALIZE -COMPUTED GO TO-) ..........
1149      K = M2
1150  250    XU = LB
1151C     .......... FOR I=K STEP -1 UNTIL M1 DO -- ..........
1152         DO 260 II = M1, K
1153            I = M1 + K - II
1154            IF (XU .GE. RV4(I)) GO TO 260
1155            XU = RV4(I)
1156            GO TO 280
1157  260    CONTINUE
1158C
1159  280    IF (X0 .GT. RV5(K)) X0 = RV5(K)
1160C     .......... NEXT BISECTION STEP ..........
1161  300    X1 = (XU + X0) * 0.5D0
1162         IF ((X0 - XU) .LE. DABS(EPS1)) GO TO 420
1163         TST1 = 2.0D0 * (DABS(XU) + DABS(X0))
1164         TST2 = TST1 + (X0 - XU)
1165         IF (TST2 .EQ. TST1) GO TO 420
1166C     .......... IN-LINE PROCEDURE FOR STURM SEQUENCE ..........
1167  320    S = P - 1
1168         U = 1.0D0
1169C
1170         DO 340 I = P, Q
1171            IF (U .NE. 0.0D0) GO TO 325
1172            V = DABS(E(I)) / EPSLON(1.0D0)
1173            IF (E2(I) .EQ. 0.0D0) V = 0.0D0
1174            GO TO 330
1175  325       V = E2(I) / U
1176  330       U = D(I) - X1 - V
1177            IF (U .LT. 0.0D0) S = S + 1
1178  340    CONTINUE
1179C
1180         GO TO (60,80,200,220,360), ISTURM
1181C     .......... REFINE INTERVALS ..........
1182  360    IF (S .GE. K) GO TO 400
1183         XU = X1
1184         IF (S .GE. M1) GO TO 380
1185         RV4(M1) = X1
1186         GO TO 300
1187  380    RV4(S+1) = X1
1188         IF (RV5(S) .GT. X1) RV5(S) = X1
1189         GO TO 300
1190  400    X0 = X1
1191         GO TO 300
1192C     .......... K-TH EIGENVALUE FOUND ..........
1193  420    RV5(K) = X1
1194      K = K - 1
1195      IF (K .GE. M1) GO TO 250
1196C     .......... ORDER EIGENVALUES TAGGED WITH THEIR
1197C                SUBMATRIX ASSOCIATIONS ..........
1198  900 S = R
1199      R = R + M2 - M1 + 1
1200      J = 1
1201      K = M1
1202C
1203      DO 920 L = 1, R
1204         IF (J .GT. S) GO TO 910
1205         IF (K .GT. M2) GO TO 940
1206         IF (RV5(K) .GE. W(L)) GO TO 915
1207C
1208         DO 905 II = J, S
1209            I = L + S - II
1210            W(I+1) = W(I)
1211            IND(I+1) = IND(I)
1212  905    CONTINUE
1213C
1214  910    W(L) = RV5(K)
1215         IND(L) = TAG
1216         K = K + 1
1217         GO TO 920
1218  915    J = J + 1
1219  920 CONTINUE
1220C
1221  940 IF (Q .LT. N) GO TO 100
1222      GO TO 1001
1223C     .......... SET ERROR -- UNDERESTIMATE OF NUMBER OF
1224C                EIGENVALUES IN INTERVAL ..........
1225  980 IERR = 3 * N + 1
1226 1001 LB = T1
1227      UB = T2
1228      RETURN
1229      END
1230      SUBROUTINE BQR(NM,N,MB,A,T,R,IERR,NV,RV)
1231C
1232      INTEGER I,J,K,L,M,N,II,IK,JK,JM,KJ,KK,KM,LL,MB,MK,MN,MZ,
1233     X        M1,M2,M3,M4,NI,NM,NV,ITS,KJ1,M21,M31,IERR,IMULT
1234      DOUBLE PRECISION A(NM,MB),RV(NV)
1235      DOUBLE PRECISION F,G,Q,R,S,T,TST1,TST2,SCALE,PYTHAG
1236C
1237C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE BQR,
1238C     NUM. MATH. 16, 85-92(1970) BY MARTIN, REINSCH, AND WILKINSON.
1239C     HANDBOOK FOR AUTO. COMP., VOL II-LINEAR ALGEBRA, 266-272(1971).
1240C
1241C     THIS SUBROUTINE FINDS THE EIGENVALUE OF SMALLEST (USUALLY)
1242C     MAGNITUDE OF A REAL SYMMETRIC BAND MATRIX USING THE
1243C     QR ALGORITHM WITH SHIFTS OF ORIGIN.  CONSECUTIVE CALLS
1244C     CAN BE MADE TO FIND FURTHER EIGENVALUES.
1245C
1246C     ON INPUT
1247C
1248C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
1249C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
1250C          DIMENSION STATEMENT.
1251C
1252C        N IS THE ORDER OF THE MATRIX.
1253C
1254C        MB IS THE (HALF) BAND WIDTH OF THE MATRIX, DEFINED AS THE
1255C          NUMBER OF ADJACENT DIAGONALS, INCLUDING THE PRINCIPAL
1256C          DIAGONAL, REQUIRED TO SPECIFY THE NON-ZERO PORTION OF THE
1257C          LOWER TRIANGLE OF THE MATRIX.
1258C
1259C        A CONTAINS THE LOWER TRIANGLE OF THE SYMMETRIC BAND INPUT
1260C          MATRIX STORED AS AN N BY MB ARRAY.  ITS LOWEST SUBDIAGONAL
1261C          IS STORED IN THE LAST N+1-MB POSITIONS OF THE FIRST COLUMN,
1262C          ITS NEXT SUBDIAGONAL IN THE LAST N+2-MB POSITIONS OF THE
1263C          SECOND COLUMN, FURTHER SUBDIAGONALS SIMILARLY, AND FINALLY
1264C          ITS PRINCIPAL DIAGONAL IN THE N POSITIONS OF THE LAST COLUMN.
1265C          CONTENTS OF STORAGES NOT PART OF THE MATRIX ARE ARBITRARY.
1266C          ON A SUBSEQUENT CALL, ITS OUTPUT CONTENTS FROM THE PREVIOUS
1267C          CALL SHOULD BE PASSED.
1268C
1269C        T SPECIFIES THE SHIFT (OF EIGENVALUES) APPLIED TO THE DIAGONAL
1270C          OF A IN FORMING THE INPUT MATRIX. WHAT IS ACTUALLY DETERMINED
1271C          IS THE EIGENVALUE OF A+TI (I IS THE IDENTITY MATRIX) NEAREST
1272C          TO T.  ON A SUBSEQUENT CALL, THE OUTPUT VALUE OF T FROM THE
1273C          PREVIOUS CALL SHOULD BE PASSED IF THE NEXT NEAREST EIGENVALUE
1274C          IS SOUGHT.
1275C
1276C        R SHOULD BE SPECIFIED AS ZERO ON THE FIRST CALL, AND AS ITS
1277C          OUTPUT VALUE FROM THE PREVIOUS CALL ON A SUBSEQUENT CALL.
1278C          IT IS USED TO DETERMINE WHEN THE LAST ROW AND COLUMN OF
1279C          THE TRANSFORMED BAND MATRIX CAN BE REGARDED AS NEGLIGIBLE.
1280C
1281C        NV MUST BE SET TO THE DIMENSION OF THE ARRAY PARAMETER RV
1282C          AS DECLARED IN THE CALLING PROGRAM DIMENSION STATEMENT.
1283C
1284C     ON OUTPUT
1285C
1286C        A CONTAINS THE TRANSFORMED BAND MATRIX.  THE MATRIX A+TI
1287C          DERIVED FROM THE OUTPUT PARAMETERS IS SIMILAR TO THE
1288C          INPUT A+TI TO WITHIN ROUNDING ERRORS.  ITS LAST ROW AND
1289C          COLUMN ARE NULL (IF IERR IS ZERO).
1290C
1291C        T CONTAINS THE COMPUTED EIGENVALUE OF A+TI (IF IERR IS ZERO).
1292C
1293C        R CONTAINS THE MAXIMUM OF ITS INPUT VALUE AND THE NORM OF THE
1294C          LAST COLUMN OF THE INPUT MATRIX A.
1295C
1296C        IERR IS SET TO
1297C          ZERO       FOR NORMAL RETURN,
1298C          N          IF THE EIGENVALUE HAS NOT BEEN
1299C                     DETERMINED AFTER 30 ITERATIONS.
1300C
1301C        RV IS A TEMPORARY STORAGE ARRAY OF DIMENSION AT LEAST
1302C          (2*MB**2+4*MB-3).  THE FIRST (3*MB-2) LOCATIONS CORRESPOND
1303C          TO THE ALGOL ARRAY B, THE NEXT (2*MB-1) LOCATIONS CORRESPOND
1304C          TO THE ALGOL ARRAY H, AND THE FINAL (2*MB**2-MB) LOCATIONS
1305C          CORRESPOND TO THE MB BY (2*MB-1) ALGOL ARRAY U.
1306C
1307C     NOTE. FOR A SUBSEQUENT CALL, N SHOULD BE REPLACED BY N-1, BUT
1308C     MB SHOULD NOT BE ALTERED EVEN WHEN IT EXCEEDS THE CURRENT N.
1309C
1310C     CALLS PYTHAG FOR  DSQRT(A*A + B*B) .
1311C
1312C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
1313C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
1314C
1315C     THIS VERSION DATED AUGUST 1983.
1316C
1317C     ------------------------------------------------------------------
1318C
1319      IERR = 0
1320      M1 = MIN0(MB,N)
1321      M = M1 - 1
1322      M2 = M + M
1323      M21 = M2 + 1
1324      M3 = M21 + M
1325      M31 = M3 + 1
1326      M4 = M31 + M2
1327      MN = M + N
1328      MZ = MB - M1
1329      ITS = 0
1330C     .......... TEST FOR CONVERGENCE ..........
1331   40 G = A(N,MB)
1332      IF (M .EQ. 0) GO TO 360
1333      F = 0.0D0
1334C
1335      DO 50 K = 1, M
1336         MK = K + MZ
1337         F = F + DABS(A(N,MK))
1338   50 CONTINUE
1339C
1340      IF (ITS .EQ. 0 .AND. F .GT. R) R = F
1341      TST1 = R
1342      TST2 = TST1 + F
1343      IF (TST2 .LE. TST1) GO TO 360
1344      IF (ITS .EQ. 30) GO TO 1000
1345      ITS = ITS + 1
1346C     .......... FORM SHIFT FROM BOTTOM 2 BY 2 MINOR ..........
1347      IF (F .GT. 0.25D0 * R .AND. ITS .LT. 5) GO TO 90
1348      F = A(N,MB-1)
1349      IF (F .EQ. 0.0D0) GO TO 70
1350      Q = (A(N-1,MB) - G) / (2.0D0 * F)
1351      S = PYTHAG(Q,1.0D0)
1352      G = G - F / (Q + DSIGN(S,Q))
1353   70 T = T + G
1354C
1355      DO 80 I = 1, N
1356   80 A(I,MB) = A(I,MB) - G
1357C
1358   90 DO 100 K = M31, M4
1359  100 RV(K) = 0.0D0
1360C
1361      DO 350 II = 1, MN
1362         I = II - M
1363         NI = N - II
1364         IF (NI .LT. 0) GO TO 230
1365C     .......... FORM COLUMN OF SHIFTED MATRIX A-G*I ..........
1366         L = MAX0(1,2-I)
1367C
1368         DO 110 K = 1, M3
1369  110    RV(K) = 0.0D0
1370C
1371         DO 120 K = L, M1
1372            KM = K + M
1373            MK = K + MZ
1374            RV(KM) = A(II,MK)
1375  120    CONTINUE
1376C
1377         LL = MIN0(M,NI)
1378         IF (LL .EQ. 0) GO TO 135
1379C
1380         DO 130 K = 1, LL
1381            KM = K + M21
1382            IK = II + K
1383            MK = MB - K
1384            RV(KM) = A(IK,MK)
1385  130    CONTINUE
1386C     .......... PRE-MULTIPLY WITH HOUSEHOLDER REFLECTIONS ..........
1387  135    LL = M2
1388         IMULT = 0
1389C     .......... MULTIPLICATION PROCEDURE ..........
1390  140    KJ = M4 - M1
1391C
1392         DO 170 J = 1, LL
1393            KJ = KJ + M1
1394            JM = J + M3
1395            IF (RV(JM) .EQ. 0.0D0) GO TO 170
1396            F = 0.0D0
1397C
1398            DO 150 K = 1, M1
1399               KJ = KJ + 1
1400               JK = J + K - 1
1401               F = F + RV(KJ) * RV(JK)
1402  150       CONTINUE
1403C
1404            F = F / RV(JM)
1405            KJ = KJ - M1
1406C
1407            DO 160 K = 1, M1
1408               KJ = KJ + 1
1409               JK = J + K - 1
1410               RV(JK) = RV(JK) - RV(KJ) * F
1411  160       CONTINUE
1412C
1413            KJ = KJ - M1
1414  170    CONTINUE
1415C
1416         IF (IMULT .NE. 0) GO TO 280
1417C     .......... HOUSEHOLDER REFLECTION ..........
1418         F = RV(M21)
1419         S = 0.0D0
1420         RV(M4) = 0.0D0
1421         SCALE = 0.0D0
1422C
1423         DO 180 K = M21, M3
1424  180    SCALE = SCALE + DABS(RV(K))
1425C
1426         IF (SCALE .EQ. 0.0D0) GO TO 210
1427C
1428         DO 190 K = M21, M3
1429  190    S = S + (RV(K)/SCALE)**2
1430C
1431         S = SCALE * SCALE * S
1432         G = -DSIGN(DSQRT(S),F)
1433         RV(M21) = G
1434         RV(M4) = S - F * G
1435         KJ = M4 + M2 * M1 + 1
1436         RV(KJ) = F - G
1437C
1438         DO 200 K = 2, M1
1439            KJ = KJ + 1
1440            KM = K + M2
1441            RV(KJ) = RV(KM)
1442  200    CONTINUE
1443C     .......... SAVE COLUMN OF TRIANGULAR FACTOR R ..........
1444  210    DO 220 K = L, M1
1445            KM = K + M
1446            MK = K + MZ
1447            A(II,MK) = RV(KM)
1448  220    CONTINUE
1449C
1450  230    L = MAX0(1,M1+1-I)
1451         IF (I .LE. 0) GO TO 300
1452C     .......... PERFORM ADDITIONAL STEPS ..........
1453         DO 240 K = 1, M21
1454  240    RV(K) = 0.0D0
1455C
1456         LL = MIN0(M1,NI+M1)
1457C     .......... GET ROW OF TRIANGULAR FACTOR R ..........
1458         DO 250 KK = 1, LL
1459            K = KK - 1
1460            KM = K + M1
1461            IK = I + K
1462            MK = MB - K
1463            RV(KM) = A(IK,MK)
1464  250    CONTINUE
1465C     .......... POST-MULTIPLY WITH HOUSEHOLDER REFLECTIONS ..........
1466         LL = M1
1467         IMULT = 1
1468         GO TO 140
1469C     .......... STORE COLUMN OF NEW A MATRIX ..........
1470  280    DO 290 K = L, M1
1471            MK = K + MZ
1472            A(I,MK) = RV(K)
1473  290    CONTINUE
1474C     .......... UPDATE HOUSEHOLDER REFLECTIONS ..........
1475  300    IF (L .GT. 1) L = L - 1
1476         KJ1 = M4 + L * M1
1477C
1478         DO 320 J = L, M2
1479            JM = J + M3
1480            RV(JM) = RV(JM+1)
1481C
1482            DO 320 K = 1, M1
1483               KJ1 = KJ1 + 1
1484               KJ = KJ1 - M1
1485               RV(KJ) = RV(KJ1)
1486  320    CONTINUE
1487C
1488  350 CONTINUE
1489C
1490      GO TO 40
1491C     .......... CONVERGENCE ..........
1492  360 T = T + G
1493C
1494      DO 380 I = 1, N
1495  380 A(I,MB) = A(I,MB) - G
1496C
1497      DO 400 K = 1, M1
1498         MK = K + MZ
1499         A(N,MK) = 0.0D0
1500  400 CONTINUE
1501C
1502      GO TO 1001
1503C     .......... SET ERROR -- NO CONVERGENCE TO
1504C                EIGENVALUE AFTER 30 ITERATIONS ..........
1505 1000 IERR = N
1506 1001 RETURN
1507      END
1508      SUBROUTINE CBABK2(NM,N,LOW,IGH,SCALE,M,ZR,ZI)
1509C
1510      INTEGER I,J,K,M,N,II,NM,IGH,LOW
1511      DOUBLE PRECISION SCALE(N),ZR(NM,M),ZI(NM,M)
1512      DOUBLE PRECISION S
1513C
1514C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE
1515C     CBABK2, WHICH IS A COMPLEX VERSION OF BALBAK,
1516C     NUM. MATH. 13, 293-304(1969) BY PARLETT AND REINSCH.
1517C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 315-326(1971).
1518C
1519C     THIS SUBROUTINE FORMS THE EIGENVECTORS OF A COMPLEX GENERAL
1520C     MATRIX BY BACK TRANSFORMING THOSE OF THE CORRESPONDING
1521C     BALANCED MATRIX DETERMINED BY  CBAL.
1522C
1523C     ON INPUT
1524C
1525C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
1526C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
1527C          DIMENSION STATEMENT.
1528C
1529C        N IS THE ORDER OF THE MATRIX.
1530C
1531C        LOW AND IGH ARE INTEGERS DETERMINED BY  CBAL.
1532C
1533C        SCALE CONTAINS INFORMATION DETERMINING THE PERMUTATIONS
1534C          AND SCALING FACTORS USED BY  CBAL.
1535C
1536C        M IS THE NUMBER OF EIGENVECTORS TO BE BACK TRANSFORMED.
1537C
1538C        ZR AND ZI CONTAIN THE REAL AND IMAGINARY PARTS,
1539C          RESPECTIVELY, OF THE EIGENVECTORS TO BE
1540C          BACK TRANSFORMED IN THEIR FIRST M COLUMNS.
1541C
1542C     ON OUTPUT
1543C
1544C        ZR AND ZI CONTAIN THE REAL AND IMAGINARY PARTS,
1545C          RESPECTIVELY, OF THE TRANSFORMED EIGENVECTORS
1546C          IN THEIR FIRST M COLUMNS.
1547C
1548C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
1549C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
1550C
1551C     THIS VERSION DATED AUGUST 1983.
1552C
1553C     ------------------------------------------------------------------
1554C
1555      IF (M .EQ. 0) GO TO 200
1556      IF (IGH .EQ. LOW) GO TO 120
1557C
1558      DO 110 I = LOW, IGH
1559         S = SCALE(I)
1560C     .......... LEFT HAND EIGENVECTORS ARE BACK TRANSFORMED
1561C                IF THE FOREGOING STATEMENT IS REPLACED BY
1562C                S=1.0D0/SCALE(I). ..........
1563         DO 100 J = 1, M
1564            ZR(I,J) = ZR(I,J) * S
1565            ZI(I,J) = ZI(I,J) * S
1566  100    CONTINUE
1567C
1568  110 CONTINUE
1569C     .......... FOR I=LOW-1 STEP -1 UNTIL 1,
1570C                IGH+1 STEP 1 UNTIL N DO -- ..........
1571  120 DO 140 II = 1, N
1572         I = II
1573         IF (I .GE. LOW .AND. I .LE. IGH) GO TO 140
1574         IF (I .LT. LOW) I = LOW - II
1575         K = SCALE(I)
1576         IF (K .EQ. I) GO TO 140
1577C
1578         DO 130 J = 1, M
1579            S = ZR(I,J)
1580            ZR(I,J) = ZR(K,J)
1581            ZR(K,J) = S
1582            S = ZI(I,J)
1583            ZI(I,J) = ZI(K,J)
1584            ZI(K,J) = S
1585  130    CONTINUE
1586C
1587  140 CONTINUE
1588C
1589  200 RETURN
1590      END
1591      SUBROUTINE CBAL(NM,N,AR,AI,LOW,IGH,SCALE)
1592C
1593      INTEGER I,J,K,L,M,N,JJ,NM,IGH,LOW,IEXC
1594      DOUBLE PRECISION AR(NM,N),AI(NM,N),SCALE(N)
1595      DOUBLE PRECISION C,F,G,R,S,B2,RADIX
1596      LOGICAL NOCONV
1597C
1598C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE
1599C     CBALANCE, WHICH IS A COMPLEX VERSION OF BALANCE,
1600C     NUM. MATH. 13, 293-304(1969) BY PARLETT AND REINSCH.
1601C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 315-326(1971).
1602C
1603C     THIS SUBROUTINE BALANCES A COMPLEX MATRIX AND ISOLATES
1604C     EIGENVALUES WHENEVER POSSIBLE.
1605C
1606C     ON INPUT
1607C
1608C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
1609C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
1610C          DIMENSION STATEMENT.
1611C
1612C        N IS THE ORDER OF THE MATRIX.
1613C
1614C        AR AND AI CONTAIN THE REAL AND IMAGINARY PARTS,
1615C          RESPECTIVELY, OF THE COMPLEX MATRIX TO BE BALANCED.
1616C
1617C     ON OUTPUT
1618C
1619C        AR AND AI CONTAIN THE REAL AND IMAGINARY PARTS,
1620C          RESPECTIVELY, OF THE BALANCED MATRIX.
1621C
1622C        LOW AND IGH ARE TWO INTEGERS SUCH THAT AR(I,J) AND AI(I,J)
1623C          ARE EQUAL TO ZERO IF
1624C           (1) I IS GREATER THAN J AND
1625C           (2) J=1,...,LOW-1 OR I=IGH+1,...,N.
1626C
1627C        SCALE CONTAINS INFORMATION DETERMINING THE
1628C           PERMUTATIONS AND SCALING FACTORS USED.
1629C
1630C     SUPPOSE THAT THE PRINCIPAL SUBMATRIX IN ROWS LOW THROUGH IGH
1631C     HAS BEEN BALANCED, THAT P(J) DENOTES THE INDEX INTERCHANGED
1632C     WITH J DURING THE PERMUTATION STEP, AND THAT THE ELEMENTS
1633C     OF THE DIAGONAL MATRIX USED ARE DENOTED BY D(I,J).  THEN
1634C        SCALE(J) = P(J),    FOR J = 1,...,LOW-1
1635C                 = D(J,J)       J = LOW,...,IGH
1636C                 = P(J)         J = IGH+1,...,N.
1637C     THE ORDER IN WHICH THE INTERCHANGES ARE MADE IS N TO IGH+1,
1638C     THEN 1 TO LOW-1.
1639C
1640C     NOTE THAT 1 IS RETURNED FOR IGH IF IGH IS ZERO FORMALLY.
1641C
1642C     THE ALGOL PROCEDURE EXC CONTAINED IN CBALANCE APPEARS IN
1643C     CBAL  IN LINE.  (NOTE THAT THE ALGOL ROLES OF IDENTIFIERS
1644C     K,L HAVE BEEN REVERSED.)
1645C
1646C     ARITHMETIC IS REAL THROUGHOUT.
1647C
1648C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
1649C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
1650C
1651C     THIS VERSION DATED AUGUST 1983.
1652C
1653C     ------------------------------------------------------------------
1654C
1655      RADIX = 16.0D0
1656C
1657      B2 = RADIX * RADIX
1658      K = 1
1659      L = N
1660      GO TO 100
1661C     .......... IN-LINE PROCEDURE FOR ROW AND
1662C                COLUMN EXCHANGE ..........
1663   20 SCALE(M) = J
1664      IF (J .EQ. M) GO TO 50
1665C
1666      DO 30 I = 1, L
1667         F = AR(I,J)
1668         AR(I,J) = AR(I,M)
1669         AR(I,M) = F
1670         F = AI(I,J)
1671         AI(I,J) = AI(I,M)
1672         AI(I,M) = F
1673   30 CONTINUE
1674C
1675      DO 40 I = K, N
1676         F = AR(J,I)
1677         AR(J,I) = AR(M,I)
1678         AR(M,I) = F
1679         F = AI(J,I)
1680         AI(J,I) = AI(M,I)
1681         AI(M,I) = F
1682   40 CONTINUE
1683C
1684   50 GO TO (80,130), IEXC
1685C     .......... SEARCH FOR ROWS ISOLATING AN EIGENVALUE
1686C                AND PUSH THEM DOWN ..........
1687   80 IF (L .EQ. 1) GO TO 280
1688      L = L - 1
1689C     .......... FOR J=L STEP -1 UNTIL 1 DO -- ..........
1690  100 DO 120 JJ = 1, L
1691         J = L + 1 - JJ
1692C
1693         DO 110 I = 1, L
1694            IF (I .EQ. J) GO TO 110
1695            IF (AR(J,I) .NE. 0.0D0 .OR. AI(J,I) .NE. 0.0D0) GO TO 120
1696  110    CONTINUE
1697C
1698         M = L
1699         IEXC = 1
1700         GO TO 20
1701  120 CONTINUE
1702C
1703      GO TO 140
1704C     .......... SEARCH FOR COLUMNS ISOLATING AN EIGENVALUE
1705C                AND PUSH THEM LEFT ..........
1706  130 K = K + 1
1707C
1708  140 DO 170 J = K, L
1709C
1710         DO 150 I = K, L
1711            IF (I .EQ. J) GO TO 150
1712            IF (AR(I,J) .NE. 0.0D0 .OR. AI(I,J) .NE. 0.0D0) GO TO 170
1713  150    CONTINUE
1714C
1715         M = K
1716         IEXC = 2
1717         GO TO 20
1718  170 CONTINUE
1719C     .......... NOW BALANCE THE SUBMATRIX IN ROWS K TO L ..........
1720      DO 180 I = K, L
1721  180 SCALE(I) = 1.0D0
1722C     .......... ITERATIVE LOOP FOR NORM REDUCTION ..........
1723  190 NOCONV = .FALSE.
1724C
1725      DO 270 I = K, L
1726         C = 0.0D0
1727         R = 0.0D0
1728C
1729         DO 200 J = K, L
1730            IF (J .EQ. I) GO TO 200
1731            C = C + DABS(AR(J,I)) + DABS(AI(J,I))
1732            R = R + DABS(AR(I,J)) + DABS(AI(I,J))
1733  200    CONTINUE
1734C     .......... GUARD AGAINST ZERO C OR R DUE TO UNDERFLOW ..........
1735         IF (C .EQ. 0.0D0 .OR. R .EQ. 0.0D0) GO TO 270
1736         G = R / RADIX
1737         F = 1.0D0
1738         S = C + R
1739  210    IF (C .GE. G) GO TO 220
1740         F = F * RADIX
1741         C = C * B2
1742         GO TO 210
1743  220    G = R * RADIX
1744  230    IF (C .LT. G) GO TO 240
1745         F = F / RADIX
1746         C = C / B2
1747         GO TO 230
1748C     .......... NOW BALANCE ..........
1749  240    IF ((C + R) / F .GE. 0.95D0 * S) GO TO 270
1750         G = 1.0D0 / F
1751         SCALE(I) = SCALE(I) * F
1752         NOCONV = .TRUE.
1753C
1754         DO 250 J = K, N
1755            AR(I,J) = AR(I,J) * G
1756            AI(I,J) = AI(I,J) * G
1757  250    CONTINUE
1758C
1759         DO 260 J = 1, L
1760            AR(J,I) = AR(J,I) * F
1761            AI(J,I) = AI(J,I) * F
1762  260    CONTINUE
1763C
1764  270 CONTINUE
1765C
1766      IF (NOCONV) GO TO 190
1767C
1768  280 LOW = K
1769      IGH = L
1770      RETURN
1771      END
1772      SUBROUTINE CG(NM,N,AR,AI,WR,WI,MATZ,ZR,ZI,FV1,FV2,FV3,IERR)
1773C
1774      INTEGER N,NM,IS1,IS2,IERR,MATZ
1775      DOUBLE PRECISION AR(NM,N),AI(NM,N),WR(N),WI(N),ZR(NM,N),ZI(NM,N),
1776     X       FV1(N),FV2(N),FV3(N)
1777C
1778C     THIS SUBROUTINE CALLS THE RECOMMENDED SEQUENCE OF
1779C     SUBROUTINES FROM THE EIGENSYSTEM SUBROUTINE PACKAGE (EISPACK)
1780C     TO FIND THE EIGENVALUES AND EIGENVECTORS (IF DESIRED)
1781C     OF A COMPLEX GENERAL MATRIX.
1782C
1783C     ON INPUT
1784C
1785C        NM  MUST BE SET TO THE ROW DIMENSION OF THE TWO-DIMENSIONAL
1786C        ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
1787C        DIMENSION STATEMENT.
1788C
1789C        N  IS THE ORDER OF THE MATRIX  A=(AR,AI).
1790C
1791C        AR  AND  AI  CONTAIN THE REAL AND IMAGINARY PARTS,
1792C        RESPECTIVELY, OF THE COMPLEX GENERAL MATRIX.
1793C
1794C        MATZ  IS AN INTEGER VARIABLE SET EQUAL TO ZERO IF
1795C        ONLY EIGENVALUES ARE DESIRED.  OTHERWISE IT IS SET TO
1796C        ANY NON-ZERO INTEGER FOR BOTH EIGENVALUES AND EIGENVECTORS.
1797C
1798C     ON OUTPUT
1799C
1800C        WR  AND  WI  CONTAIN THE REAL AND IMAGINARY PARTS,
1801C        RESPECTIVELY, OF THE EIGENVALUES.
1802C
1803C        ZR  AND  ZI  CONTAIN THE REAL AND IMAGINARY PARTS,
1804C        RESPECTIVELY, OF THE EIGENVECTORS IF MATZ IS NOT ZERO.
1805C
1806C        IERR  IS AN INTEGER OUTPUT VARIABLE SET EQUAL TO AN ERROR
1807C           COMPLETION CODE DESCRIBED IN THE DOCUMENTATION FOR COMQR
1808C           AND COMQR2.  THE NORMAL COMPLETION CODE IS ZERO.
1809C
1810C        FV1, FV2, AND  FV3  ARE TEMPORARY STORAGE ARRAYS.
1811C
1812C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
1813C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
1814C
1815C     THIS VERSION DATED AUGUST 1983.
1816C
1817C     ------------------------------------------------------------------
1818C
1819      IF (N .LE. NM) GO TO 10
1820      IERR = 10 * N
1821      GO TO 50
1822C
1823   10 CALL  CBAL(NM,N,AR,AI,IS1,IS2,FV1)
1824      CALL  CORTH(NM,N,IS1,IS2,AR,AI,FV2,FV3)
1825      IF (MATZ .NE. 0) GO TO 20
1826C     .......... FIND EIGENVALUES ONLY ..........
1827      CALL  COMQR(NM,N,IS1,IS2,AR,AI,WR,WI,IERR)
1828      GO TO 50
1829C     .......... FIND BOTH EIGENVALUES AND EIGENVECTORS ..........
1830   20 CALL  COMQR2(NM,N,IS1,IS2,FV2,FV3,AR,AI,WR,WI,ZR,ZI,IERR)
1831      IF (IERR .NE. 0) GO TO 50
1832      CALL  CBABK2(NM,N,IS1,IS2,FV1,N,ZR,ZI)
1833   50 RETURN
1834      END
1835      SUBROUTINE CH(NM,N,AR,AI,W,MATZ,ZR,ZI,FV1,FV2,FM1,IERR)
1836C
1837      INTEGER I,J,N,NM,IERR,MATZ
1838      DOUBLE PRECISION AR(NM,N),AI(NM,N),W(N),ZR(NM,N),ZI(NM,N),
1839     X       FV1(N),FV2(N),FM1(2,N)
1840C
1841C     THIS SUBROUTINE CALLS THE RECOMMENDED SEQUENCE OF
1842C     SUBROUTINES FROM THE EIGENSYSTEM SUBROUTINE PACKAGE (EISPACK)
1843C     TO FIND THE EIGENVALUES AND EIGENVECTORS (IF DESIRED)
1844C     OF A COMPLEX HERMITIAN MATRIX.
1845C
1846C     ON INPUT
1847C
1848C        NM  MUST BE SET TO THE ROW DIMENSION OF THE TWO-DIMENSIONAL
1849C        ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
1850C        DIMENSION STATEMENT.
1851C
1852C        N  IS THE ORDER OF THE MATRIX  A=(AR,AI).
1853C
1854C        AR  AND  AI  CONTAIN THE REAL AND IMAGINARY PARTS,
1855C        RESPECTIVELY, OF THE COMPLEX HERMITIAN MATRIX.
1856C
1857C        MATZ  IS AN INTEGER VARIABLE SET EQUAL TO ZERO IF
1858C        ONLY EIGENVALUES ARE DESIRED.  OTHERWISE IT IS SET TO
1859C        ANY NON-ZERO INTEGER FOR BOTH EIGENVALUES AND EIGENVECTORS.
1860C
1861C     ON OUTPUT
1862C
1863C        W  CONTAINS THE EIGENVALUES IN ASCENDING ORDER.
1864C
1865C        ZR  AND  ZI  CONTAIN THE REAL AND IMAGINARY PARTS,
1866C        RESPECTIVELY, OF THE EIGENVECTORS IF MATZ IS NOT ZERO.
1867C
1868C        IERR  IS AN INTEGER OUTPUT VARIABLE SET EQUAL TO AN ERROR
1869C           COMPLETION CODE DESCRIBED IN THE DOCUMENTATION FOR TQLRAT
1870C           AND TQL2.  THE NORMAL COMPLETION CODE IS ZERO.
1871C
1872C        FV1, FV2, AND  FM1  ARE TEMPORARY STORAGE ARRAYS.
1873C
1874C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
1875C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
1876C
1877C     THIS VERSION DATED AUGUST 1983.
1878C
1879C     ------------------------------------------------------------------
1880C
1881      IF (N .LE. NM) GO TO 10
1882      IERR = 10 * N
1883      GO TO 50
1884C
1885   10 CALL  HTRIDI(NM,N,AR,AI,W,FV1,FV2,FM1)
1886      IF (MATZ .NE. 0) GO TO 20
1887C     .......... FIND EIGENVALUES ONLY ..........
1888      CALL  TQLRAT(N,W,FV2,IERR)
1889      GO TO 50
1890C     .......... FIND BOTH EIGENVALUES AND EIGENVECTORS ..........
1891   20 DO 40 I = 1, N
1892C
1893         DO 30 J = 1, N
1894            ZR(J,I) = 0.0D0
1895   30    CONTINUE
1896C
1897         ZR(I,I) = 1.0D0
1898   40 CONTINUE
1899C
1900      CALL  TQL2(NM,N,W,FV1,ZR,IERR)
1901      IF (IERR .NE. 0) GO TO 50
1902      CALL  HTRIBK(NM,N,AR,AI,FM1,N,ZR,ZI)
1903   50 RETURN
1904      END
1905      SUBROUTINE CINVIT(NM,N,AR,AI,WR,WI,SELECT,MM,M,ZR,ZI,
1906     X                  IERR,RM1,RM2,RV1,RV2)
1907C
1908      INTEGER I,J,K,M,N,S,II,MM,MP,NM,UK,IP1,ITS,KM1,IERR
1909      DOUBLE PRECISION AR(NM,N),AI(NM,N),WR(N),WI(N),ZR(NM,MM),
1910     X       ZI(NM,MM),RM1(N,N),RM2(N,N),RV1(N),RV2(N)
1911      DOUBLE PRECISION X,Y,EPS3,NORM,NORMV,EPSLON,GROWTO,ILAMBD,PYTHAG,
1912     X       RLAMBD,UKROOT
1913      LOGICAL SELECT(N)
1914C
1915C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE CX INVIT
1916C     BY PETERS AND WILKINSON.
1917C     HANDBOOK FOR AUTO. COMP. VOL.II-LINEAR ALGEBRA, 418-439(1971).
1918C
1919C     THIS SUBROUTINE FINDS THOSE EIGENVECTORS OF A COMPLEX UPPER
1920C     HESSENBERG MATRIX CORRESPONDING TO SPECIFIED EIGENVALUES,
1921C     USING INVERSE ITERATION.
1922C
1923C     ON INPUT
1924C
1925C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
1926C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
1927C          DIMENSION STATEMENT.
1928C
1929C        N IS THE ORDER OF THE MATRIX.
1930C
1931C        AR AND AI CONTAIN THE REAL AND IMAGINARY PARTS,
1932C          RESPECTIVELY, OF THE HESSENBERG MATRIX.
1933C
1934C        WR AND WI CONTAIN THE REAL AND IMAGINARY PARTS, RESPECTIVELY,
1935C          OF THE EIGENVALUES OF THE MATRIX.  THE EIGENVALUES MUST BE
1936C          STORED IN A MANNER IDENTICAL TO THAT OF SUBROUTINE  COMLR,
1937C          WHICH RECOGNIZES POSSIBLE SPLITTING OF THE MATRIX.
1938C
1939C        SELECT SPECIFIES THE EIGENVECTORS TO BE FOUND.  THE
1940C          EIGENVECTOR CORRESPONDING TO THE J-TH EIGENVALUE IS
1941C          SPECIFIED BY SETTING SELECT(J) TO .TRUE..
1942C
1943C        MM SHOULD BE SET TO AN UPPER BOUND FOR THE NUMBER OF
1944C          EIGENVECTORS TO BE FOUND.
1945C
1946C     ON OUTPUT
1947C
1948C        AR, AI, WI, AND SELECT ARE UNALTERED.
1949C
1950C        WR MAY HAVE BEEN ALTERED SINCE CLOSE EIGENVALUES ARE PERTURBED
1951C          SLIGHTLY IN SEARCHING FOR INDEPENDENT EIGENVECTORS.
1952C
1953C        M IS THE NUMBER OF EIGENVECTORS ACTUALLY FOUND.
1954C
1955C        ZR AND ZI CONTAIN THE REAL AND IMAGINARY PARTS, RESPECTIVELY,
1956C          OF THE EIGENVECTORS.  THE EIGENVECTORS ARE NORMALIZED
1957C          SO THAT THE COMPONENT OF LARGEST MAGNITUDE IS 1.
1958C          ANY VECTOR WHICH FAILS THE ACCEPTANCE TEST IS SET TO ZERO.
1959C
1960C        IERR IS SET TO
1961C          ZERO       FOR NORMAL RETURN,
1962C          -(2*N+1)   IF MORE THAN MM EIGENVECTORS HAVE BEEN SPECIFIED,
1963C          -K         IF THE ITERATION CORRESPONDING TO THE K-TH
1964C                     VALUE FAILS,
1965C          -(N+K)     IF BOTH ERROR SITUATIONS OCCUR.
1966C
1967C        RM1, RM2, RV1, AND RV2 ARE TEMPORARY STORAGE ARRAYS.
1968C
1969C     THE ALGOL PROCEDURE GUESSVEC APPEARS IN CINVIT IN LINE.
1970C
1971C     CALLS CDIV FOR COMPLEX DIVISION.
1972C     CALLS PYTHAG FOR  DSQRT(A*A + B*B) .
1973C
1974C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
1975C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
1976C
1977C     THIS VERSION DATED AUGUST 1983.
1978C
1979C     ------------------------------------------------------------------
1980C
1981      IERR = 0
1982      UK = 0
1983      S = 1
1984C
1985      DO 980 K = 1, N
1986         IF (.NOT. SELECT(K)) GO TO 980
1987         IF (S .GT. MM) GO TO 1000
1988         IF (UK .GE. K) GO TO 200
1989C     .......... CHECK FOR POSSIBLE SPLITTING ..........
1990         DO 120 UK = K, N
1991            IF (UK .EQ. N) GO TO 140
1992            IF (AR(UK+1,UK) .EQ. 0.0D0 .AND. AI(UK+1,UK) .EQ. 0.0D0)
1993     X         GO TO 140
1994  120    CONTINUE
1995C     .......... COMPUTE INFINITY NORM OF LEADING UK BY UK
1996C                (HESSENBERG) MATRIX ..........
1997  140    NORM = 0.0D0
1998         MP = 1
1999C
2000         DO 180 I = 1, UK
2001            X = 0.0D0
2002C
2003            DO 160 J = MP, UK
2004  160       X = X + PYTHAG(AR(I,J),AI(I,J))
2005C
2006            IF (X .GT. NORM) NORM = X
2007            MP = I
2008  180    CONTINUE
2009C     .......... EPS3 REPLACES ZERO PIVOT IN DECOMPOSITION
2010C                AND CLOSE ROOTS ARE MODIFIED BY EPS3 ..........
2011         IF (NORM .EQ. 0.0D0) NORM = 1.0D0
2012         EPS3 = EPSLON(NORM)
2013C     .......... GROWTO IS THE CRITERION FOR GROWTH ..........
2014         UKROOT = UK
2015         UKROOT = DSQRT(UKROOT)
2016         GROWTO = 0.1D0 / UKROOT
2017  200    RLAMBD = WR(K)
2018         ILAMBD = WI(K)
2019         IF (K .EQ. 1) GO TO 280
2020         KM1 = K - 1
2021         GO TO 240
2022C     .......... PERTURB EIGENVALUE IF IT IS CLOSE
2023C                TO ANY PREVIOUS EIGENVALUE ..........
2024  220    RLAMBD = RLAMBD + EPS3
2025C     .......... FOR I=K-1 STEP -1 UNTIL 1 DO -- ..........
2026  240    DO 260 II = 1, KM1
2027            I = K - II
2028            IF (SELECT(I) .AND. DABS(WR(I)-RLAMBD) .LT. EPS3 .AND.
2029     X         DABS(WI(I)-ILAMBD) .LT. EPS3) GO TO 220
2030  260    CONTINUE
2031C
2032         WR(K) = RLAMBD
2033C     .......... FORM UPPER HESSENBERG (AR,AI)-(RLAMBD,ILAMBD)*I
2034C                AND INITIAL COMPLEX VECTOR ..........
2035  280    MP = 1
2036C
2037         DO 320 I = 1, UK
2038C
2039            DO 300 J = MP, UK
2040               RM1(I,J) = AR(I,J)
2041               RM2(I,J) = AI(I,J)
2042  300       CONTINUE
2043C
2044            RM1(I,I) = RM1(I,I) - RLAMBD
2045            RM2(I,I) = RM2(I,I) - ILAMBD
2046            MP = I
2047            RV1(I) = EPS3
2048  320    CONTINUE
2049C     .......... TRIANGULAR DECOMPOSITION WITH INTERCHANGES,
2050C                REPLACING ZERO PIVOTS BY EPS3 ..........
2051         IF (UK .EQ. 1) GO TO 420
2052C
2053         DO 400 I = 2, UK
2054            MP = I - 1
2055            IF (PYTHAG(RM1(I,MP),RM2(I,MP)) .LE.
2056     X          PYTHAG(RM1(MP,MP),RM2(MP,MP))) GO TO 360
2057C
2058            DO 340 J = MP, UK
2059               Y = RM1(I,J)
2060               RM1(I,J) = RM1(MP,J)
2061               RM1(MP,J) = Y
2062               Y = RM2(I,J)
2063               RM2(I,J) = RM2(MP,J)
2064               RM2(MP,J) = Y
2065  340       CONTINUE
2066C
2067  360       IF (RM1(MP,MP) .EQ. 0.0D0 .AND. RM2(MP,MP) .EQ. 0.0D0)
2068     X         RM1(MP,MP) = EPS3
2069            CALL CDIV(RM1(I,MP),RM2(I,MP),RM1(MP,MP),RM2(MP,MP),X,Y)
2070            IF (X .EQ. 0.0D0 .AND. Y .EQ. 0.0D0) GO TO 400
2071C
2072            DO 380 J = I, UK
2073               RM1(I,J) = RM1(I,J) - X * RM1(MP,J) + Y * RM2(MP,J)
2074               RM2(I,J) = RM2(I,J) - X * RM2(MP,J) - Y * RM1(MP,J)
2075  380       CONTINUE
2076C
2077  400    CONTINUE
2078C
2079  420    IF (RM1(UK,UK) .EQ. 0.0D0 .AND. RM2(UK,UK) .EQ. 0.0D0)
2080     X      RM1(UK,UK) = EPS3
2081         ITS = 0
2082C     .......... BACK SUBSTITUTION
2083C                FOR I=UK STEP -1 UNTIL 1 DO -- ..........
2084  660    DO 720 II = 1, UK
2085            I = UK + 1 - II
2086            X = RV1(I)
2087            Y = 0.0D0
2088            IF (I .EQ. UK) GO TO 700
2089            IP1 = I + 1
2090C
2091            DO 680 J = IP1, UK
2092               X = X - RM1(I,J) * RV1(J) + RM2(I,J) * RV2(J)
2093               Y = Y - RM1(I,J) * RV2(J) - RM2(I,J) * RV1(J)
2094  680       CONTINUE
2095C
2096  700       CALL CDIV(X,Y,RM1(I,I),RM2(I,I),RV1(I),RV2(I))
2097  720    CONTINUE
2098C     .......... ACCEPTANCE TEST FOR EIGENVECTOR
2099C                AND NORMALIZATION ..........
2100         ITS = ITS + 1
2101         NORM = 0.0D0
2102         NORMV = 0.0D0
2103C
2104         DO 780 I = 1, UK
2105            X = PYTHAG(RV1(I),RV2(I))
2106            IF (NORMV .GE. X) GO TO 760
2107            NORMV = X
2108            J = I
2109  760       NORM = NORM + X
2110  780    CONTINUE
2111C
2112         IF (NORM .LT. GROWTO) GO TO 840
2113C     .......... ACCEPT VECTOR ..........
2114         X = RV1(J)
2115         Y = RV2(J)
2116C
2117         DO 820 I = 1, UK
2118            CALL CDIV(RV1(I),RV2(I),X,Y,ZR(I,S),ZI(I,S))
2119  820    CONTINUE
2120C
2121         IF (UK .EQ. N) GO TO 940
2122         J = UK + 1
2123         GO TO 900
2124C     .......... IN-LINE PROCEDURE FOR CHOOSING
2125C                A NEW STARTING VECTOR ..........
2126  840    IF (ITS .GE. UK) GO TO 880
2127         X = UKROOT
2128         Y = EPS3 / (X + 1.0D0)
2129         RV1(1) = EPS3
2130C
2131         DO 860 I = 2, UK
2132  860    RV1(I) = Y
2133C
2134         J = UK - ITS + 1
2135         RV1(J) = RV1(J) - EPS3 * X
2136         GO TO 660
2137C     .......... SET ERROR -- UNACCEPTED EIGENVECTOR ..........
2138  880    J = 1
2139         IERR = -K
2140C     .......... SET REMAINING VECTOR COMPONENTS TO ZERO ..........
2141  900    DO 920 I = J, N
2142            ZR(I,S) = 0.0D0
2143            ZI(I,S) = 0.0D0
2144  920    CONTINUE
2145C
2146  940    S = S + 1
2147  980 CONTINUE
2148C
2149      GO TO 1001
2150C     .......... SET ERROR -- UNDERESTIMATE OF EIGENVECTOR
2151C                SPACE REQUIRED ..........
2152 1000 IF (IERR .NE. 0) IERR = IERR - N
2153      IF (IERR .EQ. 0) IERR = -(2 * N + 1)
2154 1001 M = S - 1
2155      RETURN
2156      END
2157      SUBROUTINE COMBAK(NM,LOW,IGH,AR,AI,INT,M,ZR,ZI)
2158C
2159      INTEGER I,J,M,LA,MM,MP,NM,IGH,KP1,LOW,MP1
2160      DOUBLE PRECISION AR(NM,IGH),AI(NM,IGH),ZR(NM,M),ZI(NM,M)
2161      DOUBLE PRECISION XR,XI
2162      INTEGER INT(IGH)
2163C
2164C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE COMBAK,
2165C     NUM. MATH. 12, 349-368(1968) BY MARTIN AND WILKINSON.
2166C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 339-358(1971).
2167C
2168C     THIS SUBROUTINE FORMS THE EIGENVECTORS OF A COMPLEX GENERAL
2169C     MATRIX BY BACK TRANSFORMING THOSE OF THE CORRESPONDING
2170C     UPPER HESSENBERG MATRIX DETERMINED BY  COMHES.
2171C
2172C     ON INPUT
2173C
2174C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
2175C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
2176C          DIMENSION STATEMENT.
2177C
2178C        LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING
2179C          SUBROUTINE  CBAL.  IF  CBAL  HAS NOT BEEN USED,
2180C          SET LOW=1 AND IGH EQUAL TO THE ORDER OF THE MATRIX.
2181C
2182C        AR AND AI CONTAIN THE MULTIPLIERS WHICH WERE USED IN THE
2183C          REDUCTION BY  COMHES  IN THEIR LOWER TRIANGLES
2184C          BELOW THE SUBDIAGONAL.
2185C
2186C        INT CONTAINS INFORMATION ON THE ROWS AND COLUMNS
2187C          INTERCHANGED IN THE REDUCTION BY  COMHES.
2188C          ONLY ELEMENTS LOW THROUGH IGH ARE USED.
2189C
2190C        M IS THE NUMBER OF EIGENVECTORS TO BE BACK TRANSFORMED.
2191C
2192C        ZR AND ZI CONTAIN THE REAL AND IMAGINARY PARTS,
2193C          RESPECTIVELY, OF THE EIGENVECTORS TO BE
2194C          BACK TRANSFORMED IN THEIR FIRST M COLUMNS.
2195C
2196C     ON OUTPUT
2197C
2198C        ZR AND ZI CONTAIN THE REAL AND IMAGINARY PARTS,
2199C          RESPECTIVELY, OF THE TRANSFORMED EIGENVECTORS
2200C          IN THEIR FIRST M COLUMNS.
2201C
2202C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
2203C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
2204C
2205C     THIS VERSION DATED AUGUST 1983.
2206C
2207C     ------------------------------------------------------------------
2208C
2209      IF (M .EQ. 0) GO TO 200
2210      LA = IGH - 1
2211      KP1 = LOW + 1
2212      IF (LA .LT. KP1) GO TO 200
2213C     .......... FOR MP=IGH-1 STEP -1 UNTIL LOW+1 DO -- ..........
2214      DO 140 MM = KP1, LA
2215         MP = LOW + IGH - MM
2216         MP1 = MP + 1
2217C
2218         DO 110 I = MP1, IGH
2219            XR = AR(I,MP-1)
2220            XI = AI(I,MP-1)
2221            IF (XR .EQ. 0.0D0 .AND. XI .EQ. 0.0D0) GO TO 110
2222C
2223            DO 100 J = 1, M
2224               ZR(I,J) = ZR(I,J) + XR * ZR(MP,J) - XI * ZI(MP,J)
2225               ZI(I,J) = ZI(I,J) + XR * ZI(MP,J) + XI * ZR(MP,J)
2226  100       CONTINUE
2227C
2228  110    CONTINUE
2229C
2230         I = INT(MP)
2231         IF (I .EQ. MP) GO TO 140
2232C
2233         DO 130 J = 1, M
2234            XR = ZR(I,J)
2235            ZR(I,J) = ZR(MP,J)
2236            ZR(MP,J) = XR
2237            XI = ZI(I,J)
2238            ZI(I,J) = ZI(MP,J)
2239            ZI(MP,J) = XI
2240  130    CONTINUE
2241C
2242  140 CONTINUE
2243C
2244  200 RETURN
2245      END
2246      SUBROUTINE COMHES(NM,N,LOW,IGH,AR,AI,INT)
2247C
2248      INTEGER I,J,M,N,LA,NM,IGH,KP1,LOW,MM1,MP1
2249      DOUBLE PRECISION AR(NM,N),AI(NM,N)
2250      DOUBLE PRECISION XR,XI,YR,YI
2251      INTEGER INT(IGH)
2252C
2253C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE COMHES,
2254C     NUM. MATH. 12, 349-368(1968) BY MARTIN AND WILKINSON.
2255C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 339-358(1971).
2256C
2257C     GIVEN A COMPLEX GENERAL MATRIX, THIS SUBROUTINE
2258C     REDUCES A SUBMATRIX SITUATED IN ROWS AND COLUMNS
2259C     LOW THROUGH IGH TO UPPER HESSENBERG FORM BY
2260C     STABILIZED ELEMENTARY SIMILARITY TRANSFORMATIONS.
2261C
2262C     ON INPUT
2263C
2264C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
2265C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
2266C          DIMENSION STATEMENT.
2267C
2268C        N IS THE ORDER OF THE MATRIX.
2269C
2270C        LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING
2271C          SUBROUTINE  CBAL.  IF  CBAL  HAS NOT BEEN USED,
2272C          SET LOW=1, IGH=N.
2273C
2274C        AR AND AI CONTAIN THE REAL AND IMAGINARY PARTS,
2275C          RESPECTIVELY, OF THE COMPLEX INPUT MATRIX.
2276C
2277C     ON OUTPUT
2278C
2279C        AR AND AI CONTAIN THE REAL AND IMAGINARY PARTS,
2280C          RESPECTIVELY, OF THE HESSENBERG MATRIX.  THE
2281C          MULTIPLIERS WHICH WERE USED IN THE REDUCTION
2282C          ARE STORED IN THE REMAINING TRIANGLES UNDER THE
2283C          HESSENBERG MATRIX.
2284C
2285C        INT CONTAINS INFORMATION ON THE ROWS AND COLUMNS
2286C          INTERCHANGED IN THE REDUCTION.
2287C          ONLY ELEMENTS LOW THROUGH IGH ARE USED.
2288C
2289C     CALLS CDIV FOR COMPLEX DIVISION.
2290C
2291C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
2292C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
2293C
2294C     THIS VERSION DATED AUGUST 1983.
2295C
2296C     ------------------------------------------------------------------
2297C
2298      LA = IGH - 1
2299      KP1 = LOW + 1
2300      IF (LA .LT. KP1) GO TO 200
2301C
2302      DO 180 M = KP1, LA
2303         MM1 = M - 1
2304         XR = 0.0D0
2305         XI = 0.0D0
2306         I = M
2307C
2308         DO 100 J = M, IGH
2309            IF (DABS(AR(J,MM1)) + DABS(AI(J,MM1))
2310     X         .LE. DABS(XR) + DABS(XI)) GO TO 100
2311            XR = AR(J,MM1)
2312            XI = AI(J,MM1)
2313            I = J
2314  100    CONTINUE
2315C
2316         INT(M) = I
2317         IF (I .EQ. M) GO TO 130
2318C     .......... INTERCHANGE ROWS AND COLUMNS OF AR AND AI ..........
2319         DO 110 J = MM1, N
2320            YR = AR(I,J)
2321            AR(I,J) = AR(M,J)
2322            AR(M,J) = YR
2323            YI = AI(I,J)
2324            AI(I,J) = AI(M,J)
2325            AI(M,J) = YI
2326  110    CONTINUE
2327C
2328         DO 120 J = 1, IGH
2329            YR = AR(J,I)
2330            AR(J,I) = AR(J,M)
2331            AR(J,M) = YR
2332            YI = AI(J,I)
2333            AI(J,I) = AI(J,M)
2334            AI(J,M) = YI
2335  120    CONTINUE
2336C     .......... END INTERCHANGE ..........
2337  130    IF (XR .EQ. 0.0D0 .AND. XI .EQ. 0.0D0) GO TO 180
2338         MP1 = M + 1
2339C
2340         DO 160 I = MP1, IGH
2341            YR = AR(I,MM1)
2342            YI = AI(I,MM1)
2343            IF (YR .EQ. 0.0D0 .AND. YI .EQ. 0.0D0) GO TO 160
2344            CALL CDIV(YR,YI,XR,XI,YR,YI)
2345            AR(I,MM1) = YR
2346            AI(I,MM1) = YI
2347C
2348            DO 140 J = M, N
2349               AR(I,J) = AR(I,J) - YR * AR(M,J) + YI * AI(M,J)
2350               AI(I,J) = AI(I,J) - YR * AI(M,J) - YI * AR(M,J)
2351  140       CONTINUE
2352C
2353            DO 150 J = 1, IGH
2354               AR(J,M) = AR(J,M) + YR * AR(J,I) - YI * AI(J,I)
2355               AI(J,M) = AI(J,M) + YR * AI(J,I) + YI * AR(J,I)
2356  150       CONTINUE
2357C
2358  160    CONTINUE
2359C
2360  180 CONTINUE
2361C
2362  200 RETURN
2363      END
2364      SUBROUTINE COMLR(NM,N,LOW,IGH,HR,HI,WR,WI,IERR)
2365C
2366      INTEGER I,J,L,M,N,EN,LL,MM,NM,IGH,IM1,ITN,ITS,LOW,MP1,ENM1,IERR
2367      DOUBLE PRECISION HR(NM,N),HI(NM,N),WR(N),WI(N)
2368      DOUBLE PRECISION SI,SR,TI,TR,XI,XR,YI,YR,ZZI,ZZR,TST1,TST2
2369C
2370C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE COMLR,
2371C     NUM. MATH. 12, 369-376(1968) BY MARTIN AND WILKINSON.
2372C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 396-403(1971).
2373C
2374C     THIS SUBROUTINE FINDS THE EIGENVALUES OF A COMPLEX
2375C     UPPER HESSENBERG MATRIX BY THE MODIFIED LR METHOD.
2376C
2377C     ON INPUT
2378C
2379C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
2380C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
2381C          DIMENSION STATEMENT.
2382C
2383C        N IS THE ORDER OF THE MATRIX.
2384C
2385C        LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING
2386C          SUBROUTINE  CBAL.  IF  CBAL  HAS NOT BEEN USED,
2387C          SET LOW=1, IGH=N.
2388C
2389C        HR AND HI CONTAIN THE REAL AND IMAGINARY PARTS,
2390C          RESPECTIVELY, OF THE COMPLEX UPPER HESSENBERG MATRIX.
2391C          THEIR LOWER TRIANGLES BELOW THE SUBDIAGONAL CONTAIN THE
2392C          MULTIPLIERS WHICH WERE USED IN THE REDUCTION BY  COMHES,
2393C          IF PERFORMED.
2394C
2395C     ON OUTPUT
2396C
2397C        THE UPPER HESSENBERG PORTIONS OF HR AND HI HAVE BEEN
2398C          DESTROYED.  THEREFORE, THEY MUST BE SAVED BEFORE
2399C          CALLING  COMLR  IF SUBSEQUENT CALCULATION OF
2400C          EIGENVECTORS IS TO BE PERFORMED.
2401C
2402C        WR AND WI CONTAIN THE REAL AND IMAGINARY PARTS,
2403C          RESPECTIVELY, OF THE EIGENVALUES.  IF AN ERROR
2404C          EXIT IS MADE, THE EIGENVALUES SHOULD BE CORRECT
2405C          FOR INDICES IERR+1,...,N.
2406C
2407C        IERR IS SET TO
2408C          ZERO       FOR NORMAL RETURN,
2409C          J          IF THE LIMIT OF 30*N ITERATIONS IS EXHAUSTED
2410C                     WHILE THE J-TH EIGENVALUE IS BEING SOUGHT.
2411C
2412C     CALLS CDIV FOR COMPLEX DIVISION.
2413C     CALLS CSROOT FOR COMPLEX SQUARE ROOT.
2414C
2415C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
2416C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
2417C
2418C     THIS VERSION DATED AUGUST 1983.
2419C
2420C     ------------------------------------------------------------------
2421C
2422      IERR = 0
2423C     .......... STORE ROOTS ISOLATED BY CBAL ..........
2424      DO 200 I = 1, N
2425         IF (I .GE. LOW .AND. I .LE. IGH) GO TO 200
2426         WR(I) = HR(I,I)
2427         WI(I) = HI(I,I)
2428  200 CONTINUE
2429C
2430      EN = IGH
2431      TR = 0.0D0
2432      TI = 0.0D0
2433      ITN = 30*N
2434C     .......... SEARCH FOR NEXT EIGENVALUE ..........
2435  220 IF (EN .LT. LOW) GO TO 1001
2436      ITS = 0
2437      ENM1 = EN - 1
2438C     .......... LOOK FOR SINGLE SMALL SUB-DIAGONAL ELEMENT
2439C                FOR L=EN STEP -1 UNTIL LOW D0 -- ..........
2440  240 DO 260 LL = LOW, EN
2441         L = EN + LOW - LL
2442         IF (L .EQ. LOW) GO TO 300
2443         TST1 = DABS(HR(L-1,L-1)) + DABS(HI(L-1,L-1))
2444     X            + DABS(HR(L,L)) + DABS(HI(L,L))
2445         TST2 = TST1 + DABS(HR(L,L-1)) + DABS(HI(L,L-1))
2446         IF (TST2 .EQ. TST1) GO TO 300
2447  260 CONTINUE
2448C     .......... FORM SHIFT ..........
2449  300 IF (L .EQ. EN) GO TO 660
2450      IF (ITN .EQ. 0) GO TO 1000
2451      IF (ITS .EQ. 10 .OR. ITS .EQ. 20) GO TO 320
2452      SR = HR(EN,EN)
2453      SI = HI(EN,EN)
2454      XR = HR(ENM1,EN) * HR(EN,ENM1) - HI(ENM1,EN) * HI(EN,ENM1)
2455      XI = HR(ENM1,EN) * HI(EN,ENM1) + HI(ENM1,EN) * HR(EN,ENM1)
2456      IF (XR .EQ. 0.0D0 .AND. XI .EQ. 0.0D0) GO TO 340
2457      YR = (HR(ENM1,ENM1) - SR) / 2.0D0
2458      YI = (HI(ENM1,ENM1) - SI) / 2.0D0
2459      CALL CSROOT(YR**2-YI**2+XR,2.0D0*YR*YI+XI,ZZR,ZZI)
2460      IF (YR * ZZR + YI * ZZI .GE. 0.0D0) GO TO 310
2461      ZZR = -ZZR
2462      ZZI = -ZZI
2463  310 CALL CDIV(XR,XI,YR+ZZR,YI+ZZI,XR,XI)
2464      SR = SR - XR
2465      SI = SI - XI
2466      GO TO 340
2467C     .......... FORM EXCEPTIONAL SHIFT ..........
2468  320 SR = DABS(HR(EN,ENM1)) + DABS(HR(ENM1,EN-2))
2469      SI = DABS(HI(EN,ENM1)) + DABS(HI(ENM1,EN-2))
2470C
2471  340 DO 360 I = LOW, EN
2472         HR(I,I) = HR(I,I) - SR
2473         HI(I,I) = HI(I,I) - SI
2474  360 CONTINUE
2475C
2476      TR = TR + SR
2477      TI = TI + SI
2478      ITS = ITS + 1
2479      ITN = ITN - 1
2480C     .......... LOOK FOR TWO CONSECUTIVE SMALL
2481C                SUB-DIAGONAL ELEMENTS ..........
2482      XR = DABS(HR(ENM1,ENM1)) + DABS(HI(ENM1,ENM1))
2483      YR = DABS(HR(EN,ENM1)) + DABS(HI(EN,ENM1))
2484      ZZR = DABS(HR(EN,EN)) + DABS(HI(EN,EN))
2485C     .......... FOR M=EN-1 STEP -1 UNTIL L DO -- ..........
2486      DO 380 MM = L, ENM1
2487         M = ENM1 + L - MM
2488         IF (M .EQ. L) GO TO 420
2489         YI = YR
2490         YR = DABS(HR(M,M-1)) + DABS(HI(M,M-1))
2491         XI = ZZR
2492         ZZR = XR
2493         XR = DABS(HR(M-1,M-1)) + DABS(HI(M-1,M-1))
2494         TST1 = ZZR / YI * (ZZR + XR + XI)
2495         TST2 = TST1 + YR
2496         IF (TST2 .EQ. TST1) GO TO 420
2497  380 CONTINUE
2498C     .......... TRIANGULAR DECOMPOSITION H=L*R ..........
2499  420 MP1 = M + 1
2500C
2501      DO 520 I = MP1, EN
2502         IM1 = I - 1
2503         XR = HR(IM1,IM1)
2504         XI = HI(IM1,IM1)
2505         YR = HR(I,IM1)
2506         YI = HI(I,IM1)
2507         IF (DABS(XR) + DABS(XI) .GE. DABS(YR) + DABS(YI)) GO TO 460
2508C     .......... INTERCHANGE ROWS OF HR AND HI ..........
2509         DO 440 J = IM1, EN
2510            ZZR = HR(IM1,J)
2511            HR(IM1,J) = HR(I,J)
2512            HR(I,J) = ZZR
2513            ZZI = HI(IM1,J)
2514            HI(IM1,J) = HI(I,J)
2515            HI(I,J) = ZZI
2516  440    CONTINUE
2517C
2518         CALL CDIV(XR,XI,YR,YI,ZZR,ZZI)
2519         WR(I) = 1.0D0
2520         GO TO 480
2521  460    CALL CDIV(YR,YI,XR,XI,ZZR,ZZI)
2522         WR(I) = -1.0D0
2523  480    HR(I,IM1) = ZZR
2524         HI(I,IM1) = ZZI
2525C
2526         DO 500 J = I, EN
2527            HR(I,J) = HR(I,J) - ZZR * HR(IM1,J) + ZZI * HI(IM1,J)
2528            HI(I,J) = HI(I,J) - ZZR * HI(IM1,J) - ZZI * HR(IM1,J)
2529  500    CONTINUE
2530C
2531  520 CONTINUE
2532C     .......... COMPOSITION R*L=H ..........
2533      DO 640 J = MP1, EN
2534         XR = HR(J,J-1)
2535         XI = HI(J,J-1)
2536         HR(J,J-1) = 0.0D0
2537         HI(J,J-1) = 0.0D0
2538C     .......... INTERCHANGE COLUMNS OF HR AND HI,
2539C                IF NECESSARY ..........
2540         IF (WR(J) .LE. 0.0D0) GO TO 580
2541C
2542         DO 540 I = L, J
2543            ZZR = HR(I,J-1)
2544            HR(I,J-1) = HR(I,J)
2545            HR(I,J) = ZZR
2546            ZZI = HI(I,J-1)
2547            HI(I,J-1) = HI(I,J)
2548            HI(I,J) = ZZI
2549  540    CONTINUE
2550C
2551  580    DO 600 I = L, J
2552            HR(I,J-1) = HR(I,J-1) + XR * HR(I,J) - XI * HI(I,J)
2553            HI(I,J-1) = HI(I,J-1) + XR * HI(I,J) + XI * HR(I,J)
2554  600    CONTINUE
2555C
2556  640 CONTINUE
2557C
2558      GO TO 240
2559C     .......... A ROOT FOUND ..........
2560  660 WR(EN) = HR(EN,EN) + TR
2561      WI(EN) = HI(EN,EN) + TI
2562      EN = ENM1
2563      GO TO 220
2564C     .......... SET ERROR -- ALL EIGENVALUES HAVE NOT
2565C                CONVERGED AFTER 30*N ITERATIONS ..........
2566 1000 IERR = EN
2567 1001 RETURN
2568      END
2569      SUBROUTINE COMLR2(NM,N,LOW,IGH,INT,HR,HI,WR,WI,ZR,ZI,IERR)
2570C
2571      INTEGER I,J,K,L,M,N,EN,II,JJ,LL,MM,NM,NN,IGH,IM1,IP1,
2572     X        ITN,ITS,LOW,MP1,ENM1,IEND,IERR
2573      DOUBLE PRECISION HR(NM,N),HI(NM,N),WR(N),WI(N),ZR(NM,N),ZI(NM,N)
2574      DOUBLE PRECISION SI,SR,TI,TR,XI,XR,YI,YR,ZZI,ZZR,NORM,TST1,TST2
2575      INTEGER INT(IGH)
2576C
2577C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE COMLR2,
2578C     NUM. MATH. 16, 181-204(1970) BY PETERS AND WILKINSON.
2579C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 372-395(1971).
2580C
2581C     THIS SUBROUTINE FINDS THE EIGENVALUES AND EIGENVECTORS
2582C     OF A COMPLEX UPPER HESSENBERG MATRIX BY THE MODIFIED LR
2583C     METHOD.  THE EIGENVECTORS OF A COMPLEX GENERAL MATRIX
2584C     CAN ALSO BE FOUND IF  COMHES  HAS BEEN USED TO REDUCE
2585C     THIS GENERAL MATRIX TO HESSENBERG FORM.
2586C
2587C     ON INPUT
2588C
2589C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
2590C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
2591C          DIMENSION STATEMENT.
2592C
2593C        N IS THE ORDER OF THE MATRIX.
2594C
2595C        LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING
2596C          SUBROUTINE  CBAL.  IF  CBAL  HAS NOT BEEN USED,
2597C          SET LOW=1, IGH=N.
2598C
2599C        INT CONTAINS INFORMATION ON THE ROWS AND COLUMNS INTERCHANGED
2600C          IN THE REDUCTION BY  COMHES, IF PERFORMED.  ONLY ELEMENTS
2601C          LOW THROUGH IGH ARE USED.  IF THE EIGENVECTORS OF THE HESSEN-
2602C          BERG MATRIX ARE DESIRED, SET INT(J)=J FOR THESE ELEMENTS.
2603C
2604C        HR AND HI CONTAIN THE REAL AND IMAGINARY PARTS,
2605C          RESPECTIVELY, OF THE COMPLEX UPPER HESSENBERG MATRIX.
2606C          THEIR LOWER TRIANGLES BELOW THE SUBDIAGONAL CONTAIN THE
2607C          MULTIPLIERS WHICH WERE USED IN THE REDUCTION BY  COMHES,
2608C          IF PERFORMED.  IF THE EIGENVECTORS OF THE HESSENBERG
2609C          MATRIX ARE DESIRED, THESE ELEMENTS MUST BE SET TO ZERO.
2610C
2611C     ON OUTPUT
2612C
2613C        THE UPPER HESSENBERG PORTIONS OF HR AND HI HAVE BEEN
2614C          DESTROYED, BUT THE LOCATION HR(1,1) CONTAINS THE NORM
2615C          OF THE TRIANGULARIZED MATRIX.
2616C
2617C        WR AND WI CONTAIN THE REAL AND IMAGINARY PARTS,
2618C          RESPECTIVELY, OF THE EIGENVALUES.  IF AN ERROR
2619C          EXIT IS MADE, THE EIGENVALUES SHOULD BE CORRECT
2620C          FOR INDICES IERR+1,...,N.
2621C
2622C        ZR AND ZI CONTAIN THE REAL AND IMAGINARY PARTS,
2623C          RESPECTIVELY, OF THE EIGENVECTORS.  THE EIGENVECTORS
2624C          ARE UNNORMALIZED.  IF AN ERROR EXIT IS MADE, NONE OF
2625C          THE EIGENVECTORS HAS BEEN FOUND.
2626C
2627C        IERR IS SET TO
2628C          ZERO       FOR NORMAL RETURN,
2629C          J          IF THE LIMIT OF 30*N ITERATIONS IS EXHAUSTED
2630C                     WHILE THE J-TH EIGENVALUE IS BEING SOUGHT.
2631C
2632C     
2633C     CALLS CDIV FOR COMPLEX DIVISION.
2634C     CALLS CSROOT FOR COMPLEX SQUARE ROOT.
2635C
2636C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
2637C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
2638C
2639C     THIS VERSION DATED AUGUST 1983.
2640C
2641C     ------------------------------------------------------------------
2642C
2643      IERR = 0
2644C     .......... INITIALIZE EIGENVECTOR MATRIX ..........
2645      DO 100 I = 1, N
2646C
2647         DO 100 J = 1, N
2648            ZR(I,J) = 0.0D0
2649            ZI(I,J) = 0.0D0
2650            IF (I .EQ. J) ZR(I,J) = 1.0D0
2651  100 CONTINUE
2652C     .......... FORM THE MATRIX OF ACCUMULATED TRANSFORMATIONS
2653C                FROM THE INFORMATION LEFT BY COMHES ..........
2654      IEND = IGH - LOW - 1
2655      IF (IEND .LE. 0) GO TO 180
2656C     .......... FOR I=IGH-1 STEP -1 UNTIL LOW+1 DO -- ..........
2657      DO 160 II = 1, IEND
2658         I = IGH - II
2659         IP1 = I + 1
2660C
2661         DO 120 K = IP1, IGH
2662            ZR(K,I) = HR(K,I-1)
2663            ZI(K,I) = HI(K,I-1)
2664  120    CONTINUE
2665C
2666         J = INT(I)
2667         IF (I .EQ. J) GO TO 160
2668C
2669         DO 140 K = I, IGH
2670            ZR(I,K) = ZR(J,K)
2671            ZI(I,K) = ZI(J,K)
2672            ZR(J,K) = 0.0D0
2673            ZI(J,K) = 0.0D0
2674  140    CONTINUE
2675C
2676         ZR(J,I) = 1.0D0
2677  160 CONTINUE
2678C     .......... STORE ROOTS ISOLATED BY CBAL ..........
2679  180 DO 200 I = 1, N
2680         IF (I .GE. LOW .AND. I .LE. IGH) GO TO 200
2681         WR(I) = HR(I,I)
2682         WI(I) = HI(I,I)
2683  200 CONTINUE
2684C
2685      EN = IGH
2686      TR = 0.0D0
2687      TI = 0.0D0
2688      ITN = 30*N
2689C     .......... SEARCH FOR NEXT EIGENVALUE ..........
2690  220 IF (EN .LT. LOW) GO TO 680
2691      ITS = 0
2692      ENM1 = EN - 1
2693C     .......... LOOK FOR SINGLE SMALL SUB-DIAGONAL ELEMENT
2694C                FOR L=EN STEP -1 UNTIL LOW DO -- ..........
2695  240 DO 260 LL = LOW, EN
2696         L = EN + LOW - LL
2697         IF (L .EQ. LOW) GO TO 300
2698         TST1 = DABS(HR(L-1,L-1)) + DABS(HI(L-1,L-1))
2699     X            + DABS(HR(L,L)) + DABS(HI(L,L))
2700         TST2 = TST1 + DABS(HR(L,L-1)) + DABS(HI(L,L-1))
2701         IF (TST2 .EQ. TST1) GO TO 300
2702  260 CONTINUE
2703C     .......... FORM SHIFT ..........
2704  300 IF (L .EQ. EN) GO TO 660
2705      IF (ITN .EQ. 0) GO TO 1000
2706      IF (ITS .EQ. 10 .OR. ITS .EQ. 20) GO TO 320
2707      SR = HR(EN,EN)
2708      SI = HI(EN,EN)
2709      XR = HR(ENM1,EN) * HR(EN,ENM1) - HI(ENM1,EN) * HI(EN,ENM1)
2710      XI = HR(ENM1,EN) * HI(EN,ENM1) + HI(ENM1,EN) * HR(EN,ENM1)
2711      IF (XR .EQ. 0.0D0 .AND. XI .EQ. 0.0D0) GO TO 340
2712      YR = (HR(ENM1,ENM1) - SR) / 2.0D0
2713      YI = (HI(ENM1,ENM1) - SI) / 2.0D0
2714      CALL CSROOT(YR**2-YI**2+XR,2.0D0*YR*YI+XI,ZZR,ZZI)
2715      IF (YR * ZZR + YI * ZZI .GE. 0.0D0) GO TO 310
2716      ZZR = -ZZR
2717      ZZI = -ZZI
2718  310 CALL CDIV(XR,XI,YR+ZZR,YI+ZZI,XR,XI)
2719      SR = SR - XR
2720      SI = SI - XI
2721      GO TO 340
2722C     .......... FORM EXCEPTIONAL SHIFT ..........
2723  320 SR = DABS(HR(EN,ENM1)) + DABS(HR(ENM1,EN-2))
2724      SI = DABS(HI(EN,ENM1)) + DABS(HI(ENM1,EN-2))
2725C
2726  340 DO 360 I = LOW, EN
2727         HR(I,I) = HR(I,I) - SR
2728         HI(I,I) = HI(I,I) - SI
2729  360 CONTINUE
2730C
2731      TR = TR + SR
2732      TI = TI + SI
2733      ITS = ITS + 1
2734      ITN = ITN - 1
2735C     .......... LOOK FOR TWO CONSECUTIVE SMALL
2736C                SUB-DIAGONAL ELEMENTS ..........
2737      XR = DABS(HR(ENM1,ENM1)) + DABS(HI(ENM1,ENM1))
2738      YR = DABS(HR(EN,ENM1)) + DABS(HI(EN,ENM1))
2739      ZZR = DABS(HR(EN,EN)) + DABS(HI(EN,EN))
2740C     .......... FOR M=EN-1 STEP -1 UNTIL L DO -- ..........
2741      DO 380 MM = L, ENM1
2742         M = ENM1 + L - MM
2743         IF (M .EQ. L) GO TO 420
2744         YI = YR
2745         YR = DABS(HR(M,M-1)) + DABS(HI(M,M-1))
2746         XI = ZZR
2747         ZZR = XR
2748         XR = DABS(HR(M-1,M-1)) + DABS(HI(M-1,M-1))
2749         TST1 = ZZR / YI * (ZZR + XR + XI)
2750         TST2 = TST1 + YR
2751         IF (TST2 .EQ. TST1) GO TO 420
2752  380 CONTINUE
2753C     .......... TRIANGULAR DECOMPOSITION H=L*R ..........
2754  420 MP1 = M + 1
2755C
2756      DO 520 I = MP1, EN
2757         IM1 = I - 1
2758         XR = HR(IM1,IM1)
2759         XI = HI(IM1,IM1)
2760         YR = HR(I,IM1)
2761         YI = HI(I,IM1)
2762         IF (DABS(XR) + DABS(XI) .GE. DABS(YR) + DABS(YI)) GO TO 460
2763C     .......... INTERCHANGE ROWS OF HR AND HI ..........
2764         DO 440 J = IM1, N
2765            ZZR = HR(IM1,J)
2766            HR(IM1,J) = HR(I,J)
2767            HR(I,J) = ZZR
2768            ZZI = HI(IM1,J)
2769            HI(IM1,J) = HI(I,J)
2770            HI(I,J) = ZZI
2771  440    CONTINUE
2772C
2773         CALL CDIV(XR,XI,YR,YI,ZZR,ZZI)
2774         WR(I) = 1.0D0
2775         GO TO 480
2776  460    CALL CDIV(YR,YI,XR,XI,ZZR,ZZI)
2777         WR(I) = -1.0D0
2778  480    HR(I,IM1) = ZZR
2779         HI(I,IM1) = ZZI
2780C
2781         DO 500 J = I, N
2782            HR(I,J) = HR(I,J) - ZZR * HR(IM1,J) + ZZI * HI(IM1,J)
2783            HI(I,J) = HI(I,J) - ZZR * HI(IM1,J) - ZZI * HR(IM1,J)
2784  500    CONTINUE
2785C
2786  520 CONTINUE
2787C     .......... COMPOSITION R*L=H ..........
2788      DO 640 J = MP1, EN
2789         XR = HR(J,J-1)
2790         XI = HI(J,J-1)
2791         HR(J,J-1) = 0.0D0
2792         HI(J,J-1) = 0.0D0
2793C     .......... INTERCHANGE COLUMNS OF HR, HI, ZR, AND ZI,
2794C                IF NECESSARY ..........
2795         IF (WR(J) .LE. 0.0D0) GO TO 580
2796C
2797         DO 540 I = 1, J
2798            ZZR = HR(I,J-1)
2799            HR(I,J-1) = HR(I,J)
2800            HR(I,J) = ZZR
2801            ZZI = HI(I,J-1)
2802            HI(I,J-1) = HI(I,J)
2803            HI(I,J) = ZZI
2804  540    CONTINUE
2805C
2806         DO 560 I = LOW, IGH
2807            ZZR = ZR(I,J-1)
2808            ZR(I,J-1) = ZR(I,J)
2809            ZR(I,J) = ZZR
2810            ZZI = ZI(I,J-1)
2811            ZI(I,J-1) = ZI(I,J)
2812            ZI(I,J) = ZZI
2813  560    CONTINUE
2814C
2815  580    DO 600 I = 1, J
2816            HR(I,J-1) = HR(I,J-1) + XR * HR(I,J) - XI * HI(I,J)
2817            HI(I,J-1) = HI(I,J-1) + XR * HI(I,J) + XI * HR(I,J)
2818  600    CONTINUE
2819C     .......... ACCUMULATE TRANSFORMATIONS ..........
2820         DO 620 I = LOW, IGH
2821            ZR(I,J-1) = ZR(I,J-1) + XR * ZR(I,J) - XI * ZI(I,J)
2822            ZI(I,J-1) = ZI(I,J-1) + XR * ZI(I,J) + XI * ZR(I,J)
2823  620    CONTINUE
2824C
2825  640 CONTINUE
2826C
2827      GO TO 240
2828C     .......... A ROOT FOUND ..........
2829  660 HR(EN,EN) = HR(EN,EN) + TR
2830      WR(EN) = HR(EN,EN)
2831      HI(EN,EN) = HI(EN,EN) + TI
2832      WI(EN) = HI(EN,EN)
2833      EN = ENM1
2834      GO TO 220
2835C     .......... ALL ROOTS FOUND.  BACKSUBSTITUTE TO FIND
2836C                VECTORS OF UPPER TRIANGULAR FORM ..........
2837  680 NORM = 0.0D0
2838C
2839      DO 720 I = 1, N
2840C
2841         DO 720 J = I, N
2842            TR = DABS(HR(I,J)) + DABS(HI(I,J))
2843            IF (TR .GT. NORM) NORM = TR
2844  720 CONTINUE
2845C
2846      HR(1,1) = NORM
2847      IF (N .EQ. 1 .OR. NORM .EQ. 0.0D0) GO TO 1001
2848C     .......... FOR EN=N STEP -1 UNTIL 2 DO -- ..........
2849      DO 800 NN = 2, N
2850         EN = N + 2 - NN
2851         XR = WR(EN)
2852         XI = WI(EN)
2853         HR(EN,EN) = 1.0D0
2854         HI(EN,EN) = 0.0D0
2855         ENM1 = EN - 1
2856C     .......... FOR I=EN-1 STEP -1 UNTIL 1 DO -- ..........
2857         DO 780 II = 1, ENM1
2858            I = EN - II
2859            ZZR = 0.0D0
2860            ZZI = 0.0D0
2861            IP1 = I + 1
2862C
2863            DO 740 J = IP1, EN
2864               ZZR = ZZR + HR(I,J) * HR(J,EN) - HI(I,J) * HI(J,EN)
2865               ZZI = ZZI + HR(I,J) * HI(J,EN) + HI(I,J) * HR(J,EN)
2866  740       CONTINUE
2867C
2868            YR = XR - WR(I)
2869            YI = XI - WI(I)
2870            IF (YR .NE. 0.0D0 .OR. YI .NE. 0.0D0) GO TO 765
2871               TST1 = NORM
2872               YR = TST1
2873  760          YR = 0.01D0 * YR
2874               TST2 = NORM + YR
2875               IF (TST2 .GT. TST1) GO TO 760
2876  765       CONTINUE
2877            CALL CDIV(ZZR,ZZI,YR,YI,HR(I,EN),HI(I,EN))
2878C     .......... OVERFLOW CONTROL ..........
2879            TR = DABS(HR(I,EN)) + DABS(HI(I,EN))
2880            IF (TR .EQ. 0.0D0) GO TO 780
2881            TST1 = TR
2882            TST2 = TST1 + 1.0D0/TST1
2883            IF (TST2 .GT. TST1) GO TO 780
2884            DO 770 J = I, EN
2885               HR(J,EN) = HR(J,EN)/TR
2886               HI(J,EN) = HI(J,EN)/TR
2887  770       CONTINUE
2888C
2889  780    CONTINUE
2890C
2891  800 CONTINUE
2892C     .......... END BACKSUBSTITUTION ..........
2893      ENM1 = N - 1
2894C     .......... VECTORS OF ISOLATED ROOTS ..........
2895      DO  840 I = 1, ENM1
2896         IF (I .GE. LOW .AND. I .LE. IGH) GO TO 840
2897         IP1 = I + 1
2898C
2899         DO 820 J = IP1, N
2900            ZR(I,J) = HR(I,J)
2901            ZI(I,J) = HI(I,J)
2902  820    CONTINUE
2903C
2904  840 CONTINUE
2905C     .......... MULTIPLY BY TRANSFORMATION MATRIX TO GIVE
2906C                VECTORS OF ORIGINAL FULL MATRIX.
2907C                FOR J=N STEP -1 UNTIL LOW+1 DO -- ..........
2908      DO 880 JJ = LOW, ENM1
2909         J = N + LOW - JJ
2910         M = MIN0(J,IGH)
2911C
2912         DO 880 I = LOW, IGH
2913            ZZR = 0.0D0
2914            ZZI = 0.0D0
2915C
2916            DO 860 K = LOW, M
2917               ZZR = ZZR + ZR(I,K) * HR(K,J) - ZI(I,K) * HI(K,J)
2918               ZZI = ZZI + ZR(I,K) * HI(K,J) + ZI(I,K) * HR(K,J)
2919  860       CONTINUE
2920C
2921            ZR(I,J) = ZZR
2922            ZI(I,J) = ZZI
2923  880 CONTINUE
2924C
2925      GO TO 1001
2926C     .......... SET ERROR -- ALL EIGENVALUES HAVE NOT
2927C                CONVERGED AFTER 30*N ITERATIONS ..........
2928 1000 IERR = EN
2929 1001 RETURN
2930      END
2931      SUBROUTINE COMQR(NM,N,LOW,IGH,HR,HI,WR,WI,IERR)
2932C
2933      INTEGER I,J,L,N,EN,LL,NM,IGH,ITN,ITS,LOW,LP1,ENM1,IERR
2934      DOUBLE PRECISION HR(NM,N),HI(NM,N),WR(N),WI(N)
2935      DOUBLE PRECISION SI,SR,TI,TR,XI,XR,YI,YR,ZZI,ZZR,NORM,TST1,TST2,
2936     X       PYTHAG
2937C
2938C     THIS SUBROUTINE IS A TRANSLATION OF A UNITARY ANALOGUE OF THE
2939C     ALGOL PROCEDURE  COMLR, NUM. MATH. 12, 369-376(1968) BY MARTIN
2940C     AND WILKINSON.
2941C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 396-403(1971).
2942C     THE UNITARY ANALOGUE SUBSTITUTES THE QR ALGORITHM OF FRANCIS
2943C     (COMP. JOUR. 4, 332-345(1962)) FOR THE LR ALGORITHM.
2944C
2945C     THIS SUBROUTINE FINDS THE EIGENVALUES OF A COMPLEX
2946C     UPPER HESSENBERG MATRIX BY THE QR METHOD.
2947C
2948C     ON INPUT
2949C
2950C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
2951C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
2952C          DIMENSION STATEMENT.
2953C
2954C        N IS THE ORDER OF THE MATRIX.
2955C
2956C        LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING
2957C          SUBROUTINE  CBAL.  IF  CBAL  HAS NOT BEEN USED,
2958C          SET LOW=1, IGH=N.
2959C
2960C        HR AND HI CONTAIN THE REAL AND IMAGINARY PARTS,
2961C          RESPECTIVELY, OF THE COMPLEX UPPER HESSENBERG MATRIX.
2962C          THEIR LOWER TRIANGLES BELOW THE SUBDIAGONAL CONTAIN
2963C          INFORMATION ABOUT THE UNITARY TRANSFORMATIONS USED IN
2964C          THE REDUCTION BY  CORTH, IF PERFORMED.
2965C
2966C     ON OUTPUT
2967C
2968C        THE UPPER HESSENBERG PORTIONS OF HR AND HI HAVE BEEN
2969C          DESTROYED.  THEREFORE, THEY MUST BE SAVED BEFORE
2970C          CALLING  COMQR  IF SUBSEQUENT CALCULATION OF
2971C          EIGENVECTORS IS TO BE PERFORMED.
2972C
2973C        WR AND WI CONTAIN THE REAL AND IMAGINARY PARTS,
2974C          RESPECTIVELY, OF THE EIGENVALUES.  IF AN ERROR
2975C          EXIT IS MADE, THE EIGENVALUES SHOULD BE CORRECT
2976C          FOR INDICES IERR+1,...,N.
2977C
2978C        IERR IS SET TO
2979C          ZERO       FOR NORMAL RETURN,
2980C          J          IF THE LIMIT OF 30*N ITERATIONS IS EXHAUSTED
2981C                     WHILE THE J-TH EIGENVALUE IS BEING SOUGHT.
2982C
2983C     CALLS CDIV FOR COMPLEX DIVISION.
2984C     CALLS CSROOT FOR COMPLEX SQUARE ROOT.
2985C     CALLS PYTHAG FOR  DSQRT(A*A + B*B) .
2986C
2987C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
2988C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
2989C
2990C     THIS VERSION DATED AUGUST 1983.
2991C
2992C     ------------------------------------------------------------------
2993C
2994      IERR = 0
2995      IF (LOW .EQ. IGH) GO TO 180
2996C     .......... CREATE REAL SUBDIAGONAL ELEMENTS ..........
2997      L = LOW + 1
2998C
2999      DO 170 I = L, IGH
3000         LL = MIN0(I+1,IGH)
3001         IF (HI(I,I-1) .EQ. 0.0D0) GO TO 170
3002         NORM = PYTHAG(HR(I,I-1),HI(I,I-1))
3003         YR = HR(I,I-1) / NORM
3004         YI = HI(I,I-1) / NORM
3005         HR(I,I-1) = NORM
3006         HI(I,I-1) = 0.0D0
3007C
3008         DO 155 J = I, IGH
3009            SI = YR * HI(I,J) - YI * HR(I,J)
3010            HR(I,J) = YR * HR(I,J) + YI * HI(I,J)
3011            HI(I,J) = SI
3012  155    CONTINUE
3013C
3014         DO 160 J = LOW, LL
3015            SI = YR * HI(J,I) + YI * HR(J,I)
3016            HR(J,I) = YR * HR(J,I) - YI * HI(J,I)
3017            HI(J,I) = SI
3018  160    CONTINUE
3019C
3020  170 CONTINUE
3021C     .......... STORE ROOTS ISOLATED BY CBAL ..........
3022  180 DO 200 I = 1, N
3023         IF (I .GE. LOW .AND. I .LE. IGH) GO TO 200
3024         WR(I) = HR(I,I)
3025         WI(I) = HI(I,I)
3026  200 CONTINUE
3027C
3028      EN = IGH
3029      TR = 0.0D0
3030      TI = 0.0D0
3031      ITN = 30*N
3032C     .......... SEARCH FOR NEXT EIGENVALUE ..........
3033  220 IF (EN .LT. LOW) GO TO 1001
3034      ITS = 0
3035      ENM1 = EN - 1
3036C     .......... LOOK FOR SINGLE SMALL SUB-DIAGONAL ELEMENT
3037C                FOR L=EN STEP -1 UNTIL LOW D0 -- ..........
3038  240 DO 260 LL = LOW, EN
3039         L = EN + LOW - LL
3040         IF (L .EQ. LOW) GO TO 300
3041         TST1 = DABS(HR(L-1,L-1)) + DABS(HI(L-1,L-1))
3042     X            + DABS(HR(L,L)) + DABS(HI(L,L))
3043         TST2 = TST1 + DABS(HR(L,L-1))
3044         IF (TST2 .EQ. TST1) GO TO 300
3045  260 CONTINUE
3046C     .......... FORM SHIFT ..........
3047  300 IF (L .EQ. EN) GO TO 660
3048      IF (ITN .EQ. 0) GO TO 1000
3049      IF (ITS .EQ. 10 .OR. ITS .EQ. 20) GO TO 320
3050      SR = HR(EN,EN)
3051      SI = HI(EN,EN)
3052      XR = HR(ENM1,EN) * HR(EN,ENM1)
3053      XI = HI(ENM1,EN) * HR(EN,ENM1)
3054      IF (XR .EQ. 0.0D0 .AND. XI .EQ. 0.0D0) GO TO 340
3055      YR = (HR(ENM1,ENM1) - SR) / 2.0D0
3056      YI = (HI(ENM1,ENM1) - SI) / 2.0D0
3057      CALL CSROOT(YR**2-YI**2+XR,2.0D0*YR*YI+XI,ZZR,ZZI)
3058      IF (YR * ZZR + YI * ZZI .GE. 0.0D0) GO TO 310
3059      ZZR = -ZZR
3060      ZZI = -ZZI
3061  310 CALL CDIV(XR,XI,YR+ZZR,YI+ZZI,XR,XI)
3062      SR = SR - XR
3063      SI = SI - XI
3064      GO TO 340
3065C     .......... FORM EXCEPTIONAL SHIFT ..........
3066  320 SR = DABS(HR(EN,ENM1)) + DABS(HR(ENM1,EN-2))
3067      SI = 0.0D0
3068C
3069  340 DO 360 I = LOW, EN
3070         HR(I,I) = HR(I,I) - SR
3071         HI(I,I) = HI(I,I) - SI
3072  360 CONTINUE
3073C
3074      TR = TR + SR
3075      TI = TI + SI
3076      ITS = ITS + 1
3077      ITN = ITN - 1
3078C     .......... REDUCE TO TRIANGLE (ROWS) ..........
3079      LP1 = L + 1
3080C
3081      DO 500 I = LP1, EN
3082         SR = HR(I,I-1)
3083         HR(I,I-1) = 0.0D0
3084         NORM = PYTHAG(PYTHAG(HR(I-1,I-1),HI(I-1,I-1)),SR)
3085         XR = HR(I-1,I-1) / NORM
3086         WR(I-1) = XR
3087         XI = HI(I-1,I-1) / NORM
3088         WI(I-1) = XI
3089         HR(I-1,I-1) = NORM
3090         HI(I-1,I-1) = 0.0D0
3091         HI(I,I-1) = SR / NORM
3092C
3093         DO 490 J = I, EN
3094            YR = HR(I-1,J)
3095            YI = HI(I-1,J)
3096            ZZR = HR(I,J)
3097            ZZI = HI(I,J)
3098            HR(I-1,J) = XR * YR + XI * YI + HI(I,I-1) * ZZR
3099            HI(I-1,J) = XR * YI - XI * YR + HI(I,I-1) * ZZI
3100            HR(I,J) = XR * ZZR - XI * ZZI - HI(I,I-1) * YR
3101            HI(I,J) = XR * ZZI + XI * ZZR - HI(I,I-1) * YI
3102  490    CONTINUE
3103C
3104  500 CONTINUE
3105C
3106      SI = HI(EN,EN)
3107      IF (SI .EQ. 0.0D0) GO TO 540
3108      NORM = PYTHAG(HR(EN,EN),SI)
3109      SR = HR(EN,EN) / NORM
3110      SI = SI / NORM
3111      HR(EN,EN) = NORM
3112      HI(EN,EN) = 0.0D0
3113C     .......... INVERSE OPERATION (COLUMNS) ..........
3114  540 DO 600 J = LP1, EN
3115         XR = WR(J-1)
3116         XI = WI(J-1)
3117C
3118         DO 580 I = L, J
3119            YR = HR(I,J-1)
3120            YI = 0.0D0
3121            ZZR = HR(I,J)
3122            ZZI = HI(I,J)
3123            IF (I .EQ. J) GO TO 560
3124            YI = HI(I,J-1)
3125            HI(I,J-1) = XR * YI + XI * YR + HI(J,J-1) * ZZI
3126  560       HR(I,J-1) = XR * YR - XI * YI + HI(J,J-1) * ZZR
3127            HR(I,J) = XR * ZZR + XI * ZZI - HI(J,J-1) * YR
3128            HI(I,J) = XR * ZZI - XI * ZZR - HI(J,J-1) * YI
3129  580    CONTINUE
3130C
3131  600 CONTINUE
3132C
3133      IF (SI .EQ. 0.0D0) GO TO 240
3134C
3135      DO 630 I = L, EN
3136         YR = HR(I,EN)
3137         YI = HI(I,EN)
3138         HR(I,EN) = SR * YR - SI * YI
3139         HI(I,EN) = SR * YI + SI * YR
3140  630 CONTINUE
3141C
3142      GO TO 240
3143C     .......... A ROOT FOUND ..........
3144  660 WR(EN) = HR(EN,EN) + TR
3145      WI(EN) = HI(EN,EN) + TI
3146      EN = ENM1
3147      GO TO 220
3148C     .......... SET ERROR -- ALL EIGENVALUES HAVE NOT
3149C                CONVERGED AFTER 30*N ITERATIONS ..........
3150 1000 IERR = EN
3151 1001 RETURN
3152      END
3153      SUBROUTINE COMQR2(NM,N,LOW,IGH,ORTR,ORTI,HR,HI,WR,WI,ZR,ZI,IERR)
3154C
3155      INTEGER I,J,K,L,M,N,EN,II,JJ,LL,NM,NN,IGH,IP1,
3156     X        ITN,ITS,LOW,LP1,ENM1,IEND,IERR
3157      DOUBLE PRECISION HR(NM,N),HI(NM,N),WR(N),WI(N),ZR(NM,N),ZI(NM,N),
3158     X       ORTR(IGH),ORTI(IGH)
3159      DOUBLE PRECISION SI,SR,TI,TR,XI,XR,YI,YR,ZZI,ZZR,NORM,TST1,TST2,
3160     X       PYTHAG
3161C
3162C     THIS SUBROUTINE IS A TRANSLATION OF A UNITARY ANALOGUE OF THE
3163C     ALGOL PROCEDURE  COMLR2, NUM. MATH. 16, 181-204(1970) BY PETERS
3164C     AND WILKINSON.
3165C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 372-395(1971).
3166C     THE UNITARY ANALOGUE SUBSTITUTES THE QR ALGORITHM OF FRANCIS
3167C     (COMP. JOUR. 4, 332-345(1962)) FOR THE LR ALGORITHM.
3168C
3169C     THIS SUBROUTINE FINDS THE EIGENVALUES AND EIGENVECTORS
3170C     OF A COMPLEX UPPER HESSENBERG MATRIX BY THE QR
3171C     METHOD.  THE EIGENVECTORS OF A COMPLEX GENERAL MATRIX
3172C     CAN ALSO BE FOUND IF  CORTH  HAS BEEN USED TO REDUCE
3173C     THIS GENERAL MATRIX TO HESSENBERG FORM.
3174C
3175C     ON INPUT
3176C
3177C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
3178C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
3179C          DIMENSION STATEMENT.
3180C
3181C        N IS THE ORDER OF THE MATRIX.
3182C
3183C        LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING
3184C          SUBROUTINE  CBAL.  IF  CBAL  HAS NOT BEEN USED,
3185C          SET LOW=1, IGH=N.
3186C
3187C        ORTR AND ORTI CONTAIN INFORMATION ABOUT THE UNITARY TRANS-
3188C          FORMATIONS USED IN THE REDUCTION BY  CORTH, IF PERFORMED.
3189C          ONLY ELEMENTS LOW THROUGH IGH ARE USED.  IF THE EIGENVECTORS
3190C          OF THE HESSENBERG MATRIX ARE DESIRED, SET ORTR(J) AND
3191C          ORTI(J) TO 0.0D0 FOR THESE ELEMENTS.
3192C
3193C        HR AND HI CONTAIN THE REAL AND IMAGINARY PARTS,
3194C          RESPECTIVELY, OF THE COMPLEX UPPER HESSENBERG MATRIX.
3195C          THEIR LOWER TRIANGLES BELOW THE SUBDIAGONAL CONTAIN FURTHER
3196C          INFORMATION ABOUT THE TRANSFORMATIONS WHICH WERE USED IN THE
3197C          REDUCTION BY  CORTH, IF PERFORMED.  IF THE EIGENVECTORS OF
3198C          THE HESSENBERG MATRIX ARE DESIRED, THESE ELEMENTS MAY BE
3199C          ARBITRARY.
3200C
3201C     ON OUTPUT
3202C
3203C        ORTR, ORTI, AND THE UPPER HESSENBERG PORTIONS OF HR AND HI
3204C          HAVE BEEN DESTROYED.
3205C
3206C        WR AND WI CONTAIN THE REAL AND IMAGINARY PARTS,
3207C          RESPECTIVELY, OF THE EIGENVALUES.  IF AN ERROR
3208C          EXIT IS MADE, THE EIGENVALUES SHOULD BE CORRECT
3209C          FOR INDICES IERR+1,...,N.
3210C
3211C        ZR AND ZI CONTAIN THE REAL AND IMAGINARY PARTS,
3212C          RESPECTIVELY, OF THE EIGENVECTORS.  THE EIGENVECTORS
3213C          ARE UNNORMALIZED.  IF AN ERROR EXIT IS MADE, NONE OF
3214C          THE EIGENVECTORS HAS BEEN FOUND.
3215C
3216C        IERR IS SET TO
3217C          ZERO       FOR NORMAL RETURN,
3218C          J          IF THE LIMIT OF 30*N ITERATIONS IS EXHAUSTED
3219C                     WHILE THE J-TH EIGENVALUE IS BEING SOUGHT.
3220C
3221C     CALLS CDIV FOR COMPLEX DIVISION.
3222C     CALLS CSROOT FOR COMPLEX SQUARE ROOT.
3223C     CALLS PYTHAG FOR  DSQRT(A*A + B*B) .
3224C
3225C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
3226C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
3227C
3228C     THIS VERSION DATED AUGUST 1983.
3229C
3230C     ------------------------------------------------------------------
3231C
3232      IERR = 0
3233C     .......... INITIALIZE EIGENVECTOR MATRIX ..........
3234      DO 101 J = 1, N
3235C
3236         DO 100 I = 1, N
3237            ZR(I,J) = 0.0D0
3238            ZI(I,J) = 0.0D0
3239  100    CONTINUE
3240         ZR(J,J) = 1.0D0
3241  101 CONTINUE
3242C     .......... FORM THE MATRIX OF ACCUMULATED TRANSFORMATIONS
3243C                FROM THE INFORMATION LEFT BY CORTH ..........
3244      IEND = IGH - LOW - 1
3245      IF (IEND) 180, 150, 105
3246C     .......... FOR I=IGH-1 STEP -1 UNTIL LOW+1 DO -- ..........
3247  105 DO 140 II = 1, IEND
3248         I = IGH - II
3249         IF (ORTR(I) .EQ. 0.0D0 .AND. ORTI(I) .EQ. 0.0D0) GO TO 140
3250         IF (HR(I,I-1) .EQ. 0.0D0 .AND. HI(I,I-1) .EQ. 0.0D0) GO TO 140
3251C     .......... NORM BELOW IS NEGATIVE OF H FORMED IN CORTH ..........
3252         NORM = HR(I,I-1) * ORTR(I) + HI(I,I-1) * ORTI(I)
3253         IP1 = I + 1
3254C
3255         DO 110 K = IP1, IGH
3256            ORTR(K) = HR(K,I-1)
3257            ORTI(K) = HI(K,I-1)
3258  110    CONTINUE
3259C
3260         DO 130 J = I, IGH
3261            SR = 0.0D0
3262            SI = 0.0D0
3263C
3264            DO 115 K = I, IGH
3265               SR = SR + ORTR(K) * ZR(K,J) + ORTI(K) * ZI(K,J)
3266               SI = SI + ORTR(K) * ZI(K,J) - ORTI(K) * ZR(K,J)
3267  115       CONTINUE
3268C
3269            SR = SR / NORM
3270            SI = SI / NORM
3271C
3272            DO 120 K = I, IGH
3273               ZR(K,J) = ZR(K,J) + SR * ORTR(K) - SI * ORTI(K)
3274               ZI(K,J) = ZI(K,J) + SR * ORTI(K) + SI * ORTR(K)
3275  120       CONTINUE
3276C
3277  130    CONTINUE
3278C
3279  140 CONTINUE
3280C     .......... CREATE REAL SUBDIAGONAL ELEMENTS ..........
3281  150 L = LOW + 1
3282C
3283      DO 170 I = L, IGH
3284         LL = MIN0(I+1,IGH)
3285         IF (HI(I,I-1) .EQ. 0.0D0) GO TO 170
3286         NORM = PYTHAG(HR(I,I-1),HI(I,I-1))
3287         YR = HR(I,I-1) / NORM
3288         YI = HI(I,I-1) / NORM
3289         HR(I,I-1) = NORM
3290         HI(I,I-1) = 0.0D0
3291C
3292         DO 155 J = I, N
3293            SI = YR * HI(I,J) - YI * HR(I,J)
3294            HR(I,J) = YR * HR(I,J) + YI * HI(I,J)
3295            HI(I,J) = SI
3296  155    CONTINUE
3297C
3298         DO 160 J = 1, LL
3299            SI = YR * HI(J,I) + YI * HR(J,I)
3300            HR(J,I) = YR * HR(J,I) - YI * HI(J,I)
3301            HI(J,I) = SI
3302  160    CONTINUE
3303C
3304         DO 165 J = LOW, IGH
3305            SI = YR * ZI(J,I) + YI * ZR(J,I)
3306            ZR(J,I) = YR * ZR(J,I) - YI * ZI(J,I)
3307            ZI(J,I) = SI
3308  165    CONTINUE
3309C
3310  170 CONTINUE
3311C     .......... STORE ROOTS ISOLATED BY CBAL ..........
3312  180 DO 200 I = 1, N
3313         IF (I .GE. LOW .AND. I .LE. IGH) GO TO 200
3314         WR(I) = HR(I,I)
3315         WI(I) = HI(I,I)
3316  200 CONTINUE
3317C
3318      EN = IGH
3319      TR = 0.0D0
3320      TI = 0.0D0
3321      ITN = 30*N
3322C     .......... SEARCH FOR NEXT EIGENVALUE ..........
3323  220 IF (EN .LT. LOW) GO TO 680
3324      ITS = 0
3325      ENM1 = EN - 1
3326C     .......... LOOK FOR SINGLE SMALL SUB-DIAGONAL ELEMENT
3327C                FOR L=EN STEP -1 UNTIL LOW DO -- ..........
3328  240 DO 260 LL = LOW, EN
3329         L = EN + LOW - LL
3330         IF (L .EQ. LOW) GO TO 300
3331         TST1 = DABS(HR(L-1,L-1)) + DABS(HI(L-1,L-1))
3332     X            + DABS(HR(L,L)) + DABS(HI(L,L))
3333         TST2 = TST1 + DABS(HR(L,L-1))
3334         IF (TST2 .EQ. TST1) GO TO 300
3335  260 CONTINUE
3336C     .......... FORM SHIFT ..........
3337  300 IF (L .EQ. EN) GO TO 660
3338      IF (ITN .EQ. 0) GO TO 1000
3339      IF (ITS .EQ. 10 .OR. ITS .EQ. 20) GO TO 320
3340      SR = HR(EN,EN)
3341      SI = HI(EN,EN)
3342      XR = HR(ENM1,EN) * HR(EN,ENM1)
3343      XI = HI(ENM1,EN) * HR(EN,ENM1)
3344      IF (XR .EQ. 0.0D0 .AND. XI .EQ. 0.0D0) GO TO 340
3345      YR = (HR(ENM1,ENM1) - SR) / 2.0D0
3346      YI = (HI(ENM1,ENM1) - SI) / 2.0D0
3347      CALL CSROOT(YR**2-YI**2+XR,2.0D0*YR*YI+XI,ZZR,ZZI)
3348      IF (YR * ZZR + YI * ZZI .GE. 0.0D0) GO TO 310
3349      ZZR = -ZZR
3350      ZZI = -ZZI
3351  310 CALL CDIV(XR,XI,YR+ZZR,YI+ZZI,XR,XI)
3352      SR = SR - XR
3353      SI = SI - XI
3354      GO TO 340
3355C     .......... FORM EXCEPTIONAL SHIFT ..........
3356  320 SR = DABS(HR(EN,ENM1)) + DABS(HR(ENM1,EN-2))
3357      SI = 0.0D0
3358C
3359  340 DO 360 I = LOW, EN
3360         HR(I,I) = HR(I,I) - SR
3361         HI(I,I) = HI(I,I) - SI
3362  360 CONTINUE
3363C
3364      TR = TR + SR
3365      TI = TI + SI
3366      ITS = ITS + 1
3367      ITN = ITN - 1
3368C     .......... REDUCE TO TRIANGLE (ROWS) ..........
3369      LP1 = L + 1
3370C
3371      DO 500 I = LP1, EN
3372         SR = HR(I,I-1)
3373         HR(I,I-1) = 0.0D0
3374         NORM = PYTHAG(PYTHAG(HR(I-1,I-1),HI(I-1,I-1)),SR)
3375         XR = HR(I-1,I-1) / NORM
3376         WR(I-1) = XR
3377         XI = HI(I-1,I-1) / NORM
3378         WI(I-1) = XI
3379         HR(I-1,I-1) = NORM
3380         HI(I-1,I-1) = 0.0D0
3381         HI(I,I-1) = SR / NORM
3382C
3383         DO 490 J = I, N
3384            YR = HR(I-1,J)
3385            YI = HI(I-1,J)
3386            ZZR = HR(I,J)
3387            ZZI = HI(I,J)
3388            HR(I-1,J) = XR * YR + XI * YI + HI(I,I-1) * ZZR
3389            HI(I-1,J) = XR * YI - XI * YR + HI(I,I-1) * ZZI
3390            HR(I,J) = XR * ZZR - XI * ZZI - HI(I,I-1) * YR
3391            HI(I,J) = XR * ZZI + XI * ZZR - HI(I,I-1) * YI
3392  490    CONTINUE
3393C
3394  500 CONTINUE
3395C
3396      SI = HI(EN,EN)
3397      IF (SI .EQ. 0.0D0) GO TO 540
3398      NORM = PYTHAG(HR(EN,EN),SI)
3399      SR = HR(EN,EN) / NORM
3400      SI = SI / NORM
3401      HR(EN,EN) = NORM
3402      HI(EN,EN) = 0.0D0
3403      IF (EN .EQ. N) GO TO 540
3404      IP1 = EN + 1
3405C
3406      DO 520 J = IP1, N
3407         YR = HR(EN,J)
3408         YI = HI(EN,J)
3409         HR(EN,J) = SR * YR + SI * YI
3410         HI(EN,J) = SR * YI - SI * YR
3411  520 CONTINUE
3412C     .......... INVERSE OPERATION (COLUMNS) ..........
3413  540 DO 600 J = LP1, EN
3414         XR = WR(J-1)
3415         XI = WI(J-1)
3416C
3417         DO 580 I = 1, J
3418            YR = HR(I,J-1)
3419            YI = 0.0D0
3420            ZZR = HR(I,J)
3421            ZZI = HI(I,J)
3422            IF (I .EQ. J) GO TO 560
3423            YI = HI(I,J-1)
3424            HI(I,J-1) = XR * YI + XI * YR + HI(J,J-1) * ZZI
3425  560       HR(I,J-1) = XR * YR - XI * YI + HI(J,J-1) * ZZR
3426            HR(I,J) = XR * ZZR + XI * ZZI - HI(J,J-1) * YR
3427            HI(I,J) = XR * ZZI - XI * ZZR - HI(J,J-1) * YI
3428  580    CONTINUE
3429C
3430         DO 590 I = LOW, IGH
3431            YR = ZR(I,J-1)
3432            YI = ZI(I,J-1)
3433            ZZR = ZR(I,J)
3434            ZZI = ZI(I,J)
3435            ZR(I,J-1) = XR * YR - XI * YI + HI(J,J-1) * ZZR
3436            ZI(I,J-1) = XR * YI + XI * YR + HI(J,J-1) * ZZI
3437            ZR(I,J) = XR * ZZR + XI * ZZI - HI(J,J-1) * YR
3438            ZI(I,J) = XR * ZZI - XI * ZZR - HI(J,J-1) * YI
3439  590    CONTINUE
3440C
3441  600 CONTINUE
3442C
3443      IF (SI .EQ. 0.0D0) GO TO 240
3444C
3445      DO 630 I = 1, EN
3446         YR = HR(I,EN)
3447         YI = HI(I,EN)
3448         HR(I,EN) = SR * YR - SI * YI
3449         HI(I,EN) = SR * YI + SI * YR
3450  630 CONTINUE
3451C
3452      DO 640 I = LOW, IGH
3453         YR = ZR(I,EN)
3454         YI = ZI(I,EN)
3455         ZR(I,EN) = SR * YR - SI * YI
3456         ZI(I,EN) = SR * YI + SI * YR
3457  640 CONTINUE
3458C
3459      GO TO 240
3460C     .......... A ROOT FOUND ..........
3461  660 HR(EN,EN) = HR(EN,EN) + TR
3462      WR(EN) = HR(EN,EN)
3463      HI(EN,EN) = HI(EN,EN) + TI
3464      WI(EN) = HI(EN,EN)
3465      EN = ENM1
3466      GO TO 220
3467C     .......... ALL ROOTS FOUND.  BACKSUBSTITUTE TO FIND
3468C                VECTORS OF UPPER TRIANGULAR FORM ..........
3469  680 NORM = 0.0D0
3470C
3471      DO 720 I = 1, N
3472C
3473         DO 720 J = I, N
3474            TR = DABS(HR(I,J)) + DABS(HI(I,J))
3475            IF (TR .GT. NORM) NORM = TR
3476  720 CONTINUE
3477C
3478      IF (N .EQ. 1 .OR. NORM .EQ. 0.0D0) GO TO 1001
3479C     .......... FOR EN=N STEP -1 UNTIL 2 DO -- ..........
3480      DO 800 NN = 2, N
3481         EN = N + 2 - NN
3482         XR = WR(EN)
3483         XI = WI(EN)
3484         HR(EN,EN) = 1.0D0
3485         HI(EN,EN) = 0.0D0
3486         ENM1 = EN - 1
3487C     .......... FOR I=EN-1 STEP -1 UNTIL 1 DO -- ..........
3488         DO 780 II = 1, ENM1
3489            I = EN - II
3490            ZZR = 0.0D0
3491            ZZI = 0.0D0
3492            IP1 = I + 1
3493C
3494            DO 740 J = IP1, EN
3495               ZZR = ZZR + HR(I,J) * HR(J,EN) - HI(I,J) * HI(J,EN)
3496               ZZI = ZZI + HR(I,J) * HI(J,EN) + HI(I,J) * HR(J,EN)
3497  740       CONTINUE
3498C
3499            YR = XR - WR(I)
3500            YI = XI - WI(I)
3501            IF (YR .NE. 0.0D0 .OR. YI .NE. 0.0D0) GO TO 765
3502               TST1 = NORM
3503               YR = TST1
3504  760          YR = 0.01D0 * YR
3505               TST2 = NORM + YR
3506               IF (TST2 .GT. TST1) GO TO 760
3507  765       CONTINUE
3508            CALL CDIV(ZZR,ZZI,YR,YI,HR(I,EN),HI(I,EN))
3509C     .......... OVERFLOW CONTROL ..........
3510            TR = DABS(HR(I,EN)) + DABS(HI(I,EN))
3511            IF (TR .EQ. 0.0D0) GO TO 780
3512            TST1 = TR
3513            TST2 = TST1 + 1.0D0/TST1
3514            IF (TST2 .GT. TST1) GO TO 780
3515            DO 770 J = I, EN
3516               HR(J,EN) = HR(J,EN)/TR
3517               HI(J,EN) = HI(J,EN)/TR
3518  770       CONTINUE
3519C
3520  780    CONTINUE
3521C
3522  800 CONTINUE
3523C     .......... END BACKSUBSTITUTION ..........
3524      ENM1 = N - 1
3525C     .......... VECTORS OF ISOLATED ROOTS ..........
3526      DO  840 I = 1, ENM1
3527         IF (I .GE. LOW .AND. I .LE. IGH) GO TO 840
3528         IP1 = I + 1
3529C
3530         DO 820 J = IP1, N
3531            ZR(I,J) = HR(I,J)
3532            ZI(I,J) = HI(I,J)
3533  820    CONTINUE
3534C
3535  840 CONTINUE
3536C     .......... MULTIPLY BY TRANSFORMATION MATRIX TO GIVE
3537C                VECTORS OF ORIGINAL FULL MATRIX.
3538C                FOR J=N STEP -1 UNTIL LOW+1 DO -- ..........
3539      DO 880 JJ = LOW, ENM1
3540         J = N + LOW - JJ
3541         M = MIN0(J,IGH)
3542C
3543         DO 880 I = LOW, IGH
3544            ZZR = 0.0D0
3545            ZZI = 0.0D0
3546C
3547            DO 860 K = LOW, M
3548               ZZR = ZZR + ZR(I,K) * HR(K,J) - ZI(I,K) * HI(K,J)
3549               ZZI = ZZI + ZR(I,K) * HI(K,J) + ZI(I,K) * HR(K,J)
3550  860       CONTINUE
3551C
3552            ZR(I,J) = ZZR
3553            ZI(I,J) = ZZI
3554  880 CONTINUE
3555C
3556      GO TO 1001
3557C     .......... SET ERROR -- ALL EIGENVALUES HAVE NOT
3558C                CONVERGED AFTER 30*N ITERATIONS ..........
3559 1000 IERR = EN
3560 1001 RETURN
3561      END
3562      SUBROUTINE CORTB(NM,LOW,IGH,AR,AI,ORTR,ORTI,M,ZR,ZI)
3563C
3564      INTEGER I,J,M,LA,MM,MP,NM,IGH,KP1,LOW,MP1
3565      DOUBLE PRECISION AR(NM,IGH),AI(NM,IGH),ORTR(IGH),ORTI(IGH),
3566     X       ZR(NM,M),ZI(NM,M)
3567      DOUBLE PRECISION H,GI,GR
3568C
3569C     THIS SUBROUTINE IS A TRANSLATION OF A COMPLEX ANALOGUE OF
3570C     THE ALGOL PROCEDURE ORTBAK, NUM. MATH. 12, 349-368(1968)
3571C     BY MARTIN AND WILKINSON.
3572C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 339-358(1971).
3573C
3574C     THIS SUBROUTINE FORMS THE EIGENVECTORS OF A COMPLEX GENERAL
3575C     MATRIX BY BACK TRANSFORMING THOSE OF THE CORRESPONDING
3576C     UPPER HESSENBERG MATRIX DETERMINED BY  CORTH.
3577C
3578C     ON INPUT
3579C
3580C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
3581C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
3582C          DIMENSION STATEMENT.
3583C
3584C        LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING
3585C          SUBROUTINE  CBAL.  IF  CBAL  HAS NOT BEEN USED,
3586C          SET LOW=1 AND IGH EQUAL TO THE ORDER OF THE MATRIX.
3587C
3588C        AR AND AI CONTAIN INFORMATION ABOUT THE UNITARY
3589C          TRANSFORMATIONS USED IN THE REDUCTION BY  CORTH
3590C          IN THEIR STRICT LOWER TRIANGLES.
3591C
3592C        ORTR AND ORTI CONTAIN FURTHER INFORMATION ABOUT THE
3593C          TRANSFORMATIONS USED IN THE REDUCTION BY  CORTH.
3594C          ONLY ELEMENTS LOW THROUGH IGH ARE USED.
3595C
3596C        M IS THE NUMBER OF COLUMNS OF ZR AND ZI TO BE BACK TRANSFORMED.
3597C
3598C        ZR AND ZI CONTAIN THE REAL AND IMAGINARY PARTS,
3599C          RESPECTIVELY, OF THE EIGENVECTORS TO BE
3600C          BACK TRANSFORMED IN THEIR FIRST M COLUMNS.
3601C
3602C     ON OUTPUT
3603C
3604C        ZR AND ZI CONTAIN THE REAL AND IMAGINARY PARTS,
3605C          RESPECTIVELY, OF THE TRANSFORMED EIGENVECTORS
3606C          IN THEIR FIRST M COLUMNS.
3607C
3608C        ORTR AND ORTI HAVE BEEN ALTERED.
3609C
3610C     NOTE THAT CORTB PRESERVES VECTOR EUCLIDEAN NORMS.
3611C
3612C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
3613C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
3614C
3615C     THIS VERSION DATED AUGUST 1983.
3616C
3617C     ------------------------------------------------------------------
3618C
3619      IF (M .EQ. 0) GO TO 200
3620      LA = IGH - 1
3621      KP1 = LOW + 1
3622      IF (LA .LT. KP1) GO TO 200
3623C     .......... FOR MP=IGH-1 STEP -1 UNTIL LOW+1 DO -- ..........
3624      DO 140 MM = KP1, LA
3625         MP = LOW + IGH - MM
3626         IF (AR(MP,MP-1) .EQ. 0.0D0 .AND. AI(MP,MP-1) .EQ. 0.0D0)
3627     X      GO TO 140
3628C     .......... H BELOW IS NEGATIVE OF H FORMED IN CORTH ..........
3629         H = AR(MP,MP-1) * ORTR(MP) + AI(MP,MP-1) * ORTI(MP)
3630         MP1 = MP + 1
3631C
3632         DO 100 I = MP1, IGH
3633            ORTR(I) = AR(I,MP-1)
3634            ORTI(I) = AI(I,MP-1)
3635  100    CONTINUE
3636C
3637         DO 130 J = 1, M
3638            GR = 0.0D0
3639            GI = 0.0D0
3640C
3641            DO 110 I = MP, IGH
3642               GR = GR + ORTR(I) * ZR(I,J) + ORTI(I) * ZI(I,J)
3643               GI = GI + ORTR(I) * ZI(I,J) - ORTI(I) * ZR(I,J)
3644  110       CONTINUE
3645C
3646            GR = GR / H
3647            GI = GI / H
3648C
3649            DO 120 I = MP, IGH
3650               ZR(I,J) = ZR(I,J) + GR * ORTR(I) - GI * ORTI(I)
3651               ZI(I,J) = ZI(I,J) + GR * ORTI(I) + GI * ORTR(I)
3652  120       CONTINUE
3653C
3654  130    CONTINUE
3655C
3656  140 CONTINUE
3657C
3658  200 RETURN
3659      END
3660      SUBROUTINE CORTH(NM,N,LOW,IGH,AR,AI,ORTR,ORTI)
3661C
3662      INTEGER I,J,M,N,II,JJ,LA,MP,NM,IGH,KP1,LOW
3663      DOUBLE PRECISION AR(NM,N),AI(NM,N),ORTR(IGH),ORTI(IGH)
3664      DOUBLE PRECISION F,G,H,FI,FR,SCALE,PYTHAG
3665C
3666C     THIS SUBROUTINE IS A TRANSLATION OF A COMPLEX ANALOGUE OF
3667C     THE ALGOL PROCEDURE ORTHES, NUM. MATH. 12, 349-368(1968)
3668C     BY MARTIN AND WILKINSON.
3669C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 339-358(1971).
3670C
3671C     GIVEN A COMPLEX GENERAL MATRIX, THIS SUBROUTINE
3672C     REDUCES A SUBMATRIX SITUATED IN ROWS AND COLUMNS
3673C     LOW THROUGH IGH TO UPPER HESSENBERG FORM BY
3674C     UNITARY SIMILARITY TRANSFORMATIONS.
3675C
3676C     ON INPUT
3677C
3678C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
3679C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
3680C          DIMENSION STATEMENT.
3681C
3682C        N IS THE ORDER OF THE MATRIX.
3683C
3684C        LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING
3685C          SUBROUTINE  CBAL.  IF  CBAL  HAS NOT BEEN USED,
3686C          SET LOW=1, IGH=N.
3687C
3688C        AR AND AI CONTAIN THE REAL AND IMAGINARY PARTS,
3689C          RESPECTIVELY, OF THE COMPLEX INPUT MATRIX.
3690C
3691C     ON OUTPUT
3692C
3693C        AR AND AI CONTAIN THE REAL AND IMAGINARY PARTS,
3694C          RESPECTIVELY, OF THE HESSENBERG MATRIX.  INFORMATION
3695C          ABOUT THE UNITARY TRANSFORMATIONS USED IN THE REDUCTION
3696C          IS STORED IN THE REMAINING TRIANGLES UNDER THE
3697C          HESSENBERG MATRIX.
3698C
3699C        ORTR AND ORTI CONTAIN FURTHER INFORMATION ABOUT THE
3700C          TRANSFORMATIONS.  ONLY ELEMENTS LOW THROUGH IGH ARE USED.
3701C
3702C     CALLS PYTHAG FOR  DSQRT(A*A + B*B) .
3703C
3704C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
3705C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
3706C
3707C     THIS VERSION DATED AUGUST 1983.
3708C
3709C     ------------------------------------------------------------------
3710C
3711      LA = IGH - 1
3712      KP1 = LOW + 1
3713      IF (LA .LT. KP1) GO TO 200
3714C
3715      DO 180 M = KP1, LA
3716         H = 0.0D0
3717         ORTR(M) = 0.0D0
3718         ORTI(M) = 0.0D0
3719         SCALE = 0.0D0
3720C     .......... SCALE COLUMN (ALGOL TOL THEN NOT NEEDED) ..........
3721         DO 90 I = M, IGH
3722   90    SCALE = SCALE + DABS(AR(I,M-1)) + DABS(AI(I,M-1))
3723C
3724         IF (SCALE .EQ. 0.0D0) GO TO 180
3725         MP = M + IGH
3726C     .......... FOR I=IGH STEP -1 UNTIL M DO -- ..........
3727         DO 100 II = M, IGH
3728            I = MP - II
3729            ORTR(I) = AR(I,M-1) / SCALE
3730            ORTI(I) = AI(I,M-1) / SCALE
3731            H = H + ORTR(I) * ORTR(I) + ORTI(I) * ORTI(I)
3732  100    CONTINUE
3733C
3734         G = DSQRT(H)
3735         F = PYTHAG(ORTR(M),ORTI(M))
3736         IF (F .EQ. 0.0D0) GO TO 103
3737         H = H + F * G
3738         G = G / F
3739         ORTR(M) = (1.0D0 + G) * ORTR(M)
3740         ORTI(M) = (1.0D0 + G) * ORTI(M)
3741         GO TO 105
3742C
3743  103    ORTR(M) = G
3744         AR(M,M-1) = SCALE
3745C     .......... FORM (I-(U*UT)/H) * A ..........
3746  105    DO 130 J = M, N
3747            FR = 0.0D0
3748            FI = 0.0D0
3749C     .......... FOR I=IGH STEP -1 UNTIL M DO -- ..........
3750            DO 110 II = M, IGH
3751               I = MP - II
3752               FR = FR + ORTR(I) * AR(I,J) + ORTI(I) * AI(I,J)
3753               FI = FI + ORTR(I) * AI(I,J) - ORTI(I) * AR(I,J)
3754  110       CONTINUE
3755C
3756            FR = FR / H
3757            FI = FI / H
3758C
3759            DO 120 I = M, IGH
3760               AR(I,J) = AR(I,J) - FR * ORTR(I) + FI * ORTI(I)
3761               AI(I,J) = AI(I,J) - FR * ORTI(I) - FI * ORTR(I)
3762  120       CONTINUE
3763C
3764  130    CONTINUE
3765C     .......... FORM (I-(U*UT)/H)*A*(I-(U*UT)/H) ..........
3766         DO 160 I = 1, IGH
3767            FR = 0.0D0
3768            FI = 0.0D0
3769C     .......... FOR J=IGH STEP -1 UNTIL M DO -- ..........
3770            DO 140 JJ = M, IGH
3771               J = MP - JJ
3772               FR = FR + ORTR(J) * AR(I,J) - ORTI(J) * AI(I,J)
3773               FI = FI + ORTR(J) * AI(I,J) + ORTI(J) * AR(I,J)
3774  140       CONTINUE
3775C
3776            FR = FR / H
3777            FI = FI / H
3778C
3779            DO 150 J = M, IGH
3780               AR(I,J) = AR(I,J) - FR * ORTR(J) - FI * ORTI(J)
3781               AI(I,J) = AI(I,J) + FR * ORTI(J) - FI * ORTR(J)
3782  150       CONTINUE
3783C
3784  160    CONTINUE
3785C
3786         ORTR(M) = SCALE * ORTR(M)
3787         ORTI(M) = SCALE * ORTI(M)
3788         AR(M,M-1) = -G * AR(M,M-1)
3789         AI(M,M-1) = -G * AI(M,M-1)
3790  180 CONTINUE
3791C
3792  200 RETURN
3793      END
3794      SUBROUTINE ELMBAK(NM,LOW,IGH,A,INT,M,Z)
3795C
3796      INTEGER I,J,M,LA,MM,MP,NM,IGH,KP1,LOW,MP1
3797      DOUBLE PRECISION A(NM,IGH),Z(NM,M)
3798      DOUBLE PRECISION X
3799      INTEGER INT(IGH)
3800C
3801C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE ELMBAK,
3802C     NUM. MATH. 12, 349-368(1968) BY MARTIN AND WILKINSON.
3803C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 339-358(1971).
3804C
3805C     THIS SUBROUTINE FORMS THE EIGENVECTORS OF A REAL GENERAL
3806C     MATRIX BY BACK TRANSFORMING THOSE OF THE CORRESPONDING
3807C     UPPER HESSENBERG MATRIX DETERMINED BY  ELMHES.
3808C
3809C     ON INPUT
3810C
3811C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
3812C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
3813C          DIMENSION STATEMENT.
3814C
3815C        LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING
3816C          SUBROUTINE  BALANC.  IF  BALANC  HAS NOT BEEN USED,
3817C          SET LOW=1 AND IGH EQUAL TO THE ORDER OF THE MATRIX.
3818C
3819C        A CONTAINS THE MULTIPLIERS WHICH WERE USED IN THE
3820C          REDUCTION BY  ELMHES  IN ITS LOWER TRIANGLE
3821C          BELOW THE SUBDIAGONAL.
3822C
3823C        INT CONTAINS INFORMATION ON THE ROWS AND COLUMNS
3824C          INTERCHANGED IN THE REDUCTION BY  ELMHES.
3825C          ONLY ELEMENTS LOW THROUGH IGH ARE USED.
3826C
3827C        M IS THE NUMBER OF COLUMNS OF Z TO BE BACK TRANSFORMED.
3828C
3829C        Z CONTAINS THE REAL AND IMAGINARY PARTS OF THE EIGEN-
3830C          VECTORS TO BE BACK TRANSFORMED IN ITS FIRST M COLUMNS.
3831C
3832C     ON OUTPUT
3833C
3834C        Z CONTAINS THE REAL AND IMAGINARY PARTS OF THE
3835C          TRANSFORMED EIGENVECTORS IN ITS FIRST M COLUMNS.
3836C
3837C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
3838C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
3839C
3840C     THIS VERSION DATED AUGUST 1983.
3841C
3842C     ------------------------------------------------------------------
3843C
3844      IF (M .EQ. 0) GO TO 200
3845      LA = IGH - 1
3846      KP1 = LOW + 1
3847      IF (LA .LT. KP1) GO TO 200
3848C     .......... FOR MP=IGH-1 STEP -1 UNTIL LOW+1 DO -- ..........
3849      DO 140 MM = KP1, LA
3850         MP = LOW + IGH - MM
3851         MP1 = MP + 1
3852C
3853         DO 110 I = MP1, IGH
3854            X = A(I,MP-1)
3855            IF (X .EQ. 0.0D0) GO TO 110
3856C
3857            DO 100 J = 1, M
3858  100       Z(I,J) = Z(I,J) + X * Z(MP,J)
3859C
3860  110    CONTINUE
3861C
3862         I = INT(MP)
3863         IF (I .EQ. MP) GO TO 140
3864C
3865         DO 130 J = 1, M
3866            X = Z(I,J)
3867            Z(I,J) = Z(MP,J)
3868            Z(MP,J) = X
3869  130    CONTINUE
3870C
3871  140 CONTINUE
3872C
3873  200 RETURN
3874      END
3875      SUBROUTINE ELMHES(NM,N,LOW,IGH,A,INT)
3876C
3877      INTEGER I,J,M,N,LA,NM,IGH,KP1,LOW,MM1,MP1
3878      DOUBLE PRECISION A(NM,N)
3879      DOUBLE PRECISION X,Y
3880      INTEGER INT(IGH)
3881C
3882C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE ELMHES,
3883C     NUM. MATH. 12, 349-368(1968) BY MARTIN AND WILKINSON.
3884C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 339-358(1971).
3885C
3886C     GIVEN A REAL GENERAL MATRIX, THIS SUBROUTINE
3887C     REDUCES A SUBMATRIX SITUATED IN ROWS AND COLUMNS
3888C     LOW THROUGH IGH TO UPPER HESSENBERG FORM BY
3889C     STABILIZED ELEMENTARY SIMILARITY TRANSFORMATIONS.
3890C
3891C     ON INPUT
3892C
3893C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
3894C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
3895C          DIMENSION STATEMENT.
3896C
3897C        N IS THE ORDER OF THE MATRIX.
3898C
3899C        LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING
3900C          SUBROUTINE  BALANC.  IF  BALANC  HAS NOT BEEN USED,
3901C          SET LOW=1, IGH=N.
3902C
3903C        A CONTAINS THE INPUT MATRIX.
3904C
3905C     ON OUTPUT
3906C
3907C        A CONTAINS THE HESSENBERG MATRIX.  THE MULTIPLIERS
3908C          WHICH WERE USED IN THE REDUCTION ARE STORED IN THE
3909C          REMAINING TRIANGLE UNDER THE HESSENBERG MATRIX.
3910C
3911C        INT CONTAINS INFORMATION ON THE ROWS AND COLUMNS
3912C          INTERCHANGED IN THE REDUCTION.
3913C          ONLY ELEMENTS LOW THROUGH IGH ARE USED.
3914C
3915C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
3916C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
3917C
3918C     THIS VERSION DATED AUGUST 1983.
3919C
3920C     ------------------------------------------------------------------
3921C
3922      LA = IGH - 1
3923      KP1 = LOW + 1
3924      IF (LA .LT. KP1) GO TO 200
3925C
3926      DO 180 M = KP1, LA
3927         MM1 = M - 1
3928         X = 0.0D0
3929         I = M
3930C
3931         DO 100 J = M, IGH
3932            IF (DABS(A(J,MM1)) .LE. DABS(X)) GO TO 100
3933            X = A(J,MM1)
3934            I = J
3935  100    CONTINUE
3936C
3937         INT(M) = I
3938         IF (I .EQ. M) GO TO 130
3939C     .......... INTERCHANGE ROWS AND COLUMNS OF A ..........
3940         DO 110 J = MM1, N
3941            Y = A(I,J)
3942            A(I,J) = A(M,J)
3943            A(M,J) = Y
3944  110    CONTINUE
3945C
3946         DO 120 J = 1, IGH
3947            Y = A(J,I)
3948            A(J,I) = A(J,M)
3949            A(J,M) = Y
3950  120    CONTINUE
3951C     .......... END INTERCHANGE ..........
3952  130    IF (X .EQ. 0.0D0) GO TO 180
3953         MP1 = M + 1
3954C
3955         DO 160 I = MP1, IGH
3956            Y = A(I,MM1)
3957            IF (Y .EQ. 0.0D0) GO TO 160
3958            Y = Y / X
3959            A(I,MM1) = Y
3960C
3961            DO 140 J = M, N
3962  140       A(I,J) = A(I,J) - Y * A(M,J)
3963C
3964            DO 150 J = 1, IGH
3965  150       A(J,M) = A(J,M) + Y * A(J,I)
3966C
3967  160    CONTINUE
3968C
3969  180 CONTINUE
3970C
3971  200 RETURN
3972      END
3973      SUBROUTINE ELTRAN(NM,N,LOW,IGH,A,INT,Z)
3974C
3975      INTEGER I,J,N,KL,MM,MP,NM,IGH,LOW,MP1
3976      DOUBLE PRECISION A(NM,IGH),Z(NM,N)
3977      INTEGER INT(IGH)
3978C
3979C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE ELMTRANS,
3980C     NUM. MATH. 16, 181-204(1970) BY PETERS AND WILKINSON.
3981C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 372-395(1971).
3982C
3983C     THIS SUBROUTINE ACCUMULATES THE STABILIZED ELEMENTARY
3984C     SIMILARITY TRANSFORMATIONS USED IN THE REDUCTION OF A
3985C     REAL GENERAL MATRIX TO UPPER HESSENBERG FORM BY  ELMHES.
3986C
3987C     ON INPUT
3988C
3989C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
3990C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
3991C          DIMENSION STATEMENT.
3992C
3993C        N IS THE ORDER OF THE MATRIX.
3994C
3995C        LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING
3996C          SUBROUTINE  BALANC.  IF  BALANC  HAS NOT BEEN USED,
3997C          SET LOW=1, IGH=N.
3998C
3999C        A CONTAINS THE MULTIPLIERS WHICH WERE USED IN THE
4000C          REDUCTION BY  ELMHES  IN ITS LOWER TRIANGLE
4001C          BELOW THE SUBDIAGONAL.
4002C
4003C        INT CONTAINS INFORMATION ON THE ROWS AND COLUMNS
4004C          INTERCHANGED IN THE REDUCTION BY  ELMHES.
4005C          ONLY ELEMENTS LOW THROUGH IGH ARE USED.
4006C
4007C     ON OUTPUT
4008C
4009C        Z CONTAINS THE TRANSFORMATION MATRIX PRODUCED IN THE
4010C          REDUCTION BY  ELMHES.
4011C
4012C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
4013C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
4014C
4015C     THIS VERSION DATED AUGUST 1983.
4016C
4017C     ------------------------------------------------------------------
4018C
4019C     .......... INITIALIZE Z TO IDENTITY MATRIX ..........
4020      DO 80 J = 1, N
4021C
4022         DO 60 I = 1, N
4023   60    Z(I,J) = 0.0D0
4024C
4025         Z(J,J) = 1.0D0
4026   80 CONTINUE
4027C
4028      KL = IGH - LOW - 1
4029      IF (KL .LT. 1) GO TO 200
4030C     .......... FOR MP=IGH-1 STEP -1 UNTIL LOW+1 DO -- ..........
4031      DO 140 MM = 1, KL
4032         MP = IGH - MM
4033         MP1 = MP + 1
4034C
4035         DO 100 I = MP1, IGH
4036  100    Z(I,MP) = A(I,MP-1)
4037C
4038         I = INT(MP)
4039         IF (I .EQ. MP) GO TO 140
4040C
4041         DO 130 J = MP, IGH
4042            Z(MP,J) = Z(I,J)
4043            Z(I,J) = 0.0D0
4044  130    CONTINUE
4045C
4046         Z(I,MP) = 1.0D0
4047  140 CONTINUE
4048C
4049  200 RETURN
4050      END
4051      SUBROUTINE FIGI(NM,N,T,D,E,E2,IERR)
4052C
4053      INTEGER I,N,NM,IERR
4054      DOUBLE PRECISION T(NM,3),D(N),E(N),E2(N)
4055C
4056C     GIVEN A NONSYMMETRIC TRIDIAGONAL MATRIX SUCH THAT THE PRODUCTS
4057C     OF CORRESPONDING PAIRS OF OFF-DIAGONAL ELEMENTS ARE ALL
4058C     NON-NEGATIVE, THIS SUBROUTINE REDUCES IT TO A SYMMETRIC
4059C     TRIDIAGONAL MATRIX WITH THE SAME EIGENVALUES.  IF, FURTHER,
4060C     A ZERO PRODUCT ONLY OCCURS WHEN BOTH FACTORS ARE ZERO,
4061C     THE REDUCED MATRIX IS SIMILAR TO THE ORIGINAL MATRIX.
4062C
4063C     ON INPUT
4064C
4065C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
4066C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
4067C          DIMENSION STATEMENT.
4068C
4069C        N IS THE ORDER OF THE MATRIX.
4070C
4071C        T CONTAINS THE INPUT MATRIX.  ITS SUBDIAGONAL IS
4072C          STORED IN THE LAST N-1 POSITIONS OF THE FIRST COLUMN,
4073C          ITS DIAGONAL IN THE N POSITIONS OF THE SECOND COLUMN,
4074C          AND ITS SUPERDIAGONAL IN THE FIRST N-1 POSITIONS OF
4075C          THE THIRD COLUMN.  T(1,1) AND T(N,3) ARE ARBITRARY.
4076C
4077C     ON OUTPUT
4078C
4079C        T IS UNALTERED.
4080C
4081C        D CONTAINS THE DIAGONAL ELEMENTS OF THE SYMMETRIC MATRIX.
4082C
4083C        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE SYMMETRIC
4084C          MATRIX IN ITS LAST N-1 POSITIONS.  E(1) IS NOT SET.
4085C
4086C        E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E.
4087C          E2 MAY COINCIDE WITH E IF THE SQUARES ARE NOT NEEDED.
4088C
4089C        IERR IS SET TO
4090C          ZERO       FOR NORMAL RETURN,
4091C          N+I        IF T(I,1)*T(I-1,3) IS NEGATIVE,
4092C          -(3*N+I)   IF T(I,1)*T(I-1,3) IS ZERO WITH ONE FACTOR
4093C                     NON-ZERO.  IN THIS CASE, THE EIGENVECTORS OF
4094C                     THE SYMMETRIC MATRIX ARE NOT SIMPLY RELATED
4095C                     TO THOSE OF  T  AND SHOULD NOT BE SOUGHT.
4096C
4097C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
4098C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
4099C
4100C     THIS VERSION DATED AUGUST 1983.
4101C
4102C     ------------------------------------------------------------------
4103C
4104      IERR = 0
4105C
4106      DO 100 I = 1, N
4107         IF (I .EQ. 1) GO TO 90
4108         E2(I) = T(I,1) * T(I-1,3)
4109         IF (E2(I)) 1000, 60, 80
4110   60    IF (T(I,1) .EQ. 0.0D0 .AND. T(I-1,3) .EQ. 0.0D0) GO TO 80
4111C     .......... SET ERROR -- PRODUCT OF SOME PAIR OF OFF-DIAGONAL
4112C                ELEMENTS IS ZERO WITH ONE MEMBER NON-ZERO ..........
4113         IERR = -(3 * N + I)
4114   80    E(I) = DSQRT(E2(I))
4115   90    D(I) = T(I,2)
4116  100 CONTINUE
4117C
4118      GO TO 1001
4119C     .......... SET ERROR -- PRODUCT OF SOME PAIR OF OFF-DIAGONAL
4120C                ELEMENTS IS NEGATIVE ..........
4121 1000 IERR = N + I
4122 1001 RETURN
4123      END
4124      SUBROUTINE FIGI2(NM,N,T,D,E,Z,IERR)
4125C
4126      INTEGER I,J,N,NM,IERR
4127      DOUBLE PRECISION T(NM,3),D(N),E(N),Z(NM,N)
4128      DOUBLE PRECISION H
4129C
4130C     GIVEN A NONSYMMETRIC TRIDIAGONAL MATRIX SUCH THAT THE PRODUCTS
4131C     OF CORRESPONDING PAIRS OF OFF-DIAGONAL ELEMENTS ARE ALL
4132C     NON-NEGATIVE, AND ZERO ONLY WHEN BOTH FACTORS ARE ZERO, THIS
4133C     SUBROUTINE REDUCES IT TO A SYMMETRIC TRIDIAGONAL MATRIX
4134C     USING AND ACCUMULATING DIAGONAL SIMILARITY TRANSFORMATIONS.
4135C
4136C     ON INPUT
4137C
4138C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
4139C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
4140C          DIMENSION STATEMENT.
4141C
4142C        N IS THE ORDER OF THE MATRIX.
4143C
4144C        T CONTAINS THE INPUT MATRIX.  ITS SUBDIAGONAL IS
4145C          STORED IN THE LAST N-1 POSITIONS OF THE FIRST COLUMN,
4146C          ITS DIAGONAL IN THE N POSITIONS OF THE SECOND COLUMN,
4147C          AND ITS SUPERDIAGONAL IN THE FIRST N-1 POSITIONS OF
4148C          THE THIRD COLUMN.  T(1,1) AND T(N,3) ARE ARBITRARY.
4149C
4150C     ON OUTPUT
4151C
4152C        T IS UNALTERED.
4153C
4154C        D CONTAINS THE DIAGONAL ELEMENTS OF THE SYMMETRIC MATRIX.
4155C
4156C        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE SYMMETRIC
4157C          MATRIX IN ITS LAST N-1 POSITIONS.  E(1) IS NOT SET.
4158C
4159C        Z CONTAINS THE TRANSFORMATION MATRIX PRODUCED IN
4160C          THE REDUCTION.
4161C
4162C        IERR IS SET TO
4163C          ZERO       FOR NORMAL RETURN,
4164C          N+I        IF T(I,1)*T(I-1,3) IS NEGATIVE,
4165C          2*N+I      IF T(I,1)*T(I-1,3) IS ZERO WITH
4166C                     ONE FACTOR NON-ZERO.
4167C
4168C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
4169C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
4170C
4171C     THIS VERSION DATED AUGUST 1983.
4172C
4173C     ------------------------------------------------------------------
4174C
4175      IERR = 0
4176C
4177      DO 100 I = 1, N
4178C
4179         DO 50 J = 1, N
4180   50    Z(I,J) = 0.0D0
4181C
4182         IF (I .EQ. 1) GO TO 70
4183         H = T(I,1) * T(I-1,3)
4184         IF (H) 900, 60, 80
4185   60    IF (T(I,1) .NE. 0.0D0 .OR. T(I-1,3) .NE. 0.0D0) GO TO 1000
4186         E(I) = 0.0D0
4187   70    Z(I,I) = 1.0D0
4188         GO TO 90
4189   80    E(I) = DSQRT(H)
4190         Z(I,I) = Z(I-1,I-1) * E(I) / T(I-1,3)
4191   90    D(I) = T(I,2)
4192  100 CONTINUE
4193C
4194      GO TO 1001
4195C     .......... SET ERROR -- PRODUCT OF SOME PAIR OF OFF-DIAGONAL
4196C                ELEMENTS IS NEGATIVE ..........
4197  900 IERR = N + I
4198      GO TO 1001
4199C     .......... SET ERROR -- PRODUCT OF SOME PAIR OF OFF-DIAGONAL
4200C                ELEMENTS IS ZERO WITH ONE MEMBER NON-ZERO ..........
4201 1000 IERR = 2 * N + I
4202 1001 RETURN
4203      END
4204      SUBROUTINE HQR(NM,N,LOW,IGH,H,WR,WI,IERR)
4205C
4206      INTEGER I,J,K,L,M,N,EN,LL,MM,NA,NM,IGH,ITN,ITS,LOW,MP2,ENM2,IERR
4207      DOUBLE PRECISION H(NM,N),WR(N),WI(N)
4208      DOUBLE PRECISION P,Q,R,S,T,W,X,Y,ZZ,NORM,TST1,TST2
4209      LOGICAL NOTLAS
4210C
4211C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE HQR,
4212C     NUM. MATH. 14, 219-231(1970) BY MARTIN, PETERS, AND WILKINSON.
4213C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 359-371(1971).
4214C
4215C     THIS SUBROUTINE FINDS THE EIGENVALUES OF A REAL
4216C     UPPER HESSENBERG MATRIX BY THE QR METHOD.
4217C
4218C     ON INPUT
4219C
4220C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
4221C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
4222C          DIMENSION STATEMENT.
4223C
4224C        N IS THE ORDER OF THE MATRIX.
4225C
4226C        LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING
4227C          SUBROUTINE  BALANC.  IF  BALANC  HAS NOT BEEN USED,
4228C          SET LOW=1, IGH=N.
4229C
4230C        H CONTAINS THE UPPER HESSENBERG MATRIX.  INFORMATION ABOUT
4231C          THE TRANSFORMATIONS USED IN THE REDUCTION TO HESSENBERG
4232C          FORM BY  ELMHES  OR  ORTHES, IF PERFORMED, IS STORED
4233C          IN THE REMAINING TRIANGLE UNDER THE HESSENBERG MATRIX.
4234C
4235C     ON OUTPUT
4236C
4237C        H HAS BEEN DESTROYED.  THEREFORE, IT MUST BE SAVED
4238C          BEFORE CALLING  HQR  IF SUBSEQUENT CALCULATION AND
4239C          BACK TRANSFORMATION OF EIGENVECTORS IS TO BE PERFORMED.
4240C
4241C        WR AND WI CONTAIN THE REAL AND IMAGINARY PARTS,
4242C          RESPECTIVELY, OF THE EIGENVALUES.  THE EIGENVALUES
4243C          ARE UNORDERED EXCEPT THAT COMPLEX CONJUGATE PAIRS
4244C          OF VALUES APPEAR CONSECUTIVELY WITH THE EIGENVALUE
4245C          HAVING THE POSITIVE IMAGINARY PART FIRST.  IF AN
4246C          ERROR EXIT IS MADE, THE EIGENVALUES SHOULD BE CORRECT
4247C          FOR INDICES IERR+1,...,N.
4248C
4249C        IERR IS SET TO
4250C          ZERO       FOR NORMAL RETURN,
4251C          J          IF THE LIMIT OF 30*N ITERATIONS IS EXHAUSTED
4252C                     WHILE THE J-TH EIGENVALUE IS BEING SOUGHT.
4253C
4254C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
4255C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
4256C
4257C     THIS VERSION DATED AUGUST 1983.
4258C
4259C     ------------------------------------------------------------------
4260C
4261      IERR = 0
4262      NORM = 0.0D0
4263      K = 1
4264C     .......... STORE ROOTS ISOLATED BY BALANC
4265C                AND COMPUTE MATRIX NORM ..........
4266      DO 50 I = 1, N
4267C
4268         DO 40 J = K, N
4269   40    NORM = NORM + DABS(H(I,J))
4270C
4271         K = I
4272         IF (I .GE. LOW .AND. I .LE. IGH) GO TO 50
4273         WR(I) = H(I,I)
4274         WI(I) = 0.0D0
4275   50 CONTINUE
4276C
4277      EN = IGH
4278      T = 0.0D0
4279      ITN = 30*N
4280C     .......... SEARCH FOR NEXT EIGENVALUES ..........
4281   60 IF (EN .LT. LOW) GO TO 1001
4282      ITS = 0
4283      NA = EN - 1
4284      ENM2 = NA - 1
4285C     .......... LOOK FOR SINGLE SMALL SUB-DIAGONAL ELEMENT
4286C                FOR L=EN STEP -1 UNTIL LOW DO -- ..........
4287   70 DO 80 LL = LOW, EN
4288         L = EN + LOW - LL
4289         IF (L .EQ. LOW) GO TO 100
4290         S = DABS(H(L-1,L-1)) + DABS(H(L,L))
4291         IF (S .EQ. 0.0D0) S = NORM
4292         TST1 = S
4293         TST2 = TST1 + DABS(H(L,L-1))
4294         IF (TST2 .EQ. TST1) GO TO 100
4295   80 CONTINUE
4296C     .......... FORM SHIFT ..........
4297  100 X = H(EN,EN)
4298      IF (L .EQ. EN) GO TO 270
4299      Y = H(NA,NA)
4300      W = H(EN,NA) * H(NA,EN)
4301      IF (L .EQ. NA) GO TO 280
4302      IF (ITN .EQ. 0) GO TO 1000
4303      IF (ITS .NE. 10 .AND. ITS .NE. 20) GO TO 130
4304C     .......... FORM EXCEPTIONAL SHIFT ..........
4305      T = T + X
4306C
4307      DO 120 I = LOW, EN
4308  120 H(I,I) = H(I,I) - X
4309C
4310      S = DABS(H(EN,NA)) + DABS(H(NA,ENM2))
4311      X = 0.75D0 * S
4312      Y = X
4313      W = -0.4375D0 * S * S
4314  130 ITS = ITS + 1
4315      ITN = ITN - 1
4316C     .......... LOOK FOR TWO CONSECUTIVE SMALL
4317C                SUB-DIAGONAL ELEMENTS.
4318C                FOR M=EN-2 STEP -1 UNTIL L DO -- ..........
4319      DO 140 MM = L, ENM2
4320         M = ENM2 + L - MM
4321         ZZ = H(M,M)
4322         R = X - ZZ
4323         S = Y - ZZ
4324         P = (R * S - W) / H(M+1,M) + H(M,M+1)
4325         Q = H(M+1,M+1) - ZZ - R - S
4326         R = H(M+2,M+1)
4327         S = DABS(P) + DABS(Q) + DABS(R)
4328         P = P / S
4329         Q = Q / S
4330         R = R / S
4331         IF (M .EQ. L) GO TO 150
4332         TST1 = DABS(P)*(DABS(H(M-1,M-1)) + DABS(ZZ) + DABS(H(M+1,M+1)))
4333         TST2 = TST1 + DABS(H(M,M-1))*(DABS(Q) + DABS(R))
4334         IF (TST2 .EQ. TST1) GO TO 150
4335  140 CONTINUE
4336C
4337  150 MP2 = M + 2
4338C
4339      DO 160 I = MP2, EN
4340         H(I,I-2) = 0.0D0
4341         IF (I .EQ. MP2) GO TO 160
4342         H(I,I-3) = 0.0D0
4343  160 CONTINUE
4344C     .......... DOUBLE QR STEP INVOLVING ROWS L TO EN AND
4345C                COLUMNS M TO EN ..........
4346      DO 260 K = M, NA
4347         NOTLAS = K .NE. NA
4348         IF (K .EQ. M) GO TO 170
4349         P = H(K,K-1)
4350         Q = H(K+1,K-1)
4351         R = 0.0D0
4352         IF (NOTLAS) R = H(K+2,K-1)
4353         X = DABS(P) + DABS(Q) + DABS(R)
4354         IF (X .EQ. 0.0D0) GO TO 260
4355         P = P / X
4356         Q = Q / X
4357         R = R / X
4358  170    S = DSIGN(DSQRT(P*P+Q*Q+R*R),P)
4359         IF (K .EQ. M) GO TO 180
4360         H(K,K-1) = -S * X
4361         GO TO 190
4362  180    IF (L .NE. M) H(K,K-1) = -H(K,K-1)
4363  190    P = P + S
4364         X = P / S
4365         Y = Q / S
4366         ZZ = R / S
4367         Q = Q / P
4368         R = R / P
4369         IF (NOTLAS) GO TO 225
4370C     .......... ROW MODIFICATION ..........
4371         DO 200 J = K, N
4372            P = H(K,J) + Q * H(K+1,J)
4373            H(K,J) = H(K,J) - P * X
4374            H(K+1,J) = H(K+1,J) - P * Y
4375  200    CONTINUE
4376C
4377         J = MIN0(EN,K+3)
4378C     .......... COLUMN MODIFICATION ..........
4379         DO 210 I = 1, J
4380            P = X * H(I,K) + Y * H(I,K+1)
4381            H(I,K) = H(I,K) - P
4382            H(I,K+1) = H(I,K+1) - P * Q
4383  210    CONTINUE
4384         GO TO 255
4385  225    CONTINUE
4386C     .......... ROW MODIFICATION ..........
4387         DO 230 J = K, N
4388            P = H(K,J) + Q * H(K+1,J) + R * H(K+2,J)
4389            H(K,J) = H(K,J) - P * X
4390            H(K+1,J) = H(K+1,J) - P * Y
4391            H(K+2,J) = H(K+2,J) - P * ZZ
4392  230    CONTINUE
4393C
4394         J = MIN0(EN,K+3)
4395C     .......... COLUMN MODIFICATION ..........
4396         DO 240 I = 1, J
4397            P = X * H(I,K) + Y * H(I,K+1) + ZZ * H(I,K+2)
4398            H(I,K) = H(I,K) - P
4399            H(I,K+1) = H(I,K+1) - P * Q
4400            H(I,K+2) = H(I,K+2) - P * R
4401  240    CONTINUE
4402  255    CONTINUE
4403C
4404  260 CONTINUE
4405C
4406      GO TO 70
4407C     .......... ONE ROOT FOUND ..........
4408  270 WR(EN) = X + T
4409      WI(EN) = 0.0D0
4410      EN = NA
4411      GO TO 60
4412C     .......... TWO ROOTS FOUND ..........
4413  280 P = (Y - X) / 2.0D0
4414      Q = P * P + W
4415      ZZ = DSQRT(DABS(Q))
4416      X = X + T
4417      IF (Q .LT. 0.0D0) GO TO 320
4418C     .......... REAL PAIR ..........
4419      ZZ = P + DSIGN(ZZ,P)
4420      WR(NA) = X + ZZ
4421      WR(EN) = WR(NA)
4422      IF (ZZ .NE. 0.0D0) WR(EN) = X - W / ZZ
4423      WI(NA) = 0.0D0
4424      WI(EN) = 0.0D0
4425      GO TO 330
4426C     .......... COMPLEX PAIR ..........
4427  320 WR(NA) = X + P
4428      WR(EN) = X + P
4429      WI(NA) = ZZ
4430      WI(EN) = -ZZ
4431  330 EN = ENM2
4432      GO TO 60
4433C     .......... SET ERROR -- ALL EIGENVALUES HAVE NOT
4434C                CONVERGED AFTER 30*N ITERATIONS ..........
4435 1000 IERR = EN
4436 1001 RETURN
4437      END
4438      SUBROUTINE HQR2(NM,N,LOW,IGH,H,WR,WI,Z,IERR)
4439C
4440      INTEGER I,J,K,L,M,N,EN,II,JJ,LL,MM,NA,NM,NN,
4441     X        IGH,ITN,ITS,LOW,MP2,ENM2,IERR
4442      DOUBLE PRECISION H(NM,N),WR(N),WI(N),Z(NM,N)
4443      DOUBLE PRECISION P,Q,R,S,T,W,X,Y,RA,SA,VI,VR,ZZ,NORM,TST1,TST2
4444      LOGICAL NOTLAS
4445C
4446C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE HQR2,
4447C     NUM. MATH. 16, 181-204(1970) BY PETERS AND WILKINSON.
4448C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 372-395(1971).
4449C
4450C     THIS SUBROUTINE FINDS THE EIGENVALUES AND EIGENVECTORS
4451C     OF A REAL UPPER HESSENBERG MATRIX BY THE QR METHOD.  THE
4452C     EIGENVECTORS OF A REAL GENERAL MATRIX CAN ALSO BE FOUND
4453C     IF  ELMHES  AND  ELTRAN  OR  ORTHES  AND  ORTRAN  HAVE
4454C     BEEN USED TO REDUCE THIS GENERAL MATRIX TO HESSENBERG FORM
4455C     AND TO ACCUMULATE THE SIMILARITY TRANSFORMATIONS.
4456C
4457C     ON INPUT
4458C
4459C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
4460C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
4461C          DIMENSION STATEMENT.
4462C
4463C        N IS THE ORDER OF THE MATRIX.
4464C
4465C        LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING
4466C          SUBROUTINE  BALANC.  IF  BALANC  HAS NOT BEEN USED,
4467C          SET LOW=1, IGH=N.
4468C
4469C        H CONTAINS THE UPPER HESSENBERG MATRIX.
4470C
4471C        Z CONTAINS THE TRANSFORMATION MATRIX PRODUCED BY  ELTRAN
4472C          AFTER THE REDUCTION BY  ELMHES, OR BY  ORTRAN  AFTER THE
4473C          REDUCTION BY  ORTHES, IF PERFORMED.  IF THE EIGENVECTORS
4474C          OF THE HESSENBERG MATRIX ARE DESIRED, Z MUST CONTAIN THE
4475C          IDENTITY MATRIX.
4476C
4477C     ON OUTPUT
4478C
4479C        H HAS BEEN DESTROYED.
4480C
4481C        WR AND WI CONTAIN THE REAL AND IMAGINARY PARTS,
4482C          RESPECTIVELY, OF THE EIGENVALUES.  THE EIGENVALUES
4483C          ARE UNORDERED EXCEPT THAT COMPLEX CONJUGATE PAIRS
4484C          OF VALUES APPEAR CONSECUTIVELY WITH THE EIGENVALUE
4485C          HAVING THE POSITIVE IMAGINARY PART FIRST.  IF AN
4486C          ERROR EXIT IS MADE, THE EIGENVALUES SHOULD BE CORRECT
4487C          FOR INDICES IERR+1,...,N.
4488C
4489C        Z CONTAINS THE REAL AND IMAGINARY PARTS OF THE EIGENVECTORS.
4490C          IF THE I-TH EIGENVALUE IS REAL, THE I-TH COLUMN OF Z
4491C          CONTAINS ITS EIGENVECTOR.  IF THE I-TH EIGENVALUE IS COMPLEX
4492C          WITH POSITIVE IMAGINARY PART, THE I-TH AND (I+1)-TH
4493C          COLUMNS OF Z CONTAIN THE REAL AND IMAGINARY PARTS OF ITS
4494C          EIGENVECTOR.  THE EIGENVECTORS ARE UNNORMALIZED.  IF AN
4495C          ERROR EXIT IS MADE, NONE OF THE EIGENVECTORS HAS BEEN FOUND.
4496C
4497C        IERR IS SET TO
4498C          ZERO       FOR NORMAL RETURN,
4499C          J          IF THE LIMIT OF 30*N ITERATIONS IS EXHAUSTED
4500C                     WHILE THE J-TH EIGENVALUE IS BEING SOUGHT.
4501C
4502C     CALLS CDIV FOR COMPLEX DIVISION.
4503C
4504C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
4505C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
4506C
4507C     THIS VERSION DATED AUGUST 1983.
4508C
4509C     ------------------------------------------------------------------
4510C
4511      IERR = 0
4512      NORM = 0.0D0
4513      K = 1
4514C     .......... STORE ROOTS ISOLATED BY BALANC
4515C                AND COMPUTE MATRIX NORM ..........
4516      DO 50 I = 1, N
4517C
4518         DO 40 J = K, N
4519   40    NORM = NORM + DABS(H(I,J))
4520C
4521         K = I
4522         IF (I .GE. LOW .AND. I .LE. IGH) GO TO 50
4523         WR(I) = H(I,I)
4524         WI(I) = 0.0D0
4525   50 CONTINUE
4526C
4527      EN = IGH
4528      T = 0.0D0
4529      ITN = 30*N
4530C     .......... SEARCH FOR NEXT EIGENVALUES ..........
4531   60 IF (EN .LT. LOW) GO TO 340
4532      ITS = 0
4533      NA = EN - 1
4534      ENM2 = NA - 1
4535C     .......... LOOK FOR SINGLE SMALL SUB-DIAGONAL ELEMENT
4536C                FOR L=EN STEP -1 UNTIL LOW DO -- ..........
4537   70 DO 80 LL = LOW, EN
4538         L = EN + LOW - LL
4539         IF (L .EQ. LOW) GO TO 100
4540         S = DABS(H(L-1,L-1)) + DABS(H(L,L))
4541         IF (S .EQ. 0.0D0) S = NORM
4542         TST1 = S
4543         TST2 = TST1 + DABS(H(L,L-1))
4544         IF (TST2 .EQ. TST1) GO TO 100
4545   80 CONTINUE
4546C     .......... FORM SHIFT ..........
4547  100 X = H(EN,EN)
4548      IF (L .EQ. EN) GO TO 270
4549      Y = H(NA,NA)
4550      W = H(EN,NA) * H(NA,EN)
4551      IF (L .EQ. NA) GO TO 280
4552      IF (ITN .EQ. 0) GO TO 1000
4553      IF (ITS .NE. 10 .AND. ITS .NE. 20) GO TO 130
4554C     .......... FORM EXCEPTIONAL SHIFT ..........
4555      T = T + X
4556C
4557      DO 120 I = LOW, EN
4558  120 H(I,I) = H(I,I) - X
4559C
4560      S = DABS(H(EN,NA)) + DABS(H(NA,ENM2))
4561      X = 0.75D0 * S
4562      Y = X
4563      W = -0.4375D0 * S * S
4564  130 ITS = ITS + 1
4565      ITN = ITN - 1
4566C     .......... LOOK FOR TWO CONSECUTIVE SMALL
4567C                SUB-DIAGONAL ELEMENTS.
4568C                FOR M=EN-2 STEP -1 UNTIL L DO -- ..........
4569      DO 140 MM = L, ENM2
4570         M = ENM2 + L - MM
4571         ZZ = H(M,M)
4572         R = X - ZZ
4573         S = Y - ZZ
4574         P = (R * S - W) / H(M+1,M) + H(M,M+1)
4575         Q = H(M+1,M+1) - ZZ - R - S
4576         R = H(M+2,M+1)
4577         S = DABS(P) + DABS(Q) + DABS(R)
4578         P = P / S
4579         Q = Q / S
4580         R = R / S
4581         IF (M .EQ. L) GO TO 150
4582         TST1 = DABS(P)*(DABS(H(M-1,M-1)) + DABS(ZZ) + DABS(H(M+1,M+1)))
4583         TST2 = TST1 + DABS(H(M,M-1))*(DABS(Q) + DABS(R))
4584         IF (TST2 .EQ. TST1) GO TO 150
4585  140 CONTINUE
4586C
4587  150 MP2 = M + 2
4588C
4589      DO 160 I = MP2, EN
4590         H(I,I-2) = 0.0D0
4591         IF (I .EQ. MP2) GO TO 160
4592         H(I,I-3) = 0.0D0
4593  160 CONTINUE
4594C     .......... DOUBLE QR STEP INVOLVING ROWS L TO EN AND
4595C                COLUMNS M TO EN ..........
4596      DO 260 K = M, NA
4597         NOTLAS = K .NE. NA
4598         IF (K .EQ. M) GO TO 170
4599         P = H(K,K-1)
4600         Q = H(K+1,K-1)
4601         R = 0.0D0
4602         IF (NOTLAS) R = H(K+2,K-1)
4603         X = DABS(P) + DABS(Q) + DABS(R)
4604         IF (X .EQ. 0.0D0) GO TO 260
4605         P = P / X
4606         Q = Q / X
4607         R = R / X
4608  170    S = DSIGN(DSQRT(P*P+Q*Q+R*R),P)
4609         IF (K .EQ. M) GO TO 180
4610         H(K,K-1) = -S * X
4611         GO TO 190
4612  180    IF (L .NE. M) H(K,K-1) = -H(K,K-1)
4613  190    P = P + S
4614         X = P / S
4615         Y = Q / S
4616         ZZ = R / S
4617         Q = Q / P
4618         R = R / P
4619         IF (NOTLAS) GO TO 225
4620C     .......... ROW MODIFICATION ..........
4621         DO 200 J = K, N
4622            P = H(K,J) + Q * H(K+1,J)
4623            H(K,J) = H(K,J) - P * X
4624            H(K+1,J) = H(K+1,J) - P * Y
4625  200    CONTINUE
4626C
4627         J = MIN0(EN,K+3)
4628C     .......... COLUMN MODIFICATION ..........
4629         DO 210 I = 1, J
4630            P = X * H(I,K) + Y * H(I,K+1)
4631            H(I,K) = H(I,K) - P
4632            H(I,K+1) = H(I,K+1) - P * Q
4633  210    CONTINUE
4634C     .......... ACCUMULATE TRANSFORMATIONS ..........
4635         DO 220 I = LOW, IGH
4636            P = X * Z(I,K) + Y * Z(I,K+1)
4637            Z(I,K) = Z(I,K) - P
4638            Z(I,K+1) = Z(I,K+1) - P * Q
4639  220    CONTINUE
4640         GO TO 255
4641  225    CONTINUE
4642C     .......... ROW MODIFICATION ..........
4643         DO 230 J = K, N
4644            P = H(K,J) + Q * H(K+1,J) + R * H(K+2,J)
4645            H(K,J) = H(K,J) - P * X
4646            H(K+1,J) = H(K+1,J) - P * Y
4647            H(K+2,J) = H(K+2,J) - P * ZZ
4648  230    CONTINUE
4649C
4650         J = MIN0(EN,K+3)
4651C     .......... COLUMN MODIFICATION ..........
4652         DO 240 I = 1, J
4653            P = X * H(I,K) + Y * H(I,K+1) + ZZ * H(I,K+2)
4654            H(I,K) = H(I,K) - P
4655            H(I,K+1) = H(I,K+1) - P * Q
4656            H(I,K+2) = H(I,K+2) - P * R
4657  240    CONTINUE
4658C     .......... ACCUMULATE TRANSFORMATIONS ..........
4659         DO 250 I = LOW, IGH
4660            P = X * Z(I,K) + Y * Z(I,K+1) + ZZ * Z(I,K+2)
4661            Z(I,K) = Z(I,K) - P
4662            Z(I,K+1) = Z(I,K+1) - P * Q
4663            Z(I,K+2) = Z(I,K+2) - P * R
4664  250    CONTINUE
4665  255    CONTINUE
4666C
4667  260 CONTINUE
4668C
4669      GO TO 70
4670C     .......... ONE ROOT FOUND ..........
4671  270 H(EN,EN) = X + T
4672      WR(EN) = H(EN,EN)
4673      WI(EN) = 0.0D0
4674      EN = NA
4675      GO TO 60
4676C     .......... TWO ROOTS FOUND ..........
4677  280 P = (Y - X) / 2.0D0
4678      Q = P * P + W
4679      ZZ = DSQRT(DABS(Q))
4680      H(EN,EN) = X + T
4681      X = H(EN,EN)
4682      H(NA,NA) = Y + T
4683      IF (Q .LT. 0.0D0) GO TO 320
4684C     .......... REAL PAIR ..........
4685      ZZ = P + DSIGN(ZZ,P)
4686      WR(NA) = X + ZZ
4687      WR(EN) = WR(NA)
4688      IF (ZZ .NE. 0.0D0) WR(EN) = X - W / ZZ
4689      WI(NA) = 0.0D0
4690      WI(EN) = 0.0D0
4691      X = H(EN,NA)
4692      S = DABS(X) + DABS(ZZ)
4693      P = X / S
4694      Q = ZZ / S
4695      R = DSQRT(P*P+Q*Q)
4696      P = P / R
4697      Q = Q / R
4698C     .......... ROW MODIFICATION ..........
4699      DO 290 J = NA, N
4700         ZZ = H(NA,J)
4701         H(NA,J) = Q * ZZ + P * H(EN,J)
4702         H(EN,J) = Q * H(EN,J) - P * ZZ
4703  290 CONTINUE
4704C     .......... COLUMN MODIFICATION ..........
4705      DO 300 I = 1, EN
4706         ZZ = H(I,NA)
4707         H(I,NA) = Q * ZZ + P * H(I,EN)
4708         H(I,EN) = Q * H(I,EN) - P * ZZ
4709  300 CONTINUE
4710C     .......... ACCUMULATE TRANSFORMATIONS ..........
4711      DO 310 I = LOW, IGH
4712         ZZ = Z(I,NA)
4713         Z(I,NA) = Q * ZZ + P * Z(I,EN)
4714         Z(I,EN) = Q * Z(I,EN) - P * ZZ
4715  310 CONTINUE
4716C
4717      GO TO 330
4718C     .......... COMPLEX PAIR ..........
4719  320 WR(NA) = X + P
4720      WR(EN) = X + P
4721      WI(NA) = ZZ
4722      WI(EN) = -ZZ
4723  330 EN = ENM2
4724      GO TO 60
4725C     .......... ALL ROOTS FOUND.  BACKSUBSTITUTE TO FIND
4726C                VECTORS OF UPPER TRIANGULAR FORM ..........
4727  340 IF (NORM .EQ. 0.0D0) GO TO 1001
4728C     .......... FOR EN=N STEP -1 UNTIL 1 DO -- ..........
4729      DO 800 NN = 1, N
4730         EN = N + 1 - NN
4731         P = WR(EN)
4732         Q = WI(EN)
4733         NA = EN - 1
4734         IF (Q) 710, 600, 800
4735C     .......... REAL VECTOR ..........
4736  600    M = EN
4737         H(EN,EN) = 1.0D0
4738         IF (NA .EQ. 0) GO TO 800
4739C     .......... FOR I=EN-1 STEP -1 UNTIL 1 DO -- ..........
4740         DO 700 II = 1, NA
4741            I = EN - II
4742            W = H(I,I) - P
4743            R = 0.0D0
4744C
4745            DO 610 J = M, EN
4746  610       R = R + H(I,J) * H(J,EN)
4747C
4748            IF (WI(I) .GE. 0.0D0) GO TO 630
4749            ZZ = W
4750            S = R
4751            GO TO 700
4752  630       M = I
4753            IF (WI(I) .NE. 0.0D0) GO TO 640
4754            T = W
4755            IF (T .NE. 0.0D0) GO TO 635
4756               TST1 = NORM
4757               T = TST1
4758  632          T = 0.01D0 * T
4759               TST2 = NORM + T
4760               IF (TST2 .GT. TST1) GO TO 632
4761  635       H(I,EN) = -R / T
4762            GO TO 680
4763C     .......... SOLVE REAL EQUATIONS ..........
4764  640       X = H(I,I+1)
4765            Y = H(I+1,I)
4766            Q = (WR(I) - P) * (WR(I) - P) + WI(I) * WI(I)
4767            T = (X * S - ZZ * R) / Q
4768            H(I,EN) = T
4769            IF (DABS(X) .LE. DABS(ZZ)) GO TO 650
4770            H(I+1,EN) = (-R - W * T) / X
4771            GO TO 680
4772  650       H(I+1,EN) = (-S - Y * T) / ZZ
4773C
4774C     .......... OVERFLOW CONTROL ..........
4775  680       T = DABS(H(I,EN))
4776            IF (T .EQ. 0.0D0) GO TO 700
4777            TST1 = T
4778            TST2 = TST1 + 1.0D0/TST1
4779            IF (TST2 .GT. TST1) GO TO 700
4780            DO 690 J = I, EN
4781               H(J,EN) = H(J,EN)/T
4782  690       CONTINUE
4783C
4784  700    CONTINUE
4785C     .......... END REAL VECTOR ..........
4786         GO TO 800
4787C     .......... COMPLEX VECTOR ..........
4788  710    M = NA
4789C     .......... LAST VECTOR COMPONENT CHOSEN IMAGINARY SO THAT
4790C                EIGENVECTOR MATRIX IS TRIANGULAR ..........
4791         IF (DABS(H(EN,NA)) .LE. DABS(H(NA,EN))) GO TO 720
4792         H(NA,NA) = Q / H(EN,NA)
4793         H(NA,EN) = -(H(EN,EN) - P) / H(EN,NA)
4794         GO TO 730
4795  720    CALL CDIV(0.0D0,-H(NA,EN),H(NA,NA)-P,Q,H(NA,NA),H(NA,EN))
4796  730    H(EN,NA) = 0.0D0
4797         H(EN,EN) = 1.0D0
4798         ENM2 = NA - 1
4799         IF (ENM2 .EQ. 0) GO TO 800
4800C     .......... FOR I=EN-2 STEP -1 UNTIL 1 DO -- ..........
4801         DO 795 II = 1, ENM2
4802            I = NA - II
4803            W = H(I,I) - P
4804            RA = 0.0D0
4805            SA = 0.0D0
4806C
4807            DO 760 J = M, EN
4808               RA = RA + H(I,J) * H(J,NA)
4809               SA = SA + H(I,J) * H(J,EN)
4810  760       CONTINUE
4811C
4812            IF (WI(I) .GE. 0.0D0) GO TO 770
4813            ZZ = W
4814            R = RA
4815            S = SA
4816            GO TO 795
4817  770       M = I
4818            IF (WI(I) .NE. 0.0D0) GO TO 780
4819            CALL CDIV(-RA,-SA,W,Q,H(I,NA),H(I,EN))
4820            GO TO 790
4821C     .......... SOLVE COMPLEX EQUATIONS ..........
4822  780       X = H(I,I+1)
4823            Y = H(I+1,I)
4824            VR = (WR(I) - P) * (WR(I) - P) + WI(I) * WI(I) - Q * Q
4825            VI = (WR(I) - P) * 2.0D0 * Q
4826            IF (VR .NE. 0.0D0 .OR. VI .NE. 0.0D0) GO TO 784
4827               TST1 = NORM * (DABS(W) + DABS(Q) + DABS(X)
4828     X                      + DABS(Y) + DABS(ZZ))
4829               VR = TST1
4830  783          VR = 0.01D0 * VR
4831               TST2 = TST1 + VR
4832               IF (TST2 .GT. TST1) GO TO 783
4833  784       CALL CDIV(X*R-ZZ*RA+Q*SA,X*S-ZZ*SA-Q*RA,VR,VI,
4834     X                H(I,NA),H(I,EN))
4835            IF (DABS(X) .LE. DABS(ZZ) + DABS(Q)) GO TO 785
4836            H(I+1,NA) = (-RA - W * H(I,NA) + Q * H(I,EN)) / X
4837            H(I+1,EN) = (-SA - W * H(I,EN) - Q * H(I,NA)) / X
4838            GO TO 790
4839  785       CALL CDIV(-R-Y*H(I,NA),-S-Y*H(I,EN),ZZ,Q,
4840     X                H(I+1,NA),H(I+1,EN))
4841C
4842C     .......... OVERFLOW CONTROL ..........
4843  790       T = DMAX1(DABS(H(I,NA)), DABS(H(I,EN)))
4844            IF (T .EQ. 0.0D0) GO TO 795
4845            TST1 = T
4846            TST2 = TST1 + 1.0D0/TST1
4847            IF (TST2 .GT. TST1) GO TO 795
4848            DO 792 J = I, EN
4849               H(J,NA) = H(J,NA)/T
4850               H(J,EN) = H(J,EN)/T
4851  792       CONTINUE
4852C
4853  795    CONTINUE
4854C     .......... END COMPLEX VECTOR ..........
4855  800 CONTINUE
4856C     .......... END BACK SUBSTITUTION.
4857C                VECTORS OF ISOLATED ROOTS ..........
4858      DO 840 I = 1, N
4859         IF (I .GE. LOW .AND. I .LE. IGH) GO TO 840
4860C
4861         DO 820 J = I, N
4862  820    Z(I,J) = H(I,J)
4863C
4864  840 CONTINUE
4865C     .......... MULTIPLY BY TRANSFORMATION MATRIX TO GIVE
4866C                VECTORS OF ORIGINAL FULL MATRIX.
4867C                FOR J=N STEP -1 UNTIL LOW DO -- ..........
4868      DO 880 JJ = LOW, N
4869         J = N + LOW - JJ
4870         M = MIN0(J,IGH)
4871C
4872         DO 880 I = LOW, IGH
4873            ZZ = 0.0D0
4874C
4875            DO 860 K = LOW, M
4876  860       ZZ = ZZ + Z(I,K) * H(K,J)
4877C
4878            Z(I,J) = ZZ
4879  880 CONTINUE
4880C
4881      GO TO 1001
4882C     .......... SET ERROR -- ALL EIGENVALUES HAVE NOT
4883C                CONVERGED AFTER 30*N ITERATIONS ..........
4884 1000 IERR = EN
4885 1001 RETURN
4886      END
4887      SUBROUTINE HTRIB3(NM,N,A,TAU,M,ZR,ZI)
4888C
4889      INTEGER I,J,K,L,M,N,NM
4890      DOUBLE PRECISION A(NM,N),TAU(2,N),ZR(NM,M),ZI(NM,M)
4891      DOUBLE PRECISION H,S,SI
4892C
4893C     THIS SUBROUTINE IS A TRANSLATION OF A COMPLEX ANALOGUE OF
4894C     THE ALGOL PROCEDURE TRBAK3, NUM. MATH. 11, 181-195(1968)
4895C     BY MARTIN, REINSCH, AND WILKINSON.
4896C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971).
4897C
4898C     THIS SUBROUTINE FORMS THE EIGENVECTORS OF A COMPLEX HERMITIAN
4899C     MATRIX BY BACK TRANSFORMING THOSE OF THE CORRESPONDING
4900C     REAL SYMMETRIC TRIDIAGONAL MATRIX DETERMINED BY  HTRID3.
4901C
4902C     ON INPUT
4903C
4904C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
4905C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
4906C          DIMENSION STATEMENT.
4907C
4908C        N IS THE ORDER OF THE MATRIX.
4909C
4910C        A CONTAINS INFORMATION ABOUT THE UNITARY TRANSFORMATIONS
4911C          USED IN THE REDUCTION BY  HTRID3.
4912C
4913C        TAU CONTAINS FURTHER INFORMATION ABOUT THE TRANSFORMATIONS.
4914C
4915C        M IS THE NUMBER OF EIGENVECTORS TO BE BACK TRANSFORMED.
4916C
4917C        ZR CONTAINS THE EIGENVECTORS TO BE BACK TRANSFORMED
4918C          IN ITS FIRST M COLUMNS.
4919C
4920C     ON OUTPUT
4921C
4922C        ZR AND ZI CONTAIN THE REAL AND IMAGINARY PARTS,
4923C          RESPECTIVELY, OF THE TRANSFORMED EIGENVECTORS
4924C          IN THEIR FIRST M COLUMNS.
4925C
4926C     NOTE THAT THE LAST COMPONENT OF EACH RETURNED VECTOR
4927C     IS REAL AND THAT VECTOR EUCLIDEAN NORMS ARE PRESERVED.
4928C
4929C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
4930C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
4931C
4932C     THIS VERSION DATED AUGUST 1983.
4933C
4934C     ------------------------------------------------------------------
4935C
4936      IF (M .EQ. 0) GO TO 200
4937C     .......... TRANSFORM THE EIGENVECTORS OF THE REAL SYMMETRIC
4938C                TRIDIAGONAL MATRIX TO THOSE OF THE HERMITIAN
4939C                TRIDIAGONAL MATRIX. ..........
4940      DO 50 K = 1, N
4941C
4942         DO 50 J = 1, M
4943            ZI(K,J) = -ZR(K,J) * TAU(2,K)
4944            ZR(K,J) = ZR(K,J) * TAU(1,K)
4945   50 CONTINUE
4946C
4947      IF (N .EQ. 1) GO TO 200
4948C     .......... RECOVER AND APPLY THE HOUSEHOLDER MATRICES ..........
4949      DO 140 I = 2, N
4950         L = I - 1
4951         H = A(I,I)
4952         IF (H .EQ. 0.0D0) GO TO 140
4953C
4954         DO 130 J = 1, M
4955            S = 0.0D0
4956            SI = 0.0D0
4957C
4958            DO 110 K = 1, L
4959               S = S + A(I,K) * ZR(K,J) - A(K,I) * ZI(K,J)
4960               SI = SI + A(I,K) * ZI(K,J) + A(K,I) * ZR(K,J)
4961  110       CONTINUE
4962C     .......... DOUBLE DIVISIONS AVOID POSSIBLE UNDERFLOW ..........
4963            S = (S / H) / H
4964            SI = (SI / H) / H
4965C
4966            DO 120 K = 1, L
4967               ZR(K,J) = ZR(K,J) - S * A(I,K) - SI * A(K,I)
4968               ZI(K,J) = ZI(K,J) - SI * A(I,K) + S * A(K,I)
4969  120       CONTINUE
4970C
4971  130    CONTINUE
4972C
4973  140 CONTINUE
4974C
4975  200 RETURN
4976      END
4977      SUBROUTINE HTRIBK(NM,N,AR,AI,TAU,M,ZR,ZI)
4978C
4979      INTEGER I,J,K,L,M,N,NM
4980      DOUBLE PRECISION AR(NM,N),AI(NM,N),TAU(2,N),ZR(NM,M),ZI(NM,M)
4981      DOUBLE PRECISION H,S,SI
4982C
4983C     THIS SUBROUTINE IS A TRANSLATION OF A COMPLEX ANALOGUE OF
4984C     THE ALGOL PROCEDURE TRBAK1, NUM. MATH. 11, 181-195(1968)
4985C     BY MARTIN, REINSCH, AND WILKINSON.
4986C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971).
4987C
4988C     THIS SUBROUTINE FORMS THE EIGENVECTORS OF A COMPLEX HERMITIAN
4989C     MATRIX BY BACK TRANSFORMING THOSE OF THE CORRESPONDING
4990C     REAL SYMMETRIC TRIDIAGONAL MATRIX DETERMINED BY  HTRIDI.
4991C
4992C     ON INPUT
4993C
4994C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
4995C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
4996C          DIMENSION STATEMENT.
4997C
4998C        N IS THE ORDER OF THE MATRIX.
4999C
5000C        AR AND AI CONTAIN INFORMATION ABOUT THE UNITARY TRANS-
5001C          FORMATIONS USED IN THE REDUCTION BY  HTRIDI  IN THEIR
5002C          FULL LOWER TRIANGLES EXCEPT FOR THE DIAGONAL OF AR.
5003C
5004C        TAU CONTAINS FURTHER INFORMATION ABOUT THE TRANSFORMATIONS.
5005C
5006C        M IS THE NUMBER OF EIGENVECTORS TO BE BACK TRANSFORMED.
5007C
5008C        ZR CONTAINS THE EIGENVECTORS TO BE BACK TRANSFORMED
5009C          IN ITS FIRST M COLUMNS.
5010C
5011C     ON OUTPUT
5012C
5013C        ZR AND ZI CONTAIN THE REAL AND IMAGINARY PARTS,
5014C          RESPECTIVELY, OF THE TRANSFORMED EIGENVECTORS
5015C          IN THEIR FIRST M COLUMNS.
5016C
5017C     NOTE THAT THE LAST COMPONENT OF EACH RETURNED VECTOR
5018C     IS REAL AND THAT VECTOR EUCLIDEAN NORMS ARE PRESERVED.
5019C
5020C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
5021C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
5022C
5023C     THIS VERSION DATED AUGUST 1983.
5024C
5025C     ------------------------------------------------------------------
5026C
5027      IF (M .EQ. 0) GO TO 200
5028C     .......... TRANSFORM THE EIGENVECTORS OF THE REAL SYMMETRIC
5029C                TRIDIAGONAL MATRIX TO THOSE OF THE HERMITIAN
5030C                TRIDIAGONAL MATRIX. ..........
5031      DO 50 K = 1, N
5032C
5033         DO 50 J = 1, M
5034            ZI(K,J) = -ZR(K,J) * TAU(2,K)
5035            ZR(K,J) = ZR(K,J) * TAU(1,K)
5036   50 CONTINUE
5037C
5038      IF (N .EQ. 1) GO TO 200
5039C     .......... RECOVER AND APPLY THE HOUSEHOLDER MATRICES ..........
5040      DO 140 I = 2, N
5041         L = I - 1
5042         H = AI(I,I)
5043         IF (H .EQ. 0.0D0) GO TO 140
5044C
5045         DO 130 J = 1, M
5046            S = 0.0D0
5047            SI = 0.0D0
5048C
5049            DO 110 K = 1, L
5050               S = S + AR(I,K) * ZR(K,J) - AI(I,K) * ZI(K,J)
5051               SI = SI + AR(I,K) * ZI(K,J) + AI(I,K) * ZR(K,J)
5052  110       CONTINUE
5053C     .......... DOUBLE DIVISIONS AVOID POSSIBLE UNDERFLOW ..........
5054            S = (S / H) / H
5055            SI = (SI / H) / H
5056C
5057            DO 120 K = 1, L
5058               ZR(K,J) = ZR(K,J) - S * AR(I,K) - SI * AI(I,K)
5059               ZI(K,J) = ZI(K,J) - SI * AR(I,K) + S * AI(I,K)
5060  120       CONTINUE
5061C
5062  130    CONTINUE
5063C
5064  140 CONTINUE
5065C
5066  200 RETURN
5067      END
5068      SUBROUTINE HTRID3(NM,N,A,D,E,E2,TAU)
5069C
5070      INTEGER I,J,K,L,N,II,NM,JM1,JP1
5071      DOUBLE PRECISION A(NM,N),D(N),E(N),E2(N),TAU(2,N)
5072      DOUBLE PRECISION F,G,H,FI,GI,HH,SI,SCALE,PYTHAG
5073C
5074C     THIS SUBROUTINE IS A TRANSLATION OF A COMPLEX ANALOGUE OF
5075C     THE ALGOL PROCEDURE TRED3, NUM. MATH. 11, 181-195(1968)
5076C     BY MARTIN, REINSCH, AND WILKINSON.
5077C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971).
5078C
5079C     THIS SUBROUTINE REDUCES A COMPLEX HERMITIAN MATRIX, STORED AS
5080C     A SINGLE SQUARE ARRAY, TO A REAL SYMMETRIC TRIDIAGONAL MATRIX
5081C     USING UNITARY SIMILARITY TRANSFORMATIONS.
5082C
5083C     ON INPUT
5084C
5085C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
5086C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
5087C          DIMENSION STATEMENT.
5088C
5089C        N IS THE ORDER OF THE MATRIX.
5090C
5091C        A CONTAINS THE LOWER TRIANGLE OF THE COMPLEX HERMITIAN INPUT
5092C          MATRIX.  THE REAL PARTS OF THE MATRIX ELEMENTS ARE STORED
5093C          IN THE FULL LOWER TRIANGLE OF A, AND THE IMAGINARY PARTS
5094C          ARE STORED IN THE TRANSPOSED POSITIONS OF THE STRICT UPPER
5095C          TRIANGLE OF A.  NO STORAGE IS REQUIRED FOR THE ZERO
5096C          IMAGINARY PARTS OF THE DIAGONAL ELEMENTS.
5097C
5098C     ON OUTPUT
5099C
5100C        A CONTAINS INFORMATION ABOUT THE UNITARY TRANSFORMATIONS
5101C          USED IN THE REDUCTION.
5102C
5103C        D CONTAINS THE DIAGONAL ELEMENTS OF THE THE TRIDIAGONAL MATRIX.
5104C
5105C        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE TRIDIAGONAL
5106C          MATRIX IN ITS LAST N-1 POSITIONS.  E(1) IS SET TO ZERO.
5107C
5108C        E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E.
5109C          E2 MAY COINCIDE WITH E IF THE SQUARES ARE NOT NEEDED.
5110C
5111C        TAU CONTAINS FURTHER INFORMATION ABOUT THE TRANSFORMATIONS.
5112C
5113C     CALLS PYTHAG FOR  DSQRT(A*A + B*B) .
5114C
5115C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
5116C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
5117C
5118C     THIS VERSION DATED AUGUST 1983.
5119C
5120C     ------------------------------------------------------------------
5121C
5122      TAU(1,N) = 1.0D0
5123      TAU(2,N) = 0.0D0
5124C     .......... FOR I=N STEP -1 UNTIL 1 DO -- ..........
5125      DO 300 II = 1, N
5126         I = N + 1 - II
5127         L = I - 1
5128         H = 0.0D0
5129         SCALE = 0.0D0
5130         IF (L .LT. 1) GO TO 130
5131C     .......... SCALE ROW (ALGOL TOL THEN NOT NEEDED) ..........
5132         DO 120 K = 1, L
5133  120    SCALE = SCALE + DABS(A(I,K)) + DABS(A(K,I))
5134C
5135         IF (SCALE .NE. 0.0D0) GO TO 140
5136         TAU(1,L) = 1.0D0
5137         TAU(2,L) = 0.0D0
5138  130    E(I) = 0.0D0
5139         E2(I) = 0.0D0
5140         GO TO 290
5141C
5142  140    DO 150 K = 1, L
5143            A(I,K) = A(I,K) / SCALE
5144            A(K,I) = A(K,I) / SCALE
5145            H = H + A(I,K) * A(I,K) + A(K,I) * A(K,I)
5146  150    CONTINUE
5147C
5148         E2(I) = SCALE * SCALE * H
5149         G = DSQRT(H)
5150         E(I) = SCALE * G
5151         F = PYTHAG(A(I,L),A(L,I))
5152C     .......... FORM NEXT DIAGONAL ELEMENT OF MATRIX T ..........
5153         IF (F .EQ. 0.0D0) GO TO 160
5154         TAU(1,L) = (A(L,I) * TAU(2,I) - A(I,L) * TAU(1,I)) / F
5155         SI = (A(I,L) * TAU(2,I) + A(L,I) * TAU(1,I)) / F
5156         H = H + F * G
5157         G = 1.0D0 + G / F
5158         A(I,L) = G * A(I,L)
5159         A(L,I) = G * A(L,I)
5160         IF (L .EQ. 1) GO TO 270
5161         GO TO 170
5162  160    TAU(1,L) = -TAU(1,I)
5163         SI = TAU(2,I)
5164         A(I,L) = G
5165  170    F = 0.0D0
5166C
5167         DO 240 J = 1, L
5168            G = 0.0D0
5169            GI = 0.0D0
5170            IF (J .EQ. 1) GO TO 190
5171            JM1 = J - 1
5172C     .......... FORM ELEMENT OF A*U ..........
5173            DO 180 K = 1, JM1
5174               G = G + A(J,K) * A(I,K) + A(K,J) * A(K,I)
5175               GI = GI - A(J,K) * A(K,I) + A(K,J) * A(I,K)
5176  180       CONTINUE
5177C
5178  190       G = G + A(J,J) * A(I,J)
5179            GI = GI - A(J,J) * A(J,I)
5180            JP1 = J + 1
5181            IF (L .LT. JP1) GO TO 220
5182C
5183            DO 200 K = JP1, L
5184               G = G + A(K,J) * A(I,K) - A(J,K) * A(K,I)
5185               GI = GI - A(K,J) * A(K,I) - A(J,K) * A(I,K)
5186  200       CONTINUE
5187C     .......... FORM ELEMENT OF P ..........
5188  220       E(J) = G / H
5189            TAU(2,J) = GI / H
5190            F = F + E(J) * A(I,J) - TAU(2,J) * A(J,I)
5191  240    CONTINUE
5192C
5193         HH = F / (H + H)
5194C     .......... FORM REDUCED A ..........
5195         DO 260 J = 1, L
5196            F = A(I,J)
5197            G = E(J) - HH * F
5198            E(J) = G
5199            FI = -A(J,I)
5200            GI = TAU(2,J) - HH * FI
5201            TAU(2,J) = -GI
5202            A(J,J) = A(J,J) - 2.0D0 * (F * G + FI * GI)
5203            IF (J .EQ. 1) GO TO 260
5204            JM1 = J - 1
5205C
5206            DO 250 K = 1, JM1
5207               A(J,K) = A(J,K) - F * E(K) - G * A(I,K)
5208     X                         + FI * TAU(2,K) + GI * A(K,I)
5209               A(K,J) = A(K,J) - F * TAU(2,K) - G * A(K,I)
5210     X                         - FI * E(K) - GI * A(I,K)
5211  250       CONTINUE
5212C
5213  260    CONTINUE
5214C
5215  270    DO 280 K = 1, L
5216            A(I,K) = SCALE * A(I,K)
5217            A(K,I) = SCALE * A(K,I)
5218  280    CONTINUE
5219C
5220         TAU(2,L) = -SI
5221  290    D(I) = A(I,I)
5222         A(I,I) = SCALE * DSQRT(H)
5223  300 CONTINUE
5224C
5225      RETURN
5226      END
5227      SUBROUTINE HTRIDI(NM,N,AR,AI,D,E,E2,TAU)
5228C
5229      INTEGER I,J,K,L,N,II,NM,JP1
5230      DOUBLE PRECISION AR(NM,N),AI(NM,N),D(N),E(N),E2(N),TAU(2,N)
5231      DOUBLE PRECISION F,G,H,FI,GI,HH,SI,SCALE,PYTHAG
5232C
5233C     THIS SUBROUTINE IS A TRANSLATION OF A COMPLEX ANALOGUE OF
5234C     THE ALGOL PROCEDURE TRED1, NUM. MATH. 11, 181-195(1968)
5235C     BY MARTIN, REINSCH, AND WILKINSON.
5236C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971).
5237C
5238C     THIS SUBROUTINE REDUCES A COMPLEX HERMITIAN MATRIX
5239C     TO A REAL SYMMETRIC TRIDIAGONAL MATRIX USING
5240C     UNITARY SIMILARITY TRANSFORMATIONS.
5241C
5242C     ON INPUT
5243C
5244C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
5245C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
5246C          DIMENSION STATEMENT.
5247C
5248C        N IS THE ORDER OF THE MATRIX.
5249C
5250C        AR AND AI CONTAIN THE REAL AND IMAGINARY PARTS,
5251C          RESPECTIVELY, OF THE COMPLEX HERMITIAN INPUT MATRIX.
5252C          ONLY THE LOWER TRIANGLE OF THE MATRIX NEED BE SUPPLIED.
5253C
5254C     ON OUTPUT
5255C
5256C        AR AND AI CONTAIN INFORMATION ABOUT THE UNITARY TRANS-
5257C          FORMATIONS USED IN THE REDUCTION IN THEIR FULL LOWER
5258C          TRIANGLES.  THEIR STRICT UPPER TRIANGLES AND THE
5259C          DIAGONAL OF AR ARE UNALTERED.
5260C
5261C        D CONTAINS THE DIAGONAL ELEMENTS OF THE THE TRIDIAGONAL MATRIX.
5262C
5263C        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE TRIDIAGONAL
5264C          MATRIX IN ITS LAST N-1 POSITIONS.  E(1) IS SET TO ZERO.
5265C
5266C        E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E.
5267C          E2 MAY COINCIDE WITH E IF THE SQUARES ARE NOT NEEDED.
5268C
5269C        TAU CONTAINS FURTHER INFORMATION ABOUT THE TRANSFORMATIONS.
5270C
5271C     CALLS PYTHAG FOR  DSQRT(A*A + B*B) .
5272C
5273C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
5274C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
5275C
5276C     THIS VERSION DATED AUGUST 1983.
5277C
5278C     ------------------------------------------------------------------
5279C
5280      TAU(1,N) = 1.0D0
5281      TAU(2,N) = 0.0D0
5282C
5283      DO 100 I = 1, N
5284  100 D(I) = AR(I,I)
5285C     .......... FOR I=N STEP -1 UNTIL 1 DO -- ..........
5286      DO 300 II = 1, N
5287         I = N + 1 - II
5288         L = I - 1
5289         H = 0.0D0
5290         SCALE = 0.0D0
5291         IF (L .LT. 1) GO TO 130
5292C     .......... SCALE ROW (ALGOL TOL THEN NOT NEEDED) ..........
5293         DO 120 K = 1, L
5294  120    SCALE = SCALE + DABS(AR(I,K)) + DABS(AI(I,K))
5295C
5296         IF (SCALE .NE. 0.0D0) GO TO 140
5297         TAU(1,L) = 1.0D0
5298         TAU(2,L) = 0.0D0
5299  130    E(I) = 0.0D0
5300         E2(I) = 0.0D0
5301         GO TO 290
5302C
5303  140    DO 150 K = 1, L
5304            AR(I,K) = AR(I,K) / SCALE
5305            AI(I,K) = AI(I,K) / SCALE
5306            H = H + AR(I,K) * AR(I,K) + AI(I,K) * AI(I,K)
5307  150    CONTINUE
5308C
5309         E2(I) = SCALE * SCALE * H
5310         G = DSQRT(H)
5311         E(I) = SCALE * G
5312         F = PYTHAG(AR(I,L),AI(I,L))
5313C     .......... FORM NEXT DIAGONAL ELEMENT OF MATRIX T ..........
5314         IF (F .EQ. 0.0D0) GO TO 160
5315         TAU(1,L) = (AI(I,L) * TAU(2,I) - AR(I,L) * TAU(1,I)) / F
5316         SI = (AR(I,L) * TAU(2,I) + AI(I,L) * TAU(1,I)) / F
5317         H = H + F * G
5318         G = 1.0D0 + G / F
5319         AR(I,L) = G * AR(I,L)
5320         AI(I,L) = G * AI(I,L)
5321         IF (L .EQ. 1) GO TO 270
5322         GO TO 170
5323  160    TAU(1,L) = -TAU(1,I)
5324         SI = TAU(2,I)
5325         AR(I,L) = G
5326  170    F = 0.0D0
5327C
5328         DO 240 J = 1, L
5329            G = 0.0D0
5330            GI = 0.0D0
5331C     .......... FORM ELEMENT OF A*U ..........
5332            DO 180 K = 1, J
5333               G = G + AR(J,K) * AR(I,K) + AI(J,K) * AI(I,K)
5334               GI = GI - AR(J,K) * AI(I,K) + AI(J,K) * AR(I,K)
5335  180       CONTINUE
5336C
5337            JP1 = J + 1
5338            IF (L .LT. JP1) GO TO 220
5339C
5340            DO 200 K = JP1, L
5341               G = G + AR(K,J) * AR(I,K) - AI(K,J) * AI(I,K)
5342               GI = GI - AR(K,J) * AI(I,K) - AI(K,J) * AR(I,K)
5343  200       CONTINUE
5344C     .......... FORM ELEMENT OF P ..........
5345  220       E(J) = G / H
5346            TAU(2,J) = GI / H
5347            F = F + E(J) * AR(I,J) - TAU(2,J) * AI(I,J)
5348  240    CONTINUE
5349C
5350         HH = F / (H + H)
5351C     .......... FORM REDUCED A ..........
5352         DO 260 J = 1, L
5353            F = AR(I,J)
5354            G = E(J) - HH * F
5355            E(J) = G
5356            FI = -AI(I,J)
5357            GI = TAU(2,J) - HH * FI
5358            TAU(2,J) = -GI
5359C
5360            DO 260 K = 1, J
5361               AR(J,K) = AR(J,K) - F * E(K) - G * AR(I,K)
5362     X                           + FI * TAU(2,K) + GI * AI(I,K)
5363               AI(J,K) = AI(J,K) - F * TAU(2,K) - G * AI(I,K)
5364     X                           - FI * E(K) - GI * AR(I,K)
5365  260    CONTINUE
5366C
5367  270    DO 280 K = 1, L
5368            AR(I,K) = SCALE * AR(I,K)
5369            AI(I,K) = SCALE * AI(I,K)
5370  280    CONTINUE
5371C
5372         TAU(2,L) = -SI
5373  290    HH = D(I)
5374         D(I) = AR(I,I)
5375         AR(I,I) = HH
5376         AI(I,I) = SCALE * DSQRT(H)
5377  300 CONTINUE
5378C
5379      RETURN
5380      END
5381      SUBROUTINE IMTQL1(N,D,E,IERR)
5382C
5383      INTEGER I,J,L,M,N,II,MML,IERR
5384      DOUBLE PRECISION D(N),E(N)
5385      DOUBLE PRECISION B,C,F,G,P,R,S,TST1,TST2,PYTHAG
5386C
5387C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE IMTQL1,
5388C     NUM. MATH. 12, 377-383(1968) BY MARTIN AND WILKINSON,
5389C     AS MODIFIED IN NUM. MATH. 15, 450(1970) BY DUBRULLE.
5390C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 241-248(1971).
5391C
5392C     THIS SUBROUTINE FINDS THE EIGENVALUES OF A SYMMETRIC
5393C     TRIDIAGONAL MATRIX BY THE IMPLICIT QL METHOD.
5394C
5395C     ON INPUT
5396C
5397C        N IS THE ORDER OF THE MATRIX.
5398C
5399C        D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX.
5400C
5401C        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE INPUT MATRIX
5402C          IN ITS LAST N-1 POSITIONS.  E(1) IS ARBITRARY.
5403C
5404C      ON OUTPUT
5405C
5406C        D CONTAINS THE EIGENVALUES IN ASCENDING ORDER.  IF AN
5407C          ERROR EXIT IS MADE, THE EIGENVALUES ARE CORRECT AND
5408C          ORDERED FOR INDICES 1,2,...IERR-1, BUT MAY NOT BE
5409C          THE SMALLEST EIGENVALUES.
5410C
5411C        E HAS BEEN DESTROYED.
5412C
5413C        IERR IS SET TO
5414C          ZERO       FOR NORMAL RETURN,
5415C          J          IF THE J-TH EIGENVALUE HAS NOT BEEN
5416C                     DETERMINED AFTER 30 ITERATIONS.
5417C
5418C     CALLS PYTHAG FOR  DSQRT(A*A + B*B) .
5419C
5420C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
5421C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
5422C
5423C     THIS VERSION DATED AUGUST 1983.
5424C
5425C     ------------------------------------------------------------------
5426C
5427      IERR = 0
5428      IF (N .EQ. 1) GO TO 1001
5429C
5430      DO 100 I = 2, N
5431  100 E(I-1) = E(I)
5432C
5433      E(N) = 0.0D0
5434C
5435      DO 290 L = 1, N
5436         J = 0
5437C     .......... LOOK FOR SMALL SUB-DIAGONAL ELEMENT ..........
5438  105    DO 110 M = L, N
5439            IF (M .EQ. N) GO TO 120
5440            TST1 = DABS(D(M)) + DABS(D(M+1))
5441            TST2 = TST1 + DABS(E(M))
5442            IF (TST2 .EQ. TST1) GO TO 120
5443  110    CONTINUE
5444C
5445  120    P = D(L)
5446         IF (M .EQ. L) GO TO 215
5447         IF (J .EQ. 30) GO TO 1000
5448         J = J + 1
5449C     .......... FORM SHIFT ..........
5450         G = (D(L+1) - P) / (2.0D0 * E(L))
5451         R = PYTHAG(G,1.0D0)
5452         G = D(M) - P + E(L) / (G + DSIGN(R,G))
5453         S = 1.0D0
5454         C = 1.0D0
5455         P = 0.0D0
5456         MML = M - L
5457C     .......... FOR I=M-1 STEP -1 UNTIL L DO -- ..........
5458         DO 200 II = 1, MML
5459            I = M - II
5460            F = S * E(I)
5461            B = C * E(I)
5462            R = PYTHAG(F,G)
5463            E(I+1) = R
5464            IF (R .EQ. 0.0D0) GO TO 210
5465            S = F / R
5466            C = G / R
5467            G = D(I+1) - P
5468            R = (D(I) - G) * S + 2.0D0 * C * B
5469            P = S * R
5470            D(I+1) = G + P
5471            G = C * R - B
5472  200    CONTINUE
5473C
5474         D(L) = D(L) - P
5475         E(L) = G
5476         E(M) = 0.0D0
5477         GO TO 105
5478C     .......... RECOVER FROM UNDERFLOW ..........
5479  210    D(I+1) = D(I+1) - P
5480         E(M) = 0.0D0
5481         GO TO 105
5482C     .......... ORDER EIGENVALUES ..........
5483  215    IF (L .EQ. 1) GO TO 250
5484C     .......... FOR I=L STEP -1 UNTIL 2 DO -- ..........
5485         DO 230 II = 2, L
5486            I = L + 2 - II
5487            IF (P .GE. D(I-1)) GO TO 270
5488            D(I) = D(I-1)
5489  230    CONTINUE
5490C
5491  250    I = 1
5492  270    D(I) = P
5493  290 CONTINUE
5494C
5495      GO TO 1001
5496C     .......... SET ERROR -- NO CONVERGENCE TO AN
5497C                EIGENVALUE AFTER 30 ITERATIONS ..........
5498 1000 IERR = L
5499 1001 RETURN
5500      END
5501      SUBROUTINE IMTQL2(NM,N,D,E,Z,IERR)
5502C
5503      INTEGER I,J,K,L,M,N,II,NM,MML,IERR
5504      DOUBLE PRECISION D(N),E(N),Z(NM,N)
5505      DOUBLE PRECISION B,C,F,G,P,R,S,TST1,TST2,PYTHAG
5506C
5507C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE IMTQL2,
5508C     NUM. MATH. 12, 377-383(1968) BY MARTIN AND WILKINSON,
5509C     AS MODIFIED IN NUM. MATH. 15, 450(1970) BY DUBRULLE.
5510C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 241-248(1971).
5511C
5512C     THIS SUBROUTINE FINDS THE EIGENVALUES AND EIGENVECTORS
5513C     OF A SYMMETRIC TRIDIAGONAL MATRIX BY THE IMPLICIT QL METHOD.
5514C     THE EIGENVECTORS OF A FULL SYMMETRIC MATRIX CAN ALSO
5515C     BE FOUND IF  TRED2  HAS BEEN USED TO REDUCE THIS
5516C     FULL MATRIX TO TRIDIAGONAL FORM.
5517C
5518C     ON INPUT
5519C
5520C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
5521C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
5522C          DIMENSION STATEMENT.
5523C
5524C        N IS THE ORDER OF THE MATRIX.
5525C
5526C        D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX.
5527C
5528C        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE INPUT MATRIX
5529C          IN ITS LAST N-1 POSITIONS.  E(1) IS ARBITRARY.
5530C
5531C        Z CONTAINS THE TRANSFORMATION MATRIX PRODUCED IN THE
5532C          REDUCTION BY  TRED2, IF PERFORMED.  IF THE EIGENVECTORS
5533C          OF THE TRIDIAGONAL MATRIX ARE DESIRED, Z MUST CONTAIN
5534C          THE IDENTITY MATRIX.
5535C
5536C      ON OUTPUT
5537C
5538C        D CONTAINS THE EIGENVALUES IN ASCENDING ORDER.  IF AN
5539C          ERROR EXIT IS MADE, THE EIGENVALUES ARE CORRECT BUT
5540C          UNORDERED FOR INDICES 1,2,...,IERR-1.
5541C
5542C        E HAS BEEN DESTROYED.
5543C
5544C        Z CONTAINS ORTHONORMAL EIGENVECTORS OF THE SYMMETRIC
5545C          TRIDIAGONAL (OR FULL) MATRIX.  IF AN ERROR EXIT IS MADE,
5546C          Z CONTAINS THE EIGENVECTORS ASSOCIATED WITH THE STORED
5547C          EIGENVALUES.
5548C
5549C        IERR IS SET TO
5550C          ZERO       FOR NORMAL RETURN,
5551C          J          IF THE J-TH EIGENVALUE HAS NOT BEEN
5552C                     DETERMINED AFTER 30 ITERATIONS.
5553C
5554C     CALLS PYTHAG FOR  DSQRT(A*A + B*B) .
5555C
5556C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
5557C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
5558C
5559C     THIS VERSION DATED AUGUST 1983.
5560C
5561C     ------------------------------------------------------------------
5562C
5563      IERR = 0
5564      IF (N .EQ. 1) GO TO 1001
5565C
5566      DO 100 I = 2, N
5567  100 E(I-1) = E(I)
5568C
5569      E(N) = 0.0D0
5570C
5571      DO 240 L = 1, N
5572         J = 0
5573C     .......... LOOK FOR SMALL SUB-DIAGONAL ELEMENT ..........
5574  105    DO 110 M = L, N
5575            IF (M .EQ. N) GO TO 120
5576            TST1 = DABS(D(M)) + DABS(D(M+1))
5577            TST2 = TST1 + DABS(E(M))
5578            IF (TST2 .EQ. TST1) GO TO 120
5579  110    CONTINUE
5580C
5581  120    P = D(L)
5582         IF (M .EQ. L) GO TO 240
5583         IF (J .EQ. 30) GO TO 1000
5584         J = J + 1
5585C     .......... FORM SHIFT ..........
5586         G = (D(L+1) - P) / (2.0D0 * E(L))
5587         R = PYTHAG(G,1.0D0)
5588         G = D(M) - P + E(L) / (G + DSIGN(R,G))
5589         S = 1.0D0
5590         C = 1.0D0
5591         P = 0.0D0
5592         MML = M - L
5593C     .......... FOR I=M-1 STEP -1 UNTIL L DO -- ..........
5594         DO 200 II = 1, MML
5595            I = M - II
5596            F = S * E(I)
5597            B = C * E(I)
5598            R = PYTHAG(F,G)
5599            E(I+1) = R
5600            IF (R .EQ. 0.0D0) GO TO 210
5601            S = F / R
5602            C = G / R
5603            G = D(I+1) - P
5604            R = (D(I) - G) * S + 2.0D0 * C * B
5605            P = S * R
5606            D(I+1) = G + P
5607            G = C * R - B
5608C     .......... FORM VECTOR ..........
5609            DO 180 K = 1, N
5610               F = Z(K,I+1)
5611               Z(K,I+1) = S * Z(K,I) + C * F
5612               Z(K,I) = C * Z(K,I) - S * F
5613  180       CONTINUE
5614C
5615  200    CONTINUE
5616C
5617         D(L) = D(L) - P
5618         E(L) = G
5619         E(M) = 0.0D0
5620         GO TO 105
5621C     .......... RECOVER FROM UNDERFLOW ..........
5622  210    D(I+1) = D(I+1) - P
5623         E(M) = 0.0D0
5624         GO TO 105
5625  240 CONTINUE
5626C     .......... ORDER EIGENVALUES AND EIGENVECTORS ..........
5627      DO 300 II = 2, N
5628         I = II - 1
5629         K = I
5630         P = D(I)
5631C
5632         DO 260 J = II, N
5633            IF (D(J) .GE. P) GO TO 260
5634            K = J
5635            P = D(J)
5636  260    CONTINUE
5637C
5638         IF (K .EQ. I) GO TO 300
5639         D(K) = D(I)
5640         D(I) = P
5641C
5642         DO 280 J = 1, N
5643            P = Z(J,I)
5644            Z(J,I) = Z(J,K)
5645            Z(J,K) = P
5646  280    CONTINUE
5647C
5648  300 CONTINUE
5649C
5650      GO TO 1001
5651C     .......... SET ERROR -- NO CONVERGENCE TO AN
5652C                EIGENVALUE AFTER 30 ITERATIONS ..........
5653 1000 IERR = L
5654 1001 RETURN
5655      END
5656      SUBROUTINE IMTQLV(N,D,E,E2,W,IND,IERR,RV1)
5657C
5658      INTEGER I,J,K,L,M,N,II,MML,TAG,IERR
5659      DOUBLE PRECISION D(N),E(N),E2(N),W(N),RV1(N)
5660      DOUBLE PRECISION B,C,F,G,P,R,S,TST1,TST2,PYTHAG
5661      INTEGER IND(N)
5662C
5663C     THIS SUBROUTINE IS A VARIANT OF  IMTQL1  WHICH IS A TRANSLATION OF
5664C     ALGOL PROCEDURE IMTQL1, NUM. MATH. 12, 377-383(1968) BY MARTIN AND
5665C     WILKINSON, AS MODIFIED IN NUM. MATH. 15, 450(1970) BY DUBRULLE.
5666C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 241-248(1971).
5667C
5668C     THIS SUBROUTINE FINDS THE EIGENVALUES OF A SYMMETRIC TRIDIAGONAL
5669C     MATRIX BY THE IMPLICIT QL METHOD AND ASSOCIATES WITH THEM
5670C     THEIR CORRESPONDING SUBMATRIX INDICES.
5671C
5672C     ON INPUT
5673C
5674C        N IS THE ORDER OF THE MATRIX.
5675C
5676C        D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX.
5677C
5678C        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE INPUT MATRIX
5679C          IN ITS LAST N-1 POSITIONS.  E(1) IS ARBITRARY.
5680C
5681C        E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E.
5682C          E2(1) IS ARBITRARY.
5683C
5684C     ON OUTPUT
5685C
5686C        D AND E ARE UNALTERED.
5687C
5688C        ELEMENTS OF E2, CORRESPONDING TO ELEMENTS OF E REGARDED
5689C          AS NEGLIGIBLE, HAVE BEEN REPLACED BY ZERO CAUSING THE
5690C          MATRIX TO SPLIT INTO A DIRECT SUM OF SUBMATRICES.
5691C          E2(1) IS ALSO SET TO ZERO.
5692C
5693C        W CONTAINS THE EIGENVALUES IN ASCENDING ORDER.  IF AN
5694C          ERROR EXIT IS MADE, THE EIGENVALUES ARE CORRECT AND
5695C          ORDERED FOR INDICES 1,2,...IERR-1, BUT MAY NOT BE
5696C          THE SMALLEST EIGENVALUES.
5697C
5698C        IND CONTAINS THE SUBMATRIX INDICES ASSOCIATED WITH THE
5699C          CORRESPONDING EIGENVALUES IN W -- 1 FOR EIGENVALUES
5700C          BELONGING TO THE FIRST SUBMATRIX FROM THE TOP,
5701C          2 FOR THOSE BELONGING TO THE SECOND SUBMATRIX, ETC..
5702C
5703C        IERR IS SET TO
5704C          ZERO       FOR NORMAL RETURN,
5705C          J          IF THE J-TH EIGENVALUE HAS NOT BEEN
5706C                     DETERMINED AFTER 30 ITERATIONS.
5707C
5708C        RV1 IS A TEMPORARY STORAGE ARRAY.
5709C
5710C     CALLS PYTHAG FOR  DSQRT(A*A + B*B) .
5711C
5712C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
5713C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
5714C
5715C     THIS VERSION DATED AUGUST 1983.
5716C
5717C     ------------------------------------------------------------------
5718C
5719      IERR = 0
5720      K = 0
5721      TAG = 0
5722C
5723      DO 100 I = 1, N
5724         W(I) = D(I)
5725         IF (I .NE. 1) RV1(I-1) = E(I)
5726  100 CONTINUE
5727C
5728      E2(1) = 0.0D0
5729      RV1(N) = 0.0D0
5730C
5731      DO 290 L = 1, N
5732         J = 0
5733C     .......... LOOK FOR SMALL SUB-DIAGONAL ELEMENT ..........
5734  105    DO 110 M = L, N
5735            IF (M .EQ. N) GO TO 120
5736            TST1 = DABS(W(M)) + DABS(W(M+1))
5737            TST2 = TST1 + DABS(RV1(M))
5738            IF (TST2 .EQ. TST1) GO TO 120
5739C     .......... GUARD AGAINST UNDERFLOWED ELEMENT OF E2 ..........
5740            IF (E2(M+1) .EQ. 0.0D0) GO TO 125
5741  110    CONTINUE
5742C
5743  120    IF (M .LE. K) GO TO 130
5744         IF (M .NE. N) E2(M+1) = 0.0D0
5745  125    K = M
5746         TAG = TAG + 1
5747  130    P = W(L)
5748         IF (M .EQ. L) GO TO 215
5749         IF (J .EQ. 30) GO TO 1000
5750         J = J + 1
5751C     .......... FORM SHIFT ..........
5752         G = (W(L+1) - P) / (2.0D0 * RV1(L))
5753         R = PYTHAG(G,1.0D0)
5754         G = W(M) - P + RV1(L) / (G + DSIGN(R,G))
5755         S = 1.0D0
5756         C = 1.0D0
5757         P = 0.0D0
5758         MML = M - L
5759C     .......... FOR I=M-1 STEP -1 UNTIL L DO -- ..........
5760         DO 200 II = 1, MML
5761            I = M - II
5762            F = S * RV1(I)
5763            B = C * RV1(I)
5764            R = PYTHAG(F,G)
5765            RV1(I+1) = R
5766            IF (R .EQ. 0.0D0) GO TO 210
5767            S = F / R
5768            C = G / R
5769            G = W(I+1) - P
5770            R = (W(I) - G) * S + 2.0D0 * C * B
5771            P = S * R
5772            W(I+1) = G + P
5773            G = C * R - B
5774  200    CONTINUE
5775C
5776         W(L) = W(L) - P
5777         RV1(L) = G
5778         RV1(M) = 0.0D0
5779         GO TO 105
5780C     .......... RECOVER FROM UNDERFLOW ..........
5781  210    W(I+1) = W(I+1) - P
5782         RV1(M) = 0.0D0
5783         GO TO 105
5784C     .......... ORDER EIGENVALUES ..........
5785  215    IF (L .EQ. 1) GO TO 250
5786C     .......... FOR I=L STEP -1 UNTIL 2 DO -- ..........
5787         DO 230 II = 2, L
5788            I = L + 2 - II
5789            IF (P .GE. W(I-1)) GO TO 270
5790            W(I) = W(I-1)
5791            IND(I) = IND(I-1)
5792  230    CONTINUE
5793C
5794  250    I = 1
5795  270    W(I) = P
5796         IND(I) = TAG
5797  290 CONTINUE
5798C
5799      GO TO 1001
5800C     .......... SET ERROR -- NO CONVERGENCE TO AN
5801C                EIGENVALUE AFTER 30 ITERATIONS ..........
5802 1000 IERR = L
5803 1001 RETURN
5804      END
5805      SUBROUTINE INVIT(NM,N,A,WR,WI,SELECT,MM,M,Z,IERR,RM1,RV1,RV2)
5806C
5807      INTEGER I,J,K,L,M,N,S,II,IP,MM,MP,NM,NS,N1,UK,IP1,ITS,KM1,IERR
5808      DOUBLE PRECISION A(NM,N),WR(N),WI(N),Z(NM,MM),RM1(N,N),
5809     X       RV1(N),RV2(N)
5810      DOUBLE PRECISION T,W,X,Y,EPS3,NORM,NORMV,EPSLON,GROWTO,ILAMBD,
5811     X       PYTHAG,RLAMBD,UKROOT
5812      LOGICAL SELECT(N)
5813C
5814C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE INVIT
5815C     BY PETERS AND WILKINSON.
5816C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 418-439(1971).
5817C
5818C     THIS SUBROUTINE FINDS THOSE EIGENVECTORS OF A REAL UPPER
5819C     HESSENBERG MATRIX CORRESPONDING TO SPECIFIED EIGENVALUES,
5820C     USING INVERSE ITERATION.
5821C
5822C     ON INPUT
5823C
5824C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
5825C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
5826C          DIMENSION STATEMENT.
5827C
5828C        N IS THE ORDER OF THE MATRIX.
5829C
5830C        A CONTAINS THE HESSENBERG MATRIX.
5831C
5832C        WR AND WI CONTAIN THE REAL AND IMAGINARY PARTS, RESPECTIVELY,
5833C          OF THE EIGENVALUES OF THE MATRIX.  THE EIGENVALUES MUST BE
5834C          STORED IN A MANNER IDENTICAL TO THAT OF SUBROUTINE  HQR,
5835C          WHICH RECOGNIZES POSSIBLE SPLITTING OF THE MATRIX.
5836C
5837C        SELECT SPECIFIES THE EIGENVECTORS TO BE FOUND. THE
5838C          EIGENVECTOR CORRESPONDING TO THE J-TH EIGENVALUE IS
5839C          SPECIFIED BY SETTING SELECT(J) TO .TRUE..
5840C
5841C        MM SHOULD BE SET TO AN UPPER BOUND FOR THE NUMBER OF
5842C          COLUMNS REQUIRED TO STORE THE EIGENVECTORS TO BE FOUND.
5843C          NOTE THAT TWO COLUMNS ARE REQUIRED TO STORE THE
5844C          EIGENVECTOR CORRESPONDING TO A COMPLEX EIGENVALUE.
5845C
5846C     ON OUTPUT
5847C
5848C        A AND WI ARE UNALTERED.
5849C
5850C        WR MAY HAVE BEEN ALTERED SINCE CLOSE EIGENVALUES ARE PERTURBED
5851C          SLIGHTLY IN SEARCHING FOR INDEPENDENT EIGENVECTORS.
5852C
5853C        SELECT MAY HAVE BEEN ALTERED.  IF THE ELEMENTS CORRESPONDING
5854C          TO A PAIR OF CONJUGATE COMPLEX EIGENVALUES WERE EACH
5855C          INITIALLY SET TO .TRUE., THE PROGRAM RESETS THE SECOND OF
5856C          THE TWO ELEMENTS TO .FALSE..
5857C
5858C        M IS THE NUMBER OF COLUMNS ACTUALLY USED TO STORE
5859C          THE EIGENVECTORS.
5860C
5861C        Z CONTAINS THE REAL AND IMAGINARY PARTS OF THE EIGENVECTORS.
5862C          IF THE NEXT SELECTED EIGENVALUE IS REAL, THE NEXT COLUMN
5863C          OF Z CONTAINS ITS EIGENVECTOR.  IF THE EIGENVALUE IS
5864C          COMPLEX, THE NEXT TWO COLUMNS OF Z CONTAIN THE REAL AND
5865C          IMAGINARY PARTS OF ITS EIGENVECTOR.  THE EIGENVECTORS ARE
5866C          NORMALIZED SO THAT THE COMPONENT OF LARGEST MAGNITUDE IS 1.
5867C          ANY VECTOR WHICH FAILS THE ACCEPTANCE TEST IS SET TO ZERO.
5868C
5869C        IERR IS SET TO
5870C          ZERO       FOR NORMAL RETURN,
5871C          -(2*N+1)   IF MORE THAN MM COLUMNS OF Z ARE NECESSARY
5872C                     TO STORE THE EIGENVECTORS CORRESPONDING TO
5873C                     THE SPECIFIED EIGENVALUES.
5874C          -K         IF THE ITERATION CORRESPONDING TO THE K-TH
5875C                     VALUE FAILS,
5876C          -(N+K)     IF BOTH ERROR SITUATIONS OCCUR.
5877C
5878C        RM1, RV1, AND RV2 ARE TEMPORARY STORAGE ARRAYS.  NOTE THAT RM1
5879C          IS SQUARE OF DIMENSION N BY N AND, AUGMENTED BY TWO COLUMNS
5880C          OF Z, IS THE TRANSPOSE OF THE CORRESPONDING ALGOL B ARRAY.
5881C
5882C     THE ALGOL PROCEDURE GUESSVEC APPEARS IN INVIT IN LINE.
5883C
5884C     CALLS CDIV FOR COMPLEX DIVISION.
5885C     CALLS PYTHAG FOR  DSQRT(A*A + B*B) .
5886C
5887C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
5888C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
5889C
5890C     THIS VERSION DATED AUGUST 1983.
5891C
5892C     ------------------------------------------------------------------
5893C
5894      IERR = 0
5895      UK = 0
5896      S = 1
5897C     .......... IP = 0, REAL EIGENVALUE
5898C                     1, FIRST OF CONJUGATE COMPLEX PAIR
5899C                    -1, SECOND OF CONJUGATE COMPLEX PAIR ..........
5900      IP = 0
5901      N1 = N - 1
5902C
5903      DO 980 K = 1, N
5904         IF (WI(K) .EQ. 0.0D0 .OR. IP .LT. 0) GO TO 100
5905         IP = 1
5906         IF (SELECT(K) .AND. SELECT(K+1)) SELECT(K+1) = .FALSE.
5907  100    IF (.NOT. SELECT(K)) GO TO 960
5908         IF (WI(K) .NE. 0.0D0) S = S + 1
5909         IF (S .GT. MM) GO TO 1000
5910         IF (UK .GE. K) GO TO 200
5911C     .......... CHECK FOR POSSIBLE SPLITTING ..........
5912         DO 120 UK = K, N
5913            IF (UK .EQ. N) GO TO 140
5914            IF (A(UK+1,UK) .EQ. 0.0D0) GO TO 140
5915  120    CONTINUE
5916C     .......... COMPUTE INFINITY NORM OF LEADING UK BY UK
5917C                (HESSENBERG) MATRIX ..........
5918  140    NORM = 0.0D0
5919         MP = 1
5920C
5921         DO 180 I = 1, UK
5922            X = 0.0D0
5923C
5924            DO 160 J = MP, UK
5925  160       X = X + DABS(A(I,J))
5926C
5927            IF (X .GT. NORM) NORM = X
5928            MP = I
5929  180    CONTINUE
5930C     .......... EPS3 REPLACES ZERO PIVOT IN DECOMPOSITION
5931C                AND CLOSE ROOTS ARE MODIFIED BY EPS3 ..........
5932         IF (NORM .EQ. 0.0D0) NORM = 1.0D0
5933         EPS3 = EPSLON(NORM)
5934C     .......... GROWTO IS THE CRITERION FOR THE GROWTH ..........
5935         UKROOT = UK
5936         UKROOT = DSQRT(UKROOT)
5937         GROWTO = 0.1D0 / UKROOT
5938  200    RLAMBD = WR(K)
5939         ILAMBD = WI(K)
5940         IF (K .EQ. 1) GO TO 280
5941         KM1 = K - 1
5942         GO TO 240
5943C     .......... PERTURB EIGENVALUE IF IT IS CLOSE
5944C                TO ANY PREVIOUS EIGENVALUE ..........
5945  220    RLAMBD = RLAMBD + EPS3
5946C     .......... FOR I=K-1 STEP -1 UNTIL 1 DO -- ..........
5947  240    DO 260 II = 1, KM1
5948            I = K - II
5949            IF (SELECT(I) .AND. DABS(WR(I)-RLAMBD) .LT. EPS3 .AND.
5950     X         DABS(WI(I)-ILAMBD) .LT. EPS3) GO TO 220
5951  260    CONTINUE
5952C
5953         WR(K) = RLAMBD
5954C     .......... PERTURB CONJUGATE EIGENVALUE TO MATCH ..........
5955         IP1 = K + IP
5956         WR(IP1) = RLAMBD
5957C     .......... FORM UPPER HESSENBERG A-RLAMBD*I (TRANSPOSED)
5958C                AND INITIAL REAL VECTOR ..........
5959  280    MP = 1
5960C
5961         DO 320 I = 1, UK
5962C
5963            DO 300 J = MP, UK
5964  300       RM1(J,I) = A(I,J)
5965C
5966            RM1(I,I) = RM1(I,I) - RLAMBD
5967            MP = I
5968            RV1(I) = EPS3
5969  320    CONTINUE
5970C
5971         ITS = 0
5972         IF (ILAMBD .NE. 0.0D0) GO TO 520
5973C     .......... REAL EIGENVALUE.
5974C                TRIANGULAR DECOMPOSITION WITH INTERCHANGES,
5975C                REPLACING ZERO PIVOTS BY EPS3 ..........
5976         IF (UK .EQ. 1) GO TO 420
5977C
5978         DO 400 I = 2, UK
5979            MP = I - 1
5980            IF (DABS(RM1(MP,I)) .LE. DABS(RM1(MP,MP))) GO TO 360
5981C
5982            DO 340 J = MP, UK
5983               Y = RM1(J,I)
5984               RM1(J,I) = RM1(J,MP)
5985               RM1(J,MP) = Y
5986  340       CONTINUE
5987C
5988  360       IF (RM1(MP,MP) .EQ. 0.0D0) RM1(MP,MP) = EPS3
5989            X = RM1(MP,I) / RM1(MP,MP)
5990            IF (X .EQ. 0.0D0) GO TO 400
5991C
5992            DO 380 J = I, UK
5993  380       RM1(J,I) = RM1(J,I) - X * RM1(J,MP)
5994C
5995  400    CONTINUE
5996C
5997  420    IF (RM1(UK,UK) .EQ. 0.0D0) RM1(UK,UK) = EPS3
5998C     .......... BACK SUBSTITUTION FOR REAL VECTOR
5999C                FOR I=UK STEP -1 UNTIL 1 DO -- ..........
6000  440    DO 500 II = 1, UK
6001            I = UK + 1 - II
6002            Y = RV1(I)
6003            IF (I .EQ. UK) GO TO 480
6004            IP1 = I + 1
6005C
6006            DO 460 J = IP1, UK
6007  460       Y = Y - RM1(J,I) * RV1(J)
6008C
6009  480       RV1(I) = Y / RM1(I,I)
6010  500    CONTINUE
6011C
6012         GO TO 740
6013C     .......... COMPLEX EIGENVALUE.
6014C                TRIANGULAR DECOMPOSITION WITH INTERCHANGES,
6015C                REPLACING ZERO PIVOTS BY EPS3.  STORE IMAGINARY
6016C                PARTS IN UPPER TRIANGLE STARTING AT (1,3) ..........
6017  520    NS = N - S
6018         Z(1,S-1) = -ILAMBD
6019         Z(1,S) = 0.0D0
6020         IF (N .EQ. 2) GO TO 550
6021         RM1(1,3) = -ILAMBD
6022         Z(1,S-1) = 0.0D0
6023         IF (N .EQ. 3) GO TO 550
6024C
6025         DO 540 I = 4, N
6026  540    RM1(1,I) = 0.0D0
6027C
6028  550    DO 640 I = 2, UK
6029            MP = I - 1
6030            W = RM1(MP,I)
6031            IF (I .LT. N) T = RM1(MP,I+1)
6032            IF (I .EQ. N) T = Z(MP,S-1)
6033            X = RM1(MP,MP) * RM1(MP,MP) + T * T
6034            IF (W * W .LE. X) GO TO 580
6035            X = RM1(MP,MP) / W
6036            Y = T / W
6037            RM1(MP,MP) = W
6038            IF (I .LT. N) RM1(MP,I+1) = 0.0D0
6039            IF (I .EQ. N) Z(MP,S-1) = 0.0D0
6040C
6041            DO 560 J = I, UK
6042               W = RM1(J,I)
6043               RM1(J,I) = RM1(J,MP) - X * W
6044               RM1(J,MP) = W
6045               IF (J .LT. N1) GO TO 555
6046               L = J - NS
6047               Z(I,L) = Z(MP,L) - Y * W
6048               Z(MP,L) = 0.0D0
6049               GO TO 560
6050  555          RM1(I,J+2) = RM1(MP,J+2) - Y * W
6051               RM1(MP,J+2) = 0.0D0
6052  560       CONTINUE
6053C
6054            RM1(I,I) = RM1(I,I) - Y * ILAMBD
6055            IF (I .LT. N1) GO TO 570
6056            L = I - NS
6057            Z(MP,L) = -ILAMBD
6058            Z(I,L) = Z(I,L) + X * ILAMBD
6059            GO TO 640
6060  570       RM1(MP,I+2) = -ILAMBD
6061            RM1(I,I+2) = RM1(I,I+2) + X * ILAMBD
6062            GO TO 640
6063  580       IF (X .NE. 0.0D0) GO TO 600
6064            RM1(MP,MP) = EPS3
6065            IF (I .LT. N) RM1(MP,I+1) = 0.0D0
6066            IF (I .EQ. N) Z(MP,S-1) = 0.0D0
6067            T = 0.0D0
6068            X = EPS3 * EPS3
6069  600       W = W / X
6070            X = RM1(MP,MP) * W
6071            Y = -T * W
6072C
6073            DO 620 J = I, UK
6074               IF (J .LT. N1) GO TO 610
6075               L = J - NS
6076               T = Z(MP,L)
6077               Z(I,L) = -X * T - Y * RM1(J,MP)
6078               GO TO 615
6079  610          T = RM1(MP,J+2)
6080               RM1(I,J+2) = -X * T - Y * RM1(J,MP)
6081  615          RM1(J,I) = RM1(J,I) - X * RM1(J,MP) + Y * T
6082  620       CONTINUE
6083C
6084            IF (I .LT. N1) GO TO 630
6085            L = I - NS
6086            Z(I,L) = Z(I,L) - ILAMBD
6087            GO TO 640
6088  630       RM1(I,I+2) = RM1(I,I+2) - ILAMBD
6089  640    CONTINUE
6090C
6091         IF (UK .LT. N1) GO TO 650
6092         L = UK - NS
6093         T = Z(UK,L)
6094         GO TO 655
6095  650    T = RM1(UK,UK+2)
6096  655    IF (RM1(UK,UK) .EQ. 0.0D0 .AND. T .EQ. 0.0D0) RM1(UK,UK) = EPS3
6097C     .......... BACK SUBSTITUTION FOR COMPLEX VECTOR
6098C                FOR I=UK STEP -1 UNTIL 1 DO -- ..........
6099  660    DO 720 II = 1, UK
6100            I = UK + 1 - II
6101            X = RV1(I)
6102            Y = 0.0D0
6103            IF (I .EQ. UK) GO TO 700
6104            IP1 = I + 1
6105C
6106            DO 680 J = IP1, UK
6107               IF (J .LT. N1) GO TO 670
6108               L = J - NS
6109               T = Z(I,L)
6110               GO TO 675
6111  670          T = RM1(I,J+2)
6112  675          X = X - RM1(J,I) * RV1(J) + T * RV2(J)
6113               Y = Y - RM1(J,I) * RV2(J) - T * RV1(J)
6114  680       CONTINUE
6115C
6116  700       IF (I .LT. N1) GO TO 710
6117            L = I - NS
6118            T = Z(I,L)
6119            GO TO 715
6120  710       T = RM1(I,I+2)
6121  715       CALL CDIV(X,Y,RM1(I,I),T,RV1(I),RV2(I))
6122  720    CONTINUE
6123C     .......... ACCEPTANCE TEST FOR REAL OR COMPLEX
6124C                EIGENVECTOR AND NORMALIZATION ..........
6125  740    ITS = ITS + 1
6126         NORM = 0.0D0
6127         NORMV = 0.0D0
6128C
6129         DO 780 I = 1, UK
6130            IF (ILAMBD .EQ. 0.0D0) X = DABS(RV1(I))
6131            IF (ILAMBD .NE. 0.0D0) X = PYTHAG(RV1(I),RV2(I))
6132            IF (NORMV .GE. X) GO TO 760
6133            NORMV = X
6134            J = I
6135  760       NORM = NORM + X
6136  780    CONTINUE
6137C
6138         IF (NORM .LT. GROWTO) GO TO 840
6139C     .......... ACCEPT VECTOR ..........
6140         X = RV1(J)
6141         IF (ILAMBD .EQ. 0.0D0) X = 1.0D0 / X
6142         IF (ILAMBD .NE. 0.0D0) Y = RV2(J)
6143C
6144         DO 820 I = 1, UK
6145            IF (ILAMBD .NE. 0.0D0) GO TO 800
6146            Z(I,S) = RV1(I) * X
6147            GO TO 820
6148  800       CALL CDIV(RV1(I),RV2(I),X,Y,Z(I,S-1),Z(I,S))
6149  820    CONTINUE
6150C
6151         IF (UK .EQ. N) GO TO 940
6152         J = UK + 1
6153         GO TO 900
6154C     .......... IN-LINE PROCEDURE FOR CHOOSING
6155C                A NEW STARTING VECTOR ..........
6156  840    IF (ITS .GE. UK) GO TO 880
6157         X = UKROOT
6158         Y = EPS3 / (X + 1.0D0)
6159         RV1(1) = EPS3
6160C
6161         DO 860 I = 2, UK
6162  860    RV1(I) = Y
6163C
6164         J = UK - ITS + 1
6165         RV1(J) = RV1(J) - EPS3 * X
6166         IF (ILAMBD .EQ. 0.0D0) GO TO 440
6167         GO TO 660
6168C     .......... SET ERROR -- UNACCEPTED EIGENVECTOR ..........
6169  880    J = 1
6170         IERR = -K
6171C     .......... SET REMAINING VECTOR COMPONENTS TO ZERO ..........
6172  900    DO 920 I = J, N
6173            Z(I,S) = 0.0D0
6174            IF (ILAMBD .NE. 0.0D0) Z(I,S-1) = 0.0D0
6175  920    CONTINUE
6176C
6177  940    S = S + 1
6178  960    IF (IP .EQ. (-1)) IP = 0
6179         IF (IP .EQ. 1) IP = -1
6180  980 CONTINUE
6181C
6182      GO TO 1001
6183C     .......... SET ERROR -- UNDERESTIMATE OF EIGENVECTOR
6184C                SPACE REQUIRED ..........
6185 1000 IF (IERR .NE. 0) IERR = IERR - N
6186      IF (IERR .EQ. 0) IERR = -(2 * N + 1)
6187 1001 M = S - 1 - IABS(IP)
6188      RETURN
6189      END
6190      SUBROUTINE MINFIT(NM,M,N,A,W,IP,B,IERR,RV1)
6191C
6192      INTEGER I,J,K,L,M,N,II,IP,I1,KK,K1,LL,L1,M1,NM,ITS,IERR
6193      DOUBLE PRECISION A(NM,N),W(N),B(NM,IP),RV1(N)
6194      DOUBLE PRECISION C,F,G,H,S,X,Y,Z,TST1,TST2,SCALE,PYTHAG
6195C
6196C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE MINFIT,
6197C     NUM. MATH. 14, 403-420(1970) BY GOLUB AND REINSCH.
6198C     HANDBOOK FOR AUTO. COMP., VOL II-LINEAR ALGEBRA, 134-151(1971).
6199C
6200C     THIS SUBROUTINE DETERMINES, TOWARDS THE SOLUTION OF THE LINEAR
6201C                                                        T
6202C     SYSTEM AX=B, THE SINGULAR VALUE DECOMPOSITION A=USV  OF A REAL
6203C                                         T
6204C     M BY N RECTANGULAR MATRIX, FORMING U B RATHER THAN U.  HOUSEHOLDER
6205C     BIDIAGONALIZATION AND A VARIANT OF THE QR ALGORITHM ARE USED.
6206C
6207C     ON INPUT
6208C
6209C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
6210C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
6211C          DIMENSION STATEMENT.  NOTE THAT NM MUST BE AT LEAST
6212C          AS LARGE AS THE MAXIMUM OF M AND N.
6213C
6214C        M IS THE NUMBER OF ROWS OF A AND B.
6215C
6216C        N IS THE NUMBER OF COLUMNS OF A AND THE ORDER OF V.
6217C
6218C        A CONTAINS THE RECTANGULAR COEFFICIENT MATRIX OF THE SYSTEM.
6219C
6220C        IP IS THE NUMBER OF COLUMNS OF B.  IP CAN BE ZERO.
6221C
6222C        B CONTAINS THE CONSTANT COLUMN MATRIX OF THE SYSTEM
6223C          IF IP IS NOT ZERO.  OTHERWISE B IS NOT REFERENCED.
6224C
6225C     ON OUTPUT
6226C
6227C        A HAS BEEN OVERWRITTEN BY THE MATRIX V (ORTHOGONAL) OF THE
6228C          DECOMPOSITION IN ITS FIRST N ROWS AND COLUMNS.  IF AN
6229C          ERROR EXIT IS MADE, THE COLUMNS OF V CORRESPONDING TO
6230C          INDICES OF CORRECT SINGULAR VALUES SHOULD BE CORRECT.
6231C
6232C        W CONTAINS THE N (NON-NEGATIVE) SINGULAR VALUES OF A (THE
6233C          DIAGONAL ELEMENTS OF S).  THEY ARE UNORDERED.  IF AN
6234C          ERROR EXIT IS MADE, THE SINGULAR VALUES SHOULD BE CORRECT
6235C          FOR INDICES IERR+1,IERR+2,...,N.
6236C
6237C                                   T
6238C        B HAS BEEN OVERWRITTEN BY U B.  IF AN ERROR EXIT IS MADE,
6239C                       T
6240C          THE ROWS OF U B CORRESPONDING TO INDICES OF CORRECT
6241C          SINGULAR VALUES SHOULD BE CORRECT.
6242C
6243C        IERR IS SET TO
6244C          ZERO       FOR NORMAL RETURN,
6245C          K          IF THE K-TH SINGULAR VALUE HAS NOT BEEN
6246C                     DETERMINED AFTER 30 ITERATIONS.
6247C
6248C        RV1 IS A TEMPORARY STORAGE ARRAY.
6249C
6250C     CALLS PYTHAG FOR  DSQRT(A*A + B*B) .
6251C
6252C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
6253C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
6254C
6255C     THIS VERSION DATED AUGUST 1983.
6256C
6257C     ------------------------------------------------------------------
6258C
6259      IERR = 0
6260C     .......... HOUSEHOLDER REDUCTION TO BIDIAGONAL FORM ..........
6261      G = 0.0D0
6262      SCALE = 0.0D0
6263      X = 0.0D0
6264C
6265      DO 300 I = 1, N
6266         L = I + 1
6267         RV1(I) = SCALE * G
6268         G = 0.0D0
6269         S = 0.0D0
6270         SCALE = 0.0D0
6271         IF (I .GT. M) GO TO 210
6272C
6273         DO 120 K = I, M
6274  120    SCALE = SCALE + DABS(A(K,I))
6275C
6276         IF (SCALE .EQ. 0.0D0) GO TO 210
6277C
6278         DO 130 K = I, M
6279            A(K,I) = A(K,I) / SCALE
6280            S = S + A(K,I)**2
6281  130    CONTINUE
6282C
6283         F = A(I,I)
6284         G = -DSIGN(DSQRT(S),F)
6285         H = F * G - S
6286         A(I,I) = F - G
6287         IF (I .EQ. N) GO TO 160
6288C
6289         DO 150 J = L, N
6290            S = 0.0D0
6291C
6292            DO 140 K = I, M
6293  140       S = S + A(K,I) * A(K,J)
6294C
6295            F = S / H
6296C
6297            DO 150 K = I, M
6298               A(K,J) = A(K,J) + F * A(K,I)
6299  150    CONTINUE
6300C
6301  160    IF (IP .EQ. 0) GO TO 190
6302C
6303         DO 180 J = 1, IP
6304            S = 0.0D0
6305C
6306            DO 170 K = I, M
6307  170       S = S + A(K,I) * B(K,J)
6308C
6309            F = S / H
6310C
6311            DO 180 K = I, M
6312               B(K,J) = B(K,J) + F * A(K,I)
6313  180    CONTINUE
6314C
6315  190    DO 200 K = I, M
6316  200    A(K,I) = SCALE * A(K,I)
6317C
6318  210    W(I) = SCALE * G
6319         G = 0.0D0
6320         S = 0.0D0
6321         SCALE = 0.0D0
6322         IF (I .GT. M .OR. I .EQ. N) GO TO 290
6323C
6324         DO 220 K = L, N
6325  220    SCALE = SCALE + DABS(A(I,K))
6326C
6327         IF (SCALE .EQ. 0.0D0) GO TO 290
6328C
6329         DO 230 K = L, N
6330            A(I,K) = A(I,K) / SCALE
6331            S = S + A(I,K)**2
6332  230    CONTINUE
6333C
6334         F = A(I,L)
6335         G = -DSIGN(DSQRT(S),F)
6336         H = F * G - S
6337         A(I,L) = F - G
6338C
6339         DO 240 K = L, N
6340  240    RV1(K) = A(I,K) / H
6341C
6342         IF (I .EQ. M) GO TO 270
6343C
6344         DO 260 J = L, M
6345            S = 0.0D0
6346C
6347            DO 250 K = L, N
6348  250       S = S + A(J,K) * A(I,K)
6349C
6350            DO 260 K = L, N
6351               A(J,K) = A(J,K) + S * RV1(K)
6352  260    CONTINUE
6353C
6354  270    DO 280 K = L, N
6355  280    A(I,K) = SCALE * A(I,K)
6356C
6357  290    X = DMAX1(X,DABS(W(I))+DABS(RV1(I)))
6358  300 CONTINUE
6359C     .......... ACCUMULATION OF RIGHT-HAND TRANSFORMATIONS.
6360C                FOR I=N STEP -1 UNTIL 1 DO -- ..........
6361      DO 400 II = 1, N
6362         I = N + 1 - II
6363         IF (I .EQ. N) GO TO 390
6364         IF (G .EQ. 0.0D0) GO TO 360
6365C
6366         DO 320 J = L, N
6367C     .......... DOUBLE DIVISION AVOIDS POSSIBLE UNDERFLOW ..........
6368  320    A(J,I) = (A(I,J) / A(I,L)) / G
6369C
6370         DO 350 J = L, N
6371            S = 0.0D0
6372C
6373            DO 340 K = L, N
6374  340       S = S + A(I,K) * A(K,J)
6375C
6376            DO 350 K = L, N
6377               A(K,J) = A(K,J) + S * A(K,I)
6378  350    CONTINUE
6379C
6380  360    DO 380 J = L, N
6381            A(I,J) = 0.0D0
6382            A(J,I) = 0.0D0
6383  380    CONTINUE
6384C
6385  390    A(I,I) = 1.0D0
6386         G = RV1(I)
6387         L = I
6388  400 CONTINUE
6389C
6390      IF (M .GE. N .OR. IP .EQ. 0) GO TO 510
6391      M1 = M + 1
6392C
6393      DO 500 I = M1, N
6394C
6395         DO 500 J = 1, IP
6396            B(I,J) = 0.0D0
6397  500 CONTINUE
6398C     .......... DIAGONALIZATION OF THE BIDIAGONAL FORM ..........
6399  510 TST1 = X
6400C     .......... FOR K=N STEP -1 UNTIL 1 DO -- ..........
6401      DO 700 KK = 1, N
6402         K1 = N - KK
6403         K = K1 + 1
6404         ITS = 0
6405C     .......... TEST FOR SPLITTING.
6406C                FOR L=K STEP -1 UNTIL 1 DO -- ..........
6407  520    DO 530 LL = 1, K
6408            L1 = K - LL
6409            L = L1 + 1
6410            TST2 = TST1 + DABS(RV1(L))
6411            IF (TST2 .EQ. TST1) GO TO 565
6412C     .......... RV1(1) IS ALWAYS ZERO, SO THERE IS NO EXIT
6413C                THROUGH THE BOTTOM OF THE LOOP ..........
6414            TST2 = TST1 + DABS(W(L1))
6415            IF (TST2 .EQ. TST1) GO TO 540
6416  530    CONTINUE
6417C     .......... CANCELLATION OF RV1(L) IF L GREATER THAN 1 ..........
6418  540    C = 0.0D0
6419         S = 1.0D0
6420C
6421         DO 560 I = L, K
6422            F = S * RV1(I)
6423            RV1(I) = C * RV1(I)
6424            TST2 = TST1 + DABS(F)
6425            IF (TST2 .EQ. TST1) GO TO 565
6426            G = W(I)
6427            H = PYTHAG(F,G)
6428            W(I) = H
6429            C = G / H
6430            S = -F / H
6431            IF (IP .EQ. 0) GO TO 560
6432C
6433            DO 550 J = 1, IP
6434               Y = B(L1,J)
6435               Z = B(I,J)
6436               B(L1,J) = Y * C + Z * S
6437               B(I,J) = -Y * S + Z * C
6438  550       CONTINUE
6439C
6440  560    CONTINUE
6441C     .......... TEST FOR CONVERGENCE ..........
6442  565    Z = W(K)
6443         IF (L .EQ. K) GO TO 650
6444C     .......... SHIFT FROM BOTTOM 2 BY 2 MINOR ..........
6445         IF (ITS .EQ. 30) GO TO 1000
6446         ITS = ITS + 1
6447         X = W(L)
6448         Y = W(K1)
6449         G = RV1(K1)
6450         H = RV1(K)
6451         F = 0.5D0 * (((G + Z) / H) * ((G - Z) / Y) + Y / H - H / Y)
6452         G = PYTHAG(F,1.0D0)
6453         F = X - (Z / X) * Z + (H / X) * (Y / (F + DSIGN(G,F)) - H)
6454C     .......... NEXT QR TRANSFORMATION ..........
6455         C = 1.0D0
6456         S = 1.0D0
6457C
6458         DO 600 I1 = L, K1
6459            I = I1 + 1
6460            G = RV1(I)
6461            Y = W(I)
6462            H = S * G
6463            G = C * G
6464            Z = PYTHAG(F,H)
6465            RV1(I1) = Z
6466            C = F / Z
6467            S = H / Z
6468            F = X * C + G * S
6469            G = -X * S + G * C
6470            H = Y * S
6471            Y = Y * C
6472C
6473            DO 570 J = 1, N
6474               X = A(J,I1)
6475               Z = A(J,I)
6476               A(J,I1) = X * C + Z * S
6477               A(J,I) = -X * S + Z * C
6478  570       CONTINUE
6479C
6480            Z = PYTHAG(F,H)
6481            W(I1) = Z
6482C     .......... ROTATION CAN BE ARBITRARY IF Z IS ZERO ..........
6483            IF (Z .EQ. 0.0D0) GO TO 580
6484            C = F / Z
6485            S = H / Z
6486  580       F = C * G + S * Y
6487            X = -S * G + C * Y
6488            IF (IP .EQ. 0) GO TO 600
6489C
6490            DO 590 J = 1, IP
6491               Y = B(I1,J)
6492               Z = B(I,J)
6493               B(I1,J) = Y * C + Z * S
6494               B(I,J) = -Y * S + Z * C
6495  590       CONTINUE
6496C
6497  600    CONTINUE
6498C
6499         RV1(L) = 0.0D0
6500         RV1(K) = F
6501         W(K) = X
6502         GO TO 520
6503C     .......... CONVERGENCE ..........
6504  650    IF (Z .GE. 0.0D0) GO TO 700
6505C     .......... W(K) IS MADE NON-NEGATIVE ..........
6506         W(K) = -Z
6507C
6508         DO 690 J = 1, N
6509  690    A(J,K) = -A(J,K)
6510C
6511  700 CONTINUE
6512C
6513      GO TO 1001
6514C     .......... SET ERROR -- NO CONVERGENCE TO A
6515C                SINGULAR VALUE AFTER 30 ITERATIONS ..........
6516 1000 IERR = K
6517 1001 RETURN
6518      END
6519      SUBROUTINE ORTBAK(NM,LOW,IGH,A,ORT,M,Z)
6520C
6521      INTEGER I,J,M,LA,MM,MP,NM,IGH,KP1,LOW,MP1
6522      DOUBLE PRECISION A(NM,IGH),ORT(IGH),Z(NM,M)
6523      DOUBLE PRECISION G
6524C
6525C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE ORTBAK,
6526C     NUM. MATH. 12, 349-368(1968) BY MARTIN AND WILKINSON.
6527C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 339-358(1971).
6528C
6529C     THIS SUBROUTINE FORMS THE EIGENVECTORS OF A REAL GENERAL
6530C     MATRIX BY BACK TRANSFORMING THOSE OF THE CORRESPONDING
6531C     UPPER HESSENBERG MATRIX DETERMINED BY  ORTHES.
6532C
6533C     ON INPUT
6534C
6535C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
6536C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
6537C          DIMENSION STATEMENT.
6538C
6539C        LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING
6540C          SUBROUTINE  BALANC.  IF  BALANC  HAS NOT BEEN USED,
6541C          SET LOW=1 AND IGH EQUAL TO THE ORDER OF THE MATRIX.
6542C
6543C        A CONTAINS INFORMATION ABOUT THE ORTHOGONAL TRANS-
6544C          FORMATIONS USED IN THE REDUCTION BY  ORTHES
6545C          IN ITS STRICT LOWER TRIANGLE.
6546C
6547C        ORT CONTAINS FURTHER INFORMATION ABOUT THE TRANS-
6548C          FORMATIONS USED IN THE REDUCTION BY  ORTHES.
6549C          ONLY ELEMENTS LOW THROUGH IGH ARE USED.
6550C
6551C        M IS THE NUMBER OF COLUMNS OF Z TO BE BACK TRANSFORMED.
6552C
6553C        Z CONTAINS THE REAL AND IMAGINARY PARTS OF THE EIGEN-
6554C          VECTORS TO BE BACK TRANSFORMED IN ITS FIRST M COLUMNS.
6555C
6556C     ON OUTPUT
6557C
6558C        Z CONTAINS THE REAL AND IMAGINARY PARTS OF THE
6559C          TRANSFORMED EIGENVECTORS IN ITS FIRST M COLUMNS.
6560C
6561C        ORT HAS BEEN ALTERED.
6562C
6563C     NOTE THAT ORTBAK PRESERVES VECTOR EUCLIDEAN NORMS.
6564C
6565C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
6566C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
6567C
6568C     THIS VERSION DATED AUGUST 1983.
6569C
6570C     ------------------------------------------------------------------
6571C
6572      IF (M .EQ. 0) GO TO 200
6573      LA = IGH - 1
6574      KP1 = LOW + 1
6575      IF (LA .LT. KP1) GO TO 200
6576C     .......... FOR MP=IGH-1 STEP -1 UNTIL LOW+1 DO -- ..........
6577      DO 140 MM = KP1, LA
6578         MP = LOW + IGH - MM
6579         IF (A(MP,MP-1) .EQ. 0.0D0) GO TO 140
6580         MP1 = MP + 1
6581C
6582         DO 100 I = MP1, IGH
6583  100    ORT(I) = A(I,MP-1)
6584C
6585         DO 130 J = 1, M
6586            G = 0.0D0
6587C
6588            DO 110 I = MP, IGH
6589  110       G = G + ORT(I) * Z(I,J)
6590C     .......... DIVISOR BELOW IS NEGATIVE OF H FORMED IN ORTHES.
6591C                DOUBLE DIVISION AVOIDS POSSIBLE UNDERFLOW ..........
6592            G = (G / ORT(MP)) / A(MP,MP-1)
6593C
6594            DO 120 I = MP, IGH
6595  120       Z(I,J) = Z(I,J) + G * ORT(I)
6596C
6597  130    CONTINUE
6598C
6599  140 CONTINUE
6600C
6601  200 RETURN
6602      END
6603      SUBROUTINE ORTHES(NM,N,LOW,IGH,A,ORT)
6604C
6605      INTEGER I,J,M,N,II,JJ,LA,MP,NM,IGH,KP1,LOW
6606      DOUBLE PRECISION A(NM,N),ORT(IGH)
6607      DOUBLE PRECISION F,G,H,SCALE
6608C
6609C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE ORTHES,
6610C     NUM. MATH. 12, 349-368(1968) BY MARTIN AND WILKINSON.
6611C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 339-358(1971).
6612C
6613C     GIVEN A REAL GENERAL MATRIX, THIS SUBROUTINE
6614C     REDUCES A SUBMATRIX SITUATED IN ROWS AND COLUMNS
6615C     LOW THROUGH IGH TO UPPER HESSENBERG FORM BY
6616C     ORTHOGONAL SIMILARITY TRANSFORMATIONS.
6617C
6618C     ON INPUT
6619C
6620C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
6621C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
6622C          DIMENSION STATEMENT.
6623C
6624C        N IS THE ORDER OF THE MATRIX.
6625C
6626C        LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING
6627C          SUBROUTINE  BALANC.  IF  BALANC  HAS NOT BEEN USED,
6628C          SET LOW=1, IGH=N.
6629C
6630C        A CONTAINS THE INPUT MATRIX.
6631C
6632C     ON OUTPUT
6633C
6634C        A CONTAINS THE HESSENBERG MATRIX.  INFORMATION ABOUT
6635C          THE ORTHOGONAL TRANSFORMATIONS USED IN THE REDUCTION
6636C          IS STORED IN THE REMAINING TRIANGLE UNDER THE
6637C          HESSENBERG MATRIX.
6638C
6639C        ORT CONTAINS FURTHER INFORMATION ABOUT THE TRANSFORMATIONS.
6640C          ONLY ELEMENTS LOW THROUGH IGH ARE USED.
6641C
6642C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
6643C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
6644C
6645C     THIS VERSION DATED AUGUST 1983.
6646C
6647C     ------------------------------------------------------------------
6648C
6649      LA = IGH - 1
6650      KP1 = LOW + 1
6651      IF (LA .LT. KP1) GO TO 200
6652C
6653      DO 180 M = KP1, LA
6654         H = 0.0D0
6655         ORT(M) = 0.0D0
6656         SCALE = 0.0D0
6657C     .......... SCALE COLUMN (ALGOL TOL THEN NOT NEEDED) ..........
6658         DO 90 I = M, IGH
6659   90    SCALE = SCALE + DABS(A(I,M-1))
6660C
6661         IF (SCALE .EQ. 0.0D0) GO TO 180
6662         MP = M + IGH
6663C     .......... FOR I=IGH STEP -1 UNTIL M DO -- ..........
6664         DO 100 II = M, IGH
6665            I = MP - II
6666            ORT(I) = A(I,M-1) / SCALE
6667            H = H + ORT(I) * ORT(I)
6668  100    CONTINUE
6669C
6670         G = -DSIGN(DSQRT(H),ORT(M))
6671         H = H - ORT(M) * G
6672         ORT(M) = ORT(M) - G
6673C     .......... FORM (I-(U*UT)/H) * A ..........
6674         DO 130 J = M, N
6675            F = 0.0D0
6676C     .......... FOR I=IGH STEP -1 UNTIL M DO -- ..........
6677            DO 110 II = M, IGH
6678               I = MP - II
6679               F = F + ORT(I) * A(I,J)
6680  110       CONTINUE
6681C
6682            F = F / H
6683C
6684            DO 120 I = M, IGH
6685  120       A(I,J) = A(I,J) - F * ORT(I)
6686C
6687  130    CONTINUE
6688C     .......... FORM (I-(U*UT)/H)*A*(I-(U*UT)/H) ..........
6689         DO 160 I = 1, IGH
6690            F = 0.0D0
6691C     .......... FOR J=IGH STEP -1 UNTIL M DO -- ..........
6692            DO 140 JJ = M, IGH
6693               J = MP - JJ
6694               F = F + ORT(J) * A(I,J)
6695  140       CONTINUE
6696C
6697            F = F / H
6698C
6699            DO 150 J = M, IGH
6700  150       A(I,J) = A(I,J) - F * ORT(J)
6701C
6702  160    CONTINUE
6703C
6704         ORT(M) = SCALE * ORT(M)
6705         A(M,M-1) = SCALE * G
6706  180 CONTINUE
6707C
6708  200 RETURN
6709      END
6710      SUBROUTINE ORTRAN(NM,N,LOW,IGH,A,ORT,Z)
6711C
6712      INTEGER I,J,N,KL,MM,MP,NM,IGH,LOW,MP1
6713      DOUBLE PRECISION A(NM,IGH),ORT(IGH),Z(NM,N)
6714      DOUBLE PRECISION G
6715C
6716C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE ORTRANS,
6717C     NUM. MATH. 16, 181-204(1970) BY PETERS AND WILKINSON.
6718C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 372-395(1971).
6719C
6720C     THIS SUBROUTINE ACCUMULATES THE ORTHOGONAL SIMILARITY
6721C     TRANSFORMATIONS USED IN THE REDUCTION OF A REAL GENERAL
6722C     MATRIX TO UPPER HESSENBERG FORM BY  ORTHES.
6723C
6724C     ON INPUT
6725C
6726C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
6727C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
6728C          DIMENSION STATEMENT.
6729C
6730C        N IS THE ORDER OF THE MATRIX.
6731C
6732C        LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING
6733C          SUBROUTINE  BALANC.  IF  BALANC  HAS NOT BEEN USED,
6734C          SET LOW=1, IGH=N.
6735C
6736C        A CONTAINS INFORMATION ABOUT THE ORTHOGONAL TRANS-
6737C          FORMATIONS USED IN THE REDUCTION BY  ORTHES
6738C          IN ITS STRICT LOWER TRIANGLE.
6739C
6740C        ORT CONTAINS FURTHER INFORMATION ABOUT THE TRANS-
6741C          FORMATIONS USED IN THE REDUCTION BY  ORTHES.
6742C          ONLY ELEMENTS LOW THROUGH IGH ARE USED.
6743C
6744C     ON OUTPUT
6745C
6746C        Z CONTAINS THE TRANSFORMATION MATRIX PRODUCED IN THE
6747C          REDUCTION BY  ORTHES.
6748C
6749C        ORT HAS BEEN ALTERED.
6750C
6751C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
6752C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
6753C
6754C     THIS VERSION DATED AUGUST 1983.
6755C
6756C     ------------------------------------------------------------------
6757C
6758C     .......... INITIALIZE Z TO IDENTITY MATRIX ..........
6759      DO 80 J = 1, N
6760C
6761         DO 60 I = 1, N
6762   60    Z(I,J) = 0.0D0
6763C
6764         Z(J,J) = 1.0D0
6765   80 CONTINUE
6766C
6767      KL = IGH - LOW - 1
6768      IF (KL .LT. 1) GO TO 200
6769C     .......... FOR MP=IGH-1 STEP -1 UNTIL LOW+1 DO -- ..........
6770      DO 140 MM = 1, KL
6771         MP = IGH - MM
6772         IF (A(MP,MP-1) .EQ. 0.0D0) GO TO 140
6773         MP1 = MP + 1
6774C
6775         DO 100 I = MP1, IGH
6776  100    ORT(I) = A(I,MP-1)
6777C
6778         DO 130 J = MP, IGH
6779            G = 0.0D0
6780C
6781            DO 110 I = MP, IGH
6782  110       G = G + ORT(I) * Z(I,J)
6783C     .......... DIVISOR BELOW IS NEGATIVE OF H FORMED IN ORTHES.
6784C                DOUBLE DIVISION AVOIDS POSSIBLE UNDERFLOW ..........
6785            G = (G / ORT(MP)) / A(MP,MP-1)
6786C
6787            DO 120 I = MP, IGH
6788  120       Z(I,J) = Z(I,J) + G * ORT(I)
6789C
6790  130    CONTINUE
6791C
6792  140 CONTINUE
6793C
6794  200 RETURN
6795      END
6796      SUBROUTINE QZHES(NM,N,A,B,MATZ,Z)
6797C
6798      INTEGER I,J,K,L,N,LB,L1,NM,NK1,NM1,NM2
6799      DOUBLE PRECISION A(NM,N),B(NM,N),Z(NM,N)
6800      DOUBLE PRECISION R,S,T,U1,U2,V1,V2,RHO
6801      LOGICAL MATZ
6802C
6803C     THIS SUBROUTINE IS THE FIRST STEP OF THE QZ ALGORITHM
6804C     FOR SOLVING GENERALIZED MATRIX EIGENVALUE PROBLEMS,
6805C     SIAM J. NUMER. ANAL. 10, 241-256(1973) BY MOLER AND STEWART.
6806C
6807C     THIS SUBROUTINE ACCEPTS A PAIR OF REAL GENERAL MATRICES AND
6808C     REDUCES ONE OF THEM TO UPPER HESSENBERG FORM AND THE OTHER
6809C     TO UPPER TRIANGULAR FORM USING ORTHOGONAL TRANSFORMATIONS.
6810C     IT IS USUALLY FOLLOWED BY  QZIT,  QZVAL  AND, POSSIBLY,  QZVEC.
6811C
6812C     ON INPUT
6813C
6814C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
6815C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
6816C          DIMENSION STATEMENT.
6817C
6818C        N IS THE ORDER OF THE MATRICES.
6819C
6820C        A CONTAINS A REAL GENERAL MATRIX.
6821C
6822C        B CONTAINS A REAL GENERAL MATRIX.
6823C
6824C        MATZ SHOULD BE SET TO .TRUE. IF THE RIGHT HAND TRANSFORMATIONS
6825C          ARE TO BE ACCUMULATED FOR LATER USE IN COMPUTING
6826C          EIGENVECTORS, AND TO .FALSE. OTHERWISE.
6827C
6828C     ON OUTPUT
6829C
6830C        A HAS BEEN REDUCED TO UPPER HESSENBERG FORM.  THE ELEMENTS
6831C          BELOW THE FIRST SUBDIAGONAL HAVE BEEN SET TO ZERO.
6832C
6833C        B HAS BEEN REDUCED TO UPPER TRIANGULAR FORM.  THE ELEMENTS
6834C          BELOW THE MAIN DIAGONAL HAVE BEEN SET TO ZERO.
6835C
6836C        Z CONTAINS THE PRODUCT OF THE RIGHT HAND TRANSFORMATIONS IF
6837C          MATZ HAS BEEN SET TO .TRUE.  OTHERWISE, Z IS NOT REFERENCED.
6838C
6839C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
6840C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
6841C
6842C     THIS VERSION DATED AUGUST 1983.
6843C
6844C     ------------------------------------------------------------------
6845C
6846C     .......... INITIALIZE Z ..........
6847      IF (.NOT. MATZ) GO TO 10
6848C
6849      DO 3 J = 1, N
6850C
6851         DO 2 I = 1, N
6852            Z(I,J) = 0.0D0
6853    2    CONTINUE
6854C
6855         Z(J,J) = 1.0D0
6856    3 CONTINUE
6857C     .......... REDUCE B TO UPPER TRIANGULAR FORM ..........
6858   10 IF (N .LE. 1) GO TO 170
6859      NM1 = N - 1
6860C
6861      DO 100 L = 1, NM1
6862         L1 = L + 1
6863         S = 0.0D0
6864C
6865         DO 20 I = L1, N
6866            S = S + DABS(B(I,L))
6867   20    CONTINUE
6868C
6869         IF (S .EQ. 0.0D0) GO TO 100
6870         S = S + DABS(B(L,L))
6871         R = 0.0D0
6872C
6873         DO 25 I = L, N
6874            B(I,L) = B(I,L) / S
6875            R = R + B(I,L)**2
6876   25    CONTINUE
6877C
6878         R = DSIGN(DSQRT(R),B(L,L))
6879         B(L,L) = B(L,L) + R
6880         RHO = R * B(L,L)
6881C
6882         DO 50 J = L1, N
6883            T = 0.0D0
6884C
6885            DO 30 I = L, N
6886               T = T + B(I,L) * B(I,J)
6887   30       CONTINUE
6888C
6889            T = -T / RHO
6890C
6891            DO 40 I = L, N
6892               B(I,J) = B(I,J) + T * B(I,L)
6893   40       CONTINUE
6894C
6895   50    CONTINUE
6896C
6897         DO 80 J = 1, N
6898            T = 0.0D0
6899C
6900            DO 60 I = L, N
6901               T = T + B(I,L) * A(I,J)
6902   60       CONTINUE
6903C
6904            T = -T / RHO
6905C
6906            DO 70 I = L, N
6907               A(I,J) = A(I,J) + T * B(I,L)
6908   70       CONTINUE
6909C
6910   80    CONTINUE
6911C
6912         B(L,L) = -S * R
6913C
6914         DO 90 I = L1, N
6915            B(I,L) = 0.0D0
6916   90    CONTINUE
6917C
6918  100 CONTINUE
6919C     .......... REDUCE A TO UPPER HESSENBERG FORM, WHILE
6920C                KEEPING B TRIANGULAR ..........
6921      IF (N .EQ. 2) GO TO 170
6922      NM2 = N - 2
6923C
6924      DO 160 K = 1, NM2
6925         NK1 = NM1 - K
6926C     .......... FOR L=N-1 STEP -1 UNTIL K+1 DO -- ..........
6927         DO 150 LB = 1, NK1
6928            L = N - LB
6929            L1 = L + 1
6930C     .......... ZERO A(L+1,K) ..........
6931            S = DABS(A(L,K)) + DABS(A(L1,K))
6932            IF (S .EQ. 0.0D0) GO TO 150
6933            U1 = A(L,K) / S
6934            U2 = A(L1,K) / S
6935            R = DSIGN(DSQRT(U1*U1+U2*U2),U1)
6936            V1 =  -(U1 + R) / R
6937            V2 = -U2 / R
6938            U2 = V2 / V1
6939C
6940            DO 110 J = K, N
6941               T = A(L,J) + U2 * A(L1,J)
6942               A(L,J) = A(L,J) + T * V1
6943               A(L1,J) = A(L1,J) + T * V2
6944  110       CONTINUE
6945C
6946            A(L1,K) = 0.0D0
6947C
6948            DO 120 J = L, N
6949               T = B(L,J) + U2 * B(L1,J)
6950               B(L,J) = B(L,J) + T * V1
6951               B(L1,J) = B(L1,J) + T * V2
6952  120       CONTINUE
6953C     .......... ZERO B(L+1,L) ..........
6954            S = DABS(B(L1,L1)) + DABS(B(L1,L))
6955            IF (S .EQ. 0.0D0) GO TO 150
6956            U1 = B(L1,L1) / S
6957            U2 = B(L1,L) / S
6958            R = DSIGN(DSQRT(U1*U1+U2*U2),U1)
6959            V1 =  -(U1 + R) / R
6960            V2 = -U2 / R
6961            U2 = V2 / V1
6962C
6963            DO 130 I = 1, L1
6964               T = B(I,L1) + U2 * B(I,L)
6965               B(I,L1) = B(I,L1) + T * V1
6966               B(I,L) = B(I,L) + T * V2
6967  130       CONTINUE
6968C
6969            B(L1,L) = 0.0D0
6970C
6971            DO 140 I = 1, N
6972               T = A(I,L1) + U2 * A(I,L)
6973               A(I,L1) = A(I,L1) + T * V1
6974               A(I,L) = A(I,L) + T * V2
6975  140       CONTINUE
6976C
6977            IF (.NOT. MATZ) GO TO 150
6978C
6979            DO 145 I = 1, N
6980               T = Z(I,L1) + U2 * Z(I,L)
6981               Z(I,L1) = Z(I,L1) + T * V1
6982               Z(I,L) = Z(I,L) + T * V2
6983  145       CONTINUE
6984C
6985  150    CONTINUE
6986C
6987  160 CONTINUE
6988C
6989  170 RETURN
6990      END
6991      SUBROUTINE QZIT(NM,N,A,B,EPS1,MATZ,Z,IERR)
6992C
6993      INTEGER I,J,K,L,N,EN,K1,K2,LD,LL,L1,NA,NM,ISH,ITN,ITS,KM1,LM1,
6994     X        ENM2,IERR,LOR1,ENORN
6995      DOUBLE PRECISION A(NM,N),B(NM,N),Z(NM,N)
6996      DOUBLE PRECISION R,S,T,A1,A2,A3,EP,SH,U1,U2,U3,V1,V2,V3,ANI,A11,
6997     X       A12,A21,A22,A33,A34,A43,A44,BNI,B11,B12,B22,B33,B34,
6998     X       B44,EPSA,EPSB,EPS1,ANORM,BNORM,EPSLON
6999      LOGICAL MATZ,NOTLAS
7000C
7001C     THIS SUBROUTINE IS THE SECOND STEP OF THE QZ ALGORITHM
7002C     FOR SOLVING GENERALIZED MATRIX EIGENVALUE PROBLEMS,
7003C     SIAM J. NUMER. ANAL. 10, 241-256(1973) BY MOLER AND STEWART,
7004C     AS MODIFIED IN TECHNICAL NOTE NASA TN D-7305(1973) BY WARD.
7005C
7006C     THIS SUBROUTINE ACCEPTS A PAIR OF REAL MATRICES, ONE OF THEM
7007C     IN UPPER HESSENBERG FORM AND THE OTHER IN UPPER TRIANGULAR FORM.
7008C     IT REDUCES THE HESSENBERG MATRIX TO QUASI-TRIANGULAR FORM USING
7009C     ORTHOGONAL TRANSFORMATIONS WHILE MAINTAINING THE TRIANGULAR FORM
7010C     OF THE OTHER MATRIX.  IT IS USUALLY PRECEDED BY  QZHES  AND
7011C     FOLLOWED BY  QZVAL  AND, POSSIBLY,  QZVEC.
7012C
7013C     ON INPUT
7014C
7015C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
7016C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
7017C          DIMENSION STATEMENT.
7018C
7019C        N IS THE ORDER OF THE MATRICES.
7020C
7021C        A CONTAINS A REAL UPPER HESSENBERG MATRIX.
7022C
7023C        B CONTAINS A REAL UPPER TRIANGULAR MATRIX.
7024C
7025C        EPS1 IS A TOLERANCE USED TO DETERMINE NEGLIGIBLE ELEMENTS.
7026C          EPS1 = 0.0 (OR NEGATIVE) MAY BE INPUT, IN WHICH CASE AN
7027C          ELEMENT WILL BE NEGLECTED ONLY IF IT IS LESS THAN ROUNDOFF
7028C          ERROR TIMES THE NORM OF ITS MATRIX.  IF THE INPUT EPS1 IS
7029C          POSITIVE, THEN AN ELEMENT WILL BE CONSIDERED NEGLIGIBLE
7030C          IF IT IS LESS THAN EPS1 TIMES THE NORM OF ITS MATRIX.  A
7031C          POSITIVE VALUE OF EPS1 MAY RESULT IN FASTER EXECUTION,
7032C          BUT LESS ACCURATE RESULTS.
7033C
7034C        MATZ SHOULD BE SET TO .TRUE. IF THE RIGHT HAND TRANSFORMATIONS
7035C          ARE TO BE ACCUMULATED FOR LATER USE IN COMPUTING
7036C          EIGENVECTORS, AND TO .FALSE. OTHERWISE.
7037C
7038C        Z CONTAINS, IF MATZ HAS BEEN SET TO .TRUE., THE
7039C          TRANSFORMATION MATRIX PRODUCED IN THE REDUCTION
7040C          BY  QZHES, IF PERFORMED, OR ELSE THE IDENTITY MATRIX.
7041C          IF MATZ HAS BEEN SET TO .FALSE., Z IS NOT REFERENCED.
7042C
7043C     ON OUTPUT
7044C
7045C        A HAS BEEN REDUCED TO QUASI-TRIANGULAR FORM.  THE ELEMENTS
7046C          BELOW THE FIRST SUBDIAGONAL ARE STILL ZERO AND NO TWO
7047C          CONSECUTIVE SUBDIAGONAL ELEMENTS ARE NONZERO.
7048C
7049C        B IS STILL IN UPPER TRIANGULAR FORM, ALTHOUGH ITS ELEMENTS
7050C          HAVE BEEN ALTERED.  THE LOCATION B(N,1) IS USED TO STORE
7051C          EPS1 TIMES THE NORM OF B FOR LATER USE BY  QZVAL  AND  QZVEC.
7052C
7053C        Z CONTAINS THE PRODUCT OF THE RIGHT HAND TRANSFORMATIONS
7054C          (FOR BOTH STEPS) IF MATZ HAS BEEN SET TO .TRUE..
7055C
7056C        IERR IS SET TO
7057C          ZERO       FOR NORMAL RETURN,
7058C          J          IF THE LIMIT OF 30*N ITERATIONS IS EXHAUSTED
7059C                     WHILE THE J-TH EIGENVALUE IS BEING SOUGHT.
7060C
7061C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
7062C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
7063C
7064C     THIS VERSION DATED AUGUST 1983.
7065C
7066C     ------------------------------------------------------------------
7067C
7068      IERR = 0
7069C     .......... COMPUTE EPSA,EPSB ..........
7070      ANORM = 0.0D0
7071      BNORM = 0.0D0
7072C
7073      DO 30 I = 1, N
7074         ANI = 0.0D0
7075         IF (I .NE. 1) ANI = DABS(A(I,I-1))
7076         BNI = 0.0D0
7077C
7078         DO 20 J = I, N
7079            ANI = ANI + DABS(A(I,J))
7080            BNI = BNI + DABS(B(I,J))
7081   20    CONTINUE
7082C
7083         IF (ANI .GT. ANORM) ANORM = ANI
7084         IF (BNI .GT. BNORM) BNORM = BNI
7085   30 CONTINUE
7086C
7087      IF (ANORM .EQ. 0.0D0) ANORM = 1.0D0
7088      IF (BNORM .EQ. 0.0D0) BNORM = 1.0D0
7089      EP = EPS1
7090      IF (EP .GT. 0.0D0) GO TO 50
7091C     .......... USE ROUNDOFF LEVEL IF EPS1 IS ZERO ..........
7092      EP = EPSLON(1.0D0)
7093   50 EPSA = EP * ANORM
7094      EPSB = EP * BNORM
7095C     .......... REDUCE A TO QUASI-TRIANGULAR FORM, WHILE
7096C                KEEPING B TRIANGULAR ..........
7097      LOR1 = 1
7098      ENORN = N
7099      EN = N
7100      ITN = 30*N
7101C     .......... BEGIN QZ STEP ..........
7102   60 IF (EN .LE. 2) GO TO 1001
7103      IF (.NOT. MATZ) ENORN = EN
7104      ITS = 0
7105      NA = EN - 1
7106      ENM2 = NA - 1
7107   70 ISH = 2
7108C     .......... CHECK FOR CONVERGENCE OR REDUCIBILITY.
7109C                FOR L=EN STEP -1 UNTIL 1 DO -- ..........
7110      DO 80 LL = 1, EN
7111         LM1 = EN - LL
7112         L = LM1 + 1
7113         IF (L .EQ. 1) GO TO 95
7114         IF (DABS(A(L,LM1)) .LE. EPSA) GO TO 90
7115   80 CONTINUE
7116C
7117   90 A(L,LM1) = 0.0D0
7118      IF (L .LT. NA) GO TO 95
7119C     .......... 1-BY-1 OR 2-BY-2 BLOCK ISOLATED ..........
7120      EN = LM1
7121      GO TO 60
7122C     .......... CHECK FOR SMALL TOP OF B ..........
7123   95 LD = L
7124  100 L1 = L + 1
7125      B11 = B(L,L)
7126      IF (DABS(B11) .GT. EPSB) GO TO 120
7127      B(L,L) = 0.0D0
7128      S = DABS(A(L,L)) + DABS(A(L1,L))
7129      U1 = A(L,L) / S
7130      U2 = A(L1,L) / S
7131      R = DSIGN(DSQRT(U1*U1+U2*U2),U1)
7132      V1 = -(U1 + R) / R
7133      V2 = -U2 / R
7134      U2 = V2 / V1
7135C
7136      DO 110 J = L, ENORN
7137         T = A(L,J) + U2 * A(L1,J)
7138         A(L,J) = A(L,J) + T * V1
7139         A(L1,J) = A(L1,J) + T * V2
7140         T = B(L,J) + U2 * B(L1,J)
7141         B(L,J) = B(L,J) + T * V1
7142         B(L1,J) = B(L1,J) + T * V2
7143  110 CONTINUE
7144C
7145      IF (L .NE. 1) A(L,LM1) = -A(L,LM1)
7146      LM1 = L
7147      L = L1
7148      GO TO 90
7149  120 A11 = A(L,L) / B11
7150      A21 = A(L1,L) / B11
7151      IF (ISH .EQ. 1) GO TO 140
7152C     .......... ITERATION STRATEGY ..........
7153      IF (ITN .EQ. 0) GO TO 1000
7154      IF (ITS .EQ. 10) GO TO 155
7155C     .......... DETERMINE TYPE OF SHIFT ..........
7156      B22 = B(L1,L1)
7157      IF (DABS(B22) .LT. EPSB) B22 = EPSB
7158      B33 = B(NA,NA)
7159      IF (DABS(B33) .LT. EPSB) B33 = EPSB
7160      B44 = B(EN,EN)
7161      IF (DABS(B44) .LT. EPSB) B44 = EPSB
7162      A33 = A(NA,NA) / B33
7163      A34 = A(NA,EN) / B44
7164      A43 = A(EN,NA) / B33
7165      A44 = A(EN,EN) / B44
7166      B34 = B(NA,EN) / B44
7167      T = 0.5D0 * (A43 * B34 - A33 - A44)
7168      R = T * T + A34 * A43 - A33 * A44
7169      IF (R .LT. 0.0D0) GO TO 150
7170C     .......... DETERMINE SINGLE SHIFT ZEROTH COLUMN OF A ..........
7171      ISH = 1
7172      R = DSQRT(R)
7173      SH = -T + R
7174      S = -T - R
7175      IF (DABS(S-A44) .LT. DABS(SH-A44)) SH = S
7176C     .......... LOOK FOR TWO CONSECUTIVE SMALL
7177C                SUB-DIAGONAL ELEMENTS OF A.
7178C                FOR L=EN-2 STEP -1 UNTIL LD DO -- ..........
7179      DO 130 LL = LD, ENM2
7180         L = ENM2 + LD - LL
7181         IF (L .EQ. LD) GO TO 140
7182         LM1 = L - 1
7183         L1 = L + 1
7184         T = A(L,L)
7185         IF (DABS(B(L,L)) .GT. EPSB) T = T - SH * B(L,L)
7186         IF (DABS(A(L,LM1)) .LE. DABS(T/A(L1,L)) * EPSA) GO TO 100
7187  130 CONTINUE
7188C
7189  140 A1 = A11 - SH
7190      A2 = A21
7191      IF (L .NE. LD) A(L,LM1) = -A(L,LM1)
7192      GO TO 160
7193C     .......... DETERMINE DOUBLE SHIFT ZEROTH COLUMN OF A ..........
7194  150 A12 = A(L,L1) / B22
7195      A22 = A(L1,L1) / B22
7196      B12 = B(L,L1) / B22
7197      A1 = ((A33 - A11) * (A44 - A11) - A34 * A43 + A43 * B34 * A11)
7198     X     / A21 + A12 - A11 * B12
7199      A2 = (A22 - A11) - A21 * B12 - (A33 - A11) - (A44 - A11)
7200     X     + A43 * B34
7201      A3 = A(L1+1,L1) / B22
7202      GO TO 160
7203C     .......... AD HOC SHIFT ..........
7204  155 A1 = 0.0D0
7205      A2 = 1.0D0
7206      A3 = 1.1605D0
7207  160 ITS = ITS + 1
7208      ITN = ITN - 1
7209      IF (.NOT. MATZ) LOR1 = LD
7210C     .......... MAIN LOOP ..........
7211      DO 260 K = L, NA
7212         NOTLAS = K .NE. NA .AND. ISH .EQ. 2
7213         K1 = K + 1
7214         K2 = K + 2
7215         KM1 = MAX0(K-1,L)
7216         LL = MIN0(EN,K1+ISH)
7217         IF (NOTLAS) GO TO 190
7218C     .......... ZERO A(K+1,K-1) ..........
7219         IF (K .EQ. L) GO TO 170
7220         A1 = A(K,KM1)
7221         A2 = A(K1,KM1)
7222  170    S = DABS(A1) + DABS(A2)
7223         IF (S .EQ. 0.0D0) GO TO 70
7224         U1 = A1 / S
7225         U2 = A2 / S
7226         R = DSIGN(DSQRT(U1*U1+U2*U2),U1)
7227         V1 = -(U1 + R) / R
7228         V2 = -U2 / R
7229         U2 = V2 / V1
7230C
7231         DO 180 J = KM1, ENORN
7232            T = A(K,J) + U2 * A(K1,J)
7233            A(K,J) = A(K,J) + T * V1
7234            A(K1,J) = A(K1,J) + T * V2
7235            T = B(K,J) + U2 * B(K1,J)
7236            B(K,J) = B(K,J) + T * V1
7237            B(K1,J) = B(K1,J) + T * V2
7238  180    CONTINUE
7239C
7240         IF (K .NE. L) A(K1,KM1) = 0.0D0
7241         GO TO 240
7242C     .......... ZERO A(K+1,K-1) AND A(K+2,K-1) ..........
7243  190    IF (K .EQ. L) GO TO 200
7244         A1 = A(K,KM1)
7245         A2 = A(K1,KM1)
7246         A3 = A(K2,KM1)
7247  200    S = DABS(A1) + DABS(A2) + DABS(A3)
7248         IF (S .EQ. 0.0D0) GO TO 260
7249         U1 = A1 / S
7250         U2 = A2 / S
7251         U3 = A3 / S
7252         R = DSIGN(DSQRT(U1*U1+U2*U2+U3*U3),U1)
7253         V1 = -(U1 + R) / R
7254         V2 = -U2 / R
7255         V3 = -U3 / R
7256         U2 = V2 / V1
7257         U3 = V3 / V1
7258C
7259         DO 210 J = KM1, ENORN
7260            T = A(K,J) + U2 * A(K1,J) + U3 * A(K2,J)
7261            A(K,J) = A(K,J) + T * V1
7262            A(K1,J) = A(K1,J) + T * V2
7263            A(K2,J) = A(K2,J) + T * V3
7264            T = B(K,J) + U2 * B(K1,J) + U3 * B(K2,J)
7265            B(K,J) = B(K,J) + T * V1
7266            B(K1,J) = B(K1,J) + T * V2
7267            B(K2,J) = B(K2,J) + T * V3
7268  210    CONTINUE
7269C
7270         IF (K .EQ. L) GO TO 220
7271         A(K1,KM1) = 0.0D0
7272         A(K2,KM1) = 0.0D0
7273C     .......... ZERO B(K+2,K+1) AND B(K+2,K) ..........
7274  220    S = DABS(B(K2,K2)) + DABS(B(K2,K1)) + DABS(B(K2,K))
7275         IF (S .EQ. 0.0D0) GO TO 240
7276         U1 = B(K2,K2) / S
7277         U2 = B(K2,K1) / S
7278         U3 = B(K2,K) / S
7279         R = DSIGN(DSQRT(U1*U1+U2*U2+U3*U3),U1)
7280         V1 = -(U1 + R) / R
7281         V2 = -U2 / R
7282         V3 = -U3 / R
7283         U2 = V2 / V1
7284         U3 = V3 / V1
7285C
7286         DO 230 I = LOR1, LL
7287            T = A(I,K2) + U2 * A(I,K1) + U3 * A(I,K)
7288            A(I,K2) = A(I,K2) + T * V1
7289            A(I,K1) = A(I,K1) + T * V2
7290            A(I,K) = A(I,K) + T * V3
7291            T = B(I,K2) + U2 * B(I,K1) + U3 * B(I,K)
7292            B(I,K2) = B(I,K2) + T * V1
7293            B(I,K1) = B(I,K1) + T * V2
7294            B(I,K) = B(I,K) + T * V3
7295  230    CONTINUE
7296C
7297         B(K2,K) = 0.0D0
7298         B(K2,K1) = 0.0D0
7299         IF (.NOT. MATZ) GO TO 240
7300C
7301         DO 235 I = 1, N
7302            T = Z(I,K2) + U2 * Z(I,K1) + U3 * Z(I,K)
7303            Z(I,K2) = Z(I,K2) + T * V1
7304            Z(I,K1) = Z(I,K1) + T * V2
7305            Z(I,K) = Z(I,K) + T * V3
7306  235    CONTINUE
7307C     .......... ZERO B(K+1,K) ..........
7308  240    S = DABS(B(K1,K1)) + DABS(B(K1,K))
7309         IF (S .EQ. 0.0D0) GO TO 260
7310         U1 = B(K1,K1) / S
7311         U2 = B(K1,K) / S
7312         R = DSIGN(DSQRT(U1*U1+U2*U2),U1)
7313         V1 = -(U1 + R) / R
7314         V2 = -U2 / R
7315         U2 = V2 / V1
7316C
7317         DO 250 I = LOR1, LL
7318            T = A(I,K1) + U2 * A(I,K)
7319            A(I,K1) = A(I,K1) + T * V1
7320            A(I,K) = A(I,K) + T * V2
7321            T = B(I,K1) + U2 * B(I,K)
7322            B(I,K1) = B(I,K1) + T * V1
7323            B(I,K) = B(I,K) + T * V2
7324  250    CONTINUE
7325C
7326         B(K1,K) = 0.0D0
7327         IF (.NOT. MATZ) GO TO 260
7328C
7329         DO 255 I = 1, N
7330            T = Z(I,K1) + U2 * Z(I,K)
7331            Z(I,K1) = Z(I,K1) + T * V1
7332            Z(I,K) = Z(I,K) + T * V2
7333  255    CONTINUE
7334C
7335  260 CONTINUE
7336C     .......... END QZ STEP ..........
7337      GO TO 70
7338C     .......... SET ERROR -- ALL EIGENVALUES HAVE NOT
7339C                CONVERGED AFTER 30*N ITERATIONS ..........
7340 1000 IERR = EN
7341C     .......... SAVE EPSB FOR USE BY QZVAL AND QZVEC ..........
7342 1001 IF (N .GT. 1) B(N,1) = EPSB
7343      RETURN
7344      END
7345      SUBROUTINE QZVAL(NM,N,A,B,ALFR,ALFI,BETA,MATZ,Z)
7346C
7347      INTEGER I,J,N,EN,NA,NM,NN,ISW
7348      DOUBLE PRECISION A(NM,N),B(NM,N),ALFR(N),ALFI(N),BETA(N),Z(NM,N)
7349      DOUBLE PRECISION C,D,E,R,S,T,AN,A1,A2,BN,CQ,CZ,DI,DR,EI,TI,TR,U1,
7350     X       U2,V1,V2,A1I,A11,A12,A2I,A21,A22,B11,B12,B22,SQI,SQR,
7351     X       SSI,SSR,SZI,SZR,A11I,A11R,A12I,A12R,A22I,A22R,EPSB
7352      LOGICAL MATZ
7353C
7354C     THIS SUBROUTINE IS THE THIRD STEP OF THE QZ ALGORITHM
7355C     FOR SOLVING GENERALIZED MATRIX EIGENVALUE PROBLEMS,
7356C     SIAM J. NUMER. ANAL. 10, 241-256(1973) BY MOLER AND STEWART.
7357C
7358C     THIS SUBROUTINE ACCEPTS A PAIR OF REAL MATRICES, ONE OF THEM
7359C     IN QUASI-TRIANGULAR FORM AND THE OTHER IN UPPER TRIANGULAR FORM.
7360C     IT REDUCES THE QUASI-TRIANGULAR MATRIX FURTHER, SO THAT ANY
7361C     REMAINING 2-BY-2 BLOCKS CORRESPOND TO PAIRS OF COMPLEX
7362C     EIGENVALUES, AND RETURNS QUANTITIES WHOSE RATIOS GIVE THE
7363C     GENERALIZED EIGENVALUES.  IT IS USUALLY PRECEDED BY  QZHES
7364C     AND  QZIT  AND MAY BE FOLLOWED BY  QZVEC.
7365C
7366C     ON INPUT
7367C
7368C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
7369C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
7370C          DIMENSION STATEMENT.
7371C
7372C        N IS THE ORDER OF THE MATRICES.
7373C
7374C        A CONTAINS A REAL UPPER QUASI-TRIANGULAR MATRIX.
7375C
7376C        B CONTAINS A REAL UPPER TRIANGULAR MATRIX.  IN ADDITION,
7377C          LOCATION B(N,1) CONTAINS THE TOLERANCE QUANTITY (EPSB)
7378C          COMPUTED AND SAVED IN  QZIT.
7379C
7380C        MATZ SHOULD BE SET TO .TRUE. IF THE RIGHT HAND TRANSFORMATIONS
7381C          ARE TO BE ACCUMULATED FOR LATER USE IN COMPUTING
7382C          EIGENVECTORS, AND TO .FALSE. OTHERWISE.
7383C
7384C        Z CONTAINS, IF MATZ HAS BEEN SET TO .TRUE., THE
7385C          TRANSFORMATION MATRIX PRODUCED IN THE REDUCTIONS BY QZHES
7386C          AND QZIT, IF PERFORMED, OR ELSE THE IDENTITY MATRIX.
7387C          IF MATZ HAS BEEN SET TO .FALSE., Z IS NOT REFERENCED.
7388C
7389C     ON OUTPUT
7390C
7391C        A HAS BEEN REDUCED FURTHER TO A QUASI-TRIANGULAR MATRIX
7392C          IN WHICH ALL NONZERO SUBDIAGONAL ELEMENTS CORRESPOND TO
7393C          PAIRS OF COMPLEX EIGENVALUES.
7394C
7395C        B IS STILL IN UPPER TRIANGULAR FORM, ALTHOUGH ITS ELEMENTS
7396C          HAVE BEEN ALTERED.  B(N,1) IS UNALTERED.
7397C
7398C        ALFR AND ALFI CONTAIN THE REAL AND IMAGINARY PARTS OF THE
7399C          DIAGONAL ELEMENTS OF THE TRIANGULAR MATRIX THAT WOULD BE
7400C          OBTAINED IF A WERE REDUCED COMPLETELY TO TRIANGULAR FORM
7401C          BY UNITARY TRANSFORMATIONS.  NON-ZERO VALUES OF ALFI OCCUR
7402C          IN PAIRS, THE FIRST MEMBER POSITIVE AND THE SECOND NEGATIVE.
7403C
7404C        BETA CONTAINS THE DIAGONAL ELEMENTS OF THE CORRESPONDING B,
7405C          NORMALIZED TO BE REAL AND NON-NEGATIVE.  THE GENERALIZED
7406C          EIGENVALUES ARE THEN THE RATIOS ((ALFR+I*ALFI)/BETA).
7407C
7408C        Z CONTAINS THE PRODUCT OF THE RIGHT HAND TRANSFORMATIONS
7409C          (FOR ALL THREE STEPS) IF MATZ HAS BEEN SET TO .TRUE.
7410C
7411C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
7412C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
7413C
7414C     THIS VERSION DATED AUGUST 1983.
7415C
7416C     ------------------------------------------------------------------
7417C
7418      EPSB = B(N,1)
7419      ISW = 1
7420C     .......... FIND EIGENVALUES OF QUASI-TRIANGULAR MATRICES.
7421C                FOR EN=N STEP -1 UNTIL 1 DO -- ..........
7422      DO 510 NN = 1, N
7423         EN = N + 1 - NN
7424         NA = EN - 1
7425         IF (ISW .EQ. 2) GO TO 505
7426         IF (EN .EQ. 1) GO TO 410
7427         IF (A(EN,NA) .NE. 0.0D0) GO TO 420
7428C     .......... 1-BY-1 BLOCK, ONE REAL ROOT ..........
7429  410    ALFR(EN) = A(EN,EN)
7430         IF (B(EN,EN) .LT. 0.0D0) ALFR(EN) = -ALFR(EN)
7431         BETA(EN) = DABS(B(EN,EN))
7432         ALFI(EN) = 0.0D0
7433         GO TO 510
7434C     .......... 2-BY-2 BLOCK ..........
7435  420    IF (DABS(B(NA,NA)) .LE. EPSB) GO TO 455
7436         IF (DABS(B(EN,EN)) .GT. EPSB) GO TO 430
7437         A1 = A(EN,EN)
7438         A2 = A(EN,NA)
7439         BN = 0.0D0
7440         GO TO 435
7441  430    AN = DABS(A(NA,NA)) + DABS(A(NA,EN)) + DABS(A(EN,NA))
7442     X      + DABS(A(EN,EN))
7443         BN = DABS(B(NA,NA)) + DABS(B(NA,EN)) + DABS(B(EN,EN))
7444         A11 = A(NA,NA) / AN
7445         A12 = A(NA,EN) / AN
7446         A21 = A(EN,NA) / AN
7447         A22 = A(EN,EN) / AN
7448         B11 = B(NA,NA) / BN
7449         B12 = B(NA,EN) / BN
7450         B22 = B(EN,EN) / BN
7451         E = A11 / B11
7452         EI = A22 / B22
7453         S = A21 / (B11 * B22)
7454         T = (A22 - E * B22) / B22
7455         IF (DABS(E) .LE. DABS(EI)) GO TO 431
7456         E = EI
7457         T = (A11 - E * B11) / B11
7458  431    C = 0.5D0 * (T - S * B12)
7459         D = C * C + S * (A12 - E * B12)
7460         IF (D .LT. 0.0D0) GO TO 480
7461C     .......... TWO REAL ROOTS.
7462C                ZERO BOTH A(EN,NA) AND B(EN,NA) ..........
7463         E = E + (C + DSIGN(DSQRT(D),C))
7464         A11 = A11 - E * B11
7465         A12 = A12 - E * B12
7466         A22 = A22 - E * B22
7467         IF (DABS(A11) + DABS(A12) .LT.
7468     X       DABS(A21) + DABS(A22)) GO TO 432
7469         A1 = A12
7470         A2 = A11
7471         GO TO 435
7472  432    A1 = A22
7473         A2 = A21
7474C     .......... CHOOSE AND APPLY REAL Z ..........
7475  435    S = DABS(A1) + DABS(A2)
7476         U1 = A1 / S
7477         U2 = A2 / S
7478         R = DSIGN(DSQRT(U1*U1+U2*U2),U1)
7479         V1 = -(U1 + R) / R
7480         V2 = -U2 / R
7481         U2 = V2 / V1
7482C
7483         DO 440 I = 1, EN
7484            T = A(I,EN) + U2 * A(I,NA)
7485            A(I,EN) = A(I,EN) + T * V1
7486            A(I,NA) = A(I,NA) + T * V2
7487            T = B(I,EN) + U2 * B(I,NA)
7488            B(I,EN) = B(I,EN) + T * V1
7489            B(I,NA) = B(I,NA) + T * V2
7490  440    CONTINUE
7491C
7492         IF (.NOT. MATZ) GO TO 450
7493C
7494         DO 445 I = 1, N
7495            T = Z(I,EN) + U2 * Z(I,NA)
7496            Z(I,EN) = Z(I,EN) + T * V1
7497            Z(I,NA) = Z(I,NA) + T * V2
7498  445    CONTINUE
7499C
7500  450    IF (BN .EQ. 0.0D0) GO TO 475
7501         IF (AN .LT. DABS(E) * BN) GO TO 455
7502         A1 = B(NA,NA)
7503         A2 = B(EN,NA)
7504         GO TO 460
7505  455    A1 = A(NA,NA)
7506         A2 = A(EN,NA)
7507C     .......... CHOOSE AND APPLY REAL Q ..........
7508  460    S = DABS(A1) + DABS(A2)
7509         IF (S .EQ. 0.0D0) GO TO 475
7510         U1 = A1 / S
7511         U2 = A2 / S
7512         R = DSIGN(DSQRT(U1*U1+U2*U2),U1)
7513         V1 = -(U1 + R) / R
7514         V2 = -U2 / R
7515         U2 = V2 / V1
7516C
7517         DO 470 J = NA, N
7518            T = A(NA,J) + U2 * A(EN,J)
7519            A(NA,J) = A(NA,J) + T * V1
7520            A(EN,J) = A(EN,J) + T * V2
7521            T = B(NA,J) + U2 * B(EN,J)
7522            B(NA,J) = B(NA,J) + T * V1
7523            B(EN,J) = B(EN,J) + T * V2
7524  470    CONTINUE
7525C
7526  475    A(EN,NA) = 0.0D0
7527         B(EN,NA) = 0.0D0
7528         ALFR(NA) = A(NA,NA)
7529         ALFR(EN) = A(EN,EN)
7530         IF (B(NA,NA) .LT. 0.0D0) ALFR(NA) = -ALFR(NA)
7531         IF (B(EN,EN) .LT. 0.0D0) ALFR(EN) = -ALFR(EN)
7532         BETA(NA) = DABS(B(NA,NA))
7533         BETA(EN) = DABS(B(EN,EN))
7534         ALFI(EN) = 0.0D0
7535         ALFI(NA) = 0.0D0
7536         GO TO 505
7537C     .......... TWO COMPLEX ROOTS ..........
7538  480    E = E + C
7539         EI = DSQRT(-D)
7540         A11R = A11 - E * B11
7541         A11I = EI * B11
7542         A12R = A12 - E * B12
7543         A12I = EI * B12
7544         A22R = A22 - E * B22
7545         A22I = EI * B22
7546         IF (DABS(A11R) + DABS(A11I) + DABS(A12R) + DABS(A12I) .LT.
7547     X       DABS(A21) + DABS(A22R) + DABS(A22I)) GO TO 482
7548         A1 = A12R
7549         A1I = A12I
7550         A2 = -A11R
7551         A2I = -A11I
7552         GO TO 485
7553  482    A1 = A22R
7554         A1I = A22I
7555         A2 = -A21
7556         A2I = 0.0D0
7557C     .......... CHOOSE COMPLEX Z ..........
7558  485    CZ = DSQRT(A1*A1+A1I*A1I)
7559         IF (CZ .EQ. 0.0D0) GO TO 487
7560         SZR = (A1 * A2 + A1I * A2I) / CZ
7561         SZI = (A1 * A2I - A1I * A2) / CZ
7562         R = DSQRT(CZ*CZ+SZR*SZR+SZI*SZI)
7563         CZ = CZ / R
7564         SZR = SZR / R
7565         SZI = SZI / R
7566         GO TO 490
7567  487    SZR = 1.0D0
7568         SZI = 0.0D0
7569  490    IF (AN .LT. (DABS(E) + EI) * BN) GO TO 492
7570         A1 = CZ * B11 + SZR * B12
7571         A1I = SZI * B12
7572         A2 = SZR * B22
7573         A2I = SZI * B22
7574         GO TO 495
7575  492    A1 = CZ * A11 + SZR * A12
7576         A1I = SZI * A12
7577         A2 = CZ * A21 + SZR * A22
7578         A2I = SZI * A22
7579C     .......... CHOOSE COMPLEX Q ..........
7580  495    CQ = DSQRT(A1*A1+A1I*A1I)
7581         IF (CQ .EQ. 0.0D0) GO TO 497
7582         SQR = (A1 * A2 + A1I * A2I) / CQ
7583         SQI = (A1 * A2I - A1I * A2) / CQ
7584         R = DSQRT(CQ*CQ+SQR*SQR+SQI*SQI)
7585         CQ = CQ / R
7586         SQR = SQR / R
7587         SQI = SQI / R
7588         GO TO 500
7589  497    SQR = 1.0D0
7590         SQI = 0.0D0
7591C     .......... COMPUTE DIAGONAL ELEMENTS THAT WOULD RESULT
7592C                IF TRANSFORMATIONS WERE APPLIED ..........
7593  500    SSR = SQR * SZR + SQI * SZI
7594         SSI = SQR * SZI - SQI * SZR
7595         I = 1
7596         TR = CQ * CZ * A11 + CQ * SZR * A12 + SQR * CZ * A21
7597     X      + SSR * A22
7598         TI = CQ * SZI * A12 - SQI * CZ * A21 + SSI * A22
7599         DR = CQ * CZ * B11 + CQ * SZR * B12 + SSR * B22
7600         DI = CQ * SZI * B12 + SSI * B22
7601         GO TO 503
7602  502    I = 2
7603         TR = SSR * A11 - SQR * CZ * A12 - CQ * SZR * A21
7604     X      + CQ * CZ * A22
7605         TI = -SSI * A11 - SQI * CZ * A12 + CQ * SZI * A21
7606         DR = SSR * B11 - SQR * CZ * B12 + CQ * CZ * B22
7607         DI = -SSI * B11 - SQI * CZ * B12
7608  503    T = TI * DR - TR * DI
7609         J = NA
7610         IF (T .LT. 0.0D0) J = EN
7611         R = DSQRT(DR*DR+DI*DI)
7612         BETA(J) = BN * R
7613         ALFR(J) = AN * (TR * DR + TI * DI) / R
7614         ALFI(J) = AN * T / R
7615         IF (I .EQ. 1) GO TO 502
7616  505    ISW = 3 - ISW
7617  510 CONTINUE
7618      B(N,1) = EPSB
7619C
7620      RETURN
7621      END
7622      SUBROUTINE QZVEC(NM,N,A,B,ALFR,ALFI,BETA,Z)
7623C
7624      INTEGER I,J,K,M,N,EN,II,JJ,NA,NM,NN,ISW,ENM2
7625      DOUBLE PRECISION A(NM,N),B(NM,N),ALFR(N),ALFI(N),BETA(N),Z(NM,N)
7626      DOUBLE PRECISION D,Q,R,S,T,W,X,Y,DI,DR,RA,RR,SA,TI,TR,T1,T2,W1,X1,
7627     X       ZZ,Z1,ALFM,ALMI,ALMR,BETM,EPSB
7628C
7629C     THIS SUBROUTINE IS THE OPTIONAL FOURTH STEP OF THE QZ ALGORITHM
7630C     FOR SOLVING GENERALIZED MATRIX EIGENVALUE PROBLEMS,
7631C     SIAM J. NUMER. ANAL. 10, 241-256(1973) BY MOLER AND STEWART.
7632C
7633C     THIS SUBROUTINE ACCEPTS A PAIR OF REAL MATRICES, ONE OF THEM IN
7634C     QUASI-TRIANGULAR FORM (IN WHICH EACH 2-BY-2 BLOCK CORRESPONDS TO
7635C     A PAIR OF COMPLEX EIGENVALUES) AND THE OTHER IN UPPER TRIANGULAR
7636C     FORM.  IT COMPUTES THE EIGENVECTORS OF THE TRIANGULAR PROBLEM AND
7637C     TRANSFORMS THE RESULTS BACK TO THE ORIGINAL COORDINATE SYSTEM.
7638C     IT IS USUALLY PRECEDED BY  QZHES,  QZIT, AND  QZVAL.
7639C
7640C     ON INPUT
7641C
7642C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
7643C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
7644C          DIMENSION STATEMENT.
7645C
7646C        N IS THE ORDER OF THE MATRICES.
7647C
7648C        A CONTAINS A REAL UPPER QUASI-TRIANGULAR MATRIX.
7649C
7650C        B CONTAINS A REAL UPPER TRIANGULAR MATRIX.  IN ADDITION,
7651C          LOCATION B(N,1) CONTAINS THE TOLERANCE QUANTITY (EPSB)
7652C          COMPUTED AND SAVED IN  QZIT.
7653C
7654C        ALFR, ALFI, AND BETA  ARE VECTORS WITH COMPONENTS WHOSE
7655C          RATIOS ((ALFR+I*ALFI)/BETA) ARE THE GENERALIZED
7656C          EIGENVALUES.  THEY ARE USUALLY OBTAINED FROM  QZVAL.
7657C
7658C        Z CONTAINS THE TRANSFORMATION MATRIX PRODUCED IN THE
7659C          REDUCTIONS BY  QZHES,  QZIT, AND  QZVAL, IF PERFORMED.
7660C          IF THE EIGENVECTORS OF THE TRIANGULAR PROBLEM ARE
7661C          DESIRED, Z MUST CONTAIN THE IDENTITY MATRIX.
7662C
7663C     ON OUTPUT
7664C
7665C        A IS UNALTERED.  ITS SUBDIAGONAL ELEMENTS PROVIDE INFORMATION
7666C           ABOUT THE STORAGE OF THE COMPLEX EIGENVECTORS.
7667C
7668C        B HAS BEEN DESTROYED.
7669C
7670C        ALFR, ALFI, AND BETA ARE UNALTERED.
7671C
7672C        Z CONTAINS THE REAL AND IMAGINARY PARTS OF THE EIGENVECTORS.
7673C          IF ALFI(I) .EQ. 0.0, THE I-TH EIGENVALUE IS REAL AND
7674C            THE I-TH COLUMN OF Z CONTAINS ITS EIGENVECTOR.
7675C          IF ALFI(I) .NE. 0.0, THE I-TH EIGENVALUE IS COMPLEX.
7676C            IF ALFI(I) .GT. 0.0, THE EIGENVALUE IS THE FIRST OF
7677C              A COMPLEX PAIR AND THE I-TH AND (I+1)-TH COLUMNS
7678C              OF Z CONTAIN ITS EIGENVECTOR.
7679C            IF ALFI(I) .LT. 0.0, THE EIGENVALUE IS THE SECOND OF
7680C              A COMPLEX PAIR AND THE (I-1)-TH AND I-TH COLUMNS
7681C              OF Z CONTAIN THE CONJUGATE OF ITS EIGENVECTOR.
7682C          EACH EIGENVECTOR IS NORMALIZED SO THAT THE MODULUS
7683C          OF ITS LARGEST COMPONENT IS 1.0 .
7684C
7685C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
7686C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
7687C
7688C     THIS VERSION DATED AUGUST 1983.
7689C
7690C     ------------------------------------------------------------------
7691C
7692      EPSB = B(N,1)
7693      ISW = 1
7694C     .......... FOR EN=N STEP -1 UNTIL 1 DO -- ..........
7695      DO 800 NN = 1, N
7696         EN = N + 1 - NN
7697         NA = EN - 1
7698         IF (ISW .EQ. 2) GO TO 795
7699         IF (ALFI(EN) .NE. 0.0D0) GO TO 710
7700C     .......... REAL VECTOR ..........
7701         M = EN
7702         B(EN,EN) = 1.0D0
7703         IF (NA .EQ. 0) GO TO 800
7704         ALFM = ALFR(M)
7705         BETM = BETA(M)
7706C     .......... FOR I=EN-1 STEP -1 UNTIL 1 DO -- ..........
7707         DO 700 II = 1, NA
7708            I = EN - II
7709            W = BETM * A(I,I) - ALFM * B(I,I)
7710            R = 0.0D0
7711C
7712            DO 610 J = M, EN
7713  610       R = R + (BETM * A(I,J) - ALFM * B(I,J)) * B(J,EN)
7714C
7715            IF (I .EQ. 1 .OR. ISW .EQ. 2) GO TO 630
7716            IF (BETM * A(I,I-1) .EQ. 0.0D0) GO TO 630
7717            ZZ = W
7718            S = R
7719            GO TO 690
7720  630       M = I
7721            IF (ISW .EQ. 2) GO TO 640
7722C     .......... REAL 1-BY-1 BLOCK ..........
7723            T = W
7724            IF (W .EQ. 0.0D0) T = EPSB
7725            B(I,EN) = -R / T
7726            GO TO 700
7727C     .......... REAL 2-BY-2 BLOCK ..........
7728  640       X = BETM * A(I,I+1) - ALFM * B(I,I+1)
7729            Y = BETM * A(I+1,I)
7730            Q = W * ZZ - X * Y
7731            T = (X * S - ZZ * R) / Q
7732            B(I,EN) = T
7733            IF (DABS(X) .LE. DABS(ZZ)) GO TO 650
7734            B(I+1,EN) = (-R - W * T) / X
7735            GO TO 690
7736  650       B(I+1,EN) = (-S - Y * T) / ZZ
7737  690       ISW = 3 - ISW
7738  700    CONTINUE
7739C     .......... END REAL VECTOR ..........
7740         GO TO 800
7741C     .......... COMPLEX VECTOR ..........
7742  710    M = NA
7743         ALMR = ALFR(M)
7744         ALMI = ALFI(M)
7745         BETM = BETA(M)
7746C     .......... LAST VECTOR COMPONENT CHOSEN IMAGINARY SO THAT
7747C                EIGENVECTOR MATRIX IS TRIANGULAR ..........
7748         Y = BETM * A(EN,NA)
7749         B(NA,NA) = -ALMI * B(EN,EN) / Y
7750         B(NA,EN) = (ALMR * B(EN,EN) - BETM * A(EN,EN)) / Y
7751         B(EN,NA) = 0.0D0
7752         B(EN,EN) = 1.0D0
7753         ENM2 = NA - 1
7754         IF (ENM2 .EQ. 0) GO TO 795
7755C     .......... FOR I=EN-2 STEP -1 UNTIL 1 DO -- ..........
7756         DO 790 II = 1, ENM2
7757            I = NA - II
7758            W = BETM * A(I,I) - ALMR * B(I,I)
7759            W1 = -ALMI * B(I,I)
7760            RA = 0.0D0
7761            SA = 0.0D0
7762C
7763            DO 760 J = M, EN
7764               X = BETM * A(I,J) - ALMR * B(I,J)
7765               X1 = -ALMI * B(I,J)
7766               RA = RA + X * B(J,NA) - X1 * B(J,EN)
7767               SA = SA + X * B(J,EN) + X1 * B(J,NA)
7768  760       CONTINUE
7769C
7770            IF (I .EQ. 1 .OR. ISW .EQ. 2) GO TO 770
7771            IF (BETM * A(I,I-1) .EQ. 0.0D0) GO TO 770
7772            ZZ = W
7773            Z1 = W1
7774            R = RA
7775            S = SA
7776            ISW = 2
7777            GO TO 790
7778  770       M = I
7779            IF (ISW .EQ. 2) GO TO 780
7780C     .......... COMPLEX 1-BY-1 BLOCK ..........
7781            TR = -RA
7782            TI = -SA
7783  773       DR = W
7784            DI = W1
7785C     .......... COMPLEX DIVIDE (T1,T2) = (TR,TI) / (DR,DI) ..........
7786  775       IF (DABS(DI) .GT. DABS(DR)) GO TO 777
7787            RR = DI / DR
7788            D = DR + DI * RR
7789            T1 = (TR + TI * RR) / D
7790            T2 = (TI - TR * RR) / D
7791            GO TO (787,782), ISW
7792  777       RR = DR / DI
7793            D = DR * RR + DI
7794            T1 = (TR * RR + TI) / D
7795            T2 = (TI * RR - TR) / D
7796            GO TO (787,782), ISW
7797C     .......... COMPLEX 2-BY-2 BLOCK ..........
7798  780       X = BETM * A(I,I+1) - ALMR * B(I,I+1)
7799            X1 = -ALMI * B(I,I+1)
7800            Y = BETM * A(I+1,I)
7801            TR = Y * RA - W * R + W1 * S
7802            TI = Y * SA - W * S - W1 * R
7803            DR = W * ZZ - W1 * Z1 - X * Y
7804            DI = W * Z1 + W1 * ZZ - X1 * Y
7805            IF (DR .EQ. 0.0D0 .AND. DI .EQ. 0.0D0) DR = EPSB
7806            GO TO 775
7807  782       B(I+1,NA) = T1
7808            B(I+1,EN) = T2
7809            ISW = 1
7810            IF (DABS(Y) .GT. DABS(W) + DABS(W1)) GO TO 785
7811            TR = -RA - X * B(I+1,NA) + X1 * B(I+1,EN)
7812            TI = -SA - X * B(I+1,EN) - X1 * B(I+1,NA)
7813            GO TO 773
7814  785       T1 = (-R - ZZ * B(I+1,NA) + Z1 * B(I+1,EN)) / Y
7815            T2 = (-S - ZZ * B(I+1,EN) - Z1 * B(I+1,NA)) / Y
7816  787       B(I,NA) = T1
7817            B(I,EN) = T2
7818  790    CONTINUE
7819C     .......... END COMPLEX VECTOR ..........
7820  795    ISW = 3 - ISW
7821  800 CONTINUE
7822C     .......... END BACK SUBSTITUTION.
7823C                TRANSFORM TO ORIGINAL COORDINATE SYSTEM.
7824C                FOR J=N STEP -1 UNTIL 1 DO -- ..........
7825      DO 880 JJ = 1, N
7826         J = N + 1 - JJ
7827C
7828         DO 880 I = 1, N
7829            ZZ = 0.0D0
7830C
7831            DO 860 K = 1, J
7832  860       ZZ = ZZ + Z(I,K) * B(K,J)
7833C
7834            Z(I,J) = ZZ
7835  880 CONTINUE
7836C     .......... NORMALIZE SO THAT MODULUS OF LARGEST
7837C                COMPONENT OF EACH VECTOR IS 1.
7838C                (ISW IS 1 INITIALLY FROM BEFORE) ..........
7839      DO 950 J = 1, N
7840         D = 0.0D0
7841         IF (ISW .EQ. 2) GO TO 920
7842         IF (ALFI(J) .NE. 0.0D0) GO TO 945
7843C
7844         DO 890 I = 1, N
7845            IF (DABS(Z(I,J)) .GT. D) D = DABS(Z(I,J))
7846  890    CONTINUE
7847C
7848         DO 900 I = 1, N
7849  900    Z(I,J) = Z(I,J) / D
7850C
7851         GO TO 950
7852C
7853  920    DO 930 I = 1, N
7854            R = DABS(Z(I,J-1)) + DABS(Z(I,J))
7855            IF (R .NE. 0.0D0) R = R * DSQRT((Z(I,J-1)/R)**2
7856     X                                     +(Z(I,J)/R)**2)
7857            IF (R .GT. D) D = R
7858  930    CONTINUE
7859C
7860         DO 940 I = 1, N
7861            Z(I,J-1) = Z(I,J-1) / D
7862            Z(I,J) = Z(I,J) / D
7863  940    CONTINUE
7864C
7865  945    ISW = 3 - ISW
7866  950 CONTINUE
7867C
7868      RETURN
7869      END
7870      SUBROUTINE RATQR(N,EPS1,D,E,E2,M,W,IND,BD,TYPE,IDEF,IERR)
7871C
7872      INTEGER I,J,K,M,N,II,JJ,K1,IDEF,IERR,JDEF
7873      DOUBLE PRECISION D(N),E(N),E2(N),W(N),BD(N)
7874      DOUBLE PRECISION F,P,Q,R,S,EP,QP,ERR,TOT,EPS1,DELTA,EPSLON
7875      INTEGER IND(N)
7876      LOGICAL TYPE
7877C
7878C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE RATQR,
7879C     NUM. MATH. 11, 264-272(1968) BY REINSCH AND BAUER.
7880C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 257-265(1971).
7881C
7882C     THIS SUBROUTINE FINDS THE ALGEBRAICALLY SMALLEST OR LARGEST
7883C     EIGENVALUES OF A SYMMETRIC TRIDIAGONAL MATRIX BY THE
7884C     RATIONAL QR METHOD WITH NEWTON CORRECTIONS.
7885C
7886C     ON INPUT
7887C
7888C        N IS THE ORDER OF THE MATRIX.
7889C
7890C        EPS1 IS A THEORETICAL ABSOLUTE ERROR TOLERANCE FOR THE
7891C          COMPUTED EIGENVALUES.  IF THE INPUT EPS1 IS NON-POSITIVE,
7892C          OR INDEED SMALLER THAN ITS DEFAULT VALUE, IT IS RESET
7893C          AT EACH ITERATION TO THE RESPECTIVE DEFAULT VALUE,
7894C          NAMELY, THE PRODUCT OF THE RELATIVE MACHINE PRECISION
7895C          AND THE MAGNITUDE OF THE CURRENT EIGENVALUE ITERATE.
7896C          THE THEORETICAL ABSOLUTE ERROR IN THE K-TH EIGENVALUE
7897C          IS USUALLY NOT GREATER THAN K TIMES EPS1.
7898C
7899C        D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX.
7900C
7901C        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE INPUT MATRIX
7902C          IN ITS LAST N-1 POSITIONS.  E(1) IS ARBITRARY.
7903C
7904C        E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E.
7905C          E2(1) IS ARBITRARY.
7906C
7907C        M IS THE NUMBER OF EIGENVALUES TO BE FOUND.
7908C
7909C        IDEF SHOULD BE SET TO 1 IF THE INPUT MATRIX IS KNOWN TO BE
7910C          POSITIVE DEFINITE, TO -1 IF THE INPUT MATRIX IS KNOWN TO
7911C          BE NEGATIVE DEFINITE, AND TO 0 OTHERWISE.
7912C
7913C        TYPE SHOULD BE SET TO .TRUE. IF THE SMALLEST EIGENVALUES
7914C          ARE TO BE FOUND, AND TO .FALSE. IF THE LARGEST EIGENVALUES
7915C          ARE TO BE FOUND.
7916C
7917C     ON OUTPUT
7918C
7919C        EPS1 IS UNALTERED UNLESS IT HAS BEEN RESET TO ITS
7920C          (LAST) DEFAULT VALUE.
7921C
7922C        D AND E ARE UNALTERED (UNLESS W OVERWRITES D).
7923C
7924C        ELEMENTS OF E2, CORRESPONDING TO ELEMENTS OF E REGARDED
7925C          AS NEGLIGIBLE, HAVE BEEN REPLACED BY ZERO CAUSING THE
7926C          MATRIX TO SPLIT INTO A DIRECT SUM OF SUBMATRICES.
7927C          E2(1) IS SET TO 0.0D0 IF THE SMALLEST EIGENVALUES HAVE BEEN
7928C          FOUND, AND TO 2.0D0 IF THE LARGEST EIGENVALUES HAVE BEEN
7929C          FOUND.  E2 IS OTHERWISE UNALTERED (UNLESS OVERWRITTEN BY BD).
7930C
7931C        W CONTAINS THE M ALGEBRAICALLY SMALLEST EIGENVALUES IN
7932C          ASCENDING ORDER, OR THE M LARGEST EIGENVALUES IN
7933C          DESCENDING ORDER.  IF AN ERROR EXIT IS MADE BECAUSE OF
7934C          AN INCORRECT SPECIFICATION OF IDEF, NO EIGENVALUES
7935C          ARE FOUND.  IF THE NEWTON ITERATES FOR A PARTICULAR
7936C          EIGENVALUE ARE NOT MONOTONE, THE BEST ESTIMATE OBTAINED
7937C          IS RETURNED AND IERR IS SET.  W MAY COINCIDE WITH D.
7938C
7939C        IND CONTAINS IN ITS FIRST M POSITIONS THE SUBMATRIX INDICES
7940C          ASSOCIATED WITH THE CORRESPONDING EIGENVALUES IN W --
7941C          1 FOR EIGENVALUES BELONGING TO THE FIRST SUBMATRIX FROM
7942C          THE TOP, 2 FOR THOSE BELONGING TO THE SECOND SUBMATRIX, ETC..
7943C
7944C        BD CONTAINS REFINED BOUNDS FOR THE THEORETICAL ERRORS OF THE
7945C          CORRESPONDING EIGENVALUES IN W.  THESE BOUNDS ARE USUALLY
7946C          WITHIN THE TOLERANCE SPECIFIED BY EPS1.  BD MAY COINCIDE
7947C          WITH E2.
7948C
7949C        IERR IS SET TO
7950C          ZERO       FOR NORMAL RETURN,
7951C          6*N+1      IF  IDEF  IS SET TO 1 AND  TYPE  TO .TRUE.
7952C                     WHEN THE MATRIX IS NOT POSITIVE DEFINITE, OR
7953C                     IF  IDEF  IS SET TO -1 AND  TYPE  TO .FALSE.
7954C                     WHEN THE MATRIX IS NOT NEGATIVE DEFINITE,
7955C          5*N+K      IF SUCCESSIVE ITERATES TO THE K-TH EIGENVALUE
7956C                     ARE NOT MONOTONE INCREASING, WHERE K REFERS
7957C                     TO THE LAST SUCH OCCURRENCE.
7958C
7959C     NOTE THAT SUBROUTINE TRIDIB IS GENERALLY FASTER AND MORE
7960C     ACCURATE THAN RATQR IF THE EIGENVALUES ARE CLUSTERED.
7961C
7962C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
7963C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
7964C
7965C     THIS VERSION DATED AUGUST 1983.
7966C
7967C     ------------------------------------------------------------------
7968C
7969      IERR = 0
7970      JDEF = IDEF
7971C     .......... COPY D ARRAY INTO W ..........
7972      DO 20 I = 1, N
7973   20 W(I) = D(I)
7974C
7975      IF (TYPE) GO TO 40
7976      J = 1
7977      GO TO 400
7978   40 ERR = 0.0D0
7979      S = 0.0D0
7980C     .......... LOOK FOR SMALL SUB-DIAGONAL ENTRIES AND DEFINE
7981C                INITIAL SHIFT FROM LOWER GERSCHGORIN BOUND.
7982C                COPY E2 ARRAY INTO BD ..........
7983      TOT = W(1)
7984      Q = 0.0D0
7985      J = 0
7986C
7987      DO 100 I = 1, N
7988         P = Q
7989         IF (I .EQ. 1) GO TO 60
7990         IF (P .GT. EPSLON(DABS(D(I)) + DABS(D(I-1)))) GO TO 80
7991   60    E2(I) = 0.0D0
7992   80    BD(I) = E2(I)
7993C     .......... COUNT ALSO IF ELEMENT OF E2 HAS UNDERFLOWED ..........
7994         IF (E2(I) .EQ. 0.0D0) J = J + 1
7995         IND(I) = J
7996         Q = 0.0D0
7997         IF (I .NE. N) Q = DABS(E(I+1))
7998         TOT = DMIN1(W(I)-P-Q,TOT)
7999  100 CONTINUE
8000C
8001      IF (JDEF .EQ. 1 .AND. TOT .LT. 0.0D0) GO TO 140
8002C
8003      DO 110 I = 1, N
8004  110 W(I) = W(I) - TOT
8005C
8006      GO TO 160
8007  140 TOT = 0.0D0
8008C
8009  160 DO 360 K = 1, M
8010C     .......... NEXT QR TRANSFORMATION ..........
8011  180    TOT = TOT + S
8012         DELTA = W(N) - S
8013         I = N
8014         F = DABS(EPSLON(TOT))
8015         IF (EPS1 .LT. F) EPS1 = F
8016         IF (DELTA .GT. EPS1) GO TO 190
8017         IF (DELTA .LT. (-EPS1)) GO TO 1000
8018         GO TO 300
8019C     .......... REPLACE SMALL SUB-DIAGONAL SQUARES BY ZERO
8020C                TO REDUCE THE INCIDENCE OF UNDERFLOWS ..........
8021  190    IF (K .EQ. N) GO TO 210
8022         K1 = K + 1
8023         DO 200 J = K1, N
8024            IF (BD(J) .LE. (EPSLON(W(J)+W(J-1))) ** 2) BD(J) = 0.0D0
8025  200    CONTINUE
8026C
8027  210    F = BD(N) / DELTA
8028         QP = DELTA + F
8029         P = 1.0D0
8030         IF (K .EQ. N) GO TO 260
8031         K1 = N - K
8032C     .......... FOR I=N-1 STEP -1 UNTIL K DO -- ..........
8033         DO 240 II = 1, K1
8034            I = N - II
8035            Q = W(I) - S - F
8036            R = Q / QP
8037            P = P * R + 1.0D0
8038            EP = F * R
8039            W(I+1) = QP + EP
8040            DELTA = Q - EP
8041            IF (DELTA .GT. EPS1) GO TO 220
8042            IF (DELTA .LT. (-EPS1)) GO TO 1000
8043            GO TO 300
8044  220       F = BD(I) / Q
8045            QP = DELTA + F
8046            BD(I+1) = QP * EP
8047  240    CONTINUE
8048C
8049  260    W(K) = QP
8050         S = QP / P
8051         IF (TOT + S .GT. TOT) GO TO 180
8052C     .......... SET ERROR -- IRREGULAR END OF ITERATION.
8053C                DEFLATE MINIMUM DIAGONAL ELEMENT ..........
8054         IERR = 5 * N + K
8055         S = 0.0D0
8056         DELTA = QP
8057C
8058         DO 280 J = K, N
8059            IF (W(J) .GT. DELTA) GO TO 280
8060            I = J
8061            DELTA = W(J)
8062  280    CONTINUE
8063C     .......... CONVERGENCE ..........
8064  300    IF (I .LT. N) BD(I+1) = BD(I) * F / QP
8065         II = IND(I)
8066         IF (I .EQ. K) GO TO 340
8067         K1 = I - K
8068C     .......... FOR J=I-1 STEP -1 UNTIL K DO -- ..........
8069         DO 320 JJ = 1, K1
8070            J = I - JJ
8071            W(J+1) = W(J) - S
8072            BD(J+1) = BD(J)
8073            IND(J+1) = IND(J)
8074  320    CONTINUE
8075C
8076  340    W(K) = TOT
8077         ERR = ERR + DABS(DELTA)
8078         BD(K) = ERR
8079         IND(K) = II
8080  360 CONTINUE
8081C
8082      IF (TYPE) GO TO 1001
8083      F = BD(1)
8084      E2(1) = 2.0D0
8085      BD(1) = F
8086      J = 2
8087C     .......... NEGATE ELEMENTS OF W FOR LARGEST VALUES ..........
8088  400 DO 500 I = 1, N
8089  500 W(I) = -W(I)
8090C
8091      JDEF = -JDEF
8092      GO TO (40,1001), J
8093C     .......... SET ERROR -- IDEF SPECIFIED INCORRECTLY ..........
8094 1000 IERR = 6 * N + 1
8095 1001 RETURN
8096      END
8097      SUBROUTINE REBAK(NM,N,B,DL,M,Z)
8098C
8099      INTEGER I,J,K,M,N,I1,II,NM
8100      DOUBLE PRECISION B(NM,N),DL(N),Z(NM,M)
8101      DOUBLE PRECISION X
8102C
8103C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE REBAKA,
8104C     NUM. MATH. 11, 99-110(1968) BY MARTIN AND WILKINSON.
8105C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 303-314(1971).
8106C
8107C     THIS SUBROUTINE FORMS THE EIGENVECTORS OF A GENERALIZED
8108C     SYMMETRIC EIGENSYSTEM BY BACK TRANSFORMING THOSE OF THE
8109C     DERIVED SYMMETRIC MATRIX DETERMINED BY  REDUC.
8110C
8111C     ON INPUT
8112C
8113C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
8114C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
8115C          DIMENSION STATEMENT.
8116C
8117C        N IS THE ORDER OF THE MATRIX SYSTEM.
8118C
8119C        B CONTAINS INFORMATION ABOUT THE SIMILARITY TRANSFORMATION
8120C          (CHOLESKY DECOMPOSITION) USED IN THE REDUCTION BY  REDUC
8121C          IN ITS STRICT LOWER TRIANGLE.
8122C
8123C        DL CONTAINS FURTHER INFORMATION ABOUT THE TRANSFORMATION.
8124C
8125C        M IS THE NUMBER OF EIGENVECTORS TO BE BACK TRANSFORMED.
8126C
8127C        Z CONTAINS THE EIGENVECTORS TO BE BACK TRANSFORMED
8128C          IN ITS FIRST M COLUMNS.
8129C
8130C     ON OUTPUT
8131C
8132C        Z CONTAINS THE TRANSFORMED EIGENVECTORS
8133C          IN ITS FIRST M COLUMNS.
8134C
8135C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
8136C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
8137C
8138C     THIS VERSION DATED AUGUST 1983.
8139C
8140C     ------------------------------------------------------------------
8141C
8142      IF (M .EQ. 0) GO TO 200
8143C
8144      DO 100 J = 1, M
8145C     .......... FOR I=N STEP -1 UNTIL 1 DO -- ..........
8146         DO 100 II = 1, N
8147            I = N + 1 - II
8148            I1 = I + 1
8149            X = Z(I,J)
8150            IF (I .EQ. N) GO TO 80
8151C
8152            DO 60 K = I1, N
8153   60       X = X - B(K,I) * Z(K,J)
8154C
8155   80       Z(I,J) = X / DL(I)
8156  100 CONTINUE
8157C
8158  200 RETURN
8159      END
8160      SUBROUTINE REBAKB(NM,N,B,DL,M,Z)
8161C
8162      INTEGER I,J,K,M,N,I1,II,NM
8163      DOUBLE PRECISION B(NM,N),DL(N),Z(NM,M)
8164      DOUBLE PRECISION X
8165C
8166C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE REBAKB,
8167C     NUM. MATH. 11, 99-110(1968) BY MARTIN AND WILKINSON.
8168C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 303-314(1971).
8169C
8170C     THIS SUBROUTINE FORMS THE EIGENVECTORS OF A GENERALIZED
8171C     SYMMETRIC EIGENSYSTEM BY BACK TRANSFORMING THOSE OF THE
8172C     DERIVED SYMMETRIC MATRIX DETERMINED BY  REDUC2.
8173C
8174C     ON INPUT
8175C
8176C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
8177C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
8178C          DIMENSION STATEMENT.
8179C
8180C        N IS THE ORDER OF THE MATRIX SYSTEM.
8181C
8182C        B CONTAINS INFORMATION ABOUT THE SIMILARITY TRANSFORMATION
8183C          (CHOLESKY DECOMPOSITION) USED IN THE REDUCTION BY  REDUC2
8184C          IN ITS STRICT LOWER TRIANGLE.
8185C
8186C        DL CONTAINS FURTHER INFORMATION ABOUT THE TRANSFORMATION.
8187C
8188C        M IS THE NUMBER OF EIGENVECTORS TO BE BACK TRANSFORMED.
8189C
8190C        Z CONTAINS THE EIGENVECTORS TO BE BACK TRANSFORMED
8191C          IN ITS FIRST M COLUMNS.
8192C
8193C     ON OUTPUT
8194C
8195C        Z CONTAINS THE TRANSFORMED EIGENVECTORS
8196C          IN ITS FIRST M COLUMNS.
8197C
8198C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
8199C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
8200C
8201C     THIS VERSION DATED AUGUST 1983.
8202C
8203C     ------------------------------------------------------------------
8204C
8205      IF (M .EQ. 0) GO TO 200
8206C
8207      DO 100 J = 1, M
8208C     .......... FOR I=N STEP -1 UNTIL 1 DO -- ..........
8209         DO 100 II = 1, N
8210            I1 = N - II
8211            I = I1 + 1
8212            X = DL(I) * Z(I,J)
8213            IF (I .EQ. 1) GO TO 80
8214C
8215            DO 60 K = 1, I1
8216   60       X = X + B(I,K) * Z(K,J)
8217C
8218   80       Z(I,J) = X
8219  100 CONTINUE
8220C
8221  200 RETURN
8222      END
8223      SUBROUTINE REDUC(NM,N,A,B,DL,IERR)
8224C
8225      INTEGER I,J,K,N,I1,J1,NM,NN,IERR
8226      DOUBLE PRECISION A(NM,N),B(NM,N),DL(N)
8227      DOUBLE PRECISION X,Y
8228C
8229C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE REDUC1,
8230C     NUM. MATH. 11, 99-110(1968) BY MARTIN AND WILKINSON.
8231C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 303-314(1971).
8232C
8233C     THIS SUBROUTINE REDUCES THE GENERALIZED SYMMETRIC EIGENPROBLEM
8234C     AX=(LAMBDA)BX, WHERE B IS POSITIVE DEFINITE, TO THE STANDARD
8235C     SYMMETRIC EIGENPROBLEM USING THE CHOLESKY FACTORIZATION OF B.
8236C
8237C     ON INPUT
8238C
8239C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
8240C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
8241C          DIMENSION STATEMENT.
8242C
8243C        N IS THE ORDER OF THE MATRICES A AND B.  IF THE CHOLESKY
8244C          FACTOR L OF B IS ALREADY AVAILABLE, N SHOULD BE PREFIXED
8245C          WITH A MINUS SIGN.
8246C
8247C        A AND B CONTAIN THE REAL SYMMETRIC INPUT MATRICES.  ONLY THE
8248C          FULL UPPER TRIANGLES OF THE MATRICES NEED BE SUPPLIED.  IF
8249C          N IS NEGATIVE, THE STRICT LOWER TRIANGLE OF B CONTAINS,
8250C          INSTEAD, THE STRICT LOWER TRIANGLE OF ITS CHOLESKY FACTOR L.
8251C
8252C        DL CONTAINS, IF N IS NEGATIVE, THE DIAGONAL ELEMENTS OF L.
8253C
8254C     ON OUTPUT
8255C
8256C        A CONTAINS IN ITS FULL LOWER TRIANGLE THE FULL LOWER TRIANGLE
8257C          OF THE SYMMETRIC MATRIX DERIVED FROM THE REDUCTION TO THE
8258C          STANDARD FORM.  THE STRICT UPPER TRIANGLE OF A IS UNALTERED.
8259C
8260C        B CONTAINS IN ITS STRICT LOWER TRIANGLE THE STRICT LOWER
8261C          TRIANGLE OF ITS CHOLESKY FACTOR L.  THE FULL UPPER
8262C          TRIANGLE OF B IS UNALTERED.
8263C
8264C        DL CONTAINS THE DIAGONAL ELEMENTS OF L.
8265C
8266C        IERR IS SET TO
8267C          ZERO       FOR NORMAL RETURN,
8268C          7*N+1      IF B IS NOT POSITIVE DEFINITE.
8269C
8270C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
8271C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
8272C
8273C     THIS VERSION DATED AUGUST 1983.
8274C
8275C     ------------------------------------------------------------------
8276C
8277      IERR = 0
8278      NN = IABS(N)
8279      IF (N .LT. 0) GO TO 100
8280C     .......... FORM L IN THE ARRAYS B AND DL ..........
8281      DO 80 I = 1, N
8282         I1 = I - 1
8283C
8284         DO 80 J = I, N
8285            X = B(I,J)
8286            IF (I .EQ. 1) GO TO 40
8287C
8288            DO 20 K = 1, I1
8289   20       X = X - B(I,K) * B(J,K)
8290C
8291   40       IF (J .NE. I) GO TO 60
8292            IF (X .LE. 0.0D0) GO TO 1000
8293            Y = DSQRT(X)
8294            DL(I) = Y
8295            GO TO 80
8296   60       B(J,I) = X / Y
8297   80 CONTINUE
8298C     .......... FORM THE TRANSPOSE OF THE UPPER TRIANGLE OF INV(L)*A
8299C                IN THE LOWER TRIANGLE OF THE ARRAY A ..........
8300  100 DO 200 I = 1, NN
8301         I1 = I - 1
8302         Y = DL(I)
8303C
8304         DO 200 J = I, NN
8305            X = A(I,J)
8306            IF (I .EQ. 1) GO TO 180
8307C
8308            DO 160 K = 1, I1
8309  160       X = X - B(I,K) * A(J,K)
8310C
8311  180       A(J,I) = X / Y
8312  200 CONTINUE
8313C     .......... PRE-MULTIPLY BY INV(L) AND OVERWRITE ..........
8314      DO 300 J = 1, NN
8315         J1 = J - 1
8316C
8317         DO 300 I = J, NN
8318            X = A(I,J)
8319            IF (I .EQ. J) GO TO 240
8320            I1 = I - 1
8321C
8322            DO 220 K = J, I1
8323  220       X = X - A(K,J) * B(I,K)
8324C
8325  240       IF (J .EQ. 1) GO TO 280
8326C
8327            DO 260 K = 1, J1
8328  260       X = X - A(J,K) * B(I,K)
8329C
8330  280       A(I,J) = X / DL(I)
8331  300 CONTINUE
8332C
8333      GO TO 1001
8334C     .......... SET ERROR -- B IS NOT POSITIVE DEFINITE ..........
8335 1000 IERR = 7 * N + 1
8336 1001 RETURN
8337      END
8338      SUBROUTINE REDUC2(NM,N,A,B,DL,IERR)
8339C
8340      INTEGER I,J,K,N,I1,J1,NM,NN,IERR
8341      DOUBLE PRECISION A(NM,N),B(NM,N),DL(N)
8342      DOUBLE PRECISION X,Y
8343C
8344C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE REDUC2,
8345C     NUM. MATH. 11, 99-110(1968) BY MARTIN AND WILKINSON.
8346C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 303-314(1971).
8347C
8348C     THIS SUBROUTINE REDUCES THE GENERALIZED SYMMETRIC EIGENPROBLEMS
8349C     ABX=(LAMBDA)X OR BAY=(LAMBDA)Y, WHERE B IS POSITIVE DEFINITE,
8350C     TO THE STANDARD SYMMETRIC EIGENPROBLEM USING THE CHOLESKY
8351C     FACTORIZATION OF B.
8352C
8353C     ON INPUT
8354C
8355C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
8356C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
8357C          DIMENSION STATEMENT.
8358C
8359C        N IS THE ORDER OF THE MATRICES A AND B.  IF THE CHOLESKY
8360C          FACTOR L OF B IS ALREADY AVAILABLE, N SHOULD BE PREFIXED
8361C          WITH A MINUS SIGN.
8362C
8363C        A AND B CONTAIN THE REAL SYMMETRIC INPUT MATRICES.  ONLY THE
8364C          FULL UPPER TRIANGLES OF THE MATRICES NEED BE SUPPLIED.  IF
8365C          N IS NEGATIVE, THE STRICT LOWER TRIANGLE OF B CONTAINS,
8366C          INSTEAD, THE STRICT LOWER TRIANGLE OF ITS CHOLESKY FACTOR L.
8367C
8368C        DL CONTAINS, IF N IS NEGATIVE, THE DIAGONAL ELEMENTS OF L.
8369C
8370C     ON OUTPUT
8371C
8372C        A CONTAINS IN ITS FULL LOWER TRIANGLE THE FULL LOWER TRIANGLE
8373C          OF THE SYMMETRIC MATRIX DERIVED FROM THE REDUCTION TO THE
8374C          STANDARD FORM.  THE STRICT UPPER TRIANGLE OF A IS UNALTERED.
8375C
8376C        B CONTAINS IN ITS STRICT LOWER TRIANGLE THE STRICT LOWER
8377C          TRIANGLE OF ITS CHOLESKY FACTOR L.  THE FULL UPPER
8378C          TRIANGLE OF B IS UNALTERED.
8379C
8380C        DL CONTAINS THE DIAGONAL ELEMENTS OF L.
8381C
8382C        IERR IS SET TO
8383C          ZERO       FOR NORMAL RETURN,
8384C          7*N+1      IF B IS NOT POSITIVE DEFINITE.
8385C
8386C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
8387C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
8388C
8389C     THIS VERSION DATED AUGUST 1983.
8390C
8391C     ------------------------------------------------------------------
8392C
8393      IERR = 0
8394      NN = IABS(N)
8395      IF (N .LT. 0) GO TO 100
8396C     .......... FORM L IN THE ARRAYS B AND DL ..........
8397      DO 80 I = 1, N
8398         I1 = I - 1
8399C
8400         DO 80 J = I, N
8401            X = B(I,J)
8402            IF (I .EQ. 1) GO TO 40
8403C
8404            DO 20 K = 1, I1
8405   20       X = X - B(I,K) * B(J,K)
8406C
8407   40       IF (J .NE. I) GO TO 60
8408            IF (X .LE. 0.0D0) GO TO 1000
8409            Y = DSQRT(X)
8410            DL(I) = Y
8411            GO TO 80
8412   60       B(J,I) = X / Y
8413   80 CONTINUE
8414C     .......... FORM THE LOWER TRIANGLE OF A*L
8415C                IN THE LOWER TRIANGLE OF THE ARRAY A ..........
8416  100 DO 200 I = 1, NN
8417         I1 = I + 1
8418C
8419         DO 200 J = 1, I
8420            X = A(J,I) * DL(J)
8421            IF (J .EQ. I) GO TO 140
8422            J1 = J + 1
8423C
8424            DO 120 K = J1, I
8425  120       X = X + A(K,I) * B(K,J)
8426C
8427  140       IF (I .EQ. NN) GO TO 180
8428C
8429            DO 160 K = I1, NN
8430  160       X = X + A(I,K) * B(K,J)
8431C
8432  180       A(I,J) = X
8433  200 CONTINUE
8434C     .......... PRE-MULTIPLY BY TRANSPOSE(L) AND OVERWRITE ..........
8435      DO 300 I = 1, NN
8436         I1 = I + 1
8437         Y = DL(I)
8438C
8439         DO 300 J = 1, I
8440            X = Y * A(I,J)
8441            IF (I .EQ. NN) GO TO 280
8442C
8443            DO 260 K = I1, NN
8444  260       X = X + A(K,J) * B(K,I)
8445C
8446  280       A(I,J) = X
8447  300 CONTINUE
8448C
8449      GO TO 1001
8450C     .......... SET ERROR -- B IS NOT POSITIVE DEFINITE ..........
8451 1000 IERR = 7 * N + 1
8452 1001 RETURN
8453      END
8454      SUBROUTINE RG(NM,N,A,WR,WI,MATZ,Z,IV1,FV1,IERR)
8455C
8456      INTEGER N,NM,IS1,IS2,IERR,MATZ
8457      DOUBLE PRECISION A(NM,N),WR(N),WI(N),Z(NM,N),FV1(N)
8458      INTEGER IV1(N)
8459C
8460C     THIS SUBROUTINE CALLS THE RECOMMENDED SEQUENCE OF
8461C     SUBROUTINES FROM THE EIGENSYSTEM SUBROUTINE PACKAGE (EISPACK)
8462C     TO FIND THE EIGENVALUES AND EIGENVECTORS (IF DESIRED)
8463C     OF A REAL GENERAL MATRIX.
8464C
8465C     ON INPUT
8466C
8467C        NM  MUST BE SET TO THE ROW DIMENSION OF THE TWO-DIMENSIONAL
8468C        ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
8469C        DIMENSION STATEMENT.
8470C
8471C        N  IS THE ORDER OF THE MATRIX  A.
8472C
8473C        A  CONTAINS THE REAL GENERAL MATRIX.
8474C
8475C        MATZ  IS AN INTEGER VARIABLE SET EQUAL TO ZERO IF
8476C        ONLY EIGENVALUES ARE DESIRED.  OTHERWISE IT IS SET TO
8477C        ANY NON-ZERO INTEGER FOR BOTH EIGENVALUES AND EIGENVECTORS.
8478C
8479C     ON OUTPUT
8480C
8481C        WR  AND  WI  CONTAIN THE REAL AND IMAGINARY PARTS,
8482C        RESPECTIVELY, OF THE EIGENVALUES.  COMPLEX CONJUGATE
8483C        PAIRS OF EIGENVALUES APPEAR CONSECUTIVELY WITH THE
8484C        EIGENVALUE HAVING THE POSITIVE IMAGINARY PART FIRST.
8485C
8486C        Z  CONTAINS THE REAL AND IMAGINARY PARTS OF THE EIGENVECTORS
8487C        IF MATZ IS NOT ZERO.  IF THE J-TH EIGENVALUE IS REAL, THE
8488C        J-TH COLUMN OF  Z  CONTAINS ITS EIGENVECTOR.  IF THE J-TH
8489C        EIGENVALUE IS COMPLEX WITH POSITIVE IMAGINARY PART, THE
8490C        J-TH AND (J+1)-TH COLUMNS OF  Z  CONTAIN THE REAL AND
8491C        IMAGINARY PARTS OF ITS EIGENVECTOR.  THE CONJUGATE OF THIS
8492C        VECTOR IS THE EIGENVECTOR FOR THE CONJUGATE EIGENVALUE.
8493C
8494C        IERR  IS AN INTEGER OUTPUT VARIABLE SET EQUAL TO AN ERROR
8495C           COMPLETION CODE DESCRIBED IN THE DOCUMENTATION FOR HQR
8496C           AND HQR2.  THE NORMAL COMPLETION CODE IS ZERO.
8497C
8498C        IV1  AND  FV1  ARE TEMPORARY STORAGE ARRAYS.
8499C
8500C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
8501C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
8502C
8503C     THIS VERSION DATED AUGUST 1983.
8504C
8505C     ------------------------------------------------------------------
8506C
8507      IF (N .LE. NM) GO TO 10
8508      IERR = 10 * N
8509      GO TO 50
8510C
8511   10 CALL  BALANC(NM,N,A,IS1,IS2,FV1)
8512      CALL  ELMHES(NM,N,IS1,IS2,A,IV1)
8513      IF (MATZ .NE. 0) GO TO 20
8514C     .......... FIND EIGENVALUES ONLY ..........
8515      CALL  HQR(NM,N,IS1,IS2,A,WR,WI,IERR)
8516      GO TO 50
8517C     .......... FIND BOTH EIGENVALUES AND EIGENVECTORS ..........
8518   20 CALL  ELTRAN(NM,N,IS1,IS2,A,IV1,Z)
8519      CALL  HQR2(NM,N,IS1,IS2,A,WR,WI,Z,IERR)
8520      IF (IERR .NE. 0) GO TO 50
8521      CALL  BALBAK(NM,N,IS1,IS2,FV1,N,Z)
8522   50 RETURN
8523      END
8524      SUBROUTINE RGG(NM,N,A,B,ALFR,ALFI,BETA,MATZ,Z,IERR)
8525C
8526      INTEGER N,NM,IERR,MATZ
8527      DOUBLE PRECISION A(NM,N),B(NM,N),ALFR(N),ALFI(N),BETA(N),Z(NM,N)
8528      LOGICAL TF
8529C
8530C     THIS SUBROUTINE CALLS THE RECOMMENDED SEQUENCE OF
8531C     SUBROUTINES FROM THE EIGENSYSTEM SUBROUTINE PACKAGE (EISPACK)
8532C     TO FIND THE EIGENVALUES AND EIGENVECTORS (IF DESIRED)
8533C     FOR THE REAL GENERAL GENERALIZED EIGENPROBLEM  AX = (LAMBDA)BX.
8534C
8535C     ON INPUT
8536C
8537C        NM  MUST BE SET TO THE ROW DIMENSION OF THE TWO-DIMENSIONAL
8538C        ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
8539C        DIMENSION STATEMENT.
8540C
8541C        N  IS THE ORDER OF THE MATRICES  A  AND  B.
8542C
8543C        A  CONTAINS A REAL GENERAL MATRIX.
8544C
8545C        B  CONTAINS A REAL GENERAL MATRIX.
8546C
8547C        MATZ  IS AN INTEGER VARIABLE SET EQUAL TO ZERO IF
8548C        ONLY EIGENVALUES ARE DESIRED.  OTHERWISE IT IS SET TO
8549C        ANY NON-ZERO INTEGER FOR BOTH EIGENVALUES AND EIGENVECTORS.
8550C
8551C     ON OUTPUT
8552C
8553C        ALFR  AND  ALFI  CONTAIN THE REAL AND IMAGINARY PARTS,
8554C        RESPECTIVELY, OF THE NUMERATORS OF THE EIGENVALUES.
8555C
8556C        BETA  CONTAINS THE DENOMINATORS OF THE EIGENVALUES,
8557C        WHICH ARE THUS GIVEN BY THE RATIOS  (ALFR+I*ALFI)/BETA.
8558C        COMPLEX CONJUGATE PAIRS OF EIGENVALUES APPEAR CONSECUTIVELY
8559C        WITH THE EIGENVALUE HAVING THE POSITIVE IMAGINARY PART FIRST.
8560C
8561C        Z  CONTAINS THE REAL AND IMAGINARY PARTS OF THE EIGENVECTORS
8562C        IF MATZ IS NOT ZERO.  IF THE J-TH EIGENVALUE IS REAL, THE
8563C        J-TH COLUMN OF  Z  CONTAINS ITS EIGENVECTOR.  IF THE J-TH
8564C        EIGENVALUE IS COMPLEX WITH POSITIVE IMAGINARY PART, THE
8565C        J-TH AND (J+1)-TH COLUMNS OF  Z  CONTAIN THE REAL AND
8566C        IMAGINARY PARTS OF ITS EIGENVECTOR.  THE CONJUGATE OF THIS
8567C        VECTOR IS THE EIGENVECTOR FOR THE CONJUGATE EIGENVALUE.
8568C
8569C        IERR  IS AN INTEGER OUTPUT VARIABLE SET EQUAL TO AN ERROR
8570C           COMPLETION CODE DESCRIBED IN THE DOCUMENTATION FOR QZIT.
8571C           THE NORMAL COMPLETION CODE IS ZERO.
8572C
8573C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
8574C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
8575C
8576C     THIS VERSION DATED AUGUST 1983.
8577C
8578C     ------------------------------------------------------------------
8579C
8580      IF (N .LE. NM) GO TO 10
8581      IERR = 10 * N
8582      GO TO 50
8583C
8584   10 IF (MATZ .NE. 0) GO TO 20
8585C     .......... FIND EIGENVALUES ONLY ..........
8586      TF = .FALSE.
8587      CALL  QZHES(NM,N,A,B,TF,Z)
8588      CALL  QZIT(NM,N,A,B,0.0D0,TF,Z,IERR)
8589      CALL  QZVAL(NM,N,A,B,ALFR,ALFI,BETA,TF,Z)
8590      GO TO 50
8591C     .......... FIND BOTH EIGENVALUES AND EIGENVECTORS ..........
8592   20 TF = .TRUE.
8593      CALL  QZHES(NM,N,A,B,TF,Z)
8594      CALL  QZIT(NM,N,A,B,0.0D0,TF,Z,IERR)
8595      CALL  QZVAL(NM,N,A,B,ALFR,ALFI,BETA,TF,Z)
8596      IF (IERR .NE. 0) GO TO 50
8597      CALL  QZVEC(NM,N,A,B,ALFR,ALFI,BETA,Z)
8598   50 RETURN
8599      END
8600      SUBROUTINE RS(NM,N,A,W,MATZ,Z,FV1,FV2,IERR)
8601C
8602      INTEGER N,NM,IERR,MATZ
8603      DOUBLE PRECISION A(NM,N),W(N),Z(NM,N),FV1(N),FV2(N)
8604C
8605C     THIS SUBROUTINE CALLS THE RECOMMENDED SEQUENCE OF
8606C     SUBROUTINES FROM THE EIGENSYSTEM SUBROUTINE PACKAGE (EISPACK)
8607C     TO FIND THE EIGENVALUES AND EIGENVECTORS (IF DESIRED)
8608C     OF A REAL SYMMETRIC MATRIX.
8609C
8610C     ON INPUT
8611C
8612C        NM  MUST BE SET TO THE ROW DIMENSION OF THE TWO-DIMENSIONAL
8613C        ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
8614C        DIMENSION STATEMENT.
8615C
8616C        N  IS THE ORDER OF THE MATRIX  A.
8617C
8618C        A  CONTAINS THE REAL SYMMETRIC MATRIX.
8619C
8620C        MATZ  IS AN INTEGER VARIABLE SET EQUAL TO ZERO IF
8621C        ONLY EIGENVALUES ARE DESIRED.  OTHERWISE IT IS SET TO
8622C        ANY NON-ZERO INTEGER FOR BOTH EIGENVALUES AND EIGENVECTORS.
8623C
8624C     ON OUTPUT
8625C
8626C        W  CONTAINS THE EIGENVALUES IN ASCENDING ORDER.
8627C
8628C        Z  CONTAINS THE EIGENVECTORS IF MATZ IS NOT ZERO.
8629C
8630C        IERR  IS AN INTEGER OUTPUT VARIABLE SET EQUAL TO AN ERROR
8631C           COMPLETION CODE DESCRIBED IN THE DOCUMENTATION FOR TQLRAT
8632C           AND TQL2.  THE NORMAL COMPLETION CODE IS ZERO.
8633C
8634C        FV1  AND  FV2  ARE TEMPORARY STORAGE ARRAYS.
8635C
8636C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
8637C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
8638C
8639C     THIS VERSION DATED AUGUST 1983.
8640C
8641C     ------------------------------------------------------------------
8642C
8643      IF (N .LE. NM) GO TO 10
8644      IERR = 10 * N
8645      GO TO 50
8646C
8647   10 IF (MATZ .NE. 0) GO TO 20
8648C     .......... FIND EIGENVALUES ONLY ..........
8649      CALL  TRED1(NM,N,A,W,FV1,FV2)
8650      CALL  TQLRAT(N,W,FV2,IERR)
8651      GO TO 50
8652C     .......... FIND BOTH EIGENVALUES AND EIGENVECTORS ..........
8653   20 CALL  TRED2(NM,N,A,W,FV1,Z)
8654      CALL  TQL2(NM,N,W,FV1,Z,IERR)
8655   50 RETURN
8656      END
8657      SUBROUTINE RSB(NM,N,MB,A,W,MATZ,Z,FV1,FV2,IERR)
8658C
8659      INTEGER N,MB,NM,IERR,MATZ
8660      DOUBLE PRECISION A(NM,MB),W(N),Z(NM,N),FV1(N),FV2(N)
8661      LOGICAL TF
8662C
8663C     THIS SUBROUTINE CALLS THE RECOMMENDED SEQUENCE OF
8664C     SUBROUTINES FROM THE EIGENSYSTEM SUBROUTINE PACKAGE (EISPACK)
8665C     TO FIND THE EIGENVALUES AND EIGENVECTORS (IF DESIRED)
8666C     OF A REAL SYMMETRIC BAND MATRIX.
8667C
8668C     ON INPUT
8669C
8670C        NM  MUST BE SET TO THE ROW DIMENSION OF THE TWO-DIMENSIONAL
8671C        ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
8672C        DIMENSION STATEMENT.
8673C
8674C        N  IS THE ORDER OF THE MATRIX  A.
8675C
8676C        MB  IS THE HALF BAND WIDTH OF THE MATRIX, DEFINED AS THE
8677C        NUMBER OF ADJACENT DIAGONALS, INCLUDING THE PRINCIPAL
8678C        DIAGONAL, REQUIRED TO SPECIFY THE NON-ZERO PORTION OF THE
8679C        LOWER TRIANGLE OF THE MATRIX.
8680C
8681C        A  CONTAINS THE LOWER TRIANGLE OF THE REAL SYMMETRIC
8682C        BAND MATRIX.  ITS LOWEST SUBDIAGONAL IS STORED IN THE
8683C        LAST  N+1-MB  POSITIONS OF THE FIRST COLUMN, ITS NEXT
8684C        SUBDIAGONAL IN THE LAST  N+2-MB  POSITIONS OF THE
8685C        SECOND COLUMN, FURTHER SUBDIAGONALS SIMILARLY, AND
8686C        FINALLY ITS PRINCIPAL DIAGONAL IN THE  N  POSITIONS
8687C        OF THE LAST COLUMN.  CONTENTS OF STORAGES NOT PART
8688C        OF THE MATRIX ARE ARBITRARY.
8689C
8690C        MATZ  IS AN INTEGER VARIABLE SET EQUAL TO ZERO IF
8691C        ONLY EIGENVALUES ARE DESIRED.  OTHERWISE IT IS SET TO
8692C        ANY NON-ZERO INTEGER FOR BOTH EIGENVALUES AND EIGENVECTORS.
8693C
8694C     ON OUTPUT
8695C
8696C        W  CONTAINS THE EIGENVALUES IN ASCENDING ORDER.
8697C
8698C        Z  CONTAINS THE EIGENVECTORS IF MATZ IS NOT ZERO.
8699C
8700C        IERR  IS AN INTEGER OUTPUT VARIABLE SET EQUAL TO AN ERROR
8701C           COMPLETION CODE DESCRIBED IN THE DOCUMENTATION FOR TQLRAT
8702C           AND TQL2.  THE NORMAL COMPLETION CODE IS ZERO.
8703C
8704C        FV1  AND  FV2  ARE TEMPORARY STORAGE ARRAYS.
8705C
8706C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
8707C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
8708C
8709C     THIS VERSION DATED AUGUST 1983.
8710C
8711C     ------------------------------------------------------------------
8712C
8713      IF (N .LE. NM) GO TO 5
8714      IERR = 10 * N
8715      GO TO 50
8716    5 IF (MB .GT. 0) GO TO 10
8717      IERR = 12 * N
8718      GO TO 50
8719   10 IF (MB .LE. N) GO TO 15
8720      IERR = 12 * N
8721      GO TO 50
8722C
8723   15 IF (MATZ .NE. 0) GO TO 20
8724C     .......... FIND EIGENVALUES ONLY ..........
8725      TF = .FALSE.
8726      CALL  BANDR(NM,N,MB,A,W,FV1,FV2,TF,Z)
8727      CALL  TQLRAT(N,W,FV2,IERR)
8728      GO TO 50
8729C     .......... FIND BOTH EIGENVALUES AND EIGENVECTORS ..........
8730   20 TF = .TRUE.
8731      CALL  BANDR(NM,N,MB,A,W,FV1,FV1,TF,Z)
8732      CALL  TQL2(NM,N,W,FV1,Z,IERR)
8733   50 RETURN
8734      END
8735      SUBROUTINE RSG(NM,N,A,B,W,MATZ,Z,FV1,FV2,IERR)
8736C
8737      INTEGER N,NM,IERR,MATZ
8738      DOUBLE PRECISION A(NM,N),B(NM,N),W(N),Z(NM,N),FV1(N),FV2(N)
8739C
8740C     THIS SUBROUTINE CALLS THE RECOMMENDED SEQUENCE OF
8741C     SUBROUTINES FROM THE EIGENSYSTEM SUBROUTINE PACKAGE (EISPACK)
8742C     TO FIND THE EIGENVALUES AND EIGENVECTORS (IF DESIRED)
8743C     FOR THE REAL SYMMETRIC GENERALIZED EIGENPROBLEM  AX = (LAMBDA)BX.
8744C
8745C     ON INPUT
8746C
8747C        NM  MUST BE SET TO THE ROW DIMENSION OF THE TWO-DIMENSIONAL
8748C        ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
8749C        DIMENSION STATEMENT.
8750C
8751C        N  IS THE ORDER OF THE MATRICES  A  AND  B.
8752C
8753C        A  CONTAINS A REAL SYMMETRIC MATRIX.
8754C
8755C        B  CONTAINS A POSITIVE DEFINITE REAL SYMMETRIC MATRIX.
8756C
8757C        MATZ  IS AN INTEGER VARIABLE SET EQUAL TO ZERO IF
8758C        ONLY EIGENVALUES ARE DESIRED.  OTHERWISE IT IS SET TO
8759C        ANY NON-ZERO INTEGER FOR BOTH EIGENVALUES AND EIGENVECTORS.
8760C
8761C     ON OUTPUT
8762C
8763C        W  CONTAINS THE EIGENVALUES IN ASCENDING ORDER.
8764C
8765C        Z  CONTAINS THE EIGENVECTORS IF MATZ IS NOT ZERO.
8766C
8767C        IERR  IS AN INTEGER OUTPUT VARIABLE SET EQUAL TO AN ERROR
8768C           COMPLETION CODE DESCRIBED IN THE DOCUMENTATION FOR TQLRAT
8769C           AND TQL2.  THE NORMAL COMPLETION CODE IS ZERO.
8770C
8771C        FV1  AND  FV2  ARE TEMPORARY STORAGE ARRAYS.
8772C
8773C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
8774C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
8775C
8776C     THIS VERSION DATED AUGUST 1983.
8777C
8778C     ------------------------------------------------------------------
8779C
8780      IF (N .LE. NM) GO TO 10
8781      IERR = 10 * N
8782      GO TO 50
8783C
8784   10 CALL  REDUC(NM,N,A,B,FV2,IERR)
8785      IF (IERR .NE. 0) GO TO 50
8786      IF (MATZ .NE. 0) GO TO 20
8787C     .......... FIND EIGENVALUES ONLY ..........
8788      CALL  TRED1(NM,N,A,W,FV1,FV2)
8789      CALL  TQLRAT(N,W,FV2,IERR)
8790      GO TO 50
8791C     .......... FIND BOTH EIGENVALUES AND EIGENVECTORS ..........
8792   20 CALL  TRED2(NM,N,A,W,FV1,Z)
8793      CALL  TQL2(NM,N,W,FV1,Z,IERR)
8794      IF (IERR .NE. 0) GO TO 50
8795      CALL  REBAK(NM,N,B,FV2,N,Z)
8796   50 RETURN
8797      END
8798      SUBROUTINE RSGAB(NM,N,A,B,W,MATZ,Z,FV1,FV2,IERR)
8799C
8800      INTEGER N,NM,IERR,MATZ
8801      DOUBLE PRECISION A(NM,N),B(NM,N),W(N),Z(NM,N),FV1(N),FV2(N)
8802C
8803C     THIS SUBROUTINE CALLS THE RECOMMENDED SEQUENCE OF
8804C     SUBROUTINES FROM THE EIGENSYSTEM SUBROUTINE PACKAGE (EISPACK)
8805C     TO FIND THE EIGENVALUES AND EIGENVECTORS (IF DESIRED)
8806C     FOR THE REAL SYMMETRIC GENERALIZED EIGENPROBLEM  ABX = (LAMBDA)X.
8807C
8808C     ON INPUT
8809C
8810C        NM  MUST BE SET TO THE ROW DIMENSION OF THE TWO-DIMENSIONAL
8811C        ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
8812C        DIMENSION STATEMENT.
8813C
8814C        N  IS THE ORDER OF THE MATRICES  A  AND  B.
8815C
8816C        A  CONTAINS A REAL SYMMETRIC MATRIX.
8817C
8818C        B  CONTAINS A POSITIVE DEFINITE REAL SYMMETRIC MATRIX.
8819C
8820C        MATZ  IS AN INTEGER VARIABLE SET EQUAL TO ZERO IF
8821C        ONLY EIGENVALUES ARE DESIRED.  OTHERWISE IT IS SET TO
8822C        ANY NON-ZERO INTEGER FOR BOTH EIGENVALUES AND EIGENVECTORS.
8823C
8824C     ON OUTPUT
8825C
8826C        W  CONTAINS THE EIGENVALUES IN ASCENDING ORDER.
8827C
8828C        Z  CONTAINS THE EIGENVECTORS IF MATZ IS NOT ZERO.
8829C
8830C        IERR  IS AN INTEGER OUTPUT VARIABLE SET EQUAL TO AN ERROR
8831C           COMPLETION CODE DESCRIBED IN THE DOCUMENTATION FOR TQLRAT
8832C           AND TQL2.  THE NORMAL COMPLETION CODE IS ZERO.
8833C
8834C        FV1  AND  FV2  ARE TEMPORARY STORAGE ARRAYS.
8835C
8836C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
8837C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
8838C
8839C     THIS VERSION DATED AUGUST 1983.
8840C
8841C     ------------------------------------------------------------------
8842C
8843      IF (N .LE. NM) GO TO 10
8844      IERR = 10 * N
8845      GO TO 50
8846C
8847   10 CALL  REDUC2(NM,N,A,B,FV2,IERR)
8848      IF (IERR .NE. 0) GO TO 50
8849      IF (MATZ .NE. 0) GO TO 20
8850C     .......... FIND EIGENVALUES ONLY ..........
8851      CALL  TRED1(NM,N,A,W,FV1,FV2)
8852      CALL  TQLRAT(N,W,FV2,IERR)
8853      GO TO 50
8854C     .......... FIND BOTH EIGENVALUES AND EIGENVECTORS ..........
8855   20 CALL  TRED2(NM,N,A,W,FV1,Z)
8856      CALL  TQL2(NM,N,W,FV1,Z,IERR)
8857      IF (IERR .NE. 0) GO TO 50
8858      CALL  REBAK(NM,N,B,FV2,N,Z)
8859   50 RETURN
8860      END
8861      SUBROUTINE RSGBA(NM,N,A,B,W,MATZ,Z,FV1,FV2,IERR)
8862C
8863      INTEGER N,NM,IERR,MATZ
8864      DOUBLE PRECISION A(NM,N),B(NM,N),W(N),Z(NM,N),FV1(N),FV2(N)
8865C
8866C     THIS SUBROUTINE CALLS THE RECOMMENDED SEQUENCE OF
8867C     SUBROUTINES FROM THE EIGENSYSTEM SUBROUTINE PACKAGE (EISPACK)
8868C     TO FIND THE EIGENVALUES AND EIGENVECTORS (IF DESIRED)
8869C     FOR THE REAL SYMMETRIC GENERALIZED EIGENPROBLEM  BAX = (LAMBDA)X.
8870C
8871C     ON INPUT
8872C
8873C        NM  MUST BE SET TO THE ROW DIMENSION OF THE TWO-DIMENSIONAL
8874C        ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
8875C        DIMENSION STATEMENT.
8876C
8877C        N  IS THE ORDER OF THE MATRICES  A  AND  B.
8878C
8879C        A  CONTAINS A REAL SYMMETRIC MATRIX.
8880C
8881C        B  CONTAINS A POSITIVE DEFINITE REAL SYMMETRIC MATRIX.
8882C
8883C        MATZ  IS AN INTEGER VARIABLE SET EQUAL TO ZERO IF
8884C        ONLY EIGENVALUES ARE DESIRED.  OTHERWISE IT IS SET TO
8885C        ANY NON-ZERO INTEGER FOR BOTH EIGENVALUES AND EIGENVECTORS.
8886C
8887C     ON OUTPUT
8888C
8889C        W  CONTAINS THE EIGENVALUES IN ASCENDING ORDER.
8890C
8891C        Z  CONTAINS THE EIGENVECTORS IF MATZ IS NOT ZERO.
8892C
8893C        IERR  IS AN INTEGER OUTPUT VARIABLE SET EQUAL TO AN ERROR
8894C           COMPLETION CODE DESCRIBED IN THE DOCUMENTATION FOR TQLRAT
8895C           AND TQL2.  THE NORMAL COMPLETION CODE IS ZERO.
8896C
8897C        FV1  AND  FV2  ARE TEMPORARY STORAGE ARRAYS.
8898C
8899C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
8900C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
8901C
8902C     THIS VERSION DATED AUGUST 1983.
8903C
8904C     ------------------------------------------------------------------
8905C
8906      IF (N .LE. NM) GO TO 10
8907      IERR = 10 * N
8908      GO TO 50
8909C
8910   10 CALL  REDUC2(NM,N,A,B,FV2,IERR)
8911      IF (IERR .NE. 0) GO TO 50
8912      IF (MATZ .NE. 0) GO TO 20
8913C     .......... FIND EIGENVALUES ONLY ..........
8914      CALL  TRED1(NM,N,A,W,FV1,FV2)
8915      CALL  TQLRAT(N,W,FV2,IERR)
8916      GO TO 50
8917C     .......... FIND BOTH EIGENVALUES AND EIGENVECTORS ..........
8918   20 CALL  TRED2(NM,N,A,W,FV1,Z)
8919      CALL  TQL2(NM,N,W,FV1,Z,IERR)
8920      IF (IERR .NE. 0) GO TO 50
8921      CALL  REBAKB(NM,N,B,FV2,N,Z)
8922   50 RETURN
8923      END
8924      SUBROUTINE RSM(NM,N,A,W,M,Z,FWORK,IWORK,IERR)
8925C
8926      INTEGER N,NM,M,IWORK(N),IERR
8927      DOUBLE PRECISION A(NM,N),W(N),Z(NM,M),FWORK(1)
8928C
8929C     THIS SUBROUTINE CALLS THE RECOMMENDED SEQUENCE OF
8930C     SUBROUTINES FROM THE EIGENSYSTEM SUBROUTINE PACKAGE (EISPACK)
8931C     TO FIND ALL OF THE EIGENVALUES AND SOME OF THE EIGENVECTORS
8932C     OF A REAL SYMMETRIC MATRIX.
8933C
8934C     ON INPUT
8935C
8936C        NM  MUST BE SET TO THE ROW DIMENSION OF THE TWO-DIMENSIONAL
8937C        ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
8938C        DIMENSION STATEMENT.
8939C
8940C        N  IS THE ORDER OF THE MATRIX  A.
8941C
8942C        A  CONTAINS THE REAL SYMMETRIC MATRIX.
8943C
8944C        M  THE EIGENVECTORS CORRESPONDING TO THE FIRST M EIGENVALUES
8945C           ARE TO BE COMPUTED.
8946C           IF M = 0 THEN NO EIGENVECTORS ARE COMPUTED.
8947C           IF M = N THEN ALL OF THE EIGENVECTORS ARE COMPUTED.
8948C
8949C     ON OUTPUT
8950C
8951C        W  CONTAINS ALL N EIGENVALUES IN ASCENDING ORDER.
8952C
8953C        Z  CONTAINS THE ORTHONORMAL EIGENVECTORS ASSOCIATED WITH
8954C           THE FIRST M EIGENVALUES.
8955C
8956C        IERR  IS AN INTEGER OUTPUT VARIABLE SET EQUAL TO AN ERROR
8957C           COMPLETION CODE DESCRIBED IN THE DOCUMENTATION FOR TQLRAT,
8958C           IMTQLV AND TINVIT.  THE NORMAL COMPLETION CODE IS ZERO.
8959C
8960C        FWORK  IS A TEMPORARY STORAGE ARRAY OF DIMENSION 8*N.
8961C
8962C        IWORK  IS AN INTEGER TEMPORARY STORAGE ARRAY OF DIMENSION N.
8963C
8964C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
8965C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
8966C
8967C     THIS VERSION DATED AUGUST 1983.
8968C
8969C     ------------------------------------------------------------------
8970C
8971      IERR = 10 * N
8972      IF (N .GT. NM .OR. M .GT. NM) GO TO 50
8973      K1 = 1
8974      K2 = K1 + N
8975      K3 = K2 + N
8976      K4 = K3 + N
8977      K5 = K4 + N
8978      K6 = K5 + N
8979      K7 = K6 + N
8980      K8 = K7 + N
8981      IF (M .GT. 0) GO TO 10
8982C     .......... FIND EIGENVALUES ONLY ..........
8983      CALL  TRED1(NM,N,A,W,FWORK(K1),FWORK(K2))
8984      CALL  TQLRAT(N,W,FWORK(K2),IERR)
8985      GO TO 50
8986C     .......... FIND ALL EIGENVALUES AND M EIGENVECTORS ..........
8987   10 CALL  TRED1(NM,N,A,FWORK(K1),FWORK(K2),FWORK(K3))
8988      CALL  IMTQLV(N,FWORK(K1),FWORK(K2),FWORK(K3),W,IWORK,
8989     X             IERR,FWORK(K4))
8990      CALL  TINVIT(NM,N,FWORK(K1),FWORK(K2),FWORK(K3),M,W,IWORK,Z,IERR,
8991     X             FWORK(K4),FWORK(K5),FWORK(K6),FWORK(K7),FWORK(K8))
8992      CALL  TRBAK1(NM,N,A,FWORK(K2),M,Z)
8993   50 RETURN
8994      END
8995      SUBROUTINE RSP(NM,N,NV,A,W,MATZ,Z,FV1,FV2,IERR)
8996C
8997      INTEGER I,J,N,NM,NV,IERR,MATZ
8998      DOUBLE PRECISION A(NV),W(N),Z(NM,N),FV1(N),FV2(N)
8999C
9000C     THIS SUBROUTINE CALLS THE RECOMMENDED SEQUENCE OF
9001C     SUBROUTINES FROM THE EIGENSYSTEM SUBROUTINE PACKAGE (EISPACK)
9002C     TO FIND THE EIGENVALUES AND EIGENVECTORS (IF DESIRED)
9003C     OF A REAL SYMMETRIC PACKED MATRIX.
9004C
9005C     ON INPUT
9006C
9007C        NM  MUST BE SET TO THE ROW DIMENSION OF THE TWO-DIMENSIONAL
9008C        ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
9009C        DIMENSION STATEMENT.
9010C
9011C        N  IS THE ORDER OF THE MATRIX  A.
9012C
9013C        NV  IS AN INTEGER VARIABLE SET EQUAL TO THE
9014C        DIMENSION OF THE ARRAY  A  AS SPECIFIED FOR
9015C        A  IN THE CALLING PROGRAM.  NV  MUST NOT BE
9016C        LESS THAN  N*(N+1)/2.
9017C
9018C        A  CONTAINS THE LOWER TRIANGLE OF THE REAL SYMMETRIC
9019C        PACKED MATRIX STORED ROW-WISE.
9020C
9021C        MATZ  IS AN INTEGER VARIABLE SET EQUAL TO ZERO IF
9022C        ONLY EIGENVALUES ARE DESIRED.  OTHERWISE IT IS SET TO
9023C        ANY NON-ZERO INTEGER FOR BOTH EIGENVALUES AND EIGENVECTORS.
9024C
9025C     ON OUTPUT
9026C
9027C        W  CONTAINS THE EIGENVALUES IN ASCENDING ORDER.
9028C
9029C        Z  CONTAINS THE EIGENVECTORS IF MATZ IS NOT ZERO.
9030C
9031C        IERR  IS AN INTEGER OUTPUT VARIABLE SET EQUAL TO AN ERROR
9032C           COMPLETION CODE DESCRIBED IN THE DOCUMENTATION FOR TQLRAT
9033C           AND TQL2.  THE NORMAL COMPLETION CODE IS ZERO.
9034C
9035C        FV1  AND  FV2  ARE TEMPORARY STORAGE ARRAYS.
9036C
9037C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
9038C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
9039C
9040C     THIS VERSION DATED AUGUST 1983.
9041C
9042C     ------------------------------------------------------------------
9043C
9044      IF (N .LE. NM) GO TO 5
9045      IERR = 10 * N
9046      GO TO 50
9047    5 IF (NV .GE. (N * (N + 1)) / 2) GO TO 10
9048      IERR = 20 * N
9049      GO TO 50
9050C
9051   10 CALL  TRED3(N,NV,A,W,FV1,FV2)
9052      IF (MATZ .NE. 0) GO TO 20
9053C     .......... FIND EIGENVALUES ONLY ..........
9054      CALL  TQLRAT(N,W,FV2,IERR)
9055      GO TO 50
9056C     .......... FIND BOTH EIGENVALUES AND EIGENVECTORS ..........
9057   20 DO 40 I = 1, N
9058C
9059         DO 30 J = 1, N
9060            Z(J,I) = 0.0D0
9061   30    CONTINUE
9062C
9063         Z(I,I) = 1.0D0
9064   40 CONTINUE
9065C
9066      CALL  TQL2(NM,N,W,FV1,Z,IERR)
9067      IF (IERR .NE. 0) GO TO 50
9068      CALL  TRBAK3(NM,N,NV,A,N,Z)
9069   50 RETURN
9070      END
9071      SUBROUTINE RST(NM,N,W,E,MATZ,Z,IERR)
9072C
9073      INTEGER I,J,N,NM,IERR,MATZ
9074      DOUBLE PRECISION W(N),E(N),Z(NM,N)
9075C
9076C     THIS SUBROUTINE CALLS THE RECOMMENDED SEQUENCE OF
9077C     SUBROUTINES FROM THE EIGENSYSTEM SUBROUTINE PACKAGE (EISPACK)
9078C     TO FIND THE EIGENVALUES AND EIGENVECTORS (IF DESIRED)
9079C     OF A REAL SYMMETRIC TRIDIAGONAL MATRIX.
9080C
9081C     ON INPUT
9082C
9083C        NM  MUST BE SET TO THE ROW DIMENSION OF THE TWO-DIMENSIONAL
9084C        ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
9085C        DIMENSION STATEMENT.
9086C
9087C        N  IS THE ORDER OF THE MATRIX.
9088C
9089C        W  CONTAINS THE DIAGONAL ELEMENTS OF THE REAL
9090C        SYMMETRIC TRIDIAGONAL MATRIX.
9091C
9092C        E  CONTAINS THE SUBDIAGONAL ELEMENTS OF THE MATRIX IN
9093C        ITS LAST N-1 POSITIONS.  E(1) IS ARBITRARY.
9094C
9095C        MATZ  IS AN INTEGER VARIABLE SET EQUAL TO ZERO IF
9096C        ONLY EIGENVALUES ARE DESIRED.  OTHERWISE IT IS SET TO
9097C        ANY NON-ZERO INTEGER FOR BOTH EIGENVALUES AND EIGENVECTORS.
9098C
9099C     ON OUTPUT
9100C
9101C        W  CONTAINS THE EIGENVALUES IN ASCENDING ORDER.
9102C
9103C        Z  CONTAINS THE EIGENVECTORS IF MATZ IS NOT ZERO.
9104C
9105C        IERR  IS AN INTEGER OUTPUT VARIABLE SET EQUAL TO AN ERROR
9106C           COMPLETION CODE DESCRIBED IN THE DOCUMENTATION FOR IMTQL1
9107C           AND IMTQL2.  THE NORMAL COMPLETION CODE IS ZERO.
9108C
9109C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
9110C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
9111C
9112C     THIS VERSION DATED AUGUST 1983.
9113C
9114C     ------------------------------------------------------------------
9115C
9116      IF (N .LE. NM) GO TO 10
9117      IERR = 10 * N
9118      GO TO 50
9119C
9120   10 IF (MATZ .NE. 0) GO TO 20
9121C     .......... FIND EIGENVALUES ONLY ..........
9122      CALL  IMTQL1(N,W,E,IERR)
9123      GO TO 50
9124C     .......... FIND BOTH EIGENVALUES AND EIGENVECTORS ..........
9125   20 DO 40 I = 1, N
9126C
9127         DO 30 J = 1, N
9128            Z(J,I) = 0.0D0
9129   30    CONTINUE
9130C
9131         Z(I,I) = 1.0D0
9132   40 CONTINUE
9133C
9134      CALL  IMTQL2(NM,N,W,E,Z,IERR)
9135   50 RETURN
9136      END
9137      SUBROUTINE RT(NM,N,A,W,MATZ,Z,FV1,IERR)
9138C
9139      INTEGER N,NM,IERR,MATZ
9140      DOUBLE PRECISION A(NM,3),W(N),Z(NM,N),FV1(N)
9141C
9142C     THIS SUBROUTINE CALLS THE RECOMMENDED SEQUENCE OF
9143C     SUBROUTINES FROM THE EIGENSYSTEM SUBROUTINE PACKAGE (EISPACK)
9144C     TO FIND THE EIGENVALUES AND EIGENVECTORS (IF DESIRED)
9145C     OF A SPECIAL REAL TRIDIAGONAL MATRIX.
9146C
9147C     ON INPUT
9148C
9149C        NM  MUST BE SET TO THE ROW DIMENSION OF THE TWO-DIMENSIONAL
9150C        ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
9151C        DIMENSION STATEMENT.
9152C
9153C        N  IS THE ORDER OF THE MATRIX  A.
9154C
9155C        A  CONTAINS THE SPECIAL REAL TRIDIAGONAL MATRIX IN ITS
9156C        FIRST THREE COLUMNS.  THE SUBDIAGONAL ELEMENTS ARE STORED
9157C        IN THE LAST  N-1  POSITIONS OF THE FIRST COLUMN, THE
9158C        DIAGONAL ELEMENTS IN THE SECOND COLUMN, AND THE SUPERDIAGONAL
9159C        ELEMENTS IN THE FIRST  N-1  POSITIONS OF THE THIRD COLUMN.
9160C        ELEMENTS  A(1,1)  AND  A(N,3)  ARE ARBITRARY.
9161C
9162C        MATZ  IS AN INTEGER VARIABLE SET EQUAL TO ZERO IF
9163C        ONLY EIGENVALUES ARE DESIRED.  OTHERWISE IT IS SET TO
9164C        ANY NON-ZERO INTEGER FOR BOTH EIGENVALUES AND EIGENVECTORS.
9165C
9166C     ON OUTPUT
9167C
9168C        W  CONTAINS THE EIGENVALUES IN ASCENDING ORDER.
9169C
9170C        Z  CONTAINS THE EIGENVECTORS IF MATZ IS NOT ZERO.
9171C
9172C        IERR  IS AN INTEGER OUTPUT VARIABLE SET EQUAL TO AN ERROR
9173C           COMPLETION CODE DESCRIBED IN THE DOCUMENTATION FOR IMTQL1
9174C           AND IMTQL2.  THE NORMAL COMPLETION CODE IS ZERO.
9175C
9176C        FV1  IS A TEMPORARY STORAGE ARRAY.
9177C
9178C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
9179C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
9180C
9181C     THIS VERSION DATED AUGUST 1983.
9182C
9183C     ------------------------------------------------------------------
9184C
9185      IF (N .LE. NM) GO TO 10
9186      IERR = 10 * N
9187      GO TO 50
9188C
9189   10 IF (MATZ .NE. 0) GO TO 20
9190C     .......... FIND EIGENVALUES ONLY ..........
9191      CALL  FIGI(NM,N,A,W,FV1,FV1,IERR)
9192      IF (IERR .GT. 0) GO TO 50
9193      CALL  IMTQL1(N,W,FV1,IERR)
9194      GO TO 50
9195C     .......... FIND BOTH EIGENVALUES AND EIGENVECTORS ..........
9196   20 CALL  FIGI2(NM,N,A,W,FV1,Z,IERR)
9197      IF (IERR .NE. 0) GO TO 50
9198      CALL  IMTQL2(NM,N,W,FV1,Z,IERR)
9199   50 RETURN
9200      END
9201      SUBROUTINE SVD(NM,M,N,A,W,MATU,U,MATV,V,IERR,RV1)
9202C
9203      INTEGER I,J,K,L,M,N,II,I1,KK,K1,LL,L1,MN,NM,ITS,IERR
9204      DOUBLE PRECISION A(NM,N),W(N),U(NM,N),V(NM,N),RV1(N)
9205      DOUBLE PRECISION C,F,G,H,S,X,Y,Z,TST1,TST2,SCALE,PYTHAG
9206      LOGICAL MATU,MATV
9207C
9208C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE SVD,
9209C     NUM. MATH. 14, 403-420(1970) BY GOLUB AND REINSCH.
9210C     HANDBOOK FOR AUTO. COMP., VOL II-LINEAR ALGEBRA, 134-151(1971).
9211C
9212C     THIS SUBROUTINE DETERMINES THE SINGULAR VALUE DECOMPOSITION
9213C          T
9214C     A=USV  OF A REAL M BY N RECTANGULAR MATRIX.  HOUSEHOLDER
9215C     BIDIAGONALIZATION AND A VARIANT OF THE QR ALGORITHM ARE USED.
9216C
9217C     ON INPUT
9218C
9219C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
9220C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
9221C          DIMENSION STATEMENT.  NOTE THAT NM MUST BE AT LEAST
9222C          AS LARGE AS THE MAXIMUM OF M AND N.
9223C
9224C        M IS THE NUMBER OF ROWS OF A (AND U).
9225C
9226C        N IS THE NUMBER OF COLUMNS OF A (AND U) AND THE ORDER OF V.
9227C
9228C        A CONTAINS THE RECTANGULAR INPUT MATRIX TO BE DECOMPOSED.
9229C
9230C        MATU SHOULD BE SET TO .TRUE. IF THE U MATRIX IN THE
9231C          DECOMPOSITION IS DESIRED, AND TO .FALSE. OTHERWISE.
9232C
9233C        MATV SHOULD BE SET TO .TRUE. IF THE V MATRIX IN THE
9234C          DECOMPOSITION IS DESIRED, AND TO .FALSE. OTHERWISE.
9235C
9236C     ON OUTPUT
9237C
9238C        A IS UNALTERED (UNLESS OVERWRITTEN BY U OR V).
9239C
9240C        W CONTAINS THE N (NON-NEGATIVE) SINGULAR VALUES OF A (THE
9241C          DIAGONAL ELEMENTS OF S).  THEY ARE UNORDERED.  IF AN
9242C          ERROR EXIT IS MADE, THE SINGULAR VALUES SHOULD BE CORRECT
9243C          FOR INDICES IERR+1,IERR+2,...,N.
9244C
9245C        U CONTAINS THE MATRIX U (ORTHOGONAL COLUMN VECTORS) OF THE
9246C          DECOMPOSITION IF MATU HAS BEEN SET TO .TRUE.  OTHERWISE
9247C          U IS USED AS A TEMPORARY ARRAY.  U MAY COINCIDE WITH A.
9248C          IF AN ERROR EXIT IS MADE, THE COLUMNS OF U CORRESPONDING
9249C          TO INDICES OF CORRECT SINGULAR VALUES SHOULD BE CORRECT.
9250C
9251C        V CONTAINS THE MATRIX V (ORTHOGONAL) OF THE DECOMPOSITION IF
9252C          MATV HAS BEEN SET TO .TRUE.  OTHERWISE V IS NOT REFERENCED.
9253C          V MAY ALSO COINCIDE WITH A IF U IS NOT NEEDED.  IF AN ERROR
9254C          EXIT IS MADE, THE COLUMNS OF V CORRESPONDING TO INDICES OF
9255C          CORRECT SINGULAR VALUES SHOULD BE CORRECT.
9256C
9257C        IERR IS SET TO
9258C          ZERO       FOR NORMAL RETURN,
9259C          K          IF THE K-TH SINGULAR VALUE HAS NOT BEEN
9260C                     DETERMINED AFTER 30 ITERATIONS.
9261C
9262C        RV1 IS A TEMPORARY STORAGE ARRAY.
9263C
9264C     CALLS PYTHAG FOR  DSQRT(A*A + B*B) .
9265C
9266C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
9267C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
9268C
9269C     THIS VERSION DATED AUGUST 1983.
9270C
9271C     ------------------------------------------------------------------
9272C
9273      IERR = 0
9274C
9275      DO 100 I = 1, M
9276C
9277         DO 100 J = 1, N
9278            U(I,J) = A(I,J)
9279  100 CONTINUE
9280C     .......... HOUSEHOLDER REDUCTION TO BIDIAGONAL FORM ..........
9281      G = 0.0D0
9282      SCALE = 0.0D0
9283      X = 0.0D0
9284C
9285      DO 300 I = 1, N
9286         L = I + 1
9287         RV1(I) = SCALE * G
9288         G = 0.0D0
9289         S = 0.0D0
9290         SCALE = 0.0D0
9291         IF (I .GT. M) GO TO 210
9292C
9293         DO 120 K = I, M
9294  120    SCALE = SCALE + DABS(U(K,I))
9295C
9296         IF (SCALE .EQ. 0.0D0) GO TO 210
9297C
9298         DO 130 K = I, M
9299            U(K,I) = U(K,I) / SCALE
9300            S = S + U(K,I)**2
9301  130    CONTINUE
9302C
9303         F = U(I,I)
9304         G = -DSIGN(DSQRT(S),F)
9305         H = F * G - S
9306         U(I,I) = F - G
9307         IF (I .EQ. N) GO TO 190
9308C
9309         DO 150 J = L, N
9310            S = 0.0D0
9311C
9312            DO 140 K = I, M
9313  140       S = S + U(K,I) * U(K,J)
9314C
9315            F = S / H
9316C
9317            DO 150 K = I, M
9318               U(K,J) = U(K,J) + F * U(K,I)
9319  150    CONTINUE
9320C
9321  190    DO 200 K = I, M
9322  200    U(K,I) = SCALE * U(K,I)
9323C
9324  210    W(I) = SCALE * G
9325         G = 0.0D0
9326         S = 0.0D0
9327         SCALE = 0.0D0
9328         IF (I .GT. M .OR. I .EQ. N) GO TO 290
9329C
9330         DO 220 K = L, N
9331  220    SCALE = SCALE + DABS(U(I,K))
9332C
9333         IF (SCALE .EQ. 0.0D0) GO TO 290
9334C
9335         DO 230 K = L, N
9336            U(I,K) = U(I,K) / SCALE
9337            S = S + U(I,K)**2
9338  230    CONTINUE
9339C
9340         F = U(I,L)
9341         G = -DSIGN(DSQRT(S),F)
9342         H = F * G - S
9343         U(I,L) = F - G
9344C
9345         DO 240 K = L, N
9346  240    RV1(K) = U(I,K) / H
9347C
9348         IF (I .EQ. M) GO TO 270
9349C
9350         DO 260 J = L, M
9351            S = 0.0D0
9352C
9353            DO 250 K = L, N
9354  250       S = S + U(J,K) * U(I,K)
9355C
9356            DO 260 K = L, N
9357               U(J,K) = U(J,K) + S * RV1(K)
9358  260    CONTINUE
9359C
9360  270    DO 280 K = L, N
9361  280    U(I,K) = SCALE * U(I,K)
9362C
9363  290    X = DMAX1(X,DABS(W(I))+DABS(RV1(I)))
9364  300 CONTINUE
9365C     .......... ACCUMULATION OF RIGHT-HAND TRANSFORMATIONS ..........
9366      IF (.NOT. MATV) GO TO 410
9367C     .......... FOR I=N STEP -1 UNTIL 1 DO -- ..........
9368      DO 400 II = 1, N
9369         I = N + 1 - II
9370         IF (I .EQ. N) GO TO 390
9371         IF (G .EQ. 0.0D0) GO TO 360
9372C
9373         DO 320 J = L, N
9374C     .......... DOUBLE DIVISION AVOIDS POSSIBLE UNDERFLOW ..........
9375  320    V(J,I) = (U(I,J) / U(I,L)) / G
9376C
9377         DO 350 J = L, N
9378            S = 0.0D0
9379C
9380            DO 340 K = L, N
9381  340       S = S + U(I,K) * V(K,J)
9382C
9383            DO 350 K = L, N
9384               V(K,J) = V(K,J) + S * V(K,I)
9385  350    CONTINUE
9386C
9387  360    DO 380 J = L, N
9388            V(I,J) = 0.0D0
9389            V(J,I) = 0.0D0
9390  380    CONTINUE
9391C
9392  390    V(I,I) = 1.0D0
9393         G = RV1(I)
9394         L = I
9395  400 CONTINUE
9396C     .......... ACCUMULATION OF LEFT-HAND TRANSFORMATIONS ..........
9397  410 IF (.NOT. MATU) GO TO 510
9398C     ..........FOR I=MIN(M,N) STEP -1 UNTIL 1 DO -- ..........
9399      MN = N
9400      IF (M .LT. N) MN = M
9401C
9402      DO 500 II = 1, MN
9403         I = MN + 1 - II
9404         L = I + 1
9405         G = W(I)
9406         IF (I .EQ. N) GO TO 430
9407C
9408         DO 420 J = L, N
9409  420    U(I,J) = 0.0D0
9410C
9411  430    IF (G .EQ. 0.0D0) GO TO 475
9412         IF (I .EQ. MN) GO TO 460
9413C
9414         DO 450 J = L, N
9415            S = 0.0D0
9416C
9417            DO 440 K = L, M
9418  440       S = S + U(K,I) * U(K,J)
9419C     .......... DOUBLE DIVISION AVOIDS POSSIBLE UNDERFLOW ..........
9420            F = (S / U(I,I)) / G
9421C
9422            DO 450 K = I, M
9423               U(K,J) = U(K,J) + F * U(K,I)
9424  450    CONTINUE
9425C
9426  460    DO 470 J = I, M
9427  470    U(J,I) = U(J,I) / G
9428C
9429         GO TO 490
9430C
9431  475    DO 480 J = I, M
9432  480    U(J,I) = 0.0D0
9433C
9434  490    U(I,I) = U(I,I) + 1.0D0
9435  500 CONTINUE
9436C     .......... DIAGONALIZATION OF THE BIDIAGONAL FORM ..........
9437  510 TST1 = X
9438C     .......... FOR K=N STEP -1 UNTIL 1 DO -- ..........
9439      DO 700 KK = 1, N
9440         K1 = N - KK
9441         K = K1 + 1
9442         ITS = 0
9443C     .......... TEST FOR SPLITTING.
9444C                FOR L=K STEP -1 UNTIL 1 DO -- ..........
9445  520    DO 530 LL = 1, K
9446            L1 = K - LL
9447            L = L1 + 1
9448            TST2 = TST1 + DABS(RV1(L))
9449            IF (TST2 .EQ. TST1) GO TO 565
9450C     .......... RV1(1) IS ALWAYS ZERO, SO THERE IS NO EXIT
9451C                THROUGH THE BOTTOM OF THE LOOP ..........
9452            TST2 = TST1 + DABS(W(L1))
9453            IF (TST2 .EQ. TST1) GO TO 540
9454  530    CONTINUE
9455C     .......... CANCELLATION OF RV1(L) IF L GREATER THAN 1 ..........
9456  540    C = 0.0D0
9457         S = 1.0D0
9458C
9459         DO 560 I = L, K
9460            F = S * RV1(I)
9461            RV1(I) = C * RV1(I)
9462            TST2 = TST1 + DABS(F)
9463            IF (TST2 .EQ. TST1) GO TO 565
9464            G = W(I)
9465            H = PYTHAG(F,G)
9466            W(I) = H
9467            C = G / H
9468            S = -F / H
9469            IF (.NOT. MATU) GO TO 560
9470C
9471            DO 550 J = 1, M
9472               Y = U(J,L1)
9473               Z = U(J,I)
9474               U(J,L1) = Y * C + Z * S
9475               U(J,I) = -Y * S + Z * C
9476  550       CONTINUE
9477C
9478  560    CONTINUE
9479C     .......... TEST FOR CONVERGENCE ..........
9480  565    Z = W(K)
9481         IF (L .EQ. K) GO TO 650
9482C     .......... SHIFT FROM BOTTOM 2 BY 2 MINOR ..........
9483         IF (ITS .EQ. 30) GO TO 1000
9484         ITS = ITS + 1
9485         X = W(L)
9486         Y = W(K1)
9487         G = RV1(K1)
9488         H = RV1(K)
9489         F = 0.5D0 * (((G + Z) / H) * ((G - Z) / Y) + Y / H - H / Y)
9490         G = PYTHAG(F,1.0D0)
9491         F = X - (Z / X) * Z + (H / X) * (Y / (F + DSIGN(G,F)) - H)
9492C     .......... NEXT QR TRANSFORMATION ..........
9493         C = 1.0D0
9494         S = 1.0D0
9495C
9496         DO 600 I1 = L, K1
9497            I = I1 + 1
9498            G = RV1(I)
9499            Y = W(I)
9500            H = S * G
9501            G = C * G
9502            Z = PYTHAG(F,H)
9503            RV1(I1) = Z
9504            C = F / Z
9505            S = H / Z
9506            F = X * C + G * S
9507            G = -X * S + G * C
9508            H = Y * S
9509            Y = Y * C
9510            IF (.NOT. MATV) GO TO 575
9511C
9512            DO 570 J = 1, N
9513               X = V(J,I1)
9514               Z = V(J,I)
9515               V(J,I1) = X * C + Z * S
9516               V(J,I) = -X * S + Z * C
9517  570       CONTINUE
9518C
9519  575       Z = PYTHAG(F,H)
9520            W(I1) = Z
9521C     .......... ROTATION CAN BE ARBITRARY IF Z IS ZERO ..........
9522            IF (Z .EQ. 0.0D0) GO TO 580
9523            C = F / Z
9524            S = H / Z
9525  580       F = C * G + S * Y
9526            X = -S * G + C * Y
9527            IF (.NOT. MATU) GO TO 600
9528C
9529            DO 590 J = 1, M
9530               Y = U(J,I1)
9531               Z = U(J,I)
9532               U(J,I1) = Y * C + Z * S
9533               U(J,I) = -Y * S + Z * C
9534  590       CONTINUE
9535C
9536  600    CONTINUE
9537C
9538         RV1(L) = 0.0D0
9539         RV1(K) = F
9540         W(K) = X
9541         GO TO 520
9542C     .......... CONVERGENCE ..........
9543  650    IF (Z .GE. 0.0D0) GO TO 700
9544C     .......... W(K) IS MADE NON-NEGATIVE ..........
9545         W(K) = -Z
9546         IF (.NOT. MATV) GO TO 700
9547C
9548         DO 690 J = 1, N
9549  690    V(J,K) = -V(J,K)
9550C
9551  700 CONTINUE
9552C
9553      GO TO 1001
9554C     .......... SET ERROR -- NO CONVERGENCE TO A
9555C                SINGULAR VALUE AFTER 30 ITERATIONS ..........
9556 1000 IERR = K
9557 1001 RETURN
9558      END
9559      SUBROUTINE TINVIT(NM,N,D,E,E2,M,W,IND,Z,
9560     X                  IERR,RV1,RV2,RV3,RV4,RV6)
9561C
9562      INTEGER I,J,M,N,P,Q,R,S,II,IP,JJ,NM,ITS,TAG,IERR,GROUP
9563      DOUBLE PRECISION D(N),E(N),E2(N),W(M),Z(NM,M),
9564     X       RV1(N),RV2(N),RV3(N),RV4(N),RV6(N)
9565      DOUBLE PRECISION U,V,UK,XU,X0,X1,EPS2,EPS3,EPS4,NORM,ORDER,EPSLON,
9566     X       PYTHAG
9567      INTEGER IND(M)
9568C
9569C     THIS SUBROUTINE IS A TRANSLATION OF THE INVERSE ITERATION TECH-
9570C     NIQUE IN THE ALGOL PROCEDURE TRISTURM BY PETERS AND WILKINSON.
9571C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 418-439(1971).
9572C
9573C     THIS SUBROUTINE FINDS THOSE EIGENVECTORS OF A TRIDIAGONAL
9574C     SYMMETRIC MATRIX CORRESPONDING TO SPECIFIED EIGENVALUES,
9575C     USING INVERSE ITERATION.
9576C
9577C     ON INPUT
9578C
9579C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
9580C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
9581C          DIMENSION STATEMENT.
9582C
9583C        N IS THE ORDER OF THE MATRIX.
9584C
9585C        D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX.
9586C
9587C        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE INPUT MATRIX
9588C          IN ITS LAST N-1 POSITIONS.  E(1) IS ARBITRARY.
9589C
9590C        E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E,
9591C          WITH ZEROS CORRESPONDING TO NEGLIGIBLE ELEMENTS OF E.
9592C          E(I) IS CONSIDERED NEGLIGIBLE IF IT IS NOT LARGER THAN
9593C          THE PRODUCT OF THE RELATIVE MACHINE PRECISION AND THE SUM
9594C          OF THE MAGNITUDES OF D(I) AND D(I-1).  E2(1) MUST CONTAIN
9595C          0.0D0 IF THE EIGENVALUES ARE IN ASCENDING ORDER, OR 2.0D0
9596C          IF THE EIGENVALUES ARE IN DESCENDING ORDER.  IF  BISECT,
9597C          TRIDIB, OR  IMTQLV  HAS BEEN USED TO FIND THE EIGENVALUES,
9598C          THEIR OUTPUT E2 ARRAY IS EXACTLY WHAT IS EXPECTED HERE.
9599C
9600C        M IS THE NUMBER OF SPECIFIED EIGENVALUES.
9601C
9602C        W CONTAINS THE M EIGENVALUES IN ASCENDING OR DESCENDING ORDER.
9603C
9604C        IND CONTAINS IN ITS FIRST M POSITIONS THE SUBMATRIX INDICES
9605C          ASSOCIATED WITH THE CORRESPONDING EIGENVALUES IN W --
9606C          1 FOR EIGENVALUES BELONGING TO THE FIRST SUBMATRIX FROM
9607C          THE TOP, 2 FOR THOSE BELONGING TO THE SECOND SUBMATRIX, ETC.
9608C
9609C     ON OUTPUT
9610C
9611C        ALL INPUT ARRAYS ARE UNALTERED.
9612C
9613C        Z CONTAINS THE ASSOCIATED SET OF ORTHONORMAL EIGENVECTORS.
9614C          ANY VECTOR WHICH FAILS TO CONVERGE IS SET TO ZERO.
9615C
9616C        IERR IS SET TO
9617C          ZERO       FOR NORMAL RETURN,
9618C          -R         IF THE EIGENVECTOR CORRESPONDING TO THE R-TH
9619C                     EIGENVALUE FAILS TO CONVERGE IN 5 ITERATIONS.
9620C
9621C        RV1, RV2, RV3, RV4, AND RV6 ARE TEMPORARY STORAGE ARRAYS.
9622C
9623C     CALLS PYTHAG FOR  DSQRT(A*A + B*B) .
9624C
9625C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
9626C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
9627C
9628C     THIS VERSION DATED AUGUST 1983.
9629C
9630C     ------------------------------------------------------------------
9631C
9632      IERR = 0
9633      IF (M .EQ. 0) GO TO 1001
9634      TAG = 0
9635      ORDER = 1.0D0 - E2(1)
9636      Q = 0
9637C     .......... ESTABLISH AND PROCESS NEXT SUBMATRIX ..........
9638  100 P = Q + 1
9639C
9640      DO 120 Q = P, N
9641         IF (Q .EQ. N) GO TO 140
9642         IF (E2(Q+1) .EQ. 0.0D0) GO TO 140
9643  120 CONTINUE
9644C     .......... FIND VECTORS BY INVERSE ITERATION ..........
9645  140 TAG = TAG + 1
9646      S = 0
9647C
9648      DO 920 R = 1, M
9649         IF (IND(R) .NE. TAG) GO TO 920
9650         ITS = 1
9651         X1 = W(R)
9652         IF (S .NE. 0) GO TO 510
9653C     .......... CHECK FOR ISOLATED ROOT ..........
9654         XU = 1.0D0
9655         IF (P .NE. Q) GO TO 490
9656         RV6(P) = 1.0D0
9657         GO TO 870
9658  490    NORM = DABS(D(P))
9659         IP = P + 1
9660C
9661         DO 500 I = IP, Q
9662  500    NORM = DMAX1(NORM, DABS(D(I))+DABS(E(I)))
9663C     .......... EPS2 IS THE CRITERION FOR GROUPING,
9664C                EPS3 REPLACES ZERO PIVOTS AND EQUAL
9665C                ROOTS ARE MODIFIED BY EPS3,
9666C                EPS4 IS TAKEN VERY SMALL TO AVOID OVERFLOW ..........
9667         EPS2 = 1.0D-3 * NORM
9668         EPS3 = EPSLON(NORM)
9669         UK = Q - P + 1
9670         EPS4 = UK * EPS3
9671         UK = EPS4 / DSQRT(UK)
9672         S = P
9673  505    GROUP = 0
9674         GO TO 520
9675C     .......... LOOK FOR CLOSE OR COINCIDENT ROOTS ..........
9676  510    IF (DABS(X1-X0) .GE. EPS2) GO TO 505
9677         GROUP = GROUP + 1
9678         IF (ORDER * (X1 - X0) .LE. 0.0D0) X1 = X0 + ORDER * EPS3
9679C     .......... ELIMINATION WITH INTERCHANGES AND
9680C                INITIALIZATION OF VECTOR ..........
9681  520    V = 0.0D0
9682C
9683         DO 580 I = P, Q
9684            RV6(I) = UK
9685            IF (I .EQ. P) GO TO 560
9686            IF (DABS(E(I)) .LT. DABS(U)) GO TO 540
9687C     .......... WARNING -- A DIVIDE CHECK MAY OCCUR HERE IF
9688C                E2 ARRAY HAS NOT BEEN SPECIFIED CORRECTLY ..........
9689            XU = U / E(I)
9690            RV4(I) = XU
9691            RV1(I-1) = E(I)
9692            RV2(I-1) = D(I) - X1
9693            RV3(I-1) = 0.0D0
9694            IF (I .NE. Q) RV3(I-1) = E(I+1)
9695            U = V - XU * RV2(I-1)
9696            V = -XU * RV3(I-1)
9697            GO TO 580
9698  540       XU = E(I) / U
9699            RV4(I) = XU
9700            RV1(I-1) = U
9701            RV2(I-1) = V
9702            RV3(I-1) = 0.0D0
9703  560       U = D(I) - X1 - XU * V
9704            IF (I .NE. Q) V = E(I+1)
9705  580    CONTINUE
9706C
9707         IF (U .EQ. 0.0D0) U = EPS3
9708         RV1(Q) = U
9709         RV2(Q) = 0.0D0
9710         RV3(Q) = 0.0D0
9711C     .......... BACK SUBSTITUTION
9712C                FOR I=Q STEP -1 UNTIL P DO -- ..........
9713  600    DO 620 II = P, Q
9714            I = P + Q - II
9715            RV6(I) = (RV6(I) - U * RV2(I) - V * RV3(I)) / RV1(I)
9716            V = U
9717            U = RV6(I)
9718  620    CONTINUE
9719C     .......... ORTHOGONALIZE WITH RESPECT TO PREVIOUS
9720C                MEMBERS OF GROUP ..........
9721         IF (GROUP .EQ. 0) GO TO 700
9722         J = R
9723C
9724         DO 680 JJ = 1, GROUP
9725  630       J = J - 1
9726            IF (IND(J) .NE. TAG) GO TO 630
9727            XU = 0.0D0
9728C
9729            DO 640 I = P, Q
9730  640       XU = XU + RV6(I) * Z(I,J)
9731C
9732            DO 660 I = P, Q
9733  660       RV6(I) = RV6(I) - XU * Z(I,J)
9734C
9735  680    CONTINUE
9736C
9737  700    NORM = 0.0D0
9738C
9739         DO 720 I = P, Q
9740  720    NORM = NORM + DABS(RV6(I))
9741C
9742         IF (NORM .GE. 1.0D0) GO TO 840
9743C     .......... FORWARD SUBSTITUTION ..........
9744         IF (ITS .EQ. 5) GO TO 830
9745         IF (NORM .NE. 0.0D0) GO TO 740
9746         RV6(S) = EPS4
9747         S = S + 1
9748         IF (S .GT. Q) S = P
9749         GO TO 780
9750  740    XU = EPS4 / NORM
9751C
9752         DO 760 I = P, Q
9753  760    RV6(I) = RV6(I) * XU
9754C     .......... ELIMINATION OPERATIONS ON NEXT VECTOR
9755C                ITERATE ..........
9756  780    DO 820 I = IP, Q
9757            U = RV6(I)
9758C     .......... IF RV1(I-1) .EQ. E(I), A ROW INTERCHANGE
9759C                WAS PERFORMED EARLIER IN THE
9760C                TRIANGULARIZATION PROCESS ..........
9761            IF (RV1(I-1) .NE. E(I)) GO TO 800
9762            U = RV6(I-1)
9763            RV6(I-1) = RV6(I)
9764  800       RV6(I) = U - RV4(I) * RV6(I-1)
9765  820    CONTINUE
9766C
9767         ITS = ITS + 1
9768         GO TO 600
9769C     .......... SET ERROR -- NON-CONVERGED EIGENVECTOR ..........
9770  830    IERR = -R
9771         XU = 0.0D0
9772         GO TO 870
9773C     .......... NORMALIZE SO THAT SUM OF SQUARES IS
9774C                1 AND EXPAND TO FULL ORDER ..........
9775  840    U = 0.0D0
9776C
9777         DO 860 I = P, Q
9778  860    U = PYTHAG(U,RV6(I))
9779C
9780         XU = 1.0D0 / U
9781C
9782  870    DO 880 I = 1, N
9783  880    Z(I,R) = 0.0D0
9784C
9785         DO 900 I = P, Q
9786  900    Z(I,R) = RV6(I) * XU
9787C
9788         X0 = X1
9789  920 CONTINUE
9790C
9791      IF (Q .LT. N) GO TO 100
9792 1001 RETURN
9793      END
9794      SUBROUTINE TQL1(N,D,E,IERR)
9795C
9796      INTEGER I,J,L,M,N,II,L1,L2,MML,IERR
9797      DOUBLE PRECISION D(N),E(N)
9798      DOUBLE PRECISION C,C2,C3,DL1,EL1,F,G,H,P,R,S,S2,TST1,TST2,PYTHAG
9799C
9800C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TQL1,
9801C     NUM. MATH. 11, 293-306(1968) BY BOWDLER, MARTIN, REINSCH, AND
9802C     WILKINSON.
9803C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 227-240(1971).
9804C
9805C     THIS SUBROUTINE FINDS THE EIGENVALUES OF A SYMMETRIC
9806C     TRIDIAGONAL MATRIX BY THE QL METHOD.
9807C
9808C     ON INPUT
9809C
9810C        N IS THE ORDER OF THE MATRIX.
9811C
9812C        D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX.
9813C
9814C        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE INPUT MATRIX
9815C          IN ITS LAST N-1 POSITIONS.  E(1) IS ARBITRARY.
9816C
9817C      ON OUTPUT
9818C
9819C        D CONTAINS THE EIGENVALUES IN ASCENDING ORDER.  IF AN
9820C          ERROR EXIT IS MADE, THE EIGENVALUES ARE CORRECT AND
9821C          ORDERED FOR INDICES 1,2,...IERR-1, BUT MAY NOT BE
9822C          THE SMALLEST EIGENVALUES.
9823C
9824C        E HAS BEEN DESTROYED.
9825C
9826C        IERR IS SET TO
9827C          ZERO       FOR NORMAL RETURN,
9828C          J          IF THE J-TH EIGENVALUE HAS NOT BEEN
9829C                     DETERMINED AFTER 30 ITERATIONS.
9830C
9831C     CALLS PYTHAG FOR  DSQRT(A*A + B*B) .
9832C
9833C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
9834C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
9835C
9836C     THIS VERSION DATED AUGUST 1983.
9837C
9838C     ------------------------------------------------------------------
9839C
9840      IERR = 0
9841      IF (N .EQ. 1) GO TO 1001
9842C
9843      DO 100 I = 2, N
9844  100 E(I-1) = E(I)
9845C
9846      F = 0.0D0
9847      TST1 = 0.0D0
9848      E(N) = 0.0D0
9849C
9850      DO 290 L = 1, N
9851         J = 0
9852         H = DABS(D(L)) + DABS(E(L))
9853         IF (TST1 .LT. H) TST1 = H
9854C     .......... LOOK FOR SMALL SUB-DIAGONAL ELEMENT ..........
9855         DO 110 M = L, N
9856            TST2 = TST1 + DABS(E(M))
9857            IF (TST2 .EQ. TST1) GO TO 120
9858C     .......... E(N) IS ALWAYS ZERO, SO THERE IS NO EXIT
9859C                THROUGH THE BOTTOM OF THE LOOP ..........
9860  110    CONTINUE
9861C
9862  120    IF (M .EQ. L) GO TO 210
9863  130    IF (J .EQ. 30) GO TO 1000
9864         J = J + 1
9865C     .......... FORM SHIFT ..........
9866         L1 = L + 1
9867         L2 = L1 + 1
9868         G = D(L)
9869         P = (D(L1) - G) / (2.0D0 * E(L))
9870         R = PYTHAG(P,1.0D0)
9871         D(L) = E(L) / (P + DSIGN(R,P))
9872         D(L1) = E(L) * (P + DSIGN(R,P))
9873         DL1 = D(L1)
9874         H = G - D(L)
9875         IF (L2 .GT. N) GO TO 145
9876C
9877         DO 140 I = L2, N
9878  140    D(I) = D(I) - H
9879C
9880  145    F = F + H
9881C     .......... QL TRANSFORMATION ..........
9882         P = D(M)
9883         C = 1.0D0
9884         C2 = C
9885         EL1 = E(L1)
9886         S = 0.0D0
9887         MML = M - L
9888C     .......... FOR I=M-1 STEP -1 UNTIL L DO -- ..........
9889         DO 200 II = 1, MML
9890            C3 = C2
9891            C2 = C
9892            S2 = S
9893            I = M - II
9894            G = C * E(I)
9895            H = C * P
9896            R = PYTHAG(P,E(I))
9897            E(I+1) = S * R
9898            S = E(I) / R
9899            C = P / R
9900            P = C * D(I) - S * G
9901            D(I+1) = H + S * (C * G + S * D(I))
9902  200    CONTINUE
9903C
9904         P = -S * S2 * C3 * EL1 * E(L) / DL1
9905         E(L) = S * P
9906         D(L) = C * P
9907         TST2 = TST1 + DABS(E(L))
9908         IF (TST2 .GT. TST1) GO TO 130
9909  210    P = D(L) + F
9910C     .......... ORDER EIGENVALUES ..........
9911         IF (L .EQ. 1) GO TO 250
9912C     .......... FOR I=L STEP -1 UNTIL 2 DO -- ..........
9913         DO 230 II = 2, L
9914            I = L + 2 - II
9915            IF (P .GE. D(I-1)) GO TO 270
9916            D(I) = D(I-1)
9917  230    CONTINUE
9918C
9919  250    I = 1
9920  270    D(I) = P
9921  290 CONTINUE
9922C
9923      GO TO 1001
9924C     .......... SET ERROR -- NO CONVERGENCE TO AN
9925C                EIGENVALUE AFTER 30 ITERATIONS ..........
9926 1000 IERR = L
9927 1001 RETURN
9928      END
9929      SUBROUTINE TQL2(NM,N,D,E,Z,IERR)
9930C
9931      INTEGER I,J,K,L,M,N,II,L1,L2,NM,MML,IERR
9932      DOUBLE PRECISION D(N),E(N),Z(NM,N)
9933      DOUBLE PRECISION C,C2,C3,DL1,EL1,F,G,H,P,R,S,S2,TST1,TST2,PYTHAG
9934C
9935C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TQL2,
9936C     NUM. MATH. 11, 293-306(1968) BY BOWDLER, MARTIN, REINSCH, AND
9937C     WILKINSON.
9938C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 227-240(1971).
9939C
9940C     THIS SUBROUTINE FINDS THE EIGENVALUES AND EIGENVECTORS
9941C     OF A SYMMETRIC TRIDIAGONAL MATRIX BY THE QL METHOD.
9942C     THE EIGENVECTORS OF A FULL SYMMETRIC MATRIX CAN ALSO
9943C     BE FOUND IF  TRED2  HAS BEEN USED TO REDUCE THIS
9944C     FULL MATRIX TO TRIDIAGONAL FORM.
9945C
9946C     ON INPUT
9947C
9948C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
9949C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
9950C          DIMENSION STATEMENT.
9951C
9952C        N IS THE ORDER OF THE MATRIX.
9953C
9954C        D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX.
9955C
9956C        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE INPUT MATRIX
9957C          IN ITS LAST N-1 POSITIONS.  E(1) IS ARBITRARY.
9958C
9959C        Z CONTAINS THE TRANSFORMATION MATRIX PRODUCED IN THE
9960C          REDUCTION BY  TRED2, IF PERFORMED.  IF THE EIGENVECTORS
9961C          OF THE TRIDIAGONAL MATRIX ARE DESIRED, Z MUST CONTAIN
9962C          THE IDENTITY MATRIX.
9963C
9964C      ON OUTPUT
9965C
9966C        D CONTAINS THE EIGENVALUES IN ASCENDING ORDER.  IF AN
9967C          ERROR EXIT IS MADE, THE EIGENVALUES ARE CORRECT BUT
9968C          UNORDERED FOR INDICES 1,2,...,IERR-1.
9969C
9970C        E HAS BEEN DESTROYED.
9971C
9972C        Z CONTAINS ORTHONORMAL EIGENVECTORS OF THE SYMMETRIC
9973C          TRIDIAGONAL (OR FULL) MATRIX.  IF AN ERROR EXIT IS MADE,
9974C          Z CONTAINS THE EIGENVECTORS ASSOCIATED WITH THE STORED
9975C          EIGENVALUES.
9976C
9977C        IERR IS SET TO
9978C          ZERO       FOR NORMAL RETURN,
9979C          J          IF THE J-TH EIGENVALUE HAS NOT BEEN
9980C                     DETERMINED AFTER 30 ITERATIONS.
9981C
9982C     CALLS PYTHAG FOR  DSQRT(A*A + B*B) .
9983C
9984C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
9985C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
9986C
9987C     THIS VERSION DATED AUGUST 1983.
9988C
9989C     ------------------------------------------------------------------
9990C
9991      IERR = 0
9992      IF (N .EQ. 1) GO TO 1001
9993C
9994      DO 100 I = 2, N
9995  100 E(I-1) = E(I)
9996C
9997      F = 0.0D0
9998      TST1 = 0.0D0
9999      E(N) = 0.0D0
10000C
10001      DO 240 L = 1, N
10002         J = 0
10003         H = DABS(D(L)) + DABS(E(L))
10004         IF (TST1 .LT. H) TST1 = H
10005C     .......... LOOK FOR SMALL SUB-DIAGONAL ELEMENT ..........
10006         DO 110 M = L, N
10007            TST2 = TST1 + DABS(E(M))
10008            IF (TST2 .EQ. TST1) GO TO 120
10009C     .......... E(N) IS ALWAYS ZERO, SO THERE IS NO EXIT
10010C                THROUGH THE BOTTOM OF THE LOOP ..........
10011  110    CONTINUE
10012C
10013  120    IF (M .EQ. L) GO TO 220
10014  130    IF (J .EQ. 30) GO TO 1000
10015         J = J + 1
10016C     .......... FORM SHIFT ..........
10017         L1 = L + 1
10018         L2 = L1 + 1
10019         G = D(L)
10020         P = (D(L1) - G) / (2.0D0 * E(L))
10021         R = PYTHAG(P,1.0D0)
10022         D(L) = E(L) / (P + DSIGN(R,P))
10023         D(L1) = E(L) * (P + DSIGN(R,P))
10024         DL1 = D(L1)
10025         H = G - D(L)
10026         IF (L2 .GT. N) GO TO 145
10027C
10028         DO 140 I = L2, N
10029  140    D(I) = D(I) - H
10030C
10031  145    F = F + H
10032C     .......... QL TRANSFORMATION ..........
10033         P = D(M)
10034         C = 1.0D0
10035         C2 = C
10036         EL1 = E(L1)
10037         S = 0.0D0
10038         MML = M - L
10039C     .......... FOR I=M-1 STEP -1 UNTIL L DO -- ..........
10040         DO 200 II = 1, MML
10041            C3 = C2
10042            C2 = C
10043            S2 = S
10044            I = M - II
10045            G = C * E(I)
10046            H = C * P
10047            R = PYTHAG(P,E(I))
10048            E(I+1) = S * R
10049            S = E(I) / R
10050            C = P / R
10051            P = C * D(I) - S * G
10052            D(I+1) = H + S * (C * G + S * D(I))
10053C     .......... FORM VECTOR ..........
10054            DO 180 K = 1, N
10055               H = Z(K,I+1)
10056               Z(K,I+1) = S * Z(K,I) + C * H
10057               Z(K,I) = C * Z(K,I) - S * H
10058  180       CONTINUE
10059C
10060  200    CONTINUE
10061C
10062         P = -S * S2 * C3 * EL1 * E(L) / DL1
10063         E(L) = S * P
10064         D(L) = C * P
10065         TST2 = TST1 + DABS(E(L))
10066         IF (TST2 .GT. TST1) GO TO 130
10067  220    D(L) = D(L) + F
10068  240 CONTINUE
10069C     .......... ORDER EIGENVALUES AND EIGENVECTORS ..........
10070      DO 300 II = 2, N
10071         I = II - 1
10072         K = I
10073         P = D(I)
10074C
10075         DO 260 J = II, N
10076            IF (D(J) .GE. P) GO TO 260
10077            K = J
10078            P = D(J)
10079  260    CONTINUE
10080C
10081         IF (K .EQ. I) GO TO 300
10082         D(K) = D(I)
10083         D(I) = P
10084C
10085         DO 280 J = 1, N
10086            P = Z(J,I)
10087            Z(J,I) = Z(J,K)
10088            Z(J,K) = P
10089  280    CONTINUE
10090C
10091  300 CONTINUE
10092C
10093      GO TO 1001
10094C     .......... SET ERROR -- NO CONVERGENCE TO AN
10095C                EIGENVALUE AFTER 30 ITERATIONS ..........
10096 1000 IERR = L
10097 1001 RETURN
10098      END
10099      SUBROUTINE TQLRAT(N,D,E2,IERR)
10100C
10101      INTEGER I,J,L,M,N,II,L1,MML,IERR
10102      DOUBLE PRECISION D(N),E2(N)
10103      DOUBLE PRECISION B,C,F,G,H,P,R,S,T,EPSLON,PYTHAG
10104C
10105C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TQLRAT,
10106C     ALGORITHM 464, COMM. ACM 16, 689(1973) BY REINSCH.
10107C
10108C     THIS SUBROUTINE FINDS THE EIGENVALUES OF A SYMMETRIC
10109C     TRIDIAGONAL MATRIX BY THE RATIONAL QL METHOD.
10110C
10111C     ON INPUT
10112C
10113C        N IS THE ORDER OF THE MATRIX.
10114C
10115C        D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX.
10116C
10117C        E2 CONTAINS THE SQUARES OF THE SUBDIAGONAL ELEMENTS OF THE
10118C          INPUT MATRIX IN ITS LAST N-1 POSITIONS.  E2(1) IS ARBITRARY.
10119C
10120C      ON OUTPUT
10121C
10122C        D CONTAINS THE EIGENVALUES IN ASCENDING ORDER.  IF AN
10123C          ERROR EXIT IS MADE, THE EIGENVALUES ARE CORRECT AND
10124C          ORDERED FOR INDICES 1,2,...IERR-1, BUT MAY NOT BE
10125C          THE SMALLEST EIGENVALUES.
10126C
10127C        E2 HAS BEEN DESTROYED.
10128C
10129C        IERR IS SET TO
10130C          ZERO       FOR NORMAL RETURN,
10131C          J          IF THE J-TH EIGENVALUE HAS NOT BEEN
10132C                     DETERMINED AFTER 30 ITERATIONS.
10133C
10134C     CALLS PYTHAG FOR  DSQRT(A*A + B*B) .
10135C
10136C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
10137C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
10138C
10139C     THIS VERSION DATED AUGUST 1983.
10140C
10141C     ------------------------------------------------------------------
10142C
10143      IERR = 0
10144      IF (N .EQ. 1) GO TO 1001
10145C
10146      DO 100 I = 2, N
10147  100 E2(I-1) = E2(I)
10148C
10149      F = 0.0D0
10150      T = 0.0D0
10151      E2(N) = 0.0D0
10152C
10153      DO 290 L = 1, N
10154         J = 0
10155         H = DABS(D(L)) + DSQRT(E2(L))
10156         IF (T .GT. H) GO TO 105
10157         T = H
10158         B = EPSLON(T)
10159         C = B * B
10160C     .......... LOOK FOR SMALL SQUARED SUB-DIAGONAL ELEMENT ..........
10161  105    DO 110 M = L, N
10162            IF (E2(M) .LE. C) GO TO 120
10163C     .......... E2(N) IS ALWAYS ZERO, SO THERE IS NO EXIT
10164C                THROUGH THE BOTTOM OF THE LOOP ..........
10165  110    CONTINUE
10166C
10167  120    IF (M .EQ. L) GO TO 210
10168  130    IF (J .EQ. 30) GO TO 1000
10169         J = J + 1
10170C     .......... FORM SHIFT ..........
10171         L1 = L + 1
10172         S = DSQRT(E2(L))
10173         G = D(L)
10174         P = (D(L1) - G) / (2.0D0 * S)
10175         R = PYTHAG(P,1.0D0)
10176         D(L) = S / (P + DSIGN(R,P))
10177         H = G - D(L)
10178C
10179         DO 140 I = L1, N
10180  140    D(I) = D(I) - H
10181C
10182         F = F + H
10183C     .......... RATIONAL QL TRANSFORMATION ..........
10184         G = D(M)
10185         IF (G .EQ. 0.0D0) G = B
10186         H = G
10187         S = 0.0D0
10188         MML = M - L
10189C     .......... FOR I=M-1 STEP -1 UNTIL L DO -- ..........
10190         DO 200 II = 1, MML
10191            I = M - II
10192            P = G * H
10193            R = P + E2(I)
10194            E2(I+1) = S * R
10195            S = E2(I) / R
10196            D(I+1) = H + S * (H + D(I))
10197            G = D(I) - E2(I) / G
10198            IF (G .EQ. 0.0D0) G = B
10199            H = G * P / R
10200  200    CONTINUE
10201C
10202         E2(L) = S * G
10203         D(L) = H
10204C     .......... GUARD AGAINST UNDERFLOW IN CONVERGENCE TEST ..........
10205         IF (H .EQ. 0.0D0) GO TO 210
10206         IF (DABS(E2(L)) .LE. DABS(C/H)) GO TO 210
10207         E2(L) = H * E2(L)
10208         IF (E2(L) .NE. 0.0D0) GO TO 130
10209  210    P = D(L) + F
10210C     .......... ORDER EIGENVALUES ..........
10211         IF (L .EQ. 1) GO TO 250
10212C     .......... FOR I=L STEP -1 UNTIL 2 DO -- ..........
10213         DO 230 II = 2, L
10214            I = L + 2 - II
10215            IF (P .GE. D(I-1)) GO TO 270
10216            D(I) = D(I-1)
10217  230    CONTINUE
10218C
10219  250    I = 1
10220  270    D(I) = P
10221  290 CONTINUE
10222C
10223      GO TO 1001
10224C     .......... SET ERROR -- NO CONVERGENCE TO AN
10225C                EIGENVALUE AFTER 30 ITERATIONS ..........
10226 1000 IERR = L
10227 1001 RETURN
10228      END
10229      SUBROUTINE TRBAK1(NM,N,A,E,M,Z)
10230C
10231      INTEGER I,J,K,L,M,N,NM
10232      DOUBLE PRECISION A(NM,N),E(N),Z(NM,M)
10233      DOUBLE PRECISION S
10234C
10235C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TRBAK1,
10236C     NUM. MATH. 11, 181-195(1968) BY MARTIN, REINSCH, AND WILKINSON.
10237C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971).
10238C
10239C     THIS SUBROUTINE FORMS THE EIGENVECTORS OF A REAL SYMMETRIC
10240C     MATRIX BY BACK TRANSFORMING THOSE OF THE CORRESPONDING
10241C     SYMMETRIC TRIDIAGONAL MATRIX DETERMINED BY  TRED1.
10242C
10243C     ON INPUT
10244C
10245C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
10246C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
10247C          DIMENSION STATEMENT.
10248C
10249C        N IS THE ORDER OF THE MATRIX.
10250C
10251C        A CONTAINS INFORMATION ABOUT THE ORTHOGONAL TRANS-
10252C          FORMATIONS USED IN THE REDUCTION BY  TRED1
10253C          IN ITS STRICT LOWER TRIANGLE.
10254C
10255C        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE TRIDIAGONAL
10256C          MATRIX IN ITS LAST N-1 POSITIONS.  E(1) IS ARBITRARY.
10257C
10258C        M IS THE NUMBER OF EIGENVECTORS TO BE BACK TRANSFORMED.
10259C
10260C        Z CONTAINS THE EIGENVECTORS TO BE BACK TRANSFORMED
10261C          IN ITS FIRST M COLUMNS.
10262C
10263C     ON OUTPUT
10264C
10265C        Z CONTAINS THE TRANSFORMED EIGENVECTORS
10266C          IN ITS FIRST M COLUMNS.
10267C
10268C     NOTE THAT TRBAK1 PRESERVES VECTOR EUCLIDEAN NORMS.
10269C
10270C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
10271C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
10272C
10273C     THIS VERSION DATED AUGUST 1983.
10274C
10275C     ------------------------------------------------------------------
10276C
10277      IF (M .EQ. 0) GO TO 200
10278      IF (N .EQ. 1) GO TO 200
10279C
10280      DO 140 I = 2, N
10281         L = I - 1
10282         IF (E(I) .EQ. 0.0D0) GO TO 140
10283C
10284         DO 130 J = 1, M
10285            S = 0.0D0
10286C
10287            DO 110 K = 1, L
10288  110       S = S + A(I,K) * Z(K,J)
10289C     .......... DIVISOR BELOW IS NEGATIVE OF H FORMED IN TRED1.
10290C                DOUBLE DIVISION AVOIDS POSSIBLE UNDERFLOW ..........
10291            S = (S / A(I,L)) / E(I)
10292C
10293            DO 120 K = 1, L
10294  120       Z(K,J) = Z(K,J) + S * A(I,K)
10295C
10296  130    CONTINUE
10297C
10298  140 CONTINUE
10299C
10300  200 RETURN
10301      END
10302      SUBROUTINE TRBAK3(NM,N,NV,A,M,Z)
10303C
10304      INTEGER I,J,K,L,M,N,IK,IZ,NM,NV
10305      DOUBLE PRECISION A(NV),Z(NM,M)
10306      DOUBLE PRECISION H,S
10307C
10308C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TRBAK3,
10309C     NUM. MATH. 11, 181-195(1968) BY MARTIN, REINSCH, AND WILKINSON.
10310C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971).
10311C
10312C     THIS SUBROUTINE FORMS THE EIGENVECTORS OF A REAL SYMMETRIC
10313C     MATRIX BY BACK TRANSFORMING THOSE OF THE CORRESPONDING
10314C     SYMMETRIC TRIDIAGONAL MATRIX DETERMINED BY  TRED3.
10315C
10316C     ON INPUT
10317C
10318C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
10319C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
10320C          DIMENSION STATEMENT.
10321C
10322C        N IS THE ORDER OF THE MATRIX.
10323C
10324C        NV MUST BE SET TO THE DIMENSION OF THE ARRAY PARAMETER A
10325C          AS DECLARED IN THE CALLING PROGRAM DIMENSION STATEMENT.
10326C
10327C        A CONTAINS INFORMATION ABOUT THE ORTHOGONAL TRANSFORMATIONS
10328C          USED IN THE REDUCTION BY  TRED3  IN ITS FIRST
10329C          N*(N+1)/2 POSITIONS.
10330C
10331C        M IS THE NUMBER OF EIGENVECTORS TO BE BACK TRANSFORMED.
10332C
10333C        Z CONTAINS THE EIGENVECTORS TO BE BACK TRANSFORMED
10334C          IN ITS FIRST M COLUMNS.
10335C
10336C     ON OUTPUT
10337C
10338C        Z CONTAINS THE TRANSFORMED EIGENVECTORS
10339C          IN ITS FIRST M COLUMNS.
10340C
10341C     NOTE THAT TRBAK3 PRESERVES VECTOR EUCLIDEAN NORMS.
10342C
10343C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
10344C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
10345C
10346C     THIS VERSION DATED AUGUST 1983.
10347C
10348C     ------------------------------------------------------------------
10349C
10350      IF (M .EQ. 0) GO TO 200
10351      IF (N .EQ. 1) GO TO 200
10352C
10353      DO 140 I = 2, N
10354         L = I - 1
10355         IZ = (I * L) / 2
10356         IK = IZ + I
10357         H = A(IK)
10358         IF (H .EQ. 0.0D0) GO TO 140
10359C
10360         DO 130 J = 1, M
10361            S = 0.0D0
10362            IK = IZ
10363C
10364            DO 110 K = 1, L
10365               IK = IK + 1
10366               S = S + A(IK) * Z(K,J)
10367  110       CONTINUE
10368C     .......... DOUBLE DIVISION AVOIDS POSSIBLE UNDERFLOW ..........
10369            S = (S / H) / H
10370            IK = IZ
10371C
10372            DO 120 K = 1, L
10373               IK = IK + 1
10374               Z(K,J) = Z(K,J) - S * A(IK)
10375  120       CONTINUE
10376C
10377  130    CONTINUE
10378C
10379  140 CONTINUE
10380C
10381  200 RETURN
10382      END
10383      SUBROUTINE TRED1(NM,N,A,D,E,E2)
10384C
10385      INTEGER I,J,K,L,N,II,NM,JP1
10386      DOUBLE PRECISION A(NM,N),D(N),E(N),E2(N)
10387      DOUBLE PRECISION F,G,H,SCALE
10388C
10389C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TRED1,
10390C     NUM. MATH. 11, 181-195(1968) BY MARTIN, REINSCH, AND WILKINSON.
10391C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971).
10392C
10393C     THIS SUBROUTINE REDUCES A REAL SYMMETRIC MATRIX
10394C     TO A SYMMETRIC TRIDIAGONAL MATRIX USING
10395C     ORTHOGONAL SIMILARITY TRANSFORMATIONS.
10396C
10397C     ON INPUT
10398C
10399C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
10400C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
10401C          DIMENSION STATEMENT.
10402C
10403C        N IS THE ORDER OF THE MATRIX.
10404C
10405C        A CONTAINS THE REAL SYMMETRIC INPUT MATRIX.  ONLY THE
10406C          LOWER TRIANGLE OF THE MATRIX NEED BE SUPPLIED.
10407C
10408C     ON OUTPUT
10409C
10410C        A CONTAINS INFORMATION ABOUT THE ORTHOGONAL TRANS-
10411C          FORMATIONS USED IN THE REDUCTION IN ITS STRICT LOWER
10412C          TRIANGLE.  THE FULL UPPER TRIANGLE OF A IS UNALTERED.
10413C
10414C        D CONTAINS THE DIAGONAL ELEMENTS OF THE TRIDIAGONAL MATRIX.
10415C
10416C        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE TRIDIAGONAL
10417C          MATRIX IN ITS LAST N-1 POSITIONS.  E(1) IS SET TO ZERO.
10418C
10419C        E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E.
10420C          E2 MAY COINCIDE WITH E IF THE SQUARES ARE NOT NEEDED.
10421C
10422C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
10423C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
10424C
10425C     THIS VERSION DATED AUGUST 1983.
10426C
10427C     ------------------------------------------------------------------
10428C
10429      DO 100 I = 1, N
10430         D(I) = A(N,I)
10431         A(N,I) = A(I,I)
10432  100 CONTINUE
10433C     .......... FOR I=N STEP -1 UNTIL 1 DO -- ..........
10434      DO 300 II = 1, N
10435         I = N + 1 - II
10436         L = I - 1
10437         H = 0.0D0
10438         SCALE = 0.0D0
10439         IF (L .LT. 1) GO TO 130
10440C     .......... SCALE ROW (ALGOL TOL THEN NOT NEEDED) ..........
10441         DO 120 K = 1, L
10442  120    SCALE = SCALE + DABS(D(K))
10443C
10444         IF (SCALE .NE. 0.0D0) GO TO 140
10445C
10446         DO 125 J = 1, L
10447            D(J) = A(L,J)
10448            A(L,J) = A(I,J)
10449            A(I,J) = 0.0D0
10450  125    CONTINUE
10451C
10452  130    E(I) = 0.0D0
10453         E2(I) = 0.0D0
10454         GO TO 300
10455C
10456  140    DO 150 K = 1, L
10457            D(K) = D(K) / SCALE
10458            H = H + D(K) * D(K)
10459  150    CONTINUE
10460C
10461         E2(I) = SCALE * SCALE * H
10462         F = D(L)
10463         G = -DSIGN(DSQRT(H),F)
10464         E(I) = SCALE * G
10465         H = H - F * G
10466         D(L) = F - G
10467         IF (L .EQ. 1) GO TO 285
10468C     .......... FORM A*U ..........
10469         DO 170 J = 1, L
10470  170    E(J) = 0.0D0
10471C
10472         DO 240 J = 1, L
10473            F = D(J)
10474            G = E(J) + A(J,J) * F
10475            JP1 = J + 1
10476            IF (L .LT. JP1) GO TO 220
10477C
10478            DO 200 K = JP1, L
10479               G = G + A(K,J) * D(K)
10480               E(K) = E(K) + A(K,J) * F
10481  200       CONTINUE
10482C
10483  220       E(J) = G
10484  240    CONTINUE
10485C     .......... FORM P ..........
10486         F = 0.0D0
10487C
10488         DO 245 J = 1, L
10489            E(J) = E(J) / H
10490            F = F + E(J) * D(J)
10491  245    CONTINUE
10492C
10493         H = F / (H + H)
10494C     .......... FORM Q ..........
10495         DO 250 J = 1, L
10496  250    E(J) = E(J) - H * D(J)
10497C     .......... FORM REDUCED A ..........
10498         DO 280 J = 1, L
10499            F = D(J)
10500            G = E(J)
10501C
10502            DO 260 K = J, L
10503  260       A(K,J) = A(K,J) - F * E(K) - G * D(K)
10504C
10505  280    CONTINUE
10506C
10507  285    DO 290 J = 1, L
10508            F = D(J)
10509            D(J) = A(L,J)
10510            A(L,J) = A(I,J)
10511            A(I,J) = F * SCALE
10512  290    CONTINUE
10513C
10514  300 CONTINUE
10515C
10516      RETURN
10517      END
10518      SUBROUTINE TRED2(NM,N,A,D,E,Z)
10519C
10520      INTEGER I,J,K,L,N,II,NM,JP1
10521      DOUBLE PRECISION A(NM,N),D(N),E(N),Z(NM,N)
10522      DOUBLE PRECISION F,G,H,HH,SCALE
10523C
10524C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TRED2,
10525C     NUM. MATH. 11, 181-195(1968) BY MARTIN, REINSCH, AND WILKINSON.
10526C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971).
10527C
10528C     THIS SUBROUTINE REDUCES A REAL SYMMETRIC MATRIX TO A
10529C     SYMMETRIC TRIDIAGONAL MATRIX USING AND ACCUMULATING
10530C     ORTHOGONAL SIMILARITY TRANSFORMATIONS.
10531C
10532C     ON INPUT
10533C
10534C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
10535C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
10536C          DIMENSION STATEMENT.
10537C
10538C        N IS THE ORDER OF THE MATRIX.
10539C
10540C        A CONTAINS THE REAL SYMMETRIC INPUT MATRIX.  ONLY THE
10541C          LOWER TRIANGLE OF THE MATRIX NEED BE SUPPLIED.
10542C
10543C     ON OUTPUT
10544C
10545C        D CONTAINS THE DIAGONAL ELEMENTS OF THE TRIDIAGONAL MATRIX.
10546C
10547C        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE TRIDIAGONAL
10548C          MATRIX IN ITS LAST N-1 POSITIONS.  E(1) IS SET TO ZERO.
10549C
10550C        Z CONTAINS THE ORTHOGONAL TRANSFORMATION MATRIX
10551C          PRODUCED IN THE REDUCTION.
10552C
10553C        A AND Z MAY COINCIDE.  IF DISTINCT, A IS UNALTERED.
10554C
10555C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
10556C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
10557C
10558C     THIS VERSION DATED AUGUST 1983.
10559C
10560C     ------------------------------------------------------------------
10561C
10562      DO 100 I = 1, N
10563C
10564         DO 80 J = I, N
10565   80    Z(J,I) = A(J,I)
10566C
10567         D(I) = A(N,I)
10568  100 CONTINUE
10569C
10570      IF (N .EQ. 1) GO TO 510
10571C     .......... FOR I=N STEP -1 UNTIL 2 DO -- ..........
10572      DO 300 II = 2, N
10573         I = N + 2 - II
10574         L = I - 1
10575         H = 0.0D0
10576         SCALE = 0.0D0
10577         IF (L .LT. 2) GO TO 130
10578C     .......... SCALE ROW (ALGOL TOL THEN NOT NEEDED) ..........
10579         DO 120 K = 1, L
10580  120    SCALE = SCALE + DABS(D(K))
10581C
10582         IF (SCALE .NE. 0.0D0) GO TO 140
10583  130    E(I) = D(L)
10584C
10585         DO 135 J = 1, L
10586            D(J) = Z(L,J)
10587            Z(I,J) = 0.0D0
10588            Z(J,I) = 0.0D0
10589  135    CONTINUE
10590C
10591         GO TO 290
10592C
10593  140    DO 150 K = 1, L
10594            D(K) = D(K) / SCALE
10595            H = H + D(K) * D(K)
10596  150    CONTINUE
10597C
10598         F = D(L)
10599         G = -DSIGN(DSQRT(H),F)
10600         E(I) = SCALE * G
10601         H = H - F * G
10602         D(L) = F - G
10603C     .......... FORM A*U ..........
10604         DO 170 J = 1, L
10605  170    E(J) = 0.0D0
10606C
10607         DO 240 J = 1, L
10608            F = D(J)
10609            Z(J,I) = F
10610            G = E(J) + Z(J,J) * F
10611            JP1 = J + 1
10612            IF (L .LT. JP1) GO TO 220
10613C
10614            DO 200 K = JP1, L
10615               G = G + Z(K,J) * D(K)
10616               E(K) = E(K) + Z(K,J) * F
10617  200       CONTINUE
10618C
10619  220       E(J) = G
10620  240    CONTINUE
10621C     .......... FORM P ..........
10622         F = 0.0D0
10623C
10624         DO 245 J = 1, L
10625            E(J) = E(J) / H
10626            F = F + E(J) * D(J)
10627  245    CONTINUE
10628C
10629         HH = F / (H + H)
10630C     .......... FORM Q ..........
10631         DO 250 J = 1, L
10632  250    E(J) = E(J) - HH * D(J)
10633C     .......... FORM REDUCED A ..........
10634         DO 280 J = 1, L
10635            F = D(J)
10636            G = E(J)
10637C
10638            DO 260 K = J, L
10639  260       Z(K,J) = Z(K,J) - F * E(K) - G * D(K)
10640C
10641            D(J) = Z(L,J)
10642            Z(I,J) = 0.0D0
10643  280    CONTINUE
10644C
10645  290    D(I) = H
10646  300 CONTINUE
10647C     .......... ACCUMULATION OF TRANSFORMATION MATRICES ..........
10648      DO 500 I = 2, N
10649         L = I - 1
10650         Z(N,L) = Z(L,L)
10651         Z(L,L) = 1.0D0
10652         H = D(I)
10653         IF (H .EQ. 0.0D0) GO TO 380
10654C
10655         DO 330 K = 1, L
10656  330    D(K) = Z(K,I) / H
10657C
10658         DO 360 J = 1, L
10659            G = 0.0D0
10660C
10661            DO 340 K = 1, L
10662  340       G = G + Z(K,I) * Z(K,J)
10663C
10664            DO 360 K = 1, L
10665               Z(K,J) = Z(K,J) - G * D(K)
10666  360    CONTINUE
10667C
10668  380    DO 400 K = 1, L
10669  400    Z(K,I) = 0.0D0
10670C
10671  500 CONTINUE
10672C
10673  510 DO 520 I = 1, N
10674         D(I) = Z(N,I)
10675         Z(N,I) = 0.0D0
10676  520 CONTINUE
10677C
10678      Z(N,N) = 1.0D0
10679      E(1) = 0.0D0
10680      RETURN
10681      END
10682      SUBROUTINE TRED3(N,NV,A,D,E,E2)
10683C
10684      INTEGER I,J,K,L,N,II,IZ,JK,NV,JM1
10685      DOUBLE PRECISION A(NV),D(N),E(N),E2(N)
10686      DOUBLE PRECISION F,G,H,HH,SCALE
10687C
10688C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TRED3,
10689C     NUM. MATH. 11, 181-195(1968) BY MARTIN, REINSCH, AND WILKINSON.
10690C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971).
10691C
10692C     THIS SUBROUTINE REDUCES A REAL SYMMETRIC MATRIX, STORED AS
10693C     A ONE-DIMENSIONAL ARRAY, TO A SYMMETRIC TRIDIAGONAL MATRIX
10694C     USING ORTHOGONAL SIMILARITY TRANSFORMATIONS.
10695C
10696C     ON INPUT
10697C
10698C        N IS THE ORDER OF THE MATRIX.
10699C
10700C        NV MUST BE SET TO THE DIMENSION OF THE ARRAY PARAMETER A
10701C          AS DECLARED IN THE CALLING PROGRAM DIMENSION STATEMENT.
10702C
10703C        A CONTAINS THE LOWER TRIANGLE OF THE REAL SYMMETRIC
10704C          INPUT MATRIX, STORED ROW-WISE AS A ONE-DIMENSIONAL
10705C          ARRAY, IN ITS FIRST N*(N+1)/2 POSITIONS.
10706C
10707C     ON OUTPUT
10708C
10709C        A CONTAINS INFORMATION ABOUT THE ORTHOGONAL
10710C          TRANSFORMATIONS USED IN THE REDUCTION.
10711C
10712C        D CONTAINS THE DIAGONAL ELEMENTS OF THE TRIDIAGONAL MATRIX.
10713C
10714C        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE TRIDIAGONAL
10715C          MATRIX IN ITS LAST N-1 POSITIONS.  E(1) IS SET TO ZERO.
10716C
10717C        E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E.
10718C          E2 MAY COINCIDE WITH E IF THE SQUARES ARE NOT NEEDED.
10719C
10720C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
10721C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
10722C
10723C     THIS VERSION DATED AUGUST 1983.
10724C
10725C     ------------------------------------------------------------------
10726C
10727C     .......... FOR I=N STEP -1 UNTIL 1 DO -- ..........
10728      DO 300 II = 1, N
10729         I = N + 1 - II
10730         L = I - 1
10731         IZ = (I * L) / 2
10732         H = 0.0D0
10733         SCALE = 0.0D0
10734         IF (L .LT. 1) GO TO 130
10735C     .......... SCALE ROW (ALGOL TOL THEN NOT NEEDED) ..........
10736         DO 120 K = 1, L
10737            IZ = IZ + 1
10738            D(K) = A(IZ)
10739            SCALE = SCALE + DABS(D(K))
10740  120    CONTINUE
10741C
10742         IF (SCALE .NE. 0.0D0) GO TO 140
10743  130    E(I) = 0.0D0
10744         E2(I) = 0.0D0
10745         GO TO 290
10746C
10747  140    DO 150 K = 1, L
10748            D(K) = D(K) / SCALE
10749            H = H + D(K) * D(K)
10750  150    CONTINUE
10751C
10752         E2(I) = SCALE * SCALE * H
10753         F = D(L)
10754         G = -DSIGN(DSQRT(H),F)
10755         E(I) = SCALE * G
10756         H = H - F * G
10757         D(L) = F - G
10758         A(IZ) = SCALE * D(L)
10759         IF (L .EQ. 1) GO TO 290
10760         JK = 1
10761C
10762         DO 240 J = 1, L
10763            F = D(J)
10764            G = 0.0D0
10765            JM1 = J - 1
10766            IF (JM1 .LT. 1) GO TO 220
10767C
10768            DO 200 K = 1, JM1
10769               G = G + A(JK) * D(K)
10770               E(K) = E(K) + A(JK) * F
10771               JK = JK + 1
10772  200       CONTINUE
10773C     
10774  220       E(J) = G + A(JK) * F
10775            JK = JK + 1
10776  240    CONTINUE
10777C     .......... FORM P ..........
10778         F = 0.0D0
10779C
10780         DO 245 J = 1, L
10781            E(J) = E(J) / H
10782            F = F + E(J) * D(J)
10783  245    CONTINUE
10784C
10785         HH = F / (H + H)
10786C     .......... FORM Q ..........
10787         DO 250 J = 1, L
10788  250    E(J) = E(J) - HH * D(J)
10789C
10790         JK = 1
10791C     .......... FORM REDUCED A ..........
10792         DO 280 J = 1, L
10793            F = D(J)
10794            G = E(J)
10795C
10796            DO 260 K = 1, J
10797               A(JK) = A(JK) - F * E(K) - G * D(K)
10798               JK = JK + 1
10799  260       CONTINUE
10800C
10801  280    CONTINUE
10802C
10803  290    D(I) = A(IZ+1)
10804         A(IZ+1) = SCALE * DSQRT(H)
10805  300 CONTINUE
10806C
10807      RETURN
10808      END
10809      SUBROUTINE TRIDIB(N,EPS1,D,E,E2,LB,UB,M11,M,W,IND,IERR,RV4,RV5)
10810C
10811      INTEGER I,J,K,L,M,N,P,Q,R,S,II,M1,M2,M11,M22,TAG,IERR,ISTURM
10812      DOUBLE PRECISION D(N),E(N),E2(N),W(M),RV4(N),RV5(N)
10813      DOUBLE PRECISION U,V,LB,T1,T2,UB,XU,X0,X1,EPS1,TST1,TST2,EPSLON
10814      INTEGER IND(M)
10815C
10816C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE BISECT,
10817C     NUM. MATH. 9, 386-393(1967) BY BARTH, MARTIN, AND WILKINSON.
10818C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 249-256(1971).
10819C
10820C     THIS SUBROUTINE FINDS THOSE EIGENVALUES OF A TRIDIAGONAL
10821C     SYMMETRIC MATRIX BETWEEN SPECIFIED BOUNDARY INDICES,
10822C     USING BISECTION.
10823C
10824C     ON INPUT
10825C
10826C        N IS THE ORDER OF THE MATRIX.
10827C
10828C        EPS1 IS AN ABSOLUTE ERROR TOLERANCE FOR THE COMPUTED
10829C          EIGENVALUES.  IF THE INPUT EPS1 IS NON-POSITIVE,
10830C          IT IS RESET FOR EACH SUBMATRIX TO A DEFAULT VALUE,
10831C          NAMELY, MINUS THE PRODUCT OF THE RELATIVE MACHINE
10832C          PRECISION AND THE 1-NORM OF THE SUBMATRIX.
10833C
10834C        D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX.
10835C
10836C        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE INPUT MATRIX
10837C          IN ITS LAST N-1 POSITIONS.  E(1) IS ARBITRARY.
10838C
10839C        E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E.
10840C          E2(1) IS ARBITRARY.
10841C
10842C        M11 SPECIFIES THE LOWER BOUNDARY INDEX FOR THE DESIRED
10843C          EIGENVALUES.
10844C
10845C        M SPECIFIES THE NUMBER OF EIGENVALUES DESIRED.  THE UPPER
10846C          BOUNDARY INDEX M22 IS THEN OBTAINED AS M22=M11+M-1.
10847C
10848C     ON OUTPUT
10849C
10850C        EPS1 IS UNALTERED UNLESS IT HAS BEEN RESET TO ITS
10851C          (LAST) DEFAULT VALUE.
10852C
10853C        D AND E ARE UNALTERED.
10854C
10855C        ELEMENTS OF E2, CORRESPONDING TO ELEMENTS OF E REGARDED
10856C          AS NEGLIGIBLE, HAVE BEEN REPLACED BY ZERO CAUSING THE
10857C          MATRIX TO SPLIT INTO A DIRECT SUM OF SUBMATRICES.
10858C          E2(1) IS ALSO SET TO ZERO.
10859C
10860C        LB AND UB DEFINE AN INTERVAL CONTAINING EXACTLY THE DESIRED
10861C          EIGENVALUES.
10862C
10863C        W CONTAINS, IN ITS FIRST M POSITIONS, THE EIGENVALUES
10864C          BETWEEN INDICES M11 AND M22 IN ASCENDING ORDER.
10865C
10866C        IND CONTAINS IN ITS FIRST M POSITIONS THE SUBMATRIX INDICES
10867C          ASSOCIATED WITH THE CORRESPONDING EIGENVALUES IN W --
10868C          1 FOR EIGENVALUES BELONGING TO THE FIRST SUBMATRIX FROM
10869C          THE TOP, 2 FOR THOSE BELONGING TO THE SECOND SUBMATRIX, ETC..
10870C
10871C        IERR IS SET TO
10872C          ZERO       FOR NORMAL RETURN,
10873C          3*N+1      IF MULTIPLE EIGENVALUES AT INDEX M11 MAKE
10874C                     UNIQUE SELECTION IMPOSSIBLE,
10875C          3*N+2      IF MULTIPLE EIGENVALUES AT INDEX M22 MAKE
10876C                     UNIQUE SELECTION IMPOSSIBLE.
10877C
10878C        RV4 AND RV5 ARE TEMPORARY STORAGE ARRAYS.
10879C
10880C     NOTE THAT SUBROUTINE TQL1, IMTQL1, OR TQLRAT IS GENERALLY FASTER
10881C     THAN TRIDIB, IF MORE THAN N/4 EIGENVALUES ARE TO BE FOUND.
10882C
10883C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
10884C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
10885C
10886C     THIS VERSION DATED AUGUST 1983.
10887C
10888C     ------------------------------------------------------------------
10889C
10890      IERR = 0
10891      TAG = 0
10892      XU = D(1)
10893      X0 = D(1)
10894      U = 0.0D0
10895C     .......... LOOK FOR SMALL SUB-DIAGONAL ENTRIES AND DETERMINE AN
10896C                INTERVAL CONTAINING ALL THE EIGENVALUES ..........
10897      DO 40 I = 1, N
10898         X1 = U
10899         U = 0.0D0
10900         IF (I .NE. N) U = DABS(E(I+1))
10901         XU = DMIN1(D(I)-(X1+U),XU)
10902         X0 = DMAX1(D(I)+(X1+U),X0)
10903         IF (I .EQ. 1) GO TO 20
10904         TST1 = DABS(D(I)) + DABS(D(I-1))
10905         TST2 = TST1 + DABS(E(I))
10906         IF (TST2 .GT. TST1) GO TO 40
10907   20    E2(I) = 0.0D0
10908   40 CONTINUE
10909C
10910      X1 = N
10911      X1 = X1 * EPSLON(DMAX1(DABS(XU),DABS(X0)))
10912      XU = XU - X1
10913      T1 = XU
10914      X0 = X0 + X1
10915      T2 = X0
10916C     .......... DETERMINE AN INTERVAL CONTAINING EXACTLY
10917C                THE DESIRED EIGENVALUES ..........
10918      P = 1
10919      Q = N
10920      M1 = M11 - 1
10921      IF (M1 .EQ. 0) GO TO 75
10922      ISTURM = 1
10923   50 V = X1
10924      X1 = XU + (X0 - XU) * 0.5D0
10925      IF (X1 .EQ. V) GO TO 980
10926      GO TO 320
10927   60 IF (S - M1) 65, 73, 70
10928   65 XU = X1
10929      GO TO 50
10930   70 X0 = X1
10931      GO TO 50
10932   73 XU = X1
10933      T1 = X1
10934   75 M22 = M1 + M
10935      IF (M22 .EQ. N) GO TO 90
10936      X0 = T2
10937      ISTURM = 2
10938      GO TO 50
10939   80 IF (S - M22) 65, 85, 70
10940   85 T2 = X1
10941   90 Q = 0
10942      R = 0
10943C     .......... ESTABLISH AND PROCESS NEXT SUBMATRIX, REFINING
10944C                INTERVAL BY THE GERSCHGORIN BOUNDS ..........
10945  100 IF (R .EQ. M) GO TO 1001
10946      TAG = TAG + 1
10947      P = Q + 1
10948      XU = D(P)
10949      X0 = D(P)
10950      U = 0.0D0
10951C
10952      DO 120 Q = P, N
10953         X1 = U
10954         U = 0.0D0
10955         V = 0.0D0
10956         IF (Q .EQ. N) GO TO 110
10957         U = DABS(E(Q+1))
10958         V = E2(Q+1)
10959  110    XU = DMIN1(D(Q)-(X1+U),XU)
10960         X0 = DMAX1(D(Q)+(X1+U),X0)
10961         IF (V .EQ. 0.0D0) GO TO 140
10962  120 CONTINUE
10963C
10964  140 X1 = EPSLON(DMAX1(DABS(XU),DABS(X0)))
10965      IF (EPS1 .LE. 0.0D0) EPS1 = -X1
10966      IF (P .NE. Q) GO TO 180
10967C     .......... CHECK FOR ISOLATED ROOT WITHIN INTERVAL ..........
10968      IF (T1 .GT. D(P) .OR. D(P) .GE. T2) GO TO 940
10969      M1 = P
10970      M2 = P
10971      RV5(P) = D(P)
10972      GO TO 900
10973  180 X1 = X1 * (Q - P + 1)
10974      LB = DMAX1(T1,XU-X1)
10975      UB = DMIN1(T2,X0+X1)
10976      X1 = LB
10977      ISTURM = 3
10978      GO TO 320
10979  200 M1 = S + 1
10980      X1 = UB
10981      ISTURM = 4
10982      GO TO 320
10983  220 M2 = S
10984      IF (M1 .GT. M2) GO TO 940
10985C     .......... FIND ROOTS BY BISECTION ..........
10986      X0 = UB
10987      ISTURM = 5
10988C
10989      DO 240 I = M1, M2
10990         RV5(I) = UB
10991         RV4(I) = LB
10992  240 CONTINUE
10993C     .......... LOOP FOR K-TH EIGENVALUE
10994C                FOR K=M2 STEP -1 UNTIL M1 DO --
10995C                (-DO- NOT USED TO LEGALIZE -COMPUTED GO TO-) ..........
10996      K = M2
10997  250    XU = LB
10998C     .......... FOR I=K STEP -1 UNTIL M1 DO -- ..........
10999         DO 260 II = M1, K
11000            I = M1 + K - II
11001            IF (XU .GE. RV4(I)) GO TO 260
11002            XU = RV4(I)
11003            GO TO 280
11004  260    CONTINUE
11005C
11006  280    IF (X0 .GT. RV5(K)) X0 = RV5(K)
11007C     .......... NEXT BISECTION STEP ..........
11008  300    X1 = (XU + X0) * 0.5D0
11009         IF ((X0 - XU) .LE. DABS(EPS1)) GO TO 420
11010         TST1 = 2.0D0 * (DABS(XU) + DABS(X0))
11011         TST2 = TST1 + (X0 - XU)
11012         IF (TST2 .EQ. TST1) GO TO 420
11013C     .......... IN-LINE PROCEDURE FOR STURM SEQUENCE ..........
11014  320    S = P - 1
11015         U = 1.0D0
11016C
11017         DO 340 I = P, Q
11018            IF (U .NE. 0.0D0) GO TO 325
11019            V = DABS(E(I)) / EPSLON(1.0D0)
11020            IF (E2(I) .EQ. 0.0D0) V = 0.0D0
11021            GO TO 330
11022  325       V = E2(I) / U
11023  330       U = D(I) - X1 - V
11024            IF (U .LT. 0.0D0) S = S + 1
11025  340    CONTINUE
11026C
11027         GO TO (60,80,200,220,360), ISTURM
11028C     .......... REFINE INTERVALS ..........
11029  360    IF (S .GE. K) GO TO 400
11030         XU = X1
11031         IF (S .GE. M1) GO TO 380
11032         RV4(M1) = X1
11033         GO TO 300
11034  380    RV4(S+1) = X1
11035         IF (RV5(S) .GT. X1) RV5(S) = X1
11036         GO TO 300
11037  400    X0 = X1
11038         GO TO 300
11039C     .......... K-TH EIGENVALUE FOUND ..........
11040  420    RV5(K) = X1
11041      K = K - 1
11042      IF (K .GE. M1) GO TO 250
11043C     .......... ORDER EIGENVALUES TAGGED WITH THEIR
11044C                SUBMATRIX ASSOCIATIONS ..........
11045  900 S = R
11046      R = R + M2 - M1 + 1
11047      J = 1
11048      K = M1
11049C
11050      DO 920 L = 1, R
11051         IF (J .GT. S) GO TO 910
11052         IF (K .GT. M2) GO TO 940
11053         IF (RV5(K) .GE. W(L)) GO TO 915
11054C
11055         DO 905 II = J, S
11056            I = L + S - II
11057            W(I+1) = W(I)
11058            IND(I+1) = IND(I)
11059  905    CONTINUE
11060C
11061  910    W(L) = RV5(K)
11062         IND(L) = TAG
11063         K = K + 1
11064         GO TO 920
11065  915    J = J + 1
11066  920 CONTINUE
11067C
11068  940 IF (Q .LT. N) GO TO 100
11069      GO TO 1001
11070C     .......... SET ERROR -- INTERVAL CANNOT BE FOUND CONTAINING
11071C                EXACTLY THE DESIRED EIGENVALUES ..........
11072  980 IERR = 3 * N + ISTURM
11073 1001 LB = T1
11074      UB = T2
11075      RETURN
11076      END
11077      SUBROUTINE TSTURM(NM,N,EPS1,D,E,E2,LB,UB,MM,M,W,Z,
11078     X                  IERR,RV1,RV2,RV3,RV4,RV5,RV6)
11079C
11080      INTEGER I,J,K,M,N,P,Q,R,S,II,IP,JJ,MM,M1,M2,NM,ITS,
11081     X        IERR,GROUP,ISTURM
11082      DOUBLE PRECISION D(N),E(N),E2(N),W(MM),Z(NM,MM),
11083     X       RV1(N),RV2(N),RV3(N),RV4(N),RV5(N),RV6(N)
11084      DOUBLE PRECISION U,V,LB,T1,T2,UB,UK,XU,X0,X1,EPS1,EPS2,EPS3,EPS4,
11085     X       NORM,TST1,TST2,EPSLON,PYTHAG
11086C
11087C     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TRISTURM
11088C     BY PETERS AND WILKINSON.
11089C     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 418-439(1971).
11090C
11091C     THIS SUBROUTINE FINDS THOSE EIGENVALUES OF A TRIDIAGONAL
11092C     SYMMETRIC MATRIX WHICH LIE IN A SPECIFIED INTERVAL AND THEIR
11093C     ASSOCIATED EIGENVECTORS, USING BISECTION AND INVERSE ITERATION.
11094C
11095C     ON INPUT
11096C
11097C        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL
11098C          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM
11099C          DIMENSION STATEMENT.
11100C
11101C        N IS THE ORDER OF THE MATRIX.
11102C
11103C        EPS1 IS AN ABSOLUTE ERROR TOLERANCE FOR THE COMPUTED
11104C          EIGENVALUES.  IT SHOULD BE CHOSEN COMMENSURATE WITH
11105C          RELATIVE PERTURBATIONS IN THE MATRIX ELEMENTS OF THE
11106C          ORDER OF THE RELATIVE MACHINE PRECISION.  IF THE
11107C          INPUT EPS1 IS NON-POSITIVE, IT IS RESET FOR EACH
11108C          SUBMATRIX TO A DEFAULT VALUE, NAMELY, MINUS THE
11109C          PRODUCT OF THE RELATIVE MACHINE PRECISION AND THE
11110C          1-NORM OF THE SUBMATRIX.
11111C
11112C        D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX.
11113C
11114C        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE INPUT MATRIX
11115C          IN ITS LAST N-1 POSITIONS.  E(1) IS ARBITRARY.
11116C
11117C        E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E.
11118C          E2(1) IS ARBITRARY.
11119C
11120C        LB AND UB DEFINE THE INTERVAL TO BE SEARCHED FOR EIGENVALUES.
11121C          IF LB IS NOT LESS THAN UB, NO EIGENVALUES WILL BE FOUND.
11122C
11123C        MM SHOULD BE SET TO AN UPPER BOUND FOR THE NUMBER OF
11124C          EIGENVALUES IN THE INTERVAL.  WARNING. IF MORE THAN
11125C          MM EIGENVALUES ARE DETERMINED TO LIE IN THE INTERVAL,
11126C          AN ERROR RETURN IS MADE WITH NO VALUES OR VECTORS FOUND.
11127C
11128C     ON OUTPUT
11129C
11130C        EPS1 IS UNALTERED UNLESS IT HAS BEEN RESET TO ITS
11131C          (LAST) DEFAULT VALUE.
11132C
11133C        D AND E ARE UNALTERED.
11134C
11135C        ELEMENTS OF E2, CORRESPONDING TO ELEMENTS OF E REGARDED
11136C          AS NEGLIGIBLE, HAVE BEEN REPLACED BY ZERO CAUSING THE
11137C          MATRIX TO SPLIT INTO A DIRECT SUM OF SUBMATRICES.
11138C          E2(1) IS ALSO SET TO ZERO.
11139C
11140C        M IS THE NUMBER OF EIGENVALUES DETERMINED TO LIE IN (LB,UB).
11141C
11142C        W CONTAINS THE M EIGENVALUES IN ASCENDING ORDER IF THE MATRIX
11143C          DOES NOT SPLIT.  IF THE MATRIX SPLITS, THE EIGENVALUES ARE
11144C          IN ASCENDING ORDER FOR EACH SUBMATRIX.  IF A VECTOR ERROR
11145C          EXIT IS MADE, W CONTAINS THOSE VALUES ALREADY FOUND.
11146C
11147C        Z CONTAINS THE ASSOCIATED SET OF ORTHONORMAL EIGENVECTORS.
11148C          IF AN ERROR EXIT IS MADE, Z CONTAINS THOSE VECTORS
11149C          ALREADY FOUND.
11150C
11151C        IERR IS SET TO
11152C          ZERO       FOR NORMAL RETURN,
11153C          3*N+1      IF M EXCEEDS MM.
11154C          4*N+R      IF THE EIGENVECTOR CORRESPONDING TO THE R-TH
11155C                     EIGENVALUE FAILS TO CONVERGE IN 5 ITERATIONS.
11156C
11157C        RV1, RV2, RV3, RV4, RV5, AND RV6 ARE TEMPORARY STORAGE ARRAYS.
11158C
11159C     THE ALGOL PROCEDURE STURMCNT CONTAINED IN TRISTURM
11160C     APPEARS IN TSTURM IN-LINE.
11161C
11162C     CALLS PYTHAG FOR  DSQRT(A*A + B*B) .
11163C
11164C     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,
11165C     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY
11166C
11167C     THIS VERSION DATED AUGUST 1983.
11168C
11169C     ------------------------------------------------------------------
11170C
11171      IERR = 0
11172      T1 = LB
11173      T2 = UB
11174C     .......... LOOK FOR SMALL SUB-DIAGONAL ENTRIES ..........
11175      DO 40 I = 1, N
11176         IF (I .EQ. 1) GO TO 20
11177         TST1 = DABS(D(I)) + DABS(D(I-1))
11178         TST2 = TST1 + DABS(E(I))
11179         IF (TST2 .GT. TST1) GO TO 40
11180   20    E2(I) = 0.0D0
11181   40 CONTINUE
11182C     .......... DETERMINE THE NUMBER OF EIGENVALUES
11183C                IN THE INTERVAL ..........
11184      P = 1
11185      Q = N
11186      X1 = UB
11187      ISTURM = 1
11188      GO TO 320
11189   60 M = S
11190      X1 = LB
11191      ISTURM = 2
11192      GO TO 320
11193   80 M = M - S
11194      IF (M .GT. MM) GO TO 980
11195      Q = 0
11196      R = 0
11197C     .......... ESTABLISH AND PROCESS NEXT SUBMATRIX, REFINING
11198C                INTERVAL BY THE GERSCHGORIN BOUNDS ..........
11199  100 IF (R .EQ. M) GO TO 1001
11200      P = Q + 1
11201      XU = D(P)
11202      X0 = D(P)
11203      U = 0.0D0
11204C
11205      DO 120 Q = P, N
11206         X1 = U
11207         U = 0.0D0
11208         V = 0.0D0
11209         IF (Q .EQ. N) GO TO 110
11210         U = DABS(E(Q+1))
11211         V = E2(Q+1)
11212  110    XU = DMIN1(D(Q)-(X1+U),XU)
11213         X0 = DMAX1(D(Q)+(X1+U),X0)
11214         IF (V .EQ. 0.0D0) GO TO 140
11215  120 CONTINUE
11216C
11217  140 X1 = EPSLON(DMAX1(DABS(XU),DABS(X0)))
11218      IF (EPS1 .LE. 0.0D0) EPS1 = -X1
11219      IF (P .NE. Q) GO TO 180
11220C     .......... CHECK FOR ISOLATED ROOT WITHIN INTERVAL ..........
11221      IF (T1 .GT. D(P) .OR. D(P) .GE. T2) GO TO 940
11222      R = R + 1
11223C
11224      DO 160 I = 1, N
11225  160 Z(I,R) = 0.0D0
11226C
11227      W(R) = D(P)
11228      Z(P,R) = 1.0D0
11229      GO TO 940
11230  180 U = Q-P+1
11231      X1 = U * X1
11232      LB = DMAX1(T1,XU-X1)
11233      UB = DMIN1(T2,X0+X1)
11234      X1 = LB
11235      ISTURM = 3
11236      GO TO 320
11237  200 M1 = S + 1
11238      X1 = UB
11239      ISTURM = 4
11240      GO TO 320
11241  220 M2 = S
11242      IF (M1 .GT. M2) GO TO 940
11243C     .......... FIND ROOTS BY BISECTION ..........
11244      X0 = UB
11245      ISTURM = 5
11246C
11247      DO 240 I = M1, M2
11248         RV5(I) = UB
11249         RV4(I) = LB
11250  240 CONTINUE
11251C     .......... LOOP FOR K-TH EIGENVALUE
11252C                FOR K=M2 STEP -1 UNTIL M1 DO --
11253C                (-DO- NOT USED TO LEGALIZE -COMPUTED GO TO-) ..........
11254      K = M2
11255  250    XU = LB
11256C     .......... FOR I=K STEP -1 UNTIL M1 DO -- ..........
11257         DO 260 II = M1, K
11258            I = M1 + K - II
11259            IF (XU .GE. RV4(I)) GO TO 260
11260            XU = RV4(I)
11261            GO TO 280
11262  260    CONTINUE
11263C
11264  280    IF (X0 .GT. RV5(K)) X0 = RV5(K)
11265C     .......... NEXT BISECTION STEP ..........
11266  300    X1 = (XU + X0) * 0.5D0
11267         IF ((X0 - XU) .LE. DABS(EPS1)) GO TO 420
11268         TST1 = 2.0D0 * (DABS(XU) + DABS(X0))
11269         TST2 = TST1 + (X0 - XU)
11270         IF (TST2 .EQ. TST1) GO TO 420
11271C     .......... IN-LINE PROCEDURE FOR STURM SEQUENCE ..........
11272  320    S = P - 1
11273         U = 1.0D0
11274C
11275         DO 340 I = P, Q
11276            IF (U .NE. 0.0D0) GO TO 325
11277            V = DABS(E(I)) / EPSLON(1.0D0)
11278            IF (E2(I) .EQ. 0.0D0) V = 0.0D0
11279            GO TO 330
11280  325       V = E2(I) / U
11281  330       U = D(I) - X1 - V
11282            IF (U .LT. 0.0D0) S = S + 1
11283  340    CONTINUE
11284C
11285         GO TO (60,80,200,220,360), ISTURM
11286C     .......... REFINE INTERVALS ..........
11287  360    IF (S .GE. K) GO TO 400
11288         XU = X1
11289         IF (S .GE. M1) GO TO 380
11290         RV4(M1) = X1
11291         GO TO 300
11292  380    RV4(S+1) = X1
11293         IF (RV5(S) .GT. X1) RV5(S) = X1
11294         GO TO 300
11295  400    X0 = X1
11296         GO TO 300
11297C     .......... K-TH EIGENVALUE FOUND ..........
11298  420    RV5(K) = X1
11299      K = K - 1
11300      IF (K .GE. M1) GO TO 250
11301C     .......... FIND VECTORS BY INVERSE ITERATION ..........
11302      NORM = DABS(D(P))
11303      IP = P + 1
11304C
11305      DO 500 I = IP, Q
11306  500 NORM = DMAX1(NORM, DABS(D(I)) + DABS(E(I)))
11307C     .......... EPS2 IS THE CRITERION FOR GROUPING,
11308C                EPS3 REPLACES ZERO PIVOTS AND EQUAL
11309C                ROOTS ARE MODIFIED BY EPS3,
11310C                EPS4 IS TAKEN VERY SMALL TO AVOID OVERFLOW ..........
11311      EPS2 = 1.0D-3 * NORM
11312      EPS3 = EPSLON(NORM)
11313      UK = Q - P + 1
11314      EPS4 = UK * EPS3
11315      UK = EPS4 / DSQRT(UK)
11316      GROUP = 0
11317      S = P
11318C
11319      DO 920 K = M1, M2
11320         R = R + 1
11321         ITS = 1
11322         W(R) = RV5(K)
11323         X1 = RV5(K)
11324C     .......... LOOK FOR CLOSE OR COINCIDENT ROOTS ..........
11325         IF (K .EQ. M1) GO TO 520
11326         IF (X1 - X0 .GE. EPS2) GROUP = -1
11327         GROUP = GROUP + 1
11328         IF (X1 .LE. X0) X1 = X0 + EPS3
11329C     .......... ELIMINATION WITH INTERCHANGES AND
11330C                INITIALIZATION OF VECTOR ..........
11331  520    V = 0.0D0
11332C
11333         DO 580 I = P, Q
11334            RV6(I) = UK
11335            IF (I .EQ. P) GO TO 560
11336            IF (DABS(E(I)) .LT. DABS(U)) GO TO 540
11337            XU = U / E(I)
11338            RV4(I) = XU
11339            RV1(I-1) = E(I)
11340            RV2(I-1) = D(I) - X1
11341            RV3(I-1) = 0.0D0
11342            IF (I .NE. Q) RV3(I-1) = E(I+1)
11343            U = V - XU * RV2(I-1)
11344            V = -XU * RV3(I-1)
11345            GO TO 580
11346  540       XU = E(I) / U
11347            RV4(I) = XU
11348            RV1(I-1) = U
11349            RV2(I-1) = V
11350            RV3(I-1) = 0.0D0
11351  560       U = D(I) - X1 - XU * V
11352            IF (I .NE. Q) V = E(I+1)
11353  580    CONTINUE
11354C
11355         IF (U .EQ. 0.0D0) U = EPS3
11356         RV1(Q) = U
11357         RV2(Q) = 0.0D0
11358         RV3(Q) = 0.0D0
11359C     .......... BACK SUBSTITUTION
11360C                FOR I=Q STEP -1 UNTIL P DO -- ..........
11361  600    DO 620 II = P, Q
11362            I = P + Q - II
11363            RV6(I) = (RV6(I) - U * RV2(I) - V * RV3(I)) / RV1(I)
11364            V = U
11365            U = RV6(I)
11366  620    CONTINUE
11367C     .......... ORTHOGONALIZE WITH RESPECT TO PREVIOUS
11368C                MEMBERS OF GROUP ..........
11369         IF (GROUP .EQ. 0) GO TO 700
11370C
11371         DO 680 JJ = 1, GROUP
11372            J = R - GROUP - 1 + JJ
11373            XU = 0.0D0
11374C
11375            DO 640 I = P, Q
11376  640       XU = XU + RV6(I) * Z(I,J)
11377C
11378            DO 660 I = P, Q
11379  660       RV6(I) = RV6(I) - XU * Z(I,J)
11380C
11381  680    CONTINUE
11382C
11383  700    NORM = 0.0D0
11384C
11385         DO 720 I = P, Q
11386  720    NORM = NORM + DABS(RV6(I))
11387C
11388         IF (NORM .GE. 1.0D0) GO TO 840
11389C     .......... FORWARD SUBSTITUTION ..........
11390         IF (ITS .EQ. 5) GO TO 960
11391         IF (NORM .NE. 0.0D0) GO TO 740
11392         RV6(S) = EPS4
11393         S = S + 1
11394         IF (S .GT. Q) S = P
11395         GO TO 780
11396  740    XU = EPS4 / NORM
11397C
11398         DO 760 I = P, Q
11399  760    RV6(I) = RV6(I) * XU
11400C     .......... ELIMINATION OPERATIONS ON NEXT VECTOR
11401C                ITERATE ..........
11402  780    DO 820 I = IP, Q
11403            U = RV6(I)
11404C     .......... IF RV1(I-1) .EQ. E(I), A ROW INTERCHANGE
11405C                WAS PERFORMED EARLIER IN THE
11406C                TRIANGULARIZATION PROCESS ..........
11407            IF (RV1(I-1) .NE. E(I)) GO TO 800
11408            U = RV6(I-1)
11409            RV6(I-1) = RV6(I)
11410  800       RV6(I) = U - RV4(I) * RV6(I-1)
11411  820    CONTINUE
11412C
11413         ITS = ITS + 1
11414         GO TO 600
11415C     .......... NORMALIZE SO THAT SUM OF SQUARES IS
11416C                1 AND EXPAND TO FULL ORDER ..........
11417  840    U = 0.0D0
11418C
11419         DO 860 I = P, Q
11420  860    U = PYTHAG(U,RV6(I))
11421C
11422         XU = 1.0D0 / U
11423C
11424         DO 880 I = 1, N
11425  880    Z(I,R) = 0.0D0
11426C
11427         DO 900 I = P, Q
11428  900    Z(I,R) = RV6(I) * XU
11429C
11430         X0 = X1
11431  920 CONTINUE
11432C
11433  940 IF (Q .LT. N) GO TO 100
11434      GO TO 1001
11435C     .......... SET ERROR -- NON-CONVERGED EIGENVECTOR ..........
11436  960 IERR = 4 * N + R
11437      GO TO 1001
11438C     .......... SET ERROR -- UNDERESTIMATE OF NUMBER OF
11439C                EIGENVALUES IN INTERVAL ..........
11440  980 IERR = 3 * N + 1
11441 1001 LB = T1
11442      UB = T2
11443      RETURN
11444      END
Note: See TracBrowser for help on using the repository browser.