PROGRAM JACOB35 C================================================================== C COMPUTATION OF EIGENVALUES AND EIGENVECTORS USING C JACOB METHOD C EQUATION TO BE SOLVED: [A]{X}=LAMBDA{X} C CONDITION: [A]= SYMMETRIC AND POSITIVE DIFINITE C JULY 18, 2008 EIJI FUKUMORI C================================================================== IMPLICIT REAL*8(A-H,O-Z) C PARAMETER (MXN=160, EPS = 1.D-15, ITAMAX = 50) DIMENSION A(MXN,MXN),U(MXN,MXN), FLAMBDA(MXN) C------ BELOW IS A SET OF TEST DATA. C NORNALLY TAKEN FROM FILE NNODE = 3 DATA A(1,1), A(1,2), A(1,3) / 3.D0, 2.D0, 1.D0 / DATA A(2,1), A(2,2), A(2,3) / 2.D0, 2.D0, 1.D0 / DATA A(3,1), A(3,2), A(3,3) / 1.D0, 1.D0, 1.D0 / C------- COMPUTE EIGENVALUES AND VECTORS --------- MAXTRTN = NNODE*ITAMAX CALL JACOBS ( MXN, EPS, MAXTRTN, NNODE, A, U, FLAMBDA ) C------------ PRINT OPEN ( 1, FILE='JACOB.OUT', STATUS='UNKNOWN' ) DO J = 1 , NNODE WRITE (1,*) 'EIGENVALUE (',J,') = ', FLAMBDA(J) WRITE(1,*) 'EIGENVECTOR' DO I = 1 , NNODE WRITE(1,*) U(I,J) END DO WRITE (1,*) END DO CLOSE (1) STOP 'NORMAL TERMINATION' END C C SUBROUTINE JACOBS ( MXN, EPS, MAXTRTN, NNODE, A, U, FLAMBDA ) IMPLICIT REAL*8(A-H,O-Z) DIMENSION A(MXN,MXN),U(MXN,MXN), FLAMBDA(MXN) C==================== INITIALIZATION OF EIGEN VECTORS ================== DO I=1,NNODE DO J=1,NNODE U(I,J) = 0.0D0 END DO U(I,I) = 1.0D0 END DO C======================INITIALIZATION FOR DO WHILE ===================== ITERATION = 0 AMXOFF = EPS DMX = EPS C================== ITERATION PROCEDURE STARTS HERE ==================== DO WHILE ( (AMXOFF/DMX.GT.EPS) .AND. (ITERATION.LT.MAXTRTN) ) DO I = 1 , NNODE IF ( DABS(A(I,I)) .GT. DMX ) DMX = DABS(A(I,I)) END DO C--------- FIND MAXIMUM IN OFF DIAGONAL ELEMENTS OF A(I,J) ------------- AMXOFF = 0.D0 DO I = 1 , NNODE-1 DO J = I+1 , NNODE IF ( DABS(A(I,J)) .GT. AMXOFF ) THEN AMXOFF = DABS(A(I,J)) K = I L = J END IF END DO END DO IF ( AMXOFF .EQ. 0.D0 ) EXIT C------------------ COMPUTATION OF ROTATIONAL ANGLE -------------------- C------------------ R IMPLIES RADIUS OF MOHR CIRCLE -------------------- C--------- CENTER IMPLIES CENTER COORDINATE OF MOHR CIRCLE ------------- ITERATION = ITERATION + 1 DIFFHALF = (A(K,K) - A(L,L))/2.D0 IF ( DIFFHALF .EQ. 0.D0 ) THEN R = DABS(A(K,L)) COSINE = 1.D0/DSQRT(2.D0) SINE = 1.D0/DSQRT(2.D0) IF ( A(K,L) .LT. 0.D0 ) SINE = -SINE IF ( R .EQ. 0.D0 ) THEN COSINE = 1.D0 SINE = 0.D0 END IF ELSE R = DSQRT ( DIFFHALF**2 + A(K,L)**2 ) COSINE = DSQRT ( DABS(DIFFHALF)/(2.D0*R) + 0.5D0 ) SINE = A(K,L)/(2.D0*R*COSINE) IF ( DIFFHALF .LT. 0.D0 ) COSINE = -COSINE END IF C------------------------- ORTHOGNALIZATION ---------------------------- IF ( R .GT. 0.D0 ) THEN DO I = 1 , NNODE AW = U(I,K) AZ = U(I,L) U(I,K) = AW*COSINE + AZ*SINE U(I,L) = -AW*SINE + AZ*COSINE IF ( ( I .NE. K ) .AND. ( I .NE. L ) ) THEN AW = A(I,K) AZ = A(I,L) A(I,K) = AW*COSINE + AZ*SINE A(I,L) = -AW*SINE + AZ*COSINE A(K,I) = A(I,K) A(L,I) = A(I,L) END IF END DO A(K,L) = 0.D0 A(L,K) = 0.D0 CENTER = 0.5D0*(A(K,K)+A(L,L)) IF ( DIFFHALF .LT. 0.D0 ) R = -R A(K,K) = CENTER + R A(L,L) = CENTER - R C----------------- LINES BELOW ALSO WORKS FINE.------------------------ C AKK = A(K,K) C ALL = A(L,L) C CROSS = 2.D0*A(K,L)*SINE*COSINE C A(K,K) = AKK*COSINE**2 + ALL*SINE**2 + CROSS C A(L,L) = AKK*SINE**2 + ALL*COSINE**2 - CROSS C---------------------------------------------------------------------- END IF END DO C======================== EIGENVALUES = A(I,I) ======================== DO I = 1 , NNODE FLAMBDA(I) = A(I,I) END DO RETURN END