* * $Id: ltql2.F,v 1.1.1.1 1996/03/01 11:38:38 mclareni Exp $ * * $Log: ltql2.F,v $ * Revision 1.1.1.1 1996/03/01 11:38:38 mclareni * Paw * * #include "paw/pilot.h" *CMZ : 1.10/00 26/07/90 10.41.59 by Rene Brun *-- Author : SUBROUTINE LTQL2(NM,N,D,E,Z,IERR) #if defined(CERNLIB_DOUBLE) DOUBLE PRECISION D,E,Z,B,C,F,G,H,P,R,S,EPMACH #endif DIMENSION D(N),E(N),Z(NM,N) C #if !defined(CERNLIB_DOUBLE) C EPMACH=2.**(-23) C #endif #if defined(CERNLIB_DOUBLE) C C sur CDC ou CRAY EPMACH = 2.**(-47) C EPMACH=2.**(-47) #endif C IERR = 0 IF (N .EQ. 1) GO TO 1001 DO 100 I = 2, N 100 E(I-1) = E(I) F = 0.0 B = 0.0 E(N) = 0.0 DO 240 L = 1, N J = 0 #if defined(CERNLIB_DOUBLE) H = EPMACH * (DABS(D(L)) + DABS(E(L))) #endif #if !defined(CERNLIB_DOUBLE) H = EPMACH * ( ABS(D(L)) + ABS(E(L))) #endif IF (B .LT. H) B = H DO 110 M = L, N #if defined(CERNLIB_DOUBLE) IF (DABS(E(M)) .LE. B) GO TO 120 #endif #if !defined(CERNLIB_DOUBLE) IF ( ABS(E(M)) .LE. B) GO TO 120 #endif 110 CONTINUE 120 IF (M .EQ. L) GO TO 220 130 IF (J .EQ. 30) GO TO 1000 J = J + 1 P = (D(L+1) - D(L)) / (2.0 * E(L)) #if defined(CERNLIB_DOUBLE) R = DSQRT(P*P+1.0) H = D(L) - E(L) / (P + DSIGN(R,P)) #endif #if !defined(CERNLIB_DOUBLE) R = SQRT(P*P+1.0) H = D(L) - E(L) / (P + SIGN(R,P)) #endif DO 140 I = L, N 140 D(I) = D(I) - H F = F + H P = D(M) C = 1.0 S = 0.0 MML = M - L DO 200 II = 1, MML I = M - II G = C * E(I) H = C * P #if defined(CERNLIB_DOUBLE) IF (DABS(P) .LT. DABS(E(I))) GO TO 150 #endif #if !defined(CERNLIB_DOUBLE) IF ( ABS(P) .LT. ABS(E(I))) GO TO 150 #endif C = E(I) / P #if defined(CERNLIB_DOUBLE) R = DSQRT(C*C+1.0) #endif #if !defined(CERNLIB_DOUBLE) R = SQRT(C*C+1.0) #endif E(I+1) = S * P * R S = C / R C = 1.0 / R GO TO 160 150 C = P / E(I) #if defined(CERNLIB_DOUBLE) R = DSQRT(C*C+1.0) #endif #if !defined(CERNLIB_DOUBLE) R = SQRT(C*C+1.0) #endif E(I+1) = S * E(I) * R S = 1.0 / 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 defined(CERNLIB_DOUBLE) IF (DABS(E(L)) .GT. B) GO TO 130 #endif #if !defined(CERNLIB_DOUBLE) IF ( ABS(E(L)) .GT. B) GO TO 130 #endif 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