Rev 7002 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
SUBROUTINE BALANC(NM,N,A,LOW,IGH,SCALE)CINTEGER I,J,K,L,M,N,JJ,NM,IGH,LOW,IEXCDOUBLE PRECISION A(NM,N),SCALE(N)DOUBLE PRECISION C,F,G,R,S,B2,RADIXLOGICAL NOCONVCC THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE BALANCE,C NUM. MATH. 13, 293-304(1969) BY PARLETT AND REINSCH.C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 315-326(1971).CC THIS SUBROUTINE BALANCES A REAL MATRIX AND ISOLATESC EIGENVALUES WHENEVER POSSIBLE.CC ON INPUTCC NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONALC ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAMC DIMENSION STATEMENT.CC N IS THE ORDER OF THE MATRIX.CC A CONTAINS THE INPUT MATRIX TO BE BALANCED.CC ON OUTPUTCC A CONTAINS THE BALANCED MATRIX.CC LOW AND IGH ARE TWO INTEGERS SUCH THAT A(I,J)C IS EQUAL TO ZERO IFC (1) I IS GREATER THAN J ANDC (2) J=1,...,LOW-1 OR I=IGH+1,...,N.CC SCALE CONTAINS INFORMATION DETERMINING THEC PERMUTATIONS AND SCALING FACTORS USED.CC SUPPOSE THAT THE PRINCIPAL SUBMATRIX IN ROWS LOW THROUGH IGHC HAS BEEN BALANCED, THAT P(J) DENOTES THE INDEX INTERCHANGEDC WITH J DURING THE PERMUTATION STEP, AND THAT THE ELEMENTSC OF THE DIAGONAL MATRIX USED ARE DENOTED BY D(I,J). THENC SCALE(J) = P(J), FOR J = 1,...,LOW-1C = D(J,J), J = LOW,...,IGHC = P(J) J = IGH+1,...,N.C THE ORDER IN WHICH THE INTERCHANGES ARE MADE IS N TO IGH+1,C THEN 1 TO LOW-1.CC NOTE THAT 1 IS RETURNED FOR IGH IF IGH IS ZERO FORMALLY.CC THE ALGOL PROCEDURE EXC CONTAINED IN BALANCE APPEARS INC BALANC IN LINE. (NOTE THAT THE ALGOL ROLES OF IDENTIFIERSC K,L HAVE BEEN REVERSED.)CC QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,C MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORYCC THIS VERSION DATED AUGUST 1983.CC ------------------------------------------------------------------CRADIX = 16.0D0CB2 = RADIX * RADIXK = 1L = NGO TO 100C .......... IN-LINE PROCEDURE FOR ROW ANDC COLUMN EXCHANGE ..........20 SCALE(M) = JIF (J .EQ. M) GO TO 50CDO 30 I = 1, LF = A(I,J)A(I,J) = A(I,M)A(I,M) = F30 CONTINUECDO 40 I = K, NF = A(J,I)A(J,I) = A(M,I)A(M,I) = F40 CONTINUEC50 GO TO (80,130), IEXCC .......... SEARCH FOR ROWS ISOLATING AN EIGENVALUEC AND PUSH THEM DOWN ..........80 IF (L .EQ. 1) GO TO 280L = L - 1C .......... FOR J=L STEP -1 UNTIL 1 DO -- ..........100 DO 120 JJ = 1, LJ = L + 1 - JJCDO 110 I = 1, LIF (I .EQ. J) GO TO 110IF (A(J,I) .NE. 0.0D0) GO TO 120110 CONTINUECM = LIEXC = 1GO TO 20120 CONTINUECGO TO 140C .......... SEARCH FOR COLUMNS ISOLATING AN EIGENVALUEC AND PUSH THEM LEFT ..........130 K = K + 1C140 DO 170 J = K, LCDO 150 I = K, LIF (I .EQ. J) GO TO 150IF (A(I,J) .NE. 0.0D0) GO TO 170150 CONTINUECM = KIEXC = 2GO TO 20170 CONTINUEC .......... NOW BALANCE THE SUBMATRIX IN ROWS K TO L ..........DO 180 I = K, L180 SCALE(I) = 1.0D0C .......... ITERATIVE LOOP FOR NORM REDUCTION ..........190 NOCONV = .FALSE.CDO 270 I = K, LC = 0.0D0R = 0.0D0CDO 200 J = K, LIF (J .EQ. I) GO TO 200C = C + DABS(A(J,I))R = R + DABS(A(I,J))200 CONTINUEC .......... GUARD AGAINST ZERO C OR R DUE TO UNDERFLOW ..........IF (C .EQ. 0.0D0 .OR. R .EQ. 0.0D0) GO TO 270G = R / RADIXF = 1.0D0S = C + R210 IF (C .GE. G) GO TO 220F = F * RADIXC = C * B2GO TO 210220 G = R * RADIX230 IF (C .LT. G) GO TO 240F = F / RADIXC = C / B2GO TO 230C .......... NOW BALANCE ..........240 IF ((C + R) / F .GE. 0.95D0 * S) GO TO 270G = 1.0D0 / FSCALE(I) = SCALE(I) * FNOCONV = .TRUE.CDO 250 J = K, N250 A(I,J) = A(I,J) * GCDO 260 J = 1, L260 A(J,I) = A(J,I) * FC270 CONTINUECIF (NOCONV) GO TO 190C280 LOW = KIGH = LRETURNENDSUBROUTINE BALBAK(NM,N,LOW,IGH,SCALE,M,Z)CINTEGER I,J,K,M,N,II,NM,IGH,LOWDOUBLE PRECISION SCALE(N),Z(NM,M)DOUBLE PRECISION SCC THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE BALBAK,C NUM. MATH. 13, 293-304(1969) BY PARLETT AND REINSCH.C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 315-326(1971).CC THIS SUBROUTINE FORMS THE EIGENVECTORS OF A REAL GENERALC MATRIX BY BACK TRANSFORMING THOSE OF THE CORRESPONDINGC BALANCED MATRIX DETERMINED BY BALANC.CC ON INPUTCC NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONALC ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAMC DIMENSION STATEMENT.CC N IS THE ORDER OF THE MATRIX.CC LOW AND IGH ARE INTEGERS DETERMINED BY BALANC.CC SCALE CONTAINS INFORMATION DETERMINING THE PERMUTATIONSC AND SCALING FACTORS USED BY BALANC.CC M IS THE NUMBER OF COLUMNS OF Z TO BE BACK TRANSFORMED.CC Z CONTAINS THE REAL AND IMAGINARY PARTS OF THE EIGEN-C VECTORS TO BE BACK TRANSFORMED IN ITS FIRST M COLUMNS.CC ON OUTPUTCC Z CONTAINS THE REAL AND IMAGINARY PARTS OF THEC TRANSFORMED EIGENVECTORS IN ITS FIRST M COLUMNS.CC QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,C MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORYCC THIS VERSION DATED AUGUST 1983.CC ------------------------------------------------------------------CIF (M .EQ. 0) GO TO 200IF (IGH .EQ. LOW) GO TO 120CDO 110 I = LOW, IGHS = SCALE(I)C .......... LEFT HAND EIGENVECTORS ARE BACK TRANSFORMEDC IF THE FOREGOING STATEMENT IS REPLACED BYC S=1.0D0/SCALE(I). ..........DO 100 J = 1, M100 Z(I,J) = Z(I,J) * SC110 CONTINUEC ......... FOR I=LOW-1 STEP -1 UNTIL 1,C IGH+1 STEP 1 UNTIL N DO -- ..........120 DO 140 II = 1, NI = IIIF (I .GE. LOW .AND. I .LE. IGH) GO TO 140IF (I .LT. LOW) I = LOW - IIK = SCALE(I)IF (K .EQ. I) GO TO 140CDO 130 J = 1, MS = Z(I,J)Z(I,J) = Z(K,J)Z(K,J) = S130 CONTINUEC140 CONTINUEC200 RETURNENDSUBROUTINE CBABK2(NM,N,LOW,IGH,SCALE,M,ZR,ZI)CINTEGER I,J,K,M,N,II,NM,IGH,LOWDOUBLE PRECISION SCALE(N),ZR(NM,M),ZI(NM,M)DOUBLE PRECISION SCC THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDUREC CBABK2, WHICH IS A COMPLEX VERSION OF BALBAK,C NUM. MATH. 13, 293-304(1969) BY PARLETT AND REINSCH.C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 315-326(1971).CC THIS SUBROUTINE FORMS THE EIGENVECTORS OF A COMPLEX GENERALC MATRIX BY BACK TRANSFORMING THOSE OF THE CORRESPONDINGC BALANCED MATRIX DETERMINED BY CBAL.CC ON INPUTCC NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONALC ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAMC DIMENSION STATEMENT.CC N IS THE ORDER OF THE MATRIX.CC LOW AND IGH ARE INTEGERS DETERMINED BY CBAL.CC SCALE CONTAINS INFORMATION DETERMINING THE PERMUTATIONSC AND SCALING FACTORS USED BY CBAL.CC M IS THE NUMBER OF EIGENVECTORS TO BE BACK TRANSFORMED.CC ZR AND ZI CONTAIN THE REAL AND IMAGINARY PARTS,C RESPECTIVELY, OF THE EIGENVECTORS TO BEC BACK TRANSFORMED IN THEIR FIRST M COLUMNS.CC ON OUTPUTCC ZR AND ZI CONTAIN THE REAL AND IMAGINARY PARTS,C RESPECTIVELY, OF THE TRANSFORMED EIGENVECTORSC IN THEIR FIRST M COLUMNS.CC QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,C MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORYCC THIS VERSION DATED AUGUST 1983.CC ------------------------------------------------------------------CIF (M .EQ. 0) GO TO 200IF (IGH .EQ. LOW) GO TO 120CDO 110 I = LOW, IGHS = SCALE(I)C .......... LEFT HAND EIGENVECTORS ARE BACK TRANSFORMEDC IF THE FOREGOING STATEMENT IS REPLACED BYC S=1.0D0/SCALE(I). ..........DO 100 J = 1, MZR(I,J) = ZR(I,J) * SZI(I,J) = ZI(I,J) * S100 CONTINUEC110 CONTINUEC .......... FOR I=LOW-1 STEP -1 UNTIL 1,C IGH+1 STEP 1 UNTIL N DO -- ..........120 DO 140 II = 1, NI = IIIF (I .GE. LOW .AND. I .LE. IGH) GO TO 140IF (I .LT. LOW) I = LOW - IIK = SCALE(I)IF (K .EQ. I) GO TO 140CDO 130 J = 1, MS = ZR(I,J)ZR(I,J) = ZR(K,J)ZR(K,J) = SS = ZI(I,J)ZI(I,J) = ZI(K,J)ZI(K,J) = S130 CONTINUEC140 CONTINUEC200 RETURNENDSUBROUTINE CBAL(NM,N,AR,AI,LOW,IGH,SCALE)CINTEGER I,J,K,L,M,N,JJ,NM,IGH,LOW,IEXCDOUBLE PRECISION AR(NM,N),AI(NM,N),SCALE(N)DOUBLE PRECISION C,F,G,R,S,B2,RADIXLOGICAL NOCONVCC THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDUREC CBALANCE, WHICH IS A COMPLEX VERSION OF BALANCE,C NUM. MATH. 13, 293-304(1969) BY PARLETT AND REINSCH.C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 315-326(1971).CC THIS SUBROUTINE BALANCES A COMPLEX MATRIX AND ISOLATESC EIGENVALUES WHENEVER POSSIBLE.CC ON INPUTCC NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONALC ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAMC DIMENSION STATEMENT.CC N IS THE ORDER OF THE MATRIX.CC AR AND AI CONTAIN THE REAL AND IMAGINARY PARTS,C RESPECTIVELY, OF THE COMPLEX MATRIX TO BE BALANCED.CC ON OUTPUTCC AR AND AI CONTAIN THE REAL AND IMAGINARY PARTS,C RESPECTIVELY, OF THE BALANCED MATRIX.CC LOW AND IGH ARE TWO INTEGERS SUCH THAT AR(I,J) AND AI(I,J)C ARE EQUAL TO ZERO IFC (1) I IS GREATER THAN J ANDC (2) J=1,...,LOW-1 OR I=IGH+1,...,N.CC SCALE CONTAINS INFORMATION DETERMINING THEC PERMUTATIONS AND SCALING FACTORS USED.CC SUPPOSE THAT THE PRINCIPAL SUBMATRIX IN ROWS LOW THROUGH IGHC HAS BEEN BALANCED, THAT P(J) DENOTES THE INDEX INTERCHANGEDC WITH J DURING THE PERMUTATION STEP, AND THAT THE ELEMENTSC OF THE DIAGONAL MATRIX USED ARE DENOTED BY D(I,J). THENC SCALE(J) = P(J), FOR J = 1,...,LOW-1C = D(J,J) J = LOW,...,IGHC = P(J) J = IGH+1,...,N.C THE ORDER IN WHICH THE INTERCHANGES ARE MADE IS N TO IGH+1,C THEN 1 TO LOW-1.CC NOTE THAT 1 IS RETURNED FOR IGH IF IGH IS ZERO FORMALLY.CC THE ALGOL PROCEDURE EXC CONTAINED IN CBALANCE APPEARS INC CBAL IN LINE. (NOTE THAT THE ALGOL ROLES OF IDENTIFIERSC K,L HAVE BEEN REVERSED.)CC ARITHMETIC IS REAL THROUGHOUT.CC QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,C MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORYCC THIS VERSION DATED AUGUST 1983.CC ------------------------------------------------------------------CRADIX = 16.0D0CB2 = RADIX * RADIXK = 1L = NGO TO 100C .......... IN-LINE PROCEDURE FOR ROW ANDC COLUMN EXCHANGE ..........20 SCALE(M) = JIF (J .EQ. M) GO TO 50CDO 30 I = 1, LF = AR(I,J)AR(I,J) = AR(I,M)AR(I,M) = FF = AI(I,J)AI(I,J) = AI(I,M)AI(I,M) = F30 CONTINUECDO 40 I = K, NF = AR(J,I)AR(J,I) = AR(M,I)AR(M,I) = FF = AI(J,I)AI(J,I) = AI(M,I)AI(M,I) = F40 CONTINUEC50 GO TO (80,130), IEXCC .......... SEARCH FOR ROWS ISOLATING AN EIGENVALUEC AND PUSH THEM DOWN ..........80 IF (L .EQ. 1) GO TO 280L = L - 1C .......... FOR J=L STEP -1 UNTIL 1 DO -- ..........100 DO 120 JJ = 1, LJ = L + 1 - JJCDO 110 I = 1, LIF (I .EQ. J) GO TO 110IF (AR(J,I) .NE. 0.0D0 .OR. AI(J,I) .NE. 0.0D0) GO TO 120110 CONTINUECM = LIEXC = 1GO TO 20120 CONTINUECGO TO 140C .......... SEARCH FOR COLUMNS ISOLATING AN EIGENVALUEC AND PUSH THEM LEFT ..........130 K = K + 1C140 DO 170 J = K, LCDO 150 I = K, LIF (I .EQ. J) GO TO 150IF (AR(I,J) .NE. 0.0D0 .OR. AI(I,J) .NE. 0.0D0) GO TO 170150 CONTINUECM = KIEXC = 2GO TO 20170 CONTINUEC .......... NOW BALANCE THE SUBMATRIX IN ROWS K TO L ..........DO 180 I = K, L180 SCALE(I) = 1.0D0C .......... ITERATIVE LOOP FOR NORM REDUCTION ..........190 NOCONV = .FALSE.CDO 270 I = K, LC = 0.0D0R = 0.0D0CDO 200 J = K, LIF (J .EQ. I) GO TO 200C = C + DABS(AR(J,I)) + DABS(AI(J,I))R = R + DABS(AR(I,J)) + DABS(AI(I,J))200 CONTINUEC .......... GUARD AGAINST ZERO C OR R DUE TO UNDERFLOW ..........IF (C .EQ. 0.0D0 .OR. R .EQ. 0.0D0) GO TO 270G = R / RADIXF = 1.0D0S = C + R210 IF (C .GE. G) GO TO 220F = F * RADIXC = C * B2GO TO 210220 G = R * RADIX230 IF (C .LT. G) GO TO 240F = F / RADIXC = C / B2GO TO 230C .......... NOW BALANCE ..........240 IF ((C + R) / F .GE. 0.95D0 * S) GO TO 270G = 1.0D0 / FSCALE(I) = SCALE(I) * FNOCONV = .TRUE.CDO 250 J = K, NAR(I,J) = AR(I,J) * GAI(I,J) = AI(I,J) * G250 CONTINUECDO 260 J = 1, LAR(J,I) = AR(J,I) * FAI(J,I) = AI(J,I) * F260 CONTINUEC270 CONTINUECIF (NOCONV) GO TO 190C280 LOW = KIGH = LRETURNENDSUBROUTINE CDIV(AR,AI,BR,BI,CR,CI)DOUBLE PRECISION AR,AI,BR,BI,CR,CICC COMPLEX DIVISION, (CR,CI) = (AR,AI)/(BR,BI)CDOUBLE PRECISION S,ARS,AIS,BRS,BISS = DABS(BR) + DABS(BI)ARS = AR/SAIS = AI/SBRS = BR/SBIS = BI/SS = BRS**2 + BIS**2CR = (ARS*BRS + AIS*BIS)/SCI = (AIS*BRS - ARS*BIS)/SRETURNENDSUBROUTINE COMQR(NM,N,LOW,IGH,HR,HI,WR,WI,IERR)CINTEGER I,J,L,N,EN,LL,NM,IGH,ITN,ITS,LOW,LP1,ENM1,IERRDOUBLE PRECISION HR(NM,N),HI(NM,N),WR(N),WI(N)DOUBLE PRECISION SI,SR,TI,TR,XI,XR,YI,YR,ZZI,ZZR,NORM,TST1,TST2,X PYTHAGCC THIS SUBROUTINE IS A TRANSLATION OF A UNITARY ANALOGUE OF THEC ALGOL PROCEDURE COMLR, NUM. MATH. 12, 369-376(1968) BY MARTINC AND WILKINSON.C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 396-403(1971).C THE UNITARY ANALOGUE SUBSTITUTES THE QR ALGORITHM OF FRANCISC (COMP. JOUR. 4, 332-345(1962)) FOR THE LR ALGORITHM.CC THIS SUBROUTINE FINDS THE EIGENVALUES OF A COMPLEXC UPPER HESSENBERG MATRIX BY THE QR METHOD.CC ON INPUTCC NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONALC ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAMC DIMENSION STATEMENT.CC N IS THE ORDER OF THE MATRIX.CC LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCINGC SUBROUTINE CBAL. IF CBAL HAS NOT BEEN USED,C SET LOW=1, IGH=N.CC HR AND HI CONTAIN THE REAL AND IMAGINARY PARTS,C RESPECTIVELY, OF THE COMPLEX UPPER HESSENBERG MATRIX.C THEIR LOWER TRIANGLES BELOW THE SUBDIAGONAL CONTAINC INFORMATION ABOUT THE UNITARY TRANSFORMATIONS USED INC THE REDUCTION BY CORTH, IF PERFORMED.CC ON OUTPUTCC THE UPPER HESSENBERG PORTIONS OF HR AND HI HAVE BEENC DESTROYED. THEREFORE, THEY MUST BE SAVED BEFOREC CALLING COMQR IF SUBSEQUENT CALCULATION OFC EIGENVECTORS IS TO BE PERFORMED.CC WR AND WI CONTAIN THE REAL AND IMAGINARY PARTS,C RESPECTIVELY, OF THE EIGENVALUES. IF AN ERRORC EXIT IS MADE, THE EIGENVALUES SHOULD BE CORRECTC FOR INDICES IERR+1,...,N.CC IERR IS SET TOC ZERO FOR NORMAL RETURN,C J IF THE LIMIT OF 30*N ITERATIONS IS EXHAUSTEDC WHILE THE J-TH EIGENVALUE IS BEING SOUGHT.CC CALLS CDIV FOR COMPLEX DIVISION.C CALLS CSROOT FOR COMPLEX SQUARE ROOT.C CALLS PYTHAG FOR DSQRT(A*A + B*B) .CC QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,C MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORYCC THIS VERSION DATED AUGUST 1983.CC ------------------------------------------------------------------cc unnecessary initialization of L to keep g77 -Wall happycL = 0CIERR = 0IF (LOW .EQ. IGH) GO TO 180C .......... CREATE REAL SUBDIAGONAL ELEMENTS ..........L = LOW + 1CDO 170 I = L, IGHLL = MIN0(I+1,IGH)IF (HI(I,I-1) .EQ. 0.0D0) GO TO 170NORM = PYTHAG(HR(I,I-1),HI(I,I-1))YR = HR(I,I-1) / NORMYI = HI(I,I-1) / NORMHR(I,I-1) = NORMHI(I,I-1) = 0.0D0CDO 155 J = I, IGHSI = YR * HI(I,J) - YI * HR(I,J)HR(I,J) = YR * HR(I,J) + YI * HI(I,J)HI(I,J) = SI155 CONTINUECDO 160 J = LOW, LLSI = YR * HI(J,I) + YI * HR(J,I)HR(J,I) = YR * HR(J,I) - YI * HI(J,I)HI(J,I) = SI160 CONTINUEC170 CONTINUEC .......... STORE ROOTS ISOLATED BY CBAL ..........180 DO 200 I = 1, NIF (I .GE. LOW .AND. I .LE. IGH) GO TO 200WR(I) = HR(I,I)WI(I) = HI(I,I)200 CONTINUECEN = IGHTR = 0.0D0TI = 0.0D0ITN = 30*NC .......... SEARCH FOR NEXT EIGENVALUE ..........220 IF (EN .LT. LOW) GO TO 1001ITS = 0ENM1 = EN - 1C .......... LOOK FOR SINGLE SMALL SUB-DIAGONAL ELEMENTC FOR L=EN STEP -1 UNTIL LOW D0 -- ..........240 DO 260 LL = LOW, ENL = EN + LOW - LLIF (L .EQ. LOW) GO TO 300TST1 = DABS(HR(L-1,L-1)) + DABS(HI(L-1,L-1))X + DABS(HR(L,L)) + DABS(HI(L,L))TST2 = TST1 + DABS(HR(L,L-1))IF (TST2 .EQ. TST1) GO TO 300260 CONTINUEC .......... FORM SHIFT ..........300 IF (L .EQ. EN) GO TO 660IF (ITN .EQ. 0) GO TO 1000IF (ITS .EQ. 10 .OR. ITS .EQ. 20) GO TO 320SR = HR(EN,EN)SI = HI(EN,EN)XR = HR(ENM1,EN) * HR(EN,ENM1)XI = HI(ENM1,EN) * HR(EN,ENM1)IF (XR .EQ. 0.0D0 .AND. XI .EQ. 0.0D0) GO TO 340YR = (HR(ENM1,ENM1) - SR) / 2.0D0YI = (HI(ENM1,ENM1) - SI) / 2.0D0CALL CSROOT(YR**2-YI**2+XR,2.0D0*YR*YI+XI,ZZR,ZZI)IF (YR * ZZR + YI * ZZI .GE. 0.0D0) GO TO 310ZZR = -ZZRZZI = -ZZI310 CALL CDIV(XR,XI,YR+ZZR,YI+ZZI,XR,XI)SR = SR - XRSI = SI - XIGO TO 340C .......... FORM EXCEPTIONAL SHIFT ..........320 SR = DABS(HR(EN,ENM1)) + DABS(HR(ENM1,EN-2))SI = 0.0D0C340 DO 360 I = LOW, ENHR(I,I) = HR(I,I) - SRHI(I,I) = HI(I,I) - SI360 CONTINUECTR = TR + SRTI = TI + SIITS = ITS + 1ITN = ITN - 1C .......... REDUCE TO TRIANGLE (ROWS) ..........LP1 = L + 1CDO 500 I = LP1, ENSR = HR(I,I-1)HR(I,I-1) = 0.0D0NORM = PYTHAG(PYTHAG(HR(I-1,I-1),HI(I-1,I-1)),SR)XR = HR(I-1,I-1) / NORMWR(I-1) = XRXI = HI(I-1,I-1) / NORMWI(I-1) = XIHR(I-1,I-1) = NORMHI(I-1,I-1) = 0.0D0HI(I,I-1) = SR / NORMCDO 490 J = I, ENYR = HR(I-1,J)YI = HI(I-1,J)ZZR = HR(I,J)ZZI = HI(I,J)HR(I-1,J) = XR * YR + XI * YI + HI(I,I-1) * ZZRHI(I-1,J) = XR * YI - XI * YR + HI(I,I-1) * ZZIHR(I,J) = XR * ZZR - XI * ZZI - HI(I,I-1) * YRHI(I,J) = XR * ZZI + XI * ZZR - HI(I,I-1) * YI490 CONTINUEC500 CONTINUECSI = HI(EN,EN)IF (SI .EQ. 0.0D0) GO TO 540NORM = PYTHAG(HR(EN,EN),SI)SR = HR(EN,EN) / NORMSI = SI / NORMHR(EN,EN) = NORMHI(EN,EN) = 0.0D0C .......... INVERSE OPERATION (COLUMNS) ..........540 DO 600 J = LP1, ENXR = WR(J-1)XI = WI(J-1)CDO 580 I = L, JYR = HR(I,J-1)YI = 0.0D0ZZR = HR(I,J)ZZI = HI(I,J)IF (I .EQ. J) GO TO 560YI = HI(I,J-1)HI(I,J-1) = XR * YI + XI * YR + HI(J,J-1) * ZZI560 HR(I,J-1) = XR * YR - XI * YI + HI(J,J-1) * ZZRHR(I,J) = XR * ZZR + XI * ZZI - HI(J,J-1) * YRHI(I,J) = XR * ZZI - XI * ZZR - HI(J,J-1) * YI580 CONTINUEC600 CONTINUECIF (SI .EQ. 0.0D0) GO TO 240CDO 630 I = L, ENYR = HR(I,EN)YI = HI(I,EN)HR(I,EN) = SR * YR - SI * YIHI(I,EN) = SR * YI + SI * YR630 CONTINUECGO TO 240C .......... A ROOT FOUND ..........660 WR(EN) = HR(EN,EN) + TRWI(EN) = HI(EN,EN) + TIEN = ENM1GO TO 220C .......... SET ERROR -- ALL EIGENVALUES HAVE NOTC CONVERGED AFTER 30*N ITERATIONS ..........1000 IERR = EN1001 RETURNENDSUBROUTINE COMQR2(NM,N,LOW,IGH,ORTR,ORTI,HR,HI,WR,WI,ZR,ZI,IERR)CINTEGER I,J,K,L,M,N,EN,II,JJ,LL,NM,NN,IGH,IP1,X ITN,ITS,LOW,LP1,ENM1,IEND,IERRDOUBLE PRECISION HR(NM,N),HI(NM,N),WR(N),WI(N),ZR(NM,N),ZI(NM,N),X ORTR(IGH),ORTI(IGH)DOUBLE PRECISION SI,SR,TI,TR,XI,XR,YI,YR,ZZI,ZZR,NORM,TST1,TST2,X PYTHAGCC THIS SUBROUTINE IS A TRANSLATION OF A UNITARY ANALOGUE OF THEC ALGOL PROCEDURE COMLR2, NUM. MATH. 16, 181-204(1970) BY PETERSC AND WILKINSON.C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 372-395(1971).C THE UNITARY ANALOGUE SUBSTITUTES THE QR ALGORITHM OF FRANCISC (COMP. JOUR. 4, 332-345(1962)) FOR THE LR ALGORITHM.CC THIS SUBROUTINE FINDS THE EIGENVALUES AND EIGENVECTORSC OF A COMPLEX UPPER HESSENBERG MATRIX BY THE QRC METHOD. THE EIGENVECTORS OF A COMPLEX GENERAL MATRIXC CAN ALSO BE FOUND IF CORTH HAS BEEN USED TO REDUCEC THIS GENERAL MATRIX TO HESSENBERG FORM.CC ON INPUTCC NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONALC ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAMC DIMENSION STATEMENT.CC N IS THE ORDER OF THE MATRIX.CC LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCINGC SUBROUTINE CBAL. IF CBAL HAS NOT BEEN USED,C SET LOW=1, IGH=N.CC ORTR AND ORTI CONTAIN INFORMATION ABOUT THE UNITARY TRANS-C FORMATIONS USED IN THE REDUCTION BY CORTH, IF PERFORMED.C ONLY ELEMENTS LOW THROUGH IGH ARE USED. IF THE EIGENVECTORSC OF THE HESSENBERG MATRIX ARE DESIRED, SET ORTR(J) ANDC ORTI(J) TO 0.0D0 FOR THESE ELEMENTS.CC HR AND HI CONTAIN THE REAL AND IMAGINARY PARTS,C RESPECTIVELY, OF THE COMPLEX UPPER HESSENBERG MATRIX.C THEIR LOWER TRIANGLES BELOW THE SUBDIAGONAL CONTAIN FURTHERC INFORMATION ABOUT THE TRANSFORMATIONS WHICH WERE USED IN THEC REDUCTION BY CORTH, IF PERFORMED. IF THE EIGENVECTORS OFC THE HESSENBERG MATRIX ARE DESIRED, THESE ELEMENTS MAY BEC ARBITRARY.CC ON OUTPUTCC ORTR, ORTI, AND THE UPPER HESSENBERG PORTIONS OF HR AND HIC HAVE BEEN DESTROYED.CC WR AND WI CONTAIN THE REAL AND IMAGINARY PARTS,C RESPECTIVELY, OF THE EIGENVALUES. IF AN ERRORC EXIT IS MADE, THE EIGENVALUES SHOULD BE CORRECTC FOR INDICES IERR+1,...,N.CC ZR AND ZI CONTAIN THE REAL AND IMAGINARY PARTS,C RESPECTIVELY, OF THE EIGENVECTORS. THE EIGENVECTORSC ARE UNNORMALIZED. IF AN ERROR EXIT IS MADE, NONE OFC THE EIGENVECTORS HAS BEEN FOUND.CC IERR IS SET TOC ZERO FOR NORMAL RETURN,C J IF THE LIMIT OF 30*N ITERATIONS IS EXHAUSTEDC WHILE THE J-TH EIGENVALUE IS BEING SOUGHT.CC CALLS CDIV FOR COMPLEX DIVISION.C CALLS CSROOT FOR COMPLEX SQUARE ROOT.C CALLS PYTHAG FOR DSQRT(A*A + B*B) .CC QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,C MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORYCC THIS VERSION DATED AUGUST 1983.CC ------------------------------------------------------------------cc unnecessary initialization of L to keep g77 -Wall happycL = 0CIERR = 0C .......... INITIALIZE EIGENVECTOR MATRIX ..........DO 101 J = 1, NCDO 100 I = 1, NZR(I,J) = 0.0D0ZI(I,J) = 0.0D0100 CONTINUEZR(J,J) = 1.0D0101 CONTINUEC .......... FORM THE MATRIX OF ACCUMULATED TRANSFORMATIONSC FROM THE INFORMATION LEFT BY CORTH ..........IEND = IGH - LOW - 1IF (IEND) 180, 150, 105C .......... FOR I=IGH-1 STEP -1 UNTIL LOW+1 DO -- ..........105 DO 140 II = 1, IENDI = IGH - IIIF (ORTR(I) .EQ. 0.0D0 .AND. ORTI(I) .EQ. 0.0D0) GO TO 140IF (HR(I,I-1) .EQ. 0.0D0 .AND. HI(I,I-1) .EQ. 0.0D0) GO TO 140C .......... NORM BELOW IS NEGATIVE OF H FORMED IN CORTH ..........NORM = HR(I,I-1) * ORTR(I) + HI(I,I-1) * ORTI(I)IP1 = I + 1CDO 110 K = IP1, IGHORTR(K) = HR(K,I-1)ORTI(K) = HI(K,I-1)110 CONTINUECDO 130 J = I, IGHSR = 0.0D0SI = 0.0D0CDO 115 K = I, IGHSR = SR + ORTR(K) * ZR(K,J) + ORTI(K) * ZI(K,J)SI = SI + ORTR(K) * ZI(K,J) - ORTI(K) * ZR(K,J)115 CONTINUECSR = SR / NORMSI = SI / NORMCDO 120 K = I, IGHZR(K,J) = ZR(K,J) + SR * ORTR(K) - SI * ORTI(K)ZI(K,J) = ZI(K,J) + SR * ORTI(K) + SI * ORTR(K)120 CONTINUEC130 CONTINUEC140 CONTINUEC .......... CREATE REAL SUBDIAGONAL ELEMENTS ..........150 L = LOW + 1CDO 170 I = L, IGHLL = MIN0(I+1,IGH)IF (HI(I,I-1) .EQ. 0.0D0) GO TO 170NORM = PYTHAG(HR(I,I-1),HI(I,I-1))YR = HR(I,I-1) / NORMYI = HI(I,I-1) / NORMHR(I,I-1) = NORMHI(I,I-1) = 0.0D0CDO 155 J = I, NSI = YR * HI(I,J) - YI * HR(I,J)HR(I,J) = YR * HR(I,J) + YI * HI(I,J)HI(I,J) = SI155 CONTINUECDO 160 J = 1, LLSI = YR * HI(J,I) + YI * HR(J,I)HR(J,I) = YR * HR(J,I) - YI * HI(J,I)HI(J,I) = SI160 CONTINUECDO 165 J = LOW, IGHSI = YR * ZI(J,I) + YI * ZR(J,I)ZR(J,I) = YR * ZR(J,I) - YI * ZI(J,I)ZI(J,I) = SI165 CONTINUEC170 CONTINUEC .......... STORE ROOTS ISOLATED BY CBAL ..........180 DO 200 I = 1, NIF (I .GE. LOW .AND. I .LE. IGH) GO TO 200WR(I) = HR(I,I)WI(I) = HI(I,I)200 CONTINUECEN = IGHTR = 0.0D0TI = 0.0D0ITN = 30*NC .......... SEARCH FOR NEXT EIGENVALUE ..........220 IF (EN .LT. LOW) GO TO 680ITS = 0ENM1 = EN - 1C .......... LOOK FOR SINGLE SMALL SUB-DIAGONAL ELEMENTC FOR L=EN STEP -1 UNTIL LOW DO -- ..........240 DO 260 LL = LOW, ENL = EN + LOW - LLIF (L .EQ. LOW) GO TO 300TST1 = DABS(HR(L-1,L-1)) + DABS(HI(L-1,L-1))X + DABS(HR(L,L)) + DABS(HI(L,L))TST2 = TST1 + DABS(HR(L,L-1))IF (TST2 .EQ. TST1) GO TO 300260 CONTINUEC .......... FORM SHIFT ..........300 IF (L .EQ. EN) GO TO 660IF (ITN .EQ. 0) GO TO 1000IF (ITS .EQ. 10 .OR. ITS .EQ. 20) GO TO 320SR = HR(EN,EN)SI = HI(EN,EN)XR = HR(ENM1,EN) * HR(EN,ENM1)XI = HI(ENM1,EN) * HR(EN,ENM1)IF (XR .EQ. 0.0D0 .AND. XI .EQ. 0.0D0) GO TO 340YR = (HR(ENM1,ENM1) - SR) / 2.0D0YI = (HI(ENM1,ENM1) - SI) / 2.0D0CALL CSROOT(YR**2-YI**2+XR,2.0D0*YR*YI+XI,ZZR,ZZI)IF (YR * ZZR + YI * ZZI .GE. 0.0D0) GO TO 310ZZR = -ZZRZZI = -ZZI310 CALL CDIV(XR,XI,YR+ZZR,YI+ZZI,XR,XI)SR = SR - XRSI = SI - XIGO TO 340C .......... FORM EXCEPTIONAL SHIFT ..........320 SR = DABS(HR(EN,ENM1)) + DABS(HR(ENM1,EN-2))SI = 0.0D0C340 DO 360 I = LOW, ENHR(I,I) = HR(I,I) - SRHI(I,I) = HI(I,I) - SI360 CONTINUECTR = TR + SRTI = TI + SIITS = ITS + 1ITN = ITN - 1C .......... REDUCE TO TRIANGLE (ROWS) ..........LP1 = L + 1CDO 500 I = LP1, ENSR = HR(I,I-1)HR(I,I-1) = 0.0D0NORM = PYTHAG(PYTHAG(HR(I-1,I-1),HI(I-1,I-1)),SR)XR = HR(I-1,I-1) / NORMWR(I-1) = XRXI = HI(I-1,I-1) / NORMWI(I-1) = XIHR(I-1,I-1) = NORMHI(I-1,I-1) = 0.0D0HI(I,I-1) = SR / NORMCDO 490 J = I, NYR = HR(I-1,J)YI = HI(I-1,J)ZZR = HR(I,J)ZZI = HI(I,J)HR(I-1,J) = XR * YR + XI * YI + HI(I,I-1) * ZZRHI(I-1,J) = XR * YI - XI * YR + HI(I,I-1) * ZZIHR(I,J) = XR * ZZR - XI * ZZI - HI(I,I-1) * YRHI(I,J) = XR * ZZI + XI * ZZR - HI(I,I-1) * YI490 CONTINUEC500 CONTINUECSI = HI(EN,EN)IF (SI .EQ. 0.0D0) GO TO 540NORM = PYTHAG(HR(EN,EN),SI)SR = HR(EN,EN) / NORMSI = SI / NORMHR(EN,EN) = NORMHI(EN,EN) = 0.0D0IF (EN .EQ. N) GO TO 540IP1 = EN + 1CDO 520 J = IP1, NYR = HR(EN,J)YI = HI(EN,J)HR(EN,J) = SR * YR + SI * YIHI(EN,J) = SR * YI - SI * YR520 CONTINUEC .......... INVERSE OPERATION (COLUMNS) ..........540 DO 600 J = LP1, ENXR = WR(J-1)XI = WI(J-1)CDO 580 I = 1, JYR = HR(I,J-1)YI = 0.0D0ZZR = HR(I,J)ZZI = HI(I,J)IF (I .EQ. J) GO TO 560YI = HI(I,J-1)HI(I,J-1) = XR * YI + XI * YR + HI(J,J-1) * ZZI560 HR(I,J-1) = XR * YR - XI * YI + HI(J,J-1) * ZZRHR(I,J) = XR * ZZR + XI * ZZI - HI(J,J-1) * YRHI(I,J) = XR * ZZI - XI * ZZR - HI(J,J-1) * YI580 CONTINUECDO 590 I = LOW, IGHYR = ZR(I,J-1)YI = ZI(I,J-1)ZZR = ZR(I,J)ZZI = ZI(I,J)ZR(I,J-1) = XR * YR - XI * YI + HI(J,J-1) * ZZRZI(I,J-1) = XR * YI + XI * YR + HI(J,J-1) * ZZIZR(I,J) = XR * ZZR + XI * ZZI - HI(J,J-1) * YRZI(I,J) = XR * ZZI - XI * ZZR - HI(J,J-1) * YI590 CONTINUEC600 CONTINUECIF (SI .EQ. 0.0D0) GO TO 240CDO 630 I = 1, ENYR = HR(I,EN)YI = HI(I,EN)HR(I,EN) = SR * YR - SI * YIHI(I,EN) = SR * YI + SI * YR630 CONTINUECDO 640 I = LOW, IGHYR = ZR(I,EN)YI = ZI(I,EN)ZR(I,EN) = SR * YR - SI * YIZI(I,EN) = SR * YI + SI * YR640 CONTINUECGO TO 240C .......... A ROOT FOUND ..........660 HR(EN,EN) = HR(EN,EN) + TRWR(EN) = HR(EN,EN)HI(EN,EN) = HI(EN,EN) + TIWI(EN) = HI(EN,EN)EN = ENM1GO TO 220C .......... ALL ROOTS FOUND. BACKSUBSTITUTE TO FINDC VECTORS OF UPPER TRIANGULAR FORM ..........680 NORM = 0.0D0CDO 720 I = 1, NCDO 720 J = I, NTR = DABS(HR(I,J)) + DABS(HI(I,J))IF (TR .GT. NORM) NORM = TR720 CONTINUECIF (N .EQ. 1 .OR. NORM .EQ. 0.0D0) GO TO 1001C .......... FOR EN=N STEP -1 UNTIL 2 DO -- ..........DO 800 NN = 2, NEN = N + 2 - NNXR = WR(EN)XI = WI(EN)HR(EN,EN) = 1.0D0HI(EN,EN) = 0.0D0ENM1 = EN - 1C .......... FOR I=EN-1 STEP -1 UNTIL 1 DO -- ..........DO 780 II = 1, ENM1I = EN - IIZZR = 0.0D0ZZI = 0.0D0IP1 = I + 1CDO 740 J = IP1, ENZZR = ZZR + HR(I,J) * HR(J,EN) - HI(I,J) * HI(J,EN)ZZI = ZZI + HR(I,J) * HI(J,EN) + HI(I,J) * HR(J,EN)740 CONTINUECYR = XR - WR(I)YI = XI - WI(I)IF (YR .NE. 0.0D0 .OR. YI .NE. 0.0D0) GO TO 765TST1 = NORMYR = TST1760 YR = 0.01D0 * YRTST2 = NORM + YRIF (TST2 .GT. TST1) GO TO 760765 CONTINUECALL CDIV(ZZR,ZZI,YR,YI,HR(I,EN),HI(I,EN))C .......... OVERFLOW CONTROL ..........TR = DABS(HR(I,EN)) + DABS(HI(I,EN))IF (TR .EQ. 0.0D0) GO TO 780TST1 = TRTST2 = TST1 + 1.0D0/TST1IF (TST2 .GT. TST1) GO TO 780DO 770 J = I, ENHR(J,EN) = HR(J,EN)/TRHI(J,EN) = HI(J,EN)/TR770 CONTINUEC780 CONTINUEC800 CONTINUEC .......... END BACKSUBSTITUTION ..........ENM1 = N - 1C .......... VECTORS OF ISOLATED ROOTS ..........DO 840 I = 1, ENM1IF (I .GE. LOW .AND. I .LE. IGH) GO TO 840IP1 = I + 1CDO 820 J = IP1, NZR(I,J) = HR(I,J)ZI(I,J) = HI(I,J)820 CONTINUEC840 CONTINUEC .......... MULTIPLY BY TRANSFORMATION MATRIX TO GIVEC VECTORS OF ORIGINAL FULL MATRIX.C FOR J=N STEP -1 UNTIL LOW+1 DO -- ..........DO 880 JJ = LOW, ENM1J = N + LOW - JJM = MIN0(J,IGH)CDO 880 I = LOW, IGHZZR = 0.0D0ZZI = 0.0D0CDO 860 K = LOW, MZZR = ZZR + ZR(I,K) * HR(K,J) - ZI(I,K) * HI(K,J)ZZI = ZZI + ZR(I,K) * HI(K,J) + ZI(I,K) * HR(K,J)860 CONTINUECZR(I,J) = ZZRZI(I,J) = ZZI880 CONTINUECGO TO 1001C .......... SET ERROR -- ALL EIGENVALUES HAVE NOTC CONVERGED AFTER 30*N ITERATIONS ..........1000 IERR = EN1001 RETURNENDSUBROUTINE CORTH(NM,N,LOW,IGH,AR,AI,ORTR,ORTI)CINTEGER I,J,M,N,II,JJ,LA,MP,NM,IGH,KP1,LOWDOUBLE PRECISION AR(NM,N),AI(NM,N),ORTR(IGH),ORTI(IGH)DOUBLE PRECISION F,G,H,FI,FR,SCALE,PYTHAGCC THIS SUBROUTINE IS A TRANSLATION OF A COMPLEX ANALOGUE OFC THE ALGOL PROCEDURE ORTHES, NUM. MATH. 12, 349-368(1968)C BY MARTIN AND WILKINSON.C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 339-358(1971).CC GIVEN A COMPLEX GENERAL MATRIX, THIS SUBROUTINEC REDUCES A SUBMATRIX SITUATED IN ROWS AND COLUMNSC LOW THROUGH IGH TO UPPER HESSENBERG FORM BYC UNITARY SIMILARITY TRANSFORMATIONS.CC ON INPUTCC NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONALC ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAMC DIMENSION STATEMENT.CC N IS THE ORDER OF THE MATRIX.CC LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCINGC SUBROUTINE CBAL. IF CBAL HAS NOT BEEN USED,C SET LOW=1, IGH=N.CC AR AND AI CONTAIN THE REAL AND IMAGINARY PARTS,C RESPECTIVELY, OF THE COMPLEX INPUT MATRIX.CC ON OUTPUTCC AR AND AI CONTAIN THE REAL AND IMAGINARY PARTS,C RESPECTIVELY, OF THE HESSENBERG MATRIX. INFORMATIONC ABOUT THE UNITARY TRANSFORMATIONS USED IN THE REDUCTIONC IS STORED IN THE REMAINING TRIANGLES UNDER THEC HESSENBERG MATRIX.CC ORTR AND ORTI CONTAIN FURTHER INFORMATION ABOUT THEC TRANSFORMATIONS. ONLY ELEMENTS LOW THROUGH IGH ARE USED.CC CALLS PYTHAG FOR DSQRT(A*A + B*B) .CC QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,C MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORYCC THIS VERSION DATED AUGUST 1983.CC ------------------------------------------------------------------CLA = IGH - 1KP1 = LOW + 1IF (LA .LT. KP1) GO TO 200CDO 180 M = KP1, LAH = 0.0D0ORTR(M) = 0.0D0ORTI(M) = 0.0D0SCALE = 0.0D0C .......... SCALE COLUMN (ALGOL TOL THEN NOT NEEDED) ..........DO 90 I = M, IGH90 SCALE = SCALE + DABS(AR(I,M-1)) + DABS(AI(I,M-1))CIF (SCALE .EQ. 0.0D0) GO TO 180MP = M + IGHC .......... FOR I=IGH STEP -1 UNTIL M DO -- ..........DO 100 II = M, IGHI = MP - IIORTR(I) = AR(I,M-1) / SCALEORTI(I) = AI(I,M-1) / SCALEH = H + ORTR(I) * ORTR(I) + ORTI(I) * ORTI(I)100 CONTINUECG = DSQRT(H)F = PYTHAG(ORTR(M),ORTI(M))IF (F .EQ. 0.0D0) GO TO 103H = H + F * GG = G / FORTR(M) = (1.0D0 + G) * ORTR(M)ORTI(M) = (1.0D0 + G) * ORTI(M)GO TO 105C103 ORTR(M) = GAR(M,M-1) = SCALEC .......... FORM (I-(U*UT)/H) * A ..........105 DO 130 J = M, NFR = 0.0D0FI = 0.0D0C .......... FOR I=IGH STEP -1 UNTIL M DO -- ..........DO 110 II = M, IGHI = MP - IIFR = FR + ORTR(I) * AR(I,J) + ORTI(I) * AI(I,J)FI = FI + ORTR(I) * AI(I,J) - ORTI(I) * AR(I,J)110 CONTINUECFR = FR / HFI = FI / HCDO 120 I = M, IGHAR(I,J) = AR(I,J) - FR * ORTR(I) + FI * ORTI(I)AI(I,J) = AI(I,J) - FR * ORTI(I) - FI * ORTR(I)120 CONTINUEC130 CONTINUEC .......... FORM (I-(U*UT)/H)*A*(I-(U*UT)/H) ..........DO 160 I = 1, IGHFR = 0.0D0FI = 0.0D0C .......... FOR J=IGH STEP -1 UNTIL M DO -- ..........DO 140 JJ = M, IGHJ = MP - JJFR = FR + ORTR(J) * AR(I,J) - ORTI(J) * AI(I,J)FI = FI + ORTR(J) * AI(I,J) + ORTI(J) * AR(I,J)140 CONTINUECFR = FR / HFI = FI / HCDO 150 J = M, IGHAR(I,J) = AR(I,J) - FR * ORTR(J) - FI * ORTI(J)AI(I,J) = AI(I,J) + FR * ORTI(J) - FI * ORTR(J)150 CONTINUEC160 CONTINUECORTR(M) = SCALE * ORTR(M)ORTI(M) = SCALE * ORTI(M)AR(M,M-1) = -G * AR(M,M-1)AI(M,M-1) = -G * AI(M,M-1)180 CONTINUEC200 RETURNENDSUBROUTINE CSROOT(XR,XI,YR,YI)DOUBLE PRECISION XR,XI,YR,YICC (YR,YI) = COMPLEX DSQRT(XR,XI)C BRANCH CHOSEN SO THAT YR .GE. 0.0 AND SIGN(YI) .EQ. SIGN(XI)CDOUBLE PRECISION S,TR,TI,PYTHAGTR = XRTI = XIS = DSQRT(0.5D0*(PYTHAG(TR,TI) + DABS(TR)))IF (TR .GE. 0.0D0) YR = SIF (TI .LT. 0.0D0) S = -SIF (TR .LE. 0.0D0) YI = SIF (TR .LT. 0.0D0) YR = 0.5D0*(TI/YI)IF (TR .GT. 0.0D0) YI = 0.5D0*(TI/YR)RETURNENDSUBROUTINE ELMHES(NM,N,LOW,IGH,A,INT)CINTEGER I,J,M,N,LA,NM,IGH,KP1,LOW,MM1,MP1DOUBLE PRECISION A(NM,N)DOUBLE PRECISION X,YINTEGER INT(IGH)CC THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE ELMHES,C NUM. MATH. 12, 349-368(1968) BY MARTIN AND WILKINSON.C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 339-358(1971).CC GIVEN A REAL GENERAL MATRIX, THIS SUBROUTINEC REDUCES A SUBMATRIX SITUATED IN ROWS AND COLUMNSC LOW THROUGH IGH TO UPPER HESSENBERG FORM BYC STABILIZED ELEMENTARY SIMILARITY TRANSFORMATIONS.CC ON INPUTCC NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONALC ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAMC DIMENSION STATEMENT.CC N IS THE ORDER OF THE MATRIX.CC LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCINGC SUBROUTINE BALANC. IF BALANC HAS NOT BEEN USED,C SET LOW=1, IGH=N.CC A CONTAINS THE INPUT MATRIX.CC ON OUTPUTCC A CONTAINS THE HESSENBERG MATRIX. THE MULTIPLIERSC WHICH WERE USED IN THE REDUCTION ARE STORED IN THEC REMAINING TRIANGLE UNDER THE HESSENBERG MATRIX.CC INT CONTAINS INFORMATION ON THE ROWS AND COLUMNSC INTERCHANGED IN THE REDUCTION.C ONLY ELEMENTS LOW THROUGH IGH ARE USED.CC QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,C MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORYCC THIS VERSION DATED AUGUST 1983.CC ------------------------------------------------------------------CLA = IGH - 1KP1 = LOW + 1IF (LA .LT. KP1) GO TO 200CDO 180 M = KP1, LAMM1 = M - 1X = 0.0D0I = MCDO 100 J = M, IGHIF (DABS(A(J,MM1)) .LE. DABS(X)) GO TO 100X = A(J,MM1)I = J100 CONTINUECINT(M) = IIF (I .EQ. M) GO TO 130C .......... INTERCHANGE ROWS AND COLUMNS OF A ..........DO 110 J = MM1, NY = A(I,J)A(I,J) = A(M,J)A(M,J) = Y110 CONTINUECDO 120 J = 1, IGHY = A(J,I)A(J,I) = A(J,M)A(J,M) = Y120 CONTINUEC .......... END INTERCHANGE ..........130 IF (X .EQ. 0.0D0) GO TO 180MP1 = M + 1CDO 160 I = MP1, IGHY = A(I,MM1)IF (Y .EQ. 0.0D0) GO TO 160Y = Y / XA(I,MM1) = YCDO 140 J = M, N140 A(I,J) = A(I,J) - Y * A(M,J)CDO 150 J = 1, IGH150 A(J,M) = A(J,M) + Y * A(J,I)C160 CONTINUEC180 CONTINUEC200 RETURNENDSUBROUTINE ELTRAN(NM,N,LOW,IGH,A,INT,Z)CINTEGER I,J,N,KL,MM,MP,NM,IGH,LOW,MP1DOUBLE PRECISION A(NM,IGH),Z(NM,N)INTEGER INT(IGH)CC THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE ELMTRANS,C NUM. MATH. 16, 181-204(1970) BY PETERS AND WILKINSON.C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 372-395(1971).CC THIS SUBROUTINE ACCUMULATES THE STABILIZED ELEMENTARYC SIMILARITY TRANSFORMATIONS USED IN THE REDUCTION OF AC REAL GENERAL MATRIX TO UPPER HESSENBERG FORM BY ELMHES.CC ON INPUTCC NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONALC ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAMC DIMENSION STATEMENT.CC N IS THE ORDER OF THE MATRIX.CC LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCINGC SUBROUTINE BALANC. IF BALANC HAS NOT BEEN USED,C SET LOW=1, IGH=N.CC A CONTAINS THE MULTIPLIERS WHICH WERE USED IN THEC REDUCTION BY ELMHES IN ITS LOWER TRIANGLEC BELOW THE SUBDIAGONAL.CC INT CONTAINS INFORMATION ON THE ROWS AND COLUMNSC INTERCHANGED IN THE REDUCTION BY ELMHES.C ONLY ELEMENTS LOW THROUGH IGH ARE USED.CC ON OUTPUTCC Z CONTAINS THE TRANSFORMATION MATRIX PRODUCED IN THEC REDUCTION BY ELMHES.CC QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,C MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORYCC THIS VERSION DATED AUGUST 1983.CC ------------------------------------------------------------------CC .......... INITIALIZE Z TO IDENTITY MATRIX ..........DO 80 J = 1, NCDO 60 I = 1, N60 Z(I,J) = 0.0D0CZ(J,J) = 1.0D080 CONTINUECKL = IGH - LOW - 1IF (KL .LT. 1) GO TO 200C .......... FOR MP=IGH-1 STEP -1 UNTIL LOW+1 DO -- ..........DO 140 MM = 1, KLMP = IGH - MMMP1 = MP + 1CDO 100 I = MP1, IGH100 Z(I,MP) = A(I,MP-1)CI = INT(MP)IF (I .EQ. MP) GO TO 140CDO 130 J = MP, IGHZ(MP,J) = Z(I,J)Z(I,J) = 0.0D0130 CONTINUECZ(I,MP) = 1.0D0140 CONTINUEC200 RETURNENDDOUBLE PRECISION FUNCTION EPSLON (X)DOUBLE PRECISION XCC ESTIMATE UNIT ROUNDOFF IN QUANTITIES OF SIZE X.CDOUBLE PRECISION A,B,C,EPSCC THIS PROGRAM SHOULD FUNCTION PROPERLY ON ALL SYSTEMSC SATISFYING THE FOLLOWING TWO ASSUMPTIONS,C 1. THE BASE USED IN REPRESENTING FLOATING POINTC NUMBERS IS NOT A POWER OF THREE.C 2. THE QUANTITY A IN STATEMENT 10 IS REPRESENTED TOC THE ACCURACY USED IN FLOATING POINT VARIABLESC THAT ARE STORED IN MEMORY.C THE STATEMENT NUMBER 10 AND THE GO TO 10 ARE INTENDED TOC FORCE OPTIMIZING COMPILERS TO GENERATE CODE SATISFYINGC ASSUMPTION 2.C UNDER THESE ASSUMPTIONS, IT SHOULD BE TRUE THAT,C A IS NOT EXACTLY EQUAL TO FOUR-THIRDS,C B HAS A ZERO FOR ITS LAST BIT OR DIGIT,C C IS NOT EXACTLY EQUAL TO ONE,C EPS MEASURES THE SEPARATION OF 1.0 FROMC THE NEXT LARGER FLOATING POINT NUMBER.C THE DEVELOPERS OF EISPACK WOULD APPRECIATE BEING INFORMEDC ABOUT ANY SYSTEMS WHERE THESE ASSUMPTIONS DO NOT HOLD.CC THIS VERSION DATED 4/6/83.CA = 4.0D0/3.0D010 B = A - 1.0D0C = B + B + BEPS = DABS(C-1.0D0)IF (EPS .EQ. 0.0D0) GO TO 10EPSLON = EPS*DABS(X)RETURNENDSUBROUTINE HQR(NM,N,LOW,IGH,H,WR,WI,IERR)CINTEGER I,J,K,L,M,N,EN,LL,MM,NA,NM,IGH,ITN,ITS,LOW,MP2,ENM2,IERRDOUBLE PRECISION H(NM,N),WR(N),WI(N)DOUBLE PRECISION P,Q,R,S,T,W,X,Y,ZZ,NORM,TST1,TST2LOGICAL NOTLASCC THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE HQR,C NUM. MATH. 14, 219-231(1970) BY MARTIN, PETERS, AND WILKINSON.C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 359-371(1971).CC THIS SUBROUTINE FINDS THE EIGENVALUES OF A REALC UPPER HESSENBERG MATRIX BY THE QR METHOD.CC ON INPUTCC NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONALC ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAMC DIMENSION STATEMENT.CC N IS THE ORDER OF THE MATRIX.CC LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCINGC SUBROUTINE BALANC. IF BALANC HAS NOT BEEN USED,C SET LOW=1, IGH=N.CC H CONTAINS THE UPPER HESSENBERG MATRIX. INFORMATION ABOUTC THE TRANSFORMATIONS USED IN THE REDUCTION TO HESSENBERGC FORM BY ELMHES OR ORTHES, IF PERFORMED, IS STOREDC IN THE REMAINING TRIANGLE UNDER THE HESSENBERG MATRIX.CC ON OUTPUTCC H HAS BEEN DESTROYED. THEREFORE, IT MUST BE SAVEDC BEFORE CALLING HQR IF SUBSEQUENT CALCULATION ANDC BACK TRANSFORMATION OF EIGENVECTORS IS TO BE PERFORMED.CC WR AND WI CONTAIN THE REAL AND IMAGINARY PARTS,C RESPECTIVELY, OF THE EIGENVALUES. THE EIGENVALUESC ARE UNORDERED EXCEPT THAT COMPLEX CONJUGATE PAIRSC OF VALUES APPEAR CONSECUTIVELY WITH THE EIGENVALUEC HAVING THE POSITIVE IMAGINARY PART FIRST. IF ANC ERROR EXIT IS MADE, THE EIGENVALUES SHOULD BE CORRECTC FOR INDICES IERR+1,...,N.CC IERR IS SET TOC ZERO FOR NORMAL RETURN,C J IF THE LIMIT OF 30*N ITERATIONS IS EXHAUSTEDC WHILE THE J-TH EIGENVALUE IS BEING SOUGHT.CC QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,C MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORYCC THIS VERSION DATED AUGUST 1983.CC ------------------------------------------------------------------cc unnecessary initialization of L M P Q R to keep g77 -Wall happycL = 0M = 0P = 0.0D0Q = 0.0D0R = 0.0D0CIERR = 0NORM = 0.0D0K = 1C .......... STORE ROOTS ISOLATED BY BALANCC AND COMPUTE MATRIX NORM ..........DO 50 I = 1, NCDO 40 J = K, N40 NORM = NORM + DABS(H(I,J))CK = IIF (I .GE. LOW .AND. I .LE. IGH) GO TO 50WR(I) = H(I,I)WI(I) = 0.0D050 CONTINUECEN = IGHT = 0.0D0ITN = 30*NC .......... SEARCH FOR NEXT EIGENVALUES ..........60 IF (EN .LT. LOW) GO TO 1001ITS = 0NA = EN - 1ENM2 = NA - 1C .......... LOOK FOR SINGLE SMALL SUB-DIAGONAL ELEMENTC FOR L=EN STEP -1 UNTIL LOW DO -- ..........70 DO 80 LL = LOW, ENL = EN + LOW - LLIF (L .EQ. LOW) GO TO 100S = DABS(H(L-1,L-1)) + DABS(H(L,L))IF (S .EQ. 0.0D0) S = NORMTST1 = STST2 = TST1 + DABS(H(L,L-1))IF (TST2 .EQ. TST1) GO TO 10080 CONTINUEC .......... FORM SHIFT ..........100 X = H(EN,EN)IF (L .EQ. EN) GO TO 270Y = H(NA,NA)W = H(EN,NA) * H(NA,EN)IF (L .EQ. NA) GO TO 280IF (ITN .EQ. 0) GO TO 1000IF (ITS .NE. 10 .AND. ITS .NE. 20) GO TO 130C .......... FORM EXCEPTIONAL SHIFT ..........T = T + XCDO 120 I = LOW, EN120 H(I,I) = H(I,I) - XCS = DABS(H(EN,NA)) + DABS(H(NA,ENM2))X = 0.75D0 * SY = XW = -0.4375D0 * S * S130 ITS = ITS + 1ITN = ITN - 1C .......... LOOK FOR TWO CONSECUTIVE SMALLC SUB-DIAGONAL ELEMENTS.C FOR M=EN-2 STEP -1 UNTIL L DO -- ..........DO 140 MM = L, ENM2M = ENM2 + L - MMZZ = H(M,M)R = X - ZZS = Y - ZZP = (R * S - W) / H(M+1,M) + H(M,M+1)Q = H(M+1,M+1) - ZZ - R - SR = H(M+2,M+1)S = DABS(P) + DABS(Q) + DABS(R)P = P / SQ = Q / SR = R / SIF (M .EQ. L) GO TO 150TST1 = DABS(P)*(DABS(H(M-1,M-1)) + DABS(ZZ) + DABS(H(M+1,M+1)))TST2 = TST1 + DABS(H(M,M-1))*(DABS(Q) + DABS(R))IF (TST2 .EQ. TST1) GO TO 150140 CONTINUEC150 MP2 = M + 2CDO 160 I = MP2, ENH(I,I-2) = 0.0D0IF (I .EQ. MP2) GO TO 160H(I,I-3) = 0.0D0160 CONTINUEC .......... DOUBLE QR STEP INVOLVING ROWS L TO EN ANDC COLUMNS M TO EN ..........DO 260 K = M, NANOTLAS = K .NE. NAIF (K .EQ. M) GO TO 170P = H(K,K-1)Q = H(K+1,K-1)R = 0.0D0IF (NOTLAS) R = H(K+2,K-1)X = DABS(P) + DABS(Q) + DABS(R)IF (X .EQ. 0.0D0) GO TO 260P = P / XQ = Q / XR = R / X170 S = DSIGN(DSQRT(P*P+Q*Q+R*R),P)IF (K .EQ. M) GO TO 180H(K,K-1) = -S * XGO TO 190180 IF (L .NE. M) H(K,K-1) = -H(K,K-1)190 P = P + SX = P / SY = Q / SZZ = R / SQ = Q / PR = R / PIF (NOTLAS) GO TO 225C .......... ROW MODIFICATION ..........DO 200 J = K, NP = H(K,J) + Q * H(K+1,J)H(K,J) = H(K,J) - P * XH(K+1,J) = H(K+1,J) - P * Y200 CONTINUECJ = MIN0(EN,K+3)C .......... COLUMN MODIFICATION ..........DO 210 I = 1, JP = X * H(I,K) + Y * H(I,K+1)H(I,K) = H(I,K) - PH(I,K+1) = H(I,K+1) - P * Q210 CONTINUEGO TO 255225 CONTINUEC .......... ROW MODIFICATION ..........DO 230 J = K, NP = H(K,J) + Q * H(K+1,J) + R * H(K+2,J)H(K,J) = H(K,J) - P * XH(K+1,J) = H(K+1,J) - P * YH(K+2,J) = H(K+2,J) - P * ZZ230 CONTINUECJ = MIN0(EN,K+3)C .......... COLUMN MODIFICATION ..........DO 240 I = 1, JP = X * H(I,K) + Y * H(I,K+1) + ZZ * H(I,K+2)H(I,K) = H(I,K) - PH(I,K+1) = H(I,K+1) - P * QH(I,K+2) = H(I,K+2) - P * R240 CONTINUE255 CONTINUEC260 CONTINUECGO TO 70C .......... ONE ROOT FOUND ..........270 WR(EN) = X + TWI(EN) = 0.0D0EN = NAGO TO 60C .......... TWO ROOTS FOUND ..........280 P = (Y - X) / 2.0D0Q = P * P + WZZ = DSQRT(DABS(Q))X = X + TIF (Q .LT. 0.0D0) GO TO 320C .......... REAL PAIR ..........ZZ = P + DSIGN(ZZ,P)WR(NA) = X + ZZWR(EN) = WR(NA)IF (ZZ .NE. 0.0D0) WR(EN) = X - W / ZZWI(NA) = 0.0D0WI(EN) = 0.0D0GO TO 330C .......... COMPLEX PAIR ..........320 WR(NA) = X + PWR(EN) = X + PWI(NA) = ZZWI(EN) = -ZZ330 EN = ENM2GO TO 60C .......... SET ERROR -- ALL EIGENVALUES HAVE NOTC CONVERGED AFTER 30*N ITERATIONS ..........1000 IERR = EN1001 RETURNENDSUBROUTINE HQR2(NM,N,LOW,IGH,H,WR,WI,Z,IERR)CINTEGER I,J,K,L,M,N,EN,II,JJ,LL,MM,NA,NM,NN,X IGH,ITN,ITS,LOW,MP2,ENM2,IERRDOUBLE PRECISION H(NM,N),WR(N),WI(N),Z(NM,N)DOUBLE PRECISION P,Q,R,S,T,W,X,Y,RA,SA,VI,VR,ZZ,NORM,TST1,TST2LOGICAL NOTLASCC THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE HQR2,C NUM. MATH. 16, 181-204(1970) BY PETERS AND WILKINSON.C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 372-395(1971).CC THIS SUBROUTINE FINDS THE EIGENVALUES AND EIGENVECTORSC OF A REAL UPPER HESSENBERG MATRIX BY THE QR METHOD. THEC EIGENVECTORS OF A REAL GENERAL MATRIX CAN ALSO BE FOUNDC IF ELMHES AND ELTRAN OR ORTHES AND ORTRAN HAVEC BEEN USED TO REDUCE THIS GENERAL MATRIX TO HESSENBERG FORMC AND TO ACCUMULATE THE SIMILARITY TRANSFORMATIONS.CC ON INPUTCC NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONALC ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAMC DIMENSION STATEMENT.CC N IS THE ORDER OF THE MATRIX.CC LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCINGC SUBROUTINE BALANC. IF BALANC HAS NOT BEEN USED,C SET LOW=1, IGH=N.CC H CONTAINS THE UPPER HESSENBERG MATRIX.CC Z CONTAINS THE TRANSFORMATION MATRIX PRODUCED BY ELTRANC AFTER THE REDUCTION BY ELMHES, OR BY ORTRAN AFTER THEC REDUCTION BY ORTHES, IF PERFORMED. IF THE EIGENVECTORSC OF THE HESSENBERG MATRIX ARE DESIRED, Z MUST CONTAIN THEC IDENTITY MATRIX.CC ON OUTPUTCC H HAS BEEN DESTROYED.CC WR AND WI CONTAIN THE REAL AND IMAGINARY PARTS,C RESPECTIVELY, OF THE EIGENVALUES. THE EIGENVALUESC ARE UNORDERED EXCEPT THAT COMPLEX CONJUGATE PAIRSC OF VALUES APPEAR CONSECUTIVELY WITH THE EIGENVALUEC HAVING THE POSITIVE IMAGINARY PART FIRST. IF ANC ERROR EXIT IS MADE, THE EIGENVALUES SHOULD BE CORRECTC FOR INDICES IERR+1,...,N.CC Z CONTAINS THE REAL AND IMAGINARY PARTS OF THE EIGENVECTORS.C IF THE I-TH EIGENVALUE IS REAL, THE I-TH COLUMN OF ZC CONTAINS ITS EIGENVECTOR. IF THE I-TH EIGENVALUE IS COMPLEXC WITH POSITIVE IMAGINARY PART, THE I-TH AND (I+1)-THC COLUMNS OF Z CONTAIN THE REAL AND IMAGINARY PARTS OF ITSC EIGENVECTOR. THE EIGENVECTORS ARE UNNORMALIZED. IF ANC ERROR EXIT IS MADE, NONE OF THE EIGENVECTORS HAS BEEN FOUND.CC IERR IS SET TOC ZERO FOR NORMAL RETURN,C J IF THE LIMIT OF 30*N ITERATIONS IS EXHAUSTEDC WHILE THE J-TH EIGENVALUE IS BEING SOUGHT.CC CALLS CDIV FOR COMPLEX DIVISION.CC QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,C MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORYCC THIS VERSION DATED AUGUST 1983.CC ------------------------------------------------------------------cc unnecessary initialization of L M P R S to keep g77 -Wall happycL = 0M = 0P = 0.0D0R = 0.0D0S = 0.0D0CIERR = 0NORM = 0.0D0K = 1C .......... STORE ROOTS ISOLATED BY BALANCC AND COMPUTE MATRIX NORM ..........DO 50 I = 1, NCDO 40 J = K, N40 NORM = NORM + DABS(H(I,J))CK = IIF (I .GE. LOW .AND. I .LE. IGH) GO TO 50WR(I) = H(I,I)WI(I) = 0.0D050 CONTINUECEN = IGHT = 0.0D0ITN = 30*NC .......... SEARCH FOR NEXT EIGENVALUES ..........60 IF (EN .LT. LOW) GO TO 340ITS = 0NA = EN - 1ENM2 = NA - 1C .......... LOOK FOR SINGLE SMALL SUB-DIAGONAL ELEMENTC FOR L=EN STEP -1 UNTIL LOW DO -- ..........70 DO 80 LL = LOW, ENL = EN + LOW - LLIF (L .EQ. LOW) GO TO 100S = DABS(H(L-1,L-1)) + DABS(H(L,L))IF (S .EQ. 0.0D0) S = NORMTST1 = STST2 = TST1 + DABS(H(L,L-1))IF (TST2 .EQ. TST1) GO TO 10080 CONTINUEC .......... FORM SHIFT ..........100 X = H(EN,EN)IF (L .EQ. EN) GO TO 270Y = H(NA,NA)W = H(EN,NA) * H(NA,EN)IF (L .EQ. NA) GO TO 280IF (ITN .EQ. 0) GO TO 1000IF (ITS .NE. 10 .AND. ITS .NE. 20) GO TO 130C .......... FORM EXCEPTIONAL SHIFT ..........T = T + XCDO 120 I = LOW, EN120 H(I,I) = H(I,I) - XCS = DABS(H(EN,NA)) + DABS(H(NA,ENM2))X = 0.75D0 * SY = XW = -0.4375D0 * S * S130 ITS = ITS + 1ITN = ITN - 1C .......... LOOK FOR TWO CONSECUTIVE SMALLC SUB-DIAGONAL ELEMENTS.C FOR M=EN-2 STEP -1 UNTIL L DO -- ..........DO 140 MM = L, ENM2M = ENM2 + L - MMZZ = H(M,M)R = X - ZZS = Y - ZZP = (R * S - W) / H(M+1,M) + H(M,M+1)Q = H(M+1,M+1) - ZZ - R - SR = H(M+2,M+1)S = DABS(P) + DABS(Q) + DABS(R)P = P / SQ = Q / SR = R / SIF (M .EQ. L) GO TO 150TST1 = DABS(P)*(DABS(H(M-1,M-1)) + DABS(ZZ) + DABS(H(M+1,M+1)))TST2 = TST1 + DABS(H(M,M-1))*(DABS(Q) + DABS(R))IF (TST2 .EQ. TST1) GO TO 150140 CONTINUEC150 MP2 = M + 2CDO 160 I = MP2, ENH(I,I-2) = 0.0D0IF (I .EQ. MP2) GO TO 160H(I,I-3) = 0.0D0160 CONTINUEC .......... DOUBLE QR STEP INVOLVING ROWS L TO EN ANDC COLUMNS M TO EN ..........DO 260 K = M, NANOTLAS = K .NE. NAIF (K .EQ. M) GO TO 170P = H(K,K-1)Q = H(K+1,K-1)R = 0.0D0IF (NOTLAS) R = H(K+2,K-1)X = DABS(P) + DABS(Q) + DABS(R)IF (X .EQ. 0.0D0) GO TO 260P = P / XQ = Q / XR = R / X170 S = DSIGN(DSQRT(P*P+Q*Q+R*R),P)IF (K .EQ. M) GO TO 180H(K,K-1) = -S * XGO TO 190180 IF (L .NE. M) H(K,K-1) = -H(K,K-1)190 P = P + SX = P / SY = Q / SZZ = R / SQ = Q / PR = R / PIF (NOTLAS) GO TO 225C .......... ROW MODIFICATION ..........DO 200 J = K, NP = H(K,J) + Q * H(K+1,J)H(K,J) = H(K,J) - P * XH(K+1,J) = H(K+1,J) - P * Y200 CONTINUECJ = MIN0(EN,K+3)C .......... COLUMN MODIFICATION ..........DO 210 I = 1, JP = X * H(I,K) + Y * H(I,K+1)H(I,K) = H(I,K) - PH(I,K+1) = H(I,K+1) - P * Q210 CONTINUEC .......... ACCUMULATE TRANSFORMATIONS ..........DO 220 I = LOW, IGHP = X * Z(I,K) + Y * Z(I,K+1)Z(I,K) = Z(I,K) - PZ(I,K+1) = Z(I,K+1) - P * Q220 CONTINUEGO TO 255225 CONTINUEC .......... ROW MODIFICATION ..........DO 230 J = K, NP = H(K,J) + Q * H(K+1,J) + R * H(K+2,J)H(K,J) = H(K,J) - P * XH(K+1,J) = H(K+1,J) - P * YH(K+2,J) = H(K+2,J) - P * ZZ230 CONTINUECJ = MIN0(EN,K+3)C .......... COLUMN MODIFICATION ..........DO 240 I = 1, JP = X * H(I,K) + Y * H(I,K+1) + ZZ * H(I,K+2)H(I,K) = H(I,K) - PH(I,K+1) = H(I,K+1) - P * QH(I,K+2) = H(I,K+2) - P * R240 CONTINUEC .......... ACCUMULATE TRANSFORMATIONS ..........DO 250 I = LOW, IGHP = X * Z(I,K) + Y * Z(I,K+1) + ZZ * Z(I,K+2)Z(I,K) = Z(I,K) - PZ(I,K+1) = Z(I,K+1) - P * QZ(I,K+2) = Z(I,K+2) - P * R250 CONTINUE255 CONTINUEC260 CONTINUECGO TO 70C .......... ONE ROOT FOUND ..........270 H(EN,EN) = X + TWR(EN) = H(EN,EN)WI(EN) = 0.0D0EN = NAGO TO 60C .......... TWO ROOTS FOUND ..........280 P = (Y - X) / 2.0D0Q = P * P + WZZ = DSQRT(DABS(Q))H(EN,EN) = X + TX = H(EN,EN)H(NA,NA) = Y + TIF (Q .LT. 0.0D0) GO TO 320C .......... REAL PAIR ..........ZZ = P + DSIGN(ZZ,P)WR(NA) = X + ZZWR(EN) = WR(NA)IF (ZZ .NE. 0.0D0) WR(EN) = X - W / ZZWI(NA) = 0.0D0WI(EN) = 0.0D0X = H(EN,NA)S = DABS(X) + DABS(ZZ)P = X / SQ = ZZ / SR = DSQRT(P*P+Q*Q)P = P / RQ = Q / RC .......... ROW MODIFICATION ..........DO 290 J = NA, NZZ = H(NA,J)H(NA,J) = Q * ZZ + P * H(EN,J)H(EN,J) = Q * H(EN,J) - P * ZZ290 CONTINUEC .......... COLUMN MODIFICATION ..........DO 300 I = 1, ENZZ = H(I,NA)H(I,NA) = Q * ZZ + P * H(I,EN)H(I,EN) = Q * H(I,EN) - P * ZZ300 CONTINUEC .......... ACCUMULATE TRANSFORMATIONS ..........DO 310 I = LOW, IGHZZ = Z(I,NA)Z(I,NA) = Q * ZZ + P * Z(I,EN)Z(I,EN) = Q * Z(I,EN) - P * ZZ310 CONTINUECGO TO 330C .......... COMPLEX PAIR ..........320 WR(NA) = X + PWR(EN) = X + PWI(NA) = ZZWI(EN) = -ZZ330 EN = ENM2GO TO 60C .......... ALL ROOTS FOUND. BACKSUBSTITUTE TO FINDC VECTORS OF UPPER TRIANGULAR FORM ..........340 IF (NORM .EQ. 0.0D0) GO TO 1001C .......... FOR EN=N STEP -1 UNTIL 1 DO -- ..........DO 800 NN = 1, NEN = N + 1 - NNP = WR(EN)Q = WI(EN)NA = EN - 1IF (Q) 710, 600, 800C .......... REAL VECTOR ..........600 M = ENH(EN,EN) = 1.0D0IF (NA .EQ. 0) GO TO 800C .......... FOR I=EN-1 STEP -1 UNTIL 1 DO -- ..........DO 700 II = 1, NAI = EN - IIW = H(I,I) - PR = 0.0D0CDO 610 J = M, EN610 R = R + H(I,J) * H(J,EN)CIF (WI(I) .GE. 0.0D0) GO TO 630ZZ = WS = RGO TO 700630 M = IIF (WI(I) .NE. 0.0D0) GO TO 640T = WIF (T .NE. 0.0D0) GO TO 635TST1 = NORMT = TST1632 T = 0.01D0 * TTST2 = NORM + TIF (TST2 .GT. TST1) GO TO 632635 H(I,EN) = -R / TGO TO 680C .......... SOLVE REAL EQUATIONS ..........640 X = H(I,I+1)Y = H(I+1,I)Q = (WR(I) - P) * (WR(I) - P) + WI(I) * WI(I)T = (X * S - ZZ * R) / QH(I,EN) = TIF (DABS(X) .LE. DABS(ZZ)) GO TO 650H(I+1,EN) = (-R - W * T) / XGO TO 680650 H(I+1,EN) = (-S - Y * T) / ZZCC .......... OVERFLOW CONTROL ..........680 T = DABS(H(I,EN))IF (T .EQ. 0.0D0) GO TO 700TST1 = TTST2 = TST1 + 1.0D0/TST1IF (TST2 .GT. TST1) GO TO 700DO 690 J = I, ENH(J,EN) = H(J,EN)/T690 CONTINUEC700 CONTINUEC .......... END REAL VECTOR ..........GO TO 800C .......... COMPLEX VECTOR ..........710 M = NAC .......... LAST VECTOR COMPONENT CHOSEN IMAGINARY SO THATC EIGENVECTOR MATRIX IS TRIANGULAR ..........IF (DABS(H(EN,NA)) .LE. DABS(H(NA,EN))) GO TO 720H(NA,NA) = Q / H(EN,NA)H(NA,EN) = -(H(EN,EN) - P) / H(EN,NA)GO TO 730720 CALL CDIV(0.0D0,-H(NA,EN),H(NA,NA)-P,Q,H(NA,NA),H(NA,EN))730 H(EN,NA) = 0.0D0H(EN,EN) = 1.0D0ENM2 = NA - 1IF (ENM2 .EQ. 0) GO TO 800C .......... FOR I=EN-2 STEP -1 UNTIL 1 DO -- ..........DO 795 II = 1, ENM2I = NA - IIW = H(I,I) - PRA = 0.0D0SA = 0.0D0CDO 760 J = M, ENRA = RA + H(I,J) * H(J,NA)SA = SA + H(I,J) * H(J,EN)760 CONTINUECIF (WI(I) .GE. 0.0D0) GO TO 770ZZ = WR = RAS = SAGO TO 795770 M = IIF (WI(I) .NE. 0.0D0) GO TO 780CALL CDIV(-RA,-SA,W,Q,H(I,NA),H(I,EN))GO TO 790C .......... SOLVE COMPLEX EQUATIONS ..........780 X = H(I,I+1)Y = H(I+1,I)VR = (WR(I) - P) * (WR(I) - P) + WI(I) * WI(I) - Q * QVI = (WR(I) - P) * 2.0D0 * QIF (VR .NE. 0.0D0 .OR. VI .NE. 0.0D0) GO TO 784TST1 = NORM * (DABS(W) + DABS(Q) + DABS(X)X + DABS(Y) + DABS(ZZ))VR = TST1783 VR = 0.01D0 * VRTST2 = TST1 + VRIF (TST2 .GT. TST1) GO TO 783784 CALL CDIV(X*R-ZZ*RA+Q*SA,X*S-ZZ*SA-Q*RA,VR,VI,X H(I,NA),H(I,EN))IF (DABS(X) .LE. DABS(ZZ) + DABS(Q)) GO TO 785H(I+1,NA) = (-RA - W * H(I,NA) + Q * H(I,EN)) / XH(I+1,EN) = (-SA - W * H(I,EN) - Q * H(I,NA)) / XGO TO 790785 CALL CDIV(-R-Y*H(I,NA),-S-Y*H(I,EN),ZZ,Q,X H(I+1,NA),H(I+1,EN))CC .......... OVERFLOW CONTROL ..........790 T = DMAX1(DABS(H(I,NA)), DABS(H(I,EN)))IF (T .EQ. 0.0D0) GO TO 795TST1 = TTST2 = TST1 + 1.0D0/TST1IF (TST2 .GT. TST1) GO TO 795DO 792 J = I, ENH(J,NA) = H(J,NA)/TH(J,EN) = H(J,EN)/T792 CONTINUEC795 CONTINUEC .......... END COMPLEX VECTOR ..........800 CONTINUEC .......... END BACK SUBSTITUTION.C VECTORS OF ISOLATED ROOTS ..........DO 840 I = 1, NIF (I .GE. LOW .AND. I .LE. IGH) GO TO 840CDO 820 J = I, N820 Z(I,J) = H(I,J)C840 CONTINUEC .......... MULTIPLY BY TRANSFORMATION MATRIX TO GIVEC VECTORS OF ORIGINAL FULL MATRIX.C FOR J=N STEP -1 UNTIL LOW DO -- ..........DO 880 JJ = LOW, NJ = N + LOW - JJM = MIN0(J,IGH)CDO 880 I = LOW, IGHZZ = 0.0D0CDO 860 K = LOW, M860 ZZ = ZZ + Z(I,K) * H(K,J)CZ(I,J) = ZZ880 CONTINUECGO TO 1001C .......... SET ERROR -- ALL EIGENVALUES HAVE NOTC CONVERGED AFTER 30*N ITERATIONS ..........1000 IERR = EN1001 RETURNENDSUBROUTINE HTRIBK(NM,N,AR,AI,TAU,M,ZR,ZI)CINTEGER I,J,K,L,M,N,NMDOUBLE PRECISION AR(NM,N),AI(NM,N),TAU(2,N),ZR(NM,M),ZI(NM,M)DOUBLE PRECISION H,S,SICC THIS SUBROUTINE IS A TRANSLATION OF A COMPLEX ANALOGUE OFC THE ALGOL PROCEDURE TRBAK1, NUM. MATH. 11, 181-195(1968)C BY MARTIN, REINSCH, AND WILKINSON.C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971).CC THIS SUBROUTINE FORMS THE EIGENVECTORS OF A COMPLEX HERMITIANC MATRIX BY BACK TRANSFORMING THOSE OF THE CORRESPONDINGC REAL SYMMETRIC TRIDIAGONAL MATRIX DETERMINED BY HTRIDI.CC ON INPUTCC NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONALC ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAMC DIMENSION STATEMENT.CC N IS THE ORDER OF THE MATRIX.CC AR AND AI CONTAIN INFORMATION ABOUT THE UNITARY TRANS-C FORMATIONS USED IN THE REDUCTION BY HTRIDI IN THEIRC FULL LOWER TRIANGLES EXCEPT FOR THE DIAGONAL OF AR.CC TAU CONTAINS FURTHER INFORMATION ABOUT THE TRANSFORMATIONS.CC M IS THE NUMBER OF EIGENVECTORS TO BE BACK TRANSFORMED.CC ZR CONTAINS THE EIGENVECTORS TO BE BACK TRANSFORMEDC IN ITS FIRST M COLUMNS.CC ON OUTPUTCC ZR AND ZI CONTAIN THE REAL AND IMAGINARY PARTS,C RESPECTIVELY, OF THE TRANSFORMED EIGENVECTORSC IN THEIR FIRST M COLUMNS.CC NOTE THAT THE LAST COMPONENT OF EACH RETURNED VECTORC IS REAL AND THAT VECTOR EUCLIDEAN NORMS ARE PRESERVED.CC QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,C MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORYCC THIS VERSION DATED AUGUST 1983.CC ------------------------------------------------------------------CIF (M .EQ. 0) GO TO 200C .......... TRANSFORM THE EIGENVECTORS OF THE REAL SYMMETRICC TRIDIAGONAL MATRIX TO THOSE OF THE HERMITIANC TRIDIAGONAL MATRIX. ..........DO 50 K = 1, NCDO 50 J = 1, MZI(K,J) = -ZR(K,J) * TAU(2,K)ZR(K,J) = ZR(K,J) * TAU(1,K)50 CONTINUECIF (N .EQ. 1) GO TO 200C .......... RECOVER AND APPLY THE HOUSEHOLDER MATRICES ..........DO 140 I = 2, NL = I - 1H = AI(I,I)IF (H .EQ. 0.0D0) GO TO 140CDO 130 J = 1, MS = 0.0D0SI = 0.0D0CDO 110 K = 1, LS = S + AR(I,K) * ZR(K,J) - AI(I,K) * ZI(K,J)SI = SI + AR(I,K) * ZI(K,J) + AI(I,K) * ZR(K,J)110 CONTINUEC .......... DOUBLE DIVISIONS AVOID POSSIBLE UNDERFLOW ..........S = (S / H) / HSI = (SI / H) / HCDO 120 K = 1, LZR(K,J) = ZR(K,J) - S * AR(I,K) - SI * AI(I,K)ZI(K,J) = ZI(K,J) - SI * AR(I,K) + S * AI(I,K)120 CONTINUEC130 CONTINUEC140 CONTINUEC200 RETURNENDSUBROUTINE HTRIDI(NM,N,AR,AI,D,E,E2,TAU)CINTEGER I,J,K,L,N,II,NM,JP1DOUBLE PRECISION AR(NM,N),AI(NM,N),D(N),E(N),E2(N),TAU(2,N)DOUBLE PRECISION F,G,H,FI,GI,HH,SI,SCALE,PYTHAGCC THIS SUBROUTINE IS A TRANSLATION OF A COMPLEX ANALOGUE OFC THE ALGOL PROCEDURE TRED1, NUM. MATH. 11, 181-195(1968)C BY MARTIN, REINSCH, AND WILKINSON.C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971).CC THIS SUBROUTINE REDUCES A COMPLEX HERMITIAN MATRIXC TO A REAL SYMMETRIC TRIDIAGONAL MATRIX USINGC UNITARY SIMILARITY TRANSFORMATIONS.CC ON INPUTCC NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONALC ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAMC DIMENSION STATEMENT.CC N IS THE ORDER OF THE MATRIX.CC AR AND AI CONTAIN THE REAL AND IMAGINARY PARTS,C RESPECTIVELY, OF THE COMPLEX HERMITIAN INPUT MATRIX.C ONLY THE LOWER TRIANGLE OF THE MATRIX NEED BE SUPPLIED.CC ON OUTPUTCC AR AND AI CONTAIN INFORMATION ABOUT THE UNITARY TRANS-C FORMATIONS USED IN THE REDUCTION IN THEIR FULL LOWERC TRIANGLES. THEIR STRICT UPPER TRIANGLES AND THEC DIAGONAL OF AR ARE UNALTERED.CC D CONTAINS THE DIAGONAL ELEMENTS OF THE THE TRIDIAGONAL MATRIX.CC E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE TRIDIAGONALC MATRIX IN ITS LAST N-1 POSITIONS. E(1) IS SET TO ZERO.CC E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E.C E2 MAY COINCIDE WITH E IF THE SQUARES ARE NOT NEEDED.CC TAU CONTAINS FURTHER INFORMATION ABOUT THE TRANSFORMATIONS.CC CALLS PYTHAG FOR DSQRT(A*A + B*B) .CC QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,C MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORYCC THIS VERSION DATED AUGUST 1983.CC ------------------------------------------------------------------CTAU(1,N) = 1.0D0TAU(2,N) = 0.0D0CDO 100 I = 1, N100 D(I) = AR(I,I)C .......... FOR I=N STEP -1 UNTIL 1 DO -- ..........DO 300 II = 1, NI = N + 1 - IIL = I - 1H = 0.0D0SCALE = 0.0D0IF (L .LT. 1) GO TO 130C .......... SCALE ROW (ALGOL TOL THEN NOT NEEDED) ..........DO 120 K = 1, L120 SCALE = SCALE + DABS(AR(I,K)) + DABS(AI(I,K))CIF (SCALE .NE. 0.0D0) GO TO 140TAU(1,L) = 1.0D0TAU(2,L) = 0.0D0130 E(I) = 0.0D0E2(I) = 0.0D0GO TO 290C140 DO 150 K = 1, LAR(I,K) = AR(I,K) / SCALEAI(I,K) = AI(I,K) / SCALEH = H + AR(I,K) * AR(I,K) + AI(I,K) * AI(I,K)150 CONTINUECE2(I) = SCALE * SCALE * HG = DSQRT(H)E(I) = SCALE * GF = PYTHAG(AR(I,L),AI(I,L))C .......... FORM NEXT DIAGONAL ELEMENT OF MATRIX T ..........IF (F .EQ. 0.0D0) GO TO 160TAU(1,L) = (AI(I,L) * TAU(2,I) - AR(I,L) * TAU(1,I)) / FSI = (AR(I,L) * TAU(2,I) + AI(I,L) * TAU(1,I)) / FH = H + F * GG = 1.0D0 + G / FAR(I,L) = G * AR(I,L)AI(I,L) = G * AI(I,L)IF (L .EQ. 1) GO TO 270GO TO 170160 TAU(1,L) = -TAU(1,I)SI = TAU(2,I)AR(I,L) = G170 F = 0.0D0CDO 240 J = 1, LG = 0.0D0GI = 0.0D0C .......... FORM ELEMENT OF A*U ..........DO 180 K = 1, JG = G + AR(J,K) * AR(I,K) + AI(J,K) * AI(I,K)GI = GI - AR(J,K) * AI(I,K) + AI(J,K) * AR(I,K)180 CONTINUECJP1 = J + 1IF (L .LT. JP1) GO TO 220CDO 200 K = JP1, LG = G + AR(K,J) * AR(I,K) - AI(K,J) * AI(I,K)GI = GI - AR(K,J) * AI(I,K) - AI(K,J) * AR(I,K)200 CONTINUEC .......... FORM ELEMENT OF P ..........220 E(J) = G / HTAU(2,J) = GI / HF = F + E(J) * AR(I,J) - TAU(2,J) * AI(I,J)240 CONTINUECHH = F / (H + H)C .......... FORM REDUCED A ..........DO 260 J = 1, LF = AR(I,J)G = E(J) - HH * FE(J) = GFI = -AI(I,J)GI = TAU(2,J) - HH * FITAU(2,J) = -GICDO 260 K = 1, JAR(J,K) = AR(J,K) - F * E(K) - G * AR(I,K)X + FI * TAU(2,K) + GI * AI(I,K)AI(J,K) = AI(J,K) - F * TAU(2,K) - G * AI(I,K)X - FI * E(K) - GI * AR(I,K)260 CONTINUEC270 DO 280 K = 1, LAR(I,K) = SCALE * AR(I,K)AI(I,K) = SCALE * AI(I,K)280 CONTINUECTAU(2,L) = -SI290 HH = D(I)D(I) = AR(I,I)AR(I,I) = HHAI(I,I) = SCALE * DSQRT(H)300 CONTINUECRETURNENDDOUBLE PRECISION FUNCTION PYTHAG(A,B)DOUBLE PRECISION A,BCC FINDS DSQRT(A**2+B**2) WITHOUT OVERFLOW OR DESTRUCTIVE UNDERFLOWCDOUBLE PRECISION P,R,S,T,UP = DMAX1(DABS(A),DABS(B))IF (P .EQ. 0.0D0) GO TO 20R = (DMIN1(DABS(A),DABS(B))/P)**210 CONTINUET = 4.0D0 + RIF (T .EQ. 4.0D0) GO TO 20S = R/TU = 1.0D0 + 2.0D0*SP = U*PR = (S/U)**2 * RGO TO 1020 PYTHAG = PRETURNENDSUBROUTINE TQL1(N,D,E,IERR)CINTEGER I,J,L,M,N,II,L1,L2,MML,IERRDOUBLE PRECISION D(N),E(N)DOUBLE PRECISION C,C2,C3,DL1,EL1,F,G,H,P,R,S,S2,TST1,TST2,PYTHAGCC THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TQL1,C NUM. MATH. 11, 293-306(1968) BY BOWDLER, MARTIN, REINSCH, ANDC WILKINSON.C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 227-240(1971).CC THIS SUBROUTINE FINDS THE EIGENVALUES OF A SYMMETRICC TRIDIAGONAL MATRIX BY THE QL METHOD.CC ON INPUTCC N IS THE ORDER OF THE MATRIX.CC D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX.CC E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE INPUT MATRIXC IN ITS LAST N-1 POSITIONS. E(1) IS ARBITRARY.CC ON OUTPUTCC D CONTAINS THE EIGENVALUES IN ASCENDING ORDER. IF ANC ERROR EXIT IS MADE, THE EIGENVALUES ARE CORRECT ANDC ORDERED FOR INDICES 1,2,...IERR-1, BUT MAY NOT BEC THE SMALLEST EIGENVALUES.CC E HAS BEEN DESTROYED.CC IERR IS SET TOC ZERO FOR NORMAL RETURN,C J IF THE J-TH EIGENVALUE HAS NOT BEENC DETERMINED AFTER 30 ITERATIONS.CC CALLS PYTHAG FOR DSQRT(A*A + B*B) .CC QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,C MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORYCC THIS VERSION DATED AUGUST 1983.CC ------------------------------------------------------------------cc unnecessary initialization of C3 and S2 to keep g77 -Wall happycC3 = 0.0D0S2 = 0.0D0CIERR = 0IF (N .EQ. 1) GO TO 1001CDO 100 I = 2, N100 E(I-1) = E(I)CF = 0.0D0TST1 = 0.0D0E(N) = 0.0D0CDO 290 L = 1, NJ = 0H = DABS(D(L)) + DABS(E(L))IF (TST1 .LT. H) TST1 = HC .......... LOOK FOR SMALL SUB-DIAGONAL ELEMENT ..........DO 110 M = L, NTST2 = TST1 + DABS(E(M))IF (TST2 .EQ. TST1) GO TO 120C .......... E(N) IS ALWAYS ZERO, SO THERE IS NO EXITC THROUGH THE BOTTOM OF THE LOOP ..........110 CONTINUEC120 IF (M .EQ. L) GO TO 210130 IF (J .EQ. 30) GO TO 1000J = J + 1C .......... FORM SHIFT ..........L1 = L + 1L2 = L1 + 1G = D(L)P = (D(L1) - G) / (2.0D0 * E(L))R = PYTHAG(P,1.0D0)D(L) = E(L) / (P + DSIGN(R,P))D(L1) = E(L) * (P + DSIGN(R,P))DL1 = D(L1)H = G - D(L)IF (L2 .GT. N) GO TO 145CDO 140 I = L2, N140 D(I) = D(I) - HC145 F = F + HC .......... QL TRANSFORMATION ..........P = D(M)C = 1.0D0C2 = CEL1 = E(L1)S = 0.0D0MML = M - LC .......... FOR I=M-1 STEP -1 UNTIL L DO -- ..........DO 200 II = 1, MMLC3 = C2C2 = CS2 = SI = M - IIG = C * E(I)H = C * PR = PYTHAG(P,E(I))E(I+1) = S * RS = E(I) / RC = P / RP = C * D(I) - S * GD(I+1) = H + S * (C * G + S * D(I))200 CONTINUECP = -S * S2 * C3 * EL1 * E(L) / DL1E(L) = S * PD(L) = C * PTST2 = TST1 + DABS(E(L))IF (TST2 .GT. TST1) GO TO 130210 P = D(L) + FC .......... ORDER EIGENVALUES ..........IF (L .EQ. 1) GO TO 250C .......... FOR I=L STEP -1 UNTIL 2 DO -- ..........DO 230 II = 2, LI = L + 2 - IIIF (P .GE. D(I-1)) GO TO 270D(I) = D(I-1)230 CONTINUEC250 I = 1270 D(I) = P290 CONTINUECGO TO 1001C .......... SET ERROR -- NO CONVERGENCE TO ANC EIGENVALUE AFTER 30 ITERATIONS ..........1000 IERR = L1001 RETURNENDSUBROUTINE TQL2(NM,N,D,E,Z,IERR)CINTEGER I,J,K,L,M,N,II,L1,L2,NM,MML,IERRDOUBLE PRECISION D(N),E(N),Z(NM,N)DOUBLE PRECISION C,C2,C3,DL1,EL1,F,G,H,P,R,S,S2,TST1,TST2,PYTHAGCC THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TQL2,C NUM. MATH. 11, 293-306(1968) BY BOWDLER, MARTIN, REINSCH, ANDC WILKINSON.C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 227-240(1971).CC THIS SUBROUTINE FINDS THE EIGENVALUES AND EIGENVECTORSC OF A SYMMETRIC TRIDIAGONAL MATRIX BY THE QL METHOD.C THE EIGENVECTORS OF A FULL SYMMETRIC MATRIX CAN ALSOC BE FOUND IF TRED2 HAS BEEN USED TO REDUCE THISC FULL MATRIX TO TRIDIAGONAL FORM.CC ON INPUTCC NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONALC ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAMC DIMENSION STATEMENT.CC N IS THE ORDER OF THE MATRIX.CC D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX.CC E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE INPUT MATRIXC IN ITS LAST N-1 POSITIONS. E(1) IS ARBITRARY.CC Z CONTAINS THE TRANSFORMATION MATRIX PRODUCED IN THEC REDUCTION BY TRED2, IF PERFORMED. IF THE EIGENVECTORSC OF THE TRIDIAGONAL MATRIX ARE DESIRED, Z MUST CONTAINC THE IDENTITY MATRIX.CC ON OUTPUTCC D CONTAINS THE EIGENVALUES IN ASCENDING ORDER. IF ANC ERROR EXIT IS MADE, THE EIGENVALUES ARE CORRECT BUTC UNORDERED FOR INDICES 1,2,...,IERR-1.CC E HAS BEEN DESTROYED.CC Z CONTAINS ORTHONORMAL EIGENVECTORS OF THE SYMMETRICC TRIDIAGONAL (OR FULL) MATRIX. IF AN ERROR EXIT IS MADE,C Z CONTAINS THE EIGENVECTORS ASSOCIATED WITH THE STOREDC EIGENVALUES.CC IERR IS SET TOC ZERO FOR NORMAL RETURN,C J IF THE J-TH EIGENVALUE HAS NOT BEENC DETERMINED AFTER 30 ITERATIONS.CC CALLS PYTHAG FOR DSQRT(A*A + B*B) .CC QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,C MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORYCC THIS VERSION DATED AUGUST 1983.CC ------------------------------------------------------------------cc unnecessary initialization of C3 and S2 to keep g77 -Wall happycC3 = 0.0D0S2 = 0.0D0CIERR = 0IF (N .EQ. 1) GO TO 1001CDO 100 I = 2, N100 E(I-1) = E(I)CF = 0.0D0TST1 = 0.0D0E(N) = 0.0D0CDO 240 L = 1, NJ = 0H = DABS(D(L)) + DABS(E(L))IF (TST1 .LT. H) TST1 = HC .......... LOOK FOR SMALL SUB-DIAGONAL ELEMENT ..........DO 110 M = L, NTST2 = TST1 + DABS(E(M))IF (TST2 .EQ. TST1) GO TO 120C .......... E(N) IS ALWAYS ZERO, SO THERE IS NO EXITC THROUGH THE BOTTOM OF THE LOOP ..........110 CONTINUEC120 IF (M .EQ. L) GO TO 220130 IF (J .EQ. 30) GO TO 1000J = J + 1C .......... FORM SHIFT ..........L1 = L + 1L2 = L1 + 1G = D(L)P = (D(L1) - G) / (2.0D0 * E(L))R = PYTHAG(P,1.0D0)D(L) = E(L) / (P + DSIGN(R,P))D(L1) = E(L) * (P + DSIGN(R,P))DL1 = D(L1)H = G - D(L)IF (L2 .GT. N) GO TO 145CDO 140 I = L2, N140 D(I) = D(I) - HC145 F = F + HC .......... QL TRANSFORMATION ..........P = D(M)C = 1.0D0C2 = CEL1 = E(L1)S = 0.0D0MML = M - LC .......... FOR I=M-1 STEP -1 UNTIL L DO -- ..........DO 200 II = 1, MMLC3 = C2C2 = CS2 = SI = M - IIG = C * E(I)H = C * PR = PYTHAG(P,E(I))E(I+1) = S * RS = E(I) / RC = P / RP = C * D(I) - S * GD(I+1) = H + S * (C * G + S * D(I))C .......... FORM VECTOR ..........DO 180 K = 1, NH = Z(K,I+1)Z(K,I+1) = S * Z(K,I) + C * HZ(K,I) = C * Z(K,I) - S * H180 CONTINUEC200 CONTINUECP = -S * S2 * C3 * EL1 * E(L) / DL1E(L) = S * PD(L) = C * PTST2 = TST1 + DABS(E(L))IF (TST2 .GT. TST1) GO TO 130220 D(L) = D(L) + F240 CONTINUEC .......... ORDER EIGENVALUES AND EIGENVECTORS ..........DO 300 II = 2, NI = II - 1K = IP = D(I)CDO 260 J = II, NIF (D(J) .GE. P) GO TO 260K = JP = D(J)260 CONTINUECIF (K .EQ. I) GO TO 300D(K) = D(I)D(I) = PCDO 280 J = 1, NP = Z(J,I)Z(J,I) = Z(J,K)Z(J,K) = P280 CONTINUEC300 CONTINUECGO TO 1001C .......... SET ERROR -- NO CONVERGENCE TO ANC EIGENVALUE AFTER 30 ITERATIONS ..........1000 IERR = L1001 RETURNENDSUBROUTINE TQLRAT(N,D,E2,IERR)CINTEGER I,J,L,M,N,II,L1,MML,IERRDOUBLE PRECISION D(N),E2(N)DOUBLE PRECISION B,C,F,G,H,P,R,S,T,EPSLON,PYTHAGCC THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TQLRAT,C ALGORITHM 464, COMM. ACM 16, 689(1973) BY REINSCH.CC THIS SUBROUTINE FINDS THE EIGENVALUES OF A SYMMETRICC TRIDIAGONAL MATRIX BY THE RATIONAL QL METHOD.CC ON INPUTCC N IS THE ORDER OF THE MATRIX.CC D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX.CC E2 CONTAINS THE SQUARES OF THE SUBDIAGONAL ELEMENTS OF THEC INPUT MATRIX IN ITS LAST N-1 POSITIONS. E2(1) IS ARBITRARY.CC ON OUTPUTCC D CONTAINS THE EIGENVALUES IN ASCENDING ORDER. IF ANC ERROR EXIT IS MADE, THE EIGENVALUES ARE CORRECT ANDC ORDERED FOR INDICES 1,2,...IERR-1, BUT MAY NOT BEC THE SMALLEST EIGENVALUES.CC E2 HAS BEEN DESTROYED.CC IERR IS SET TOC ZERO FOR NORMAL RETURN,C J IF THE J-TH EIGENVALUE HAS NOT BEENC DETERMINED AFTER 30 ITERATIONS.CC CALLS PYTHAG FOR DSQRT(A*A + B*B) .CC QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,C MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORYCC THIS VERSION DATED AUGUST 1983.CC ------------------------------------------------------------------cc unnecessary initialization of B and C to keep g77 -Wall happycB = 0.0D0C = 0.0D0CIERR = 0IF (N .EQ. 1) GO TO 1001CDO 100 I = 2, N100 E2(I-1) = E2(I)CF = 0.0D0T = 0.0D0E2(N) = 0.0D0CDO 290 L = 1, NJ = 0H = DABS(D(L)) + DSQRT(E2(L))IF (T .GT. H) GO TO 105T = HB = EPSLON(T)C = B * BC .......... LOOK FOR SMALL SQUARED SUB-DIAGONAL ELEMENT ..........105 DO 110 M = L, NIF (E2(M) .LE. C) GO TO 120C .......... E2(N) IS ALWAYS ZERO, SO THERE IS NO EXITC THROUGH THE BOTTOM OF THE LOOP ..........110 CONTINUEC120 IF (M .EQ. L) GO TO 210130 IF (J .EQ. 30) GO TO 1000J = J + 1C .......... FORM SHIFT ..........L1 = L + 1S = DSQRT(E2(L))G = D(L)P = (D(L1) - G) / (2.0D0 * S)R = PYTHAG(P,1.0D0)D(L) = S / (P + DSIGN(R,P))H = G - D(L)CDO 140 I = L1, N140 D(I) = D(I) - HCF = F + HC .......... RATIONAL QL TRANSFORMATION ..........G = D(M)IF (G .EQ. 0.0D0) G = BH = GS = 0.0D0MML = M - LC .......... FOR I=M-1 STEP -1 UNTIL L DO -- ..........DO 200 II = 1, MMLI = M - IIP = G * HR = P + E2(I)E2(I+1) = S * RS = E2(I) / RD(I+1) = H + S * (H + D(I))G = D(I) - E2(I) / GIF (G .EQ. 0.0D0) G = BH = G * P / R200 CONTINUECE2(L) = S * GD(L) = HC .......... GUARD AGAINST UNDERFLOW IN CONVERGENCE TEST ..........IF (H .EQ. 0.0D0) GO TO 210IF (DABS(E2(L)) .LE. DABS(C/H)) GO TO 210E2(L) = H * E2(L)IF (E2(L) .NE. 0.0D0) GO TO 130210 P = D(L) + FC .......... ORDER EIGENVALUES ..........IF (L .EQ. 1) GO TO 250C .......... FOR I=L STEP -1 UNTIL 2 DO -- ..........DO 230 II = 2, LI = L + 2 - IIIF (P .GE. D(I-1)) GO TO 270D(I) = D(I-1)230 CONTINUEC250 I = 1270 D(I) = P290 CONTINUECGO TO 1001C .......... SET ERROR -- NO CONVERGENCE TO ANC EIGENVALUE AFTER 30 ITERATIONS ..........1000 IERR = L1001 RETURNENDSUBROUTINE TRED1(NM,N,A,D,E,E2)CINTEGER I,J,K,L,N,II,NM,JP1DOUBLE PRECISION A(NM,N),D(N),E(N),E2(N)DOUBLE PRECISION F,G,H,SCALECC THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TRED1,C NUM. MATH. 11, 181-195(1968) BY MARTIN, REINSCH, AND WILKINSON.C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971).CC THIS SUBROUTINE REDUCES A REAL SYMMETRIC MATRIXC TO A SYMMETRIC TRIDIAGONAL MATRIX USINGC ORTHOGONAL SIMILARITY TRANSFORMATIONS.CC ON INPUTCC NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONALC ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAMC DIMENSION STATEMENT.CC N IS THE ORDER OF THE MATRIX.CC A CONTAINS THE REAL SYMMETRIC INPUT MATRIX. ONLY THEC LOWER TRIANGLE OF THE MATRIX NEED BE SUPPLIED.CC ON OUTPUTCC A CONTAINS INFORMATION ABOUT THE ORTHOGONAL TRANS-C FORMATIONS USED IN THE REDUCTION IN ITS STRICT LOWERC TRIANGLE. THE FULL UPPER TRIANGLE OF A IS UNALTERED.CC D CONTAINS THE DIAGONAL ELEMENTS OF THE TRIDIAGONAL MATRIX.CC E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE TRIDIAGONALC MATRIX IN ITS LAST N-1 POSITIONS. E(1) IS SET TO ZERO.CC E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E.C E2 MAY COINCIDE WITH E IF THE SQUARES ARE NOT NEEDED.CC QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,C MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORYCC THIS VERSION DATED AUGUST 1983.CC ------------------------------------------------------------------CDO 100 I = 1, ND(I) = A(N,I)A(N,I) = A(I,I)100 CONTINUEC .......... FOR I=N STEP -1 UNTIL 1 DO -- ..........DO 300 II = 1, NI = N + 1 - IIL = I - 1H = 0.0D0SCALE = 0.0D0IF (L .LT. 1) GO TO 130C .......... SCALE ROW (ALGOL TOL THEN NOT NEEDED) ..........DO 120 K = 1, L120 SCALE = SCALE + DABS(D(K))CIF (SCALE .NE. 0.0D0) GO TO 140CDO 125 J = 1, LD(J) = A(L,J)A(L,J) = A(I,J)A(I,J) = 0.0D0125 CONTINUEC130 E(I) = 0.0D0E2(I) = 0.0D0GO TO 300C140 DO 150 K = 1, LD(K) = D(K) / SCALEH = H + D(K) * D(K)150 CONTINUECE2(I) = SCALE * SCALE * HF = D(L)G = -DSIGN(DSQRT(H),F)E(I) = SCALE * GH = H - F * GD(L) = F - GIF (L .EQ. 1) GO TO 285C .......... FORM A*U ..........DO 170 J = 1, L170 E(J) = 0.0D0CDO 240 J = 1, LF = D(J)G = E(J) + A(J,J) * FJP1 = J + 1IF (L .LT. JP1) GO TO 220CDO 200 K = JP1, LG = G + A(K,J) * D(K)E(K) = E(K) + A(K,J) * F200 CONTINUEC220 E(J) = G240 CONTINUEC .......... FORM P ..........F = 0.0D0CDO 245 J = 1, LE(J) = E(J) / HF = F + E(J) * D(J)245 CONTINUECH = F / (H + H)C .......... FORM Q ..........DO 250 J = 1, L250 E(J) = E(J) - H * D(J)C .......... FORM REDUCED A ..........DO 280 J = 1, LF = D(J)G = E(J)CDO 260 K = J, L260 A(K,J) = A(K,J) - F * E(K) - G * D(K)C280 CONTINUEC285 DO 290 J = 1, LF = D(J)D(J) = A(L,J)A(L,J) = A(I,J)A(I,J) = F * SCALE290 CONTINUEC300 CONTINUECRETURNENDSUBROUTINE TRED2(NM,N,A,D,E,Z)CINTEGER I,J,K,L,N,II,NM,JP1DOUBLE PRECISION A(NM,N),D(N),E(N),Z(NM,N)DOUBLE PRECISION F,G,H,HH,SCALECC THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TRED2,C NUM. MATH. 11, 181-195(1968) BY MARTIN, REINSCH, AND WILKINSON.C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971).CC THIS SUBROUTINE REDUCES A REAL SYMMETRIC MATRIX TO AC SYMMETRIC TRIDIAGONAL MATRIX USING AND ACCUMULATINGC ORTHOGONAL SIMILARITY TRANSFORMATIONS.CC ON INPUTCC NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONALC ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAMC DIMENSION STATEMENT.CC N IS THE ORDER OF THE MATRIX.CC A CONTAINS THE REAL SYMMETRIC INPUT MATRIX. ONLY THEC LOWER TRIANGLE OF THE MATRIX NEED BE SUPPLIED.CC ON OUTPUTCC D CONTAINS THE DIAGONAL ELEMENTS OF THE TRIDIAGONAL MATRIX.CC E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE TRIDIAGONALC MATRIX IN ITS LAST N-1 POSITIONS. E(1) IS SET TO ZERO.CC Z CONTAINS THE ORTHOGONAL TRANSFORMATION MATRIXC PRODUCED IN THE REDUCTION.CC A AND Z MAY COINCIDE. IF DISTINCT, A IS UNALTERED.CC QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,C MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORYCC THIS VERSION DATED AUGUST 1983.CC ------------------------------------------------------------------CDO 100 I = 1, NCDO 80 J = I, N80 Z(J,I) = A(J,I)CD(I) = A(N,I)100 CONTINUECIF (N .EQ. 1) GO TO 510C .......... FOR I=N STEP -1 UNTIL 2 DO -- ..........DO 300 II = 2, NI = N + 2 - IIL = I - 1H = 0.0D0SCALE = 0.0D0IF (L .LT. 2) GO TO 130C .......... SCALE ROW (ALGOL TOL THEN NOT NEEDED) ..........DO 120 K = 1, L120 SCALE = SCALE + DABS(D(K))CIF (SCALE .NE. 0.0D0) GO TO 140130 E(I) = D(L)CDO 135 J = 1, LD(J) = Z(L,J)Z(I,J) = 0.0D0Z(J,I) = 0.0D0135 CONTINUECGO TO 290C140 DO 150 K = 1, LD(K) = D(K) / SCALEH = H + D(K) * D(K)150 CONTINUECF = D(L)G = -DSIGN(DSQRT(H),F)E(I) = SCALE * GH = H - F * GD(L) = F - GC .......... FORM A*U ..........DO 170 J = 1, L170 E(J) = 0.0D0CDO 240 J = 1, LF = D(J)Z(J,I) = FG = E(J) + Z(J,J) * FJP1 = J + 1IF (L .LT. JP1) GO TO 220CDO 200 K = JP1, LG = G + Z(K,J) * D(K)E(K) = E(K) + Z(K,J) * F200 CONTINUEC220 E(J) = G240 CONTINUEC .......... FORM P ..........F = 0.0D0CDO 245 J = 1, LE(J) = E(J) / HF = F + E(J) * D(J)245 CONTINUECHH = F / (H + H)C .......... FORM Q ..........DO 250 J = 1, L250 E(J) = E(J) - HH * D(J)C .......... FORM REDUCED A ..........DO 280 J = 1, LF = D(J)G = E(J)CDO 260 K = J, L260 Z(K,J) = Z(K,J) - F * E(K) - G * D(K)CD(J) = Z(L,J)Z(I,J) = 0.0D0280 CONTINUEC290 D(I) = H300 CONTINUEC .......... ACCUMULATION OF TRANSFORMATION MATRICES ..........DO 500 I = 2, NL = I - 1Z(N,L) = Z(L,L)Z(L,L) = 1.0D0H = D(I)IF (H .EQ. 0.0D0) GO TO 380CDO 330 K = 1, L330 D(K) = Z(K,I) / HCDO 360 J = 1, LG = 0.0D0CDO 340 K = 1, L340 G = G + Z(K,I) * Z(K,J)CDO 360 K = 1, LZ(K,J) = Z(K,J) - G * D(K)360 CONTINUEC380 DO 400 K = 1, L400 Z(K,I) = 0.0D0C500 CONTINUEC510 DO 520 I = 1, ND(I) = Z(N,I)Z(N,I) = 0.0D0520 CONTINUECZ(N,N) = 1.0D0E(1) = 0.0D0RETURNENDSUBROUTINE RG(NM,N,A,WR,WI,MATZ,Z,IV1,FV1,IERR)CINTEGER N,NM,IS1,IS2,IERR,MATZDOUBLE PRECISION A(NM,N),WR(N),WI(N),Z(NM,N),FV1(N)INTEGER IV1(N)CC THIS SUBROUTINE CALLS THE RECOMMENDED SEQUENCE OFC SUBROUTINES FROM THE EIGENSYSTEM SUBROUTINE PACKAGE (EISPACK)C TO FIND THE EIGENVALUES AND EIGENVECTORS (IF DESIRED)C OF A REAL GENERAL MATRIX.CC ON INPUTCC NM MUST BE SET TO THE ROW DIMENSION OF THE TWO-DIMENSIONALC ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAMC DIMENSION STATEMENT.CC N IS THE ORDER OF THE MATRIX A.CC A CONTAINS THE REAL GENERAL MATRIX.CC MATZ IS AN INTEGER VARIABLE SET EQUAL TO ZERO IFC ONLY EIGENVALUES ARE DESIRED. OTHERWISE IT IS SET TOC ANY NON-ZERO INTEGER FOR BOTH EIGENVALUES AND EIGENVECTORS.CC ON OUTPUTCC WR AND WI CONTAIN THE REAL AND IMAGINARY PARTS,C RESPECTIVELY, OF THE EIGENVALUES. COMPLEX CONJUGATEC PAIRS OF EIGENVALUES APPEAR CONSECUTIVELY WITH THEC EIGENVALUE HAVING THE POSITIVE IMAGINARY PART FIRST.CC Z CONTAINS THE REAL AND IMAGINARY PARTS OF THE EIGENVECTORSC IF MATZ IS NOT ZERO. IF THE J-TH EIGENVALUE IS REAL, THEC J-TH COLUMN OF Z CONTAINS ITS EIGENVECTOR. IF THE J-THC EIGENVALUE IS COMPLEX WITH POSITIVE IMAGINARY PART, THEC J-TH AND (J+1)-TH COLUMNS OF Z CONTAIN THE REAL ANDC IMAGINARY PARTS OF ITS EIGENVECTOR. THE CONJUGATE OF THISC VECTOR IS THE EIGENVECTOR FOR THE CONJUGATE EIGENVALUE.CC IERR IS AN INTEGER OUTPUT VARIABLE SET EQUAL TO AN ERRORC COMPLETION CODE DESCRIBED IN THE DOCUMENTATION FOR HQRC AND HQR2. THE NORMAL COMPLETION CODE IS ZERO.CC IV1 AND FV1 ARE TEMPORARY STORAGE ARRAYS.CC QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,C MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORYCC THIS VERSION DATED AUGUST 1983.CC ------------------------------------------------------------------CIF (N .LE. NM) GO TO 10IERR = 10 * NGO TO 50C10 CALL BALANC(NM,N,A,IS1,IS2,FV1)CALL ELMHES(NM,N,IS1,IS2,A,IV1)IF (MATZ .NE. 0) GO TO 20C .......... FIND EIGENVALUES ONLY ..........CALL HQR(NM,N,IS1,IS2,A,WR,WI,IERR)GO TO 50C .......... FIND BOTH EIGENVALUES AND EIGENVECTORS ..........20 CALL ELTRAN(NM,N,IS1,IS2,A,IV1,Z)CALL HQR2(NM,N,IS1,IS2,A,WR,WI,Z,IERR)IF (IERR .NE. 0) GO TO 50CALL BALBAK(NM,N,IS1,IS2,FV1,N,Z)50 RETURNENDSUBROUTINE RS(NM,N,A,W,MATZ,Z,FV1,FV2,IERR)CINTEGER N,NM,IERR,MATZDOUBLE PRECISION A(NM,N),W(N),Z(NM,N),FV1(N),FV2(N)CC THIS SUBROUTINE CALLS THE RECOMMENDED SEQUENCE OFC SUBROUTINES FROM THE EIGENSYSTEM SUBROUTINE PACKAGE (EISPACK)C TO FIND THE EIGENVALUES AND EIGENVECTORS (IF DESIRED)C OF A REAL SYMMETRIC MATRIX.CC ON INPUTCC NM MUST BE SET TO THE ROW DIMENSION OF THE TWO-DIMENSIONALC ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAMC DIMENSION STATEMENT.CC N IS THE ORDER OF THE MATRIX A.CC A CONTAINS THE REAL SYMMETRIC MATRIX.CC MATZ IS AN INTEGER VARIABLE SET EQUAL TO ZERO IFC ONLY EIGENVALUES ARE DESIRED. OTHERWISE IT IS SET TOC ANY NON-ZERO INTEGER FOR BOTH EIGENVALUES AND EIGENVECTORS.CC ON OUTPUTCC W CONTAINS THE EIGENVALUES IN ASCENDING ORDER.CC Z CONTAINS THE EIGENVECTORS IF MATZ IS NOT ZERO.CC IERR IS AN INTEGER OUTPUT VARIABLE SET EQUAL TO AN ERRORC COMPLETION CODE DESCRIBED IN THE DOCUMENTATION FOR TQLRATC AND TQL2. THE NORMAL COMPLETION CODE IS ZERO.CC FV1 AND FV2 ARE TEMPORARY STORAGE ARRAYS.CC QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,C MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORYCC THIS VERSION DATED AUGUST 1983.CC ------------------------------------------------------------------CIF (N .LE. NM) GO TO 10IERR = 10 * NGO TO 50C10 IF (MATZ .NE. 0) GO TO 20C .......... FIND EIGENVALUES ONLY ..........CALL TRED1(NM,N,A,W,FV1,FV2)CALL TQLRAT(N,W,FV2,IERR)GO TO 50C .......... FIND BOTH EIGENVALUES AND EIGENVECTORS ..........20 CALL TRED2(NM,N,A,W,FV1,Z)CALL TQL2(NM,N,W,FV1,Z,IERR)50 RETURNENDSUBROUTINE CG(NM,N,AR,AI,WR,WI,MATZ,ZR,ZI,FV1,FV2,FV3,IERR)CINTEGER N,NM,IS1,IS2,IERR,MATZDOUBLE PRECISION AR(NM,N),AI(NM,N),WR(N),WI(N),ZR(NM,N),ZI(NM,N),X FV1(N),FV2(N),FV3(N)CC THIS SUBROUTINE CALLS THE RECOMMENDED SEQUENCE OFC SUBROUTINES FROM THE EIGENSYSTEM SUBROUTINE PACKAGE (EISPACK)C TO FIND THE EIGENVALUES AND EIGENVECTORS (IF DESIRED)C OF A COMPLEX GENERAL MATRIX.CC ON INPUTCC NM MUST BE SET TO THE ROW DIMENSION OF THE TWO-DIMENSIONALC ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAMC DIMENSION STATEMENT.CC N IS THE ORDER OF THE MATRIX A=(AR,AI).CC AR AND AI CONTAIN THE REAL AND IMAGINARY PARTS,C RESPECTIVELY, OF THE COMPLEX GENERAL MATRIX.CC MATZ IS AN INTEGER VARIABLE SET EQUAL TO ZERO IFC ONLY EIGENVALUES ARE DESIRED. OTHERWISE IT IS SET TOC ANY NON-ZERO INTEGER FOR BOTH EIGENVALUES AND EIGENVECTORS.CC ON OUTPUTCC WR AND WI CONTAIN THE REAL AND IMAGINARY PARTS,C RESPECTIVELY, OF THE EIGENVALUES.CC ZR AND ZI CONTAIN THE REAL AND IMAGINARY PARTS,C RESPECTIVELY, OF THE EIGENVECTORS IF MATZ IS NOT ZERO.CC IERR IS AN INTEGER OUTPUT VARIABLE SET EQUAL TO AN ERRORC COMPLETION CODE DESCRIBED IN THE DOCUMENTATION FOR COMQRC AND COMQR2. THE NORMAL COMPLETION CODE IS ZERO.CC FV1, FV2, AND FV3 ARE TEMPORARY STORAGE ARRAYS.CC QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,C MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORYCC THIS VERSION DATED AUGUST 1983.CC ------------------------------------------------------------------CIF (N .LE. NM) GO TO 10IERR = 10 * NGO TO 50C10 CALL CBAL(NM,N,AR,AI,IS1,IS2,FV1)CALL CORTH(NM,N,IS1,IS2,AR,AI,FV2,FV3)IF (MATZ .NE. 0) GO TO 20C .......... FIND EIGENVALUES ONLY ..........CALL COMQR(NM,N,IS1,IS2,AR,AI,WR,WI,IERR)GO TO 50C .......... FIND BOTH EIGENVALUES AND EIGENVECTORS ..........20 CALL COMQR2(NM,N,IS1,IS2,FV2,FV3,AR,AI,WR,WI,ZR,ZI,IERR)IF (IERR .NE. 0) GO TO 50CALL CBABK2(NM,N,IS1,IS2,FV1,N,ZR,ZI)50 RETURNENDSUBROUTINE CH(NM,N,AR,AI,W,MATZ,ZR,ZI,FV1,FV2,FM1,IERR)CINTEGER I,J,N,NM,IERR,MATZDOUBLE PRECISION AR(NM,N),AI(NM,N),W(N),ZR(NM,N),ZI(NM,N),X FV1(N),FV2(N),FM1(2,N)CC THIS SUBROUTINE CALLS THE RECOMMENDED SEQUENCE OFC SUBROUTINES FROM THE EIGENSYSTEM SUBROUTINE PACKAGE (EISPACK)C TO FIND THE EIGENVALUES AND EIGENVECTORS (IF DESIRED)C OF A COMPLEX HERMITIAN MATRIX.CC ON INPUTCC NM MUST BE SET TO THE ROW DIMENSION OF THE TWO-DIMENSIONALC ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAMC DIMENSION STATEMENT.CC N IS THE ORDER OF THE MATRIX A=(AR,AI).CC AR AND AI CONTAIN THE REAL AND IMAGINARY PARTS,C RESPECTIVELY, OF THE COMPLEX HERMITIAN MATRIX.CC MATZ IS AN INTEGER VARIABLE SET EQUAL TO ZERO IFC ONLY EIGENVALUES ARE DESIRED. OTHERWISE IT IS SET TOC ANY NON-ZERO INTEGER FOR BOTH EIGENVALUES AND EIGENVECTORS.CC ON OUTPUTCC W CONTAINS THE EIGENVALUES IN ASCENDING ORDER.CC ZR AND ZI CONTAIN THE REAL AND IMAGINARY PARTS,C RESPECTIVELY, OF THE EIGENVECTORS IF MATZ IS NOT ZERO.CC IERR IS AN INTEGER OUTPUT VARIABLE SET EQUAL TO AN ERRORC COMPLETION CODE DESCRIBED IN THE DOCUMENTATION FOR TQLRATC AND TQL2. THE NORMAL COMPLETION CODE IS ZERO.CC FV1, FV2, AND FM1 ARE TEMPORARY STORAGE ARRAYS.CC QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW,C MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORYCC THIS VERSION DATED AUGUST 1983.CC ------------------------------------------------------------------CIF (N .LE. NM) GO TO 10IERR = 10 * NGO TO 50C10 CALL HTRIDI(NM,N,AR,AI,W,FV1,FV2,FM1)IF (MATZ .NE. 0) GO TO 20C .......... FIND EIGENVALUES ONLY ..........CALL TQLRAT(N,W,FV2,IERR)GO TO 50C .......... FIND BOTH EIGENVALUES AND EIGENVECTORS ..........20 DO 40 I = 1, NCDO 30 J = 1, NZR(J,I) = 0.0D030 CONTINUECZR(I,I) = 1.0D040 CONTINUECCALL TQL2(NM,N,W,FV1,ZR,IERR)IF (IERR .NE. 0) GO TO 50CALL HTRIBK(NM,N,AR,AI,FM1,N,ZR,ZI)50 RETURNEND