Rev 7041 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
DOUBLE 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)RETURNENDDOUBLE 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 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 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 I = 2, NE(I-1) = E(I)end doCF = 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 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 ..........end doC120 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 I = L2, ND(I) = D(I) - Hend doC145 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 I = 2, NE2(I-1) = E2(I)end doCF = 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 I = L1, ND(I) = D(I) - Hend doCF = 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 K = 1, LSCALE = SCALE + DABS(D(K))end doCIF (SCALE .NE. 0.0D0) GO TO 140CDO J = 1, LD(J) = A(L,J)A(L,J) = A(I,J)A(I,J) = 0.0D0end doC130 E(I) = 0.0D0E2(I) = 0.0D0GO TO 300C140 DO K = 1, LD(K) = D(K) / SCALEH = H + D(K) * D(K)end doCE2(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 J = 1, LE(J) = 0.0D0end doCDO 240 J = 1, LF = D(J)G = E(J) + A(J,J) * FJP1 = J + 1IF (L .LT. JP1) GO TO 220CDO K = JP1, LG = G + A(K,J) * D(K)E(K) = E(K) + A(K,J) * Fend doC220 E(J) = G240 CONTINUEC .......... FORM P ..........F = 0.0D0CDO J = 1, LE(J) = E(J) / HF = F + E(J) * D(J)end doCH = F / (H + H)C .......... FORM Q ..........DO J = 1, LE(J) = E(J) - H * D(J)end doC .......... FORM REDUCED A ..........DO J = 1, LF = D(J)G = E(J)CDO K = J, LA(K,J) = A(K,J) - F * E(K) - G * D(K)end doCend doC285 DO J = 1, LF = D(J)D(J) = A(L,J)A(L,J) = A(I,J)A(I,J) = F * SCALEend doC300 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 I = 1, NDO J = I, NZ(J,I) = A(J,I)end doD(I) = A(N,I)end doCIF (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 K = 1, LSCALE = SCALE + DABS(D(K))end doCIF (SCALE .NE. 0.0D0) GO TO 140130 E(I) = D(L)CDO J = 1, LD(J) = Z(L,J)Z(I,J) = 0.0D0Z(J,I) = 0.0D0end doCGO TO 290C140 DO K = 1, LD(K) = D(K) / SCALEH = H + D(K) * D(K)end doCF = D(L)G = -DSIGN(DSQRT(H),F)E(I) = SCALE * GH = H - F * GD(L) = F - GC .......... FORM A*U ..........DO J = 1, LE(J) = 0.0D0end doCDO 240 J = 1, LF = D(J)Z(J,I) = FG = E(J) + Z(J,J) * FJP1 = J + 1IF (L .LT. JP1) GO TO 220CDO K = JP1, LG = G + Z(K,J) * D(K)E(K) = E(K) + Z(K,J) * Fend doC220 E(J) = G240 CONTINUEC .......... FORM P ..........F = 0.0D0CDO J = 1, LE(J) = E(J) / HF = F + E(J) * D(J)end doCHH = F / (H + H)C .......... FORM Q ..........DO J = 1, LE(J) = E(J) - HH * D(J)end doC .......... FORM REDUCED A ..........DO 280 J = 1, LF = D(J)G = E(J)CDO K = J, LZ(K,J) = Z(K,J) - F * E(K) - G * D(K)end doCD(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 .ne. 0.0D0) thenDO K = 1, LD(K) = Z(K,I) / Hend doCDO J = 1, LG = 0.0D0DO K = 1, LG = G + Z(K,I) * Z(K,J)end doCDO K = 1, LZ(K,J) = Z(K,J) - G * D(K)end doend doend ifC 380DO K = 1, LZ(K,I) = 0.0D0end doC500 CONTINUEC510 DO I = 1, ND(I) = Z(N,I)Z(N,I) = 0.0D0end doCZ(N,N) = 1.0D0E(1) = 0.0D0RETURNEND