c The old tried-and-true CERN subroutine subroutine EISRS1(NM,N,D,ZR,IERR,E) implicit real*8(a-h,o-z) INTEGER NM,N,IERR,KKKK dimension E(nm),D(nm),ZR(nm,nm) C all eigenvalues and corresponding eigenvectors C of real symmetric matrix call TRED2(NM,N,D,E,ZR) call TQL2(NM,N,D,E,ZR,IERR) return end SUBROUTINE TRED2(NM,N,D,E,Z) implicit real*8(a-h,o-z) INTEGER I,J,K,L,N,II,NM,JP1 dimension D(nm),E(nm),Z(nm,nm) IF (N .EQ. 1) GO TO 320 DO 300 II = 2, N I = N + 2 - II L = I - 1 H = 0.d0 SCALE = 0.d0 IF (L .LT. 2) GO TO 130 DO 120 K = 1, L 120 SCALE = SCALE + DABS(Z(I,K)) IF (SCALE .NE. 0.d0) GO TO 140 130 E(I) = Z(I,L) GO TO 290 140 DO 150 K = 1, L Z(I,K) = Z(I,K) / SCALE H = H + Z(I,K) * Z(I,K) 150 CONTINUE F = Z(I,L) G = -DSIGN(DSQRT(H),F) E(I) = SCALE * G H = H - F * G Z(I,L) = F - G F = 0.d0 DO 240 J = 1, L Z(J,I) = Z(I,J) / (SCALE * H) G = 0.d0 DO 180 K = 1, J 180 G = G + Z(J,K) * Z(I,K) JP1 = J + 1 IF (L .LT. JP1) GO TO 220 DO 200 K = JP1, L 200 G = G + Z(K,J) * Z(I,K) 220 E(J) = G / H F = F + E(J) * Z(I,J) 240 CONTINUE HH = F / (H + H) DO 260 J = 1, L F = Z(I,J) G = E(J) - HH * F E(J) = G DO 260 K = 1, J Z(J,K) = Z(J,K) - F * E(K) - G * Z(I,K) 260 CONTINUE DO 280 K = 1, L 280 Z(I,K) = SCALE * Z(I,K) 290 D(I) = H 300 CONTINUE 320 D(1) = 0.d0 E(1) = 0.d0 DO 500 I = 1, N L = I - 1 IF (D(I) .EQ. 0.d0) GO TO 380 DO 360 J = 1, L G = 0.d0 DO 340 K = 1, L 340 G = G + Z(I,K) * Z(K,J) DO 360 K = 1, L Z(K,J) = Z(K,J) - G * Z(K,I) 360 CONTINUE 380 D(I) = Z(I,I) Z(I,I) = 1.d0 IF (L .LT. 1) GO TO 500 DO 400 J = 1, L Z(I,J) = 0.d0 Z(J,I) = 0.d0 400 CONTINUE 500 CONTINUE RETURN END SUBROUTINE TQL2(NM,N,D,E,Z,IERR) implicit real*8(a-h,o-z) real*8MACHEP INTEGER I,J,K,L,M,N,II,NM,MML,IERR dimension D(nm),E(nm),Z(nm,nm) MACHEP=2.d0**(-52) IERR = 0 IF (N .EQ. 1) GO TO 1001 DO 100 I = 2, N 100 E(I-1) = E(I) F = 0.d0 B = 0.d0 E(N) = 0.d0 DO 240 L = 1, N J = 0 H = MACHEP * (DABS(D(L)) + DABS(E(L))) IF (B .LT. H) B = H DO 110 M = L, N IF (DABS(E(M)) .LE. B) GO TO 120 110 CONTINUE 120 IF (M .EQ. L) GO TO 220 130 IF (J .EQ. 50) GO TO 1000 J = J + 1 P = (D(L+1) - D(L)) / (2.d0 * E(L)) R = DSQRT(P*P+1.d0) H = D(L) - E(L) / (P + DSIGN(R,P)) DO 140 I = L, N 140 D(I) = D(I) - H F = F + H P = D(M) C = 1.d0 S = 0.d0 MML = M - L DO 200 II = 1, MML I = M - II G = C * E(I) H = C * P IF (DABS(P) .LT. DABS(E(I))) GO TO 150 C = E(I) / P R = DSQRT(C*C+1.d0) E(I+1) = S * P * R S = C / R C = 1.d0 / R GO TO 160 150 C = P / E(I) R = DSQRT(C*C+1.d0) E(I+1) = S * E(I) * R S = 1.d0 / R C = C * S 160 P = C * D(I) - S * G D(I+1) = H + S * (C * G + S * D(I)) DO 180 K = 1, N H = Z(K,I+1) Z(K,I+1) = S * Z(K,I) + C * H Z(K,I) = C * Z(K,I) - S * H 180 CONTINUE 200 CONTINUE E(L) = S * P D(L) = C * P IF (DABS(E(L)) .GT. B) GO TO 130 220 D(L) = D(L) + F 240 CONTINUE DO 300 II = 2, N I = II - 1 K = I P = D(I) DO 260 J = II, N IF (D(J) .GE. P) GO TO 260 K = J P = D(J) 260 CONTINUE IF (K .EQ. I) GO TO 300 D(K) = D(I) D(I) = P DO 280 J = 1, N P = Z(J,I) Z(J,I) = Z(J,K) Z(J,K) = P 280 CONTINUE 300 CONTINUE GO TO 1001 1000 IERR = L 1001 RETURN END