File: DIAGON.FT of Tape: Various/ETH/f2
(Source file text) 

      SUBROUTINE DIAGON
	COMMON /FITPAR/ JIT,FISTOP,AMARQI,UPMARQ,DNMARQ,VARI,
     $  UPVAR,DNVAR,VARMIN,MLOOP,LOOPLW,ISTART,ISTOP,ITEST,IDEFIX
	COMMON /DIAG/ A(24,24),Z(24,24),D(24),E(24)
	COMMON /SIZE/ N,NP,K1,K3
	COMMON /VECT/ C(24),D1(6,4),Q(6,4),DIAGEL(24)
C
	LOGICAL ITEST
C TEST OUTPUT
600	FORMAT(1H0,16(F7.2,1X))
601	FORMAT(1H )
602	FORMAT(1H ,16(F7.2,1X))
C
      DATA EPS/1.E-07/        
      DATA TOL/1.E-07/        
	IF (.NOT.ITEST) GO TO 350
	WRITE(3,600) (C(J),J=1,N)
	WRITE(3,601)
	DO 300 K=1,N
300	WRITE(3,602) (A(K,J),J=1,N)
350      Z(1,1)=1.        
      IF(N.LE.1) GO TO 219        
      DO 1 I=1,N        
      DO 1 J=1,N        
      Z(J,I)=A(I,J)        
1     CONTINUE        
C        
      DO 9 II=2,N        
      L=N-II        
      I=L+2        
      F=Z(I,I-1)        
      G=0.        
      IF(L.EQ.0) GOTO 100        
      DO 2 K=1,L        
      G=G+Z(I,K)**2        
2     CONTINUE        
100   CONTINUE        
      H=G+F*F        
      IF(G.GT.TOL) GOTO 3        
      E(I)=F        
      H=0.        
      GOTO 9        
3     L=L+1        
      G=-SIGN(SQRT(H),F)        
      E(I)=G        
      H=H-F*G        
      Z(I,I-1)=F-G        
      F=0.        
      DO 6 J=1,L        
      Z(J,I)=Z(I,J)/H        
      G=0.        
      DO 4 K=1,J        
      G=G+Z(J,K)*Z(I,K)        
4     CONTINUE        
      J1=J+1        
      IF(J1.GT.L) GOTO 110        
      DO 5 K=J1,L        
      G=G+Z(K,J)*Z(I,K)        
5     CONTINUE        
110   CONTINUE        
      E(J)=G/H        
      F=F+G*Z(J,I)        
6     CONTINUE        
      HH=F/(H+H)        
      DO 8 J=1,L        
      F=Z(I,J)        
      G=E(J)-HH*F        
      E(J)=G        
      DO 7 K=1,J        
      Z(J,K)=Z(J,K)-F*E(K)-G*Z(I,K)        
7     CONTINUE        
8     CONTINUE        
9     D(I)=H        
      D(1)=0.        
      E(1)=0.        
      DO 15 I=1,N        
      L=I-1        
      IF(ABS(D(I)).LT.1.E-08)GO TO 13        
      IF(L.EQ.0) GOTO 13        
      DO 12 J=1,L        
      G=0.        
      DO 10 K=1,L        
      G=G+Z(I,K)*Z(K,J)        
10    CONTINUE        
      DO 11 K=1,L        
      Z(K,J)=Z(K,J)-G*Z(K,I)        
11    CONTINUE        
12    CONTINUE        
13    D(I)=Z(I,I)        
      Z(I,I)=1.        
      IF(L.EQ.0) GOTO 15        
      DO 14 J=1,L        
      Z(I,J)=0.        
      Z(J,I)=0.        
14    CONTINUE        
15    CONTINUE        
      DO 201 I=2,N        
      E(I-1)=E(I)        
201   CONTINUE        
      E(N)=0.        
      B=0.        
      F=0.        
      J=0
      JIT=0
      DO 212 L=1,N        
      J=0        
      H=EPS*(ABS(D(L))+ABS(E(L)))        
      IF(B.LT.H) B=H        
      DO 202 M=L,N        
      IF(ABS(E(M))-B)203,203,202        
202   CONTINUE        
203   CONTINUE        
      IF(M.EQ.L) GOTO 211        
204   CONTINUE        
      IF(J.EQ.30) GOTO 217        
      J=J+1        
      P=(D(L+1)-D(L))/(2.*E(L))        
      R=SQRT(P*P+1.)        
      H = D(L) - E(L)/(P+SIGN(R,P))        
      DO 205 I=L,N        
      D(I)=D(I)-H        
205   CONTINUE        
      F=F+H        
      P=D(M)        
      CO=1.        
      S=0.        
      M1=M-1        
      ML=M1+L        
      DO 210 II=L,M1        
      I=ML-II        
      G=CO*E(I)        
      H=CO*P        
      IF(ABS(P)-ABS(E(I)))207,206,206        
206   CONTINUE        
      CO=E(I)/P        
      R=SQRT(CO*CO+1.)        
      E(I+1)=S*P*R        
      S=CO/R        
      CO=1./R        
      GO TO 208        
207   CONTINUE        
      CO=P/E(I)        
      R=SQRT(CO*CO+1.)        
      E(I+1)=S*E(I)*R        
      S=1./R        
      CO=CO/R        
208   CONTINUE        
      P=CO*D(I)-S*G        
      D(I+1)=H+S*(CO*G+S*D(I))        
      DO 209 K=1,N        
      H=Z(K,I+1)        
      Z(K,I+1)=S*Z(K,I)+CO*H        
      Z(K,I)=CO*Z(K,I)-S*H        
209   CONTINUE        
210   CONTINUE        
      E(L)=S*P        
      D(L)=CO*P        
      IF(ABS(E(L))-B)211,211,204        
211   CONTINUE        
      D(L)=D(L)+F        
      JIT=JIT+J
212   CONTINUE        
      N1=N-1        
      DO 216 I=1,N1        
      K=I        
      P=D(I)        
      II=I+1        
      DO 214 J=II,N        
      IF(D(J)-P) 213,214,214        
213   CONTINUE        
      K=J        
      P=D(J)        
214   CONTINUE        
      IF(K.EQ.I) GOTO 216        
      D(K)=D(I)        
      D(I)=P        
      DO 215 J=1,N        
      P=Z(J,I)        
      Z(J,I)=Z(J,K)        
      Z(J,K)=P        
215   CONTINUE        
216   CONTINUE        
219   CONTINUE
	IF (.NOT.ITEST) GO TO 360
	WRITE(3,600) (D(J),J=1,N)
	WRITE(3,601)
	DO 301 K=1,N
301	WRITE(3,602) (Z(K,J),J=1,N)
360	RETURN        
217   CONTINUE        
      STOP 11111        
      END