C CASE STUDY 10 - GAUSS-SEIDEL METHOD FOR SOLVING SIMULTANEOUS EQUATIONS C C PROGRAM TO SOLVE N SIMULTANEOUS EQUATIONS IN N UNKNOWNS BY THE C METHOD OF GAUSS-SEIDEL ITERATION. N MUST NOT EXCEED 20. C ONLY THE NON-ZERO ELEMENTS IN THE ARRAYS NEED BE ENTERED. C DIMENSION A(20, 20), B(20), X(20) C CLEAR ARRAYS IT=10 IK=11 IP=3 IC=2 C ********** CALL ASSIGN (IC,'GAUSS.INP') CALL ASSIGN (IP,'GAUSS.OUT') C CALL FOPEN (IC,'GAUSS.INP') C CALL FOPEN (IC,'GAUSS.OUT') C ********** WRITE(IP,1100) 1100 FORMAT(1H1'GAUSS-SEIDEL TEST'/) 1001 DO 50 I = 1, 20 B(I) = 0.0 X(I) = 0.0 DO 50 J = 1, 20 50 A(I,J) = 0.0 C READ NUM OF ITERATIONS AND IBM VARIABLE READ (IC, 20) N, IBM 20 FORMAT (2I2) C READ THE COEFFICIENTS, WHICH ARE PUNCHED TWO-TO-A CARD 31 READ (IC, 21) I, J, A(I, J), I1, J1, A(I1, J1), NEXT 21 FORMAT (2I2, F10.0, 2I2, F10.0, I1) IF (NEXT .EQ. 0) GO TO 31 C READ THE CONSTANT TERMS 32 READ (IC,22) I, B(I), NEXT 22 FORMAT (I2, F10.0, I1) IF (NEXT .EQ. 0 ) GO TO 32 C BEGIN THE ITERATION SCHEME WRITE(IT,1000) 1000 FORMAT(' INPUT NUM OF ITERATIONS'/) READ(IK,1005) MAX 1005 FORMAT(I4) IF (MAX) 900,900,901 900 CALL EXIT 901 ITER = 1 C STATEMENT 99 IS EXECUTED ONCE PER SWEEP 99 BIG = 0.0 C INDEX I SELECTS A ROW DO 100 I = 1, N C STATEMENT 102 IS EXECUTED ONCE PER ROW 102 SUM = 0.0 C SEGMENT FROM HERE THROUGH STATEMENT 107 GETS THE SUM OF THE C TERMS IN A ROW, EXCLUDING THE MAIN DIAGONAL TERM IF (I .EQ. 1) GO TO 105 LAST = I - 1 DO 106 J = 1, LAST 106 SUM = SUM + A(I,J)*X(J) IF (I .EQ. N) GO TO 103 105 INITL = I + 1 DO 107 J = INITL, N 107 SUM = SUM + A(I,J)*X(J) C COMPUTE NEW VALUE OF A VARIABLE 103 TEMP = (B(I) - SUM) / A(I,I) C AT END OF SWEEP, THIS STATEMENT HAS PUT LARGEST RESIDUAL IN BIG IF (ABS(TEMP-X(I)) .GT. BIG) BIG = ABS(TEMP - X(I)) 100 X(I) = TEMP C ONE SWEEP HAS NOW BEEN COMPLETED GO TO 110 1010 DO 42 I = 1, N 42 WRITE (IP,200) I, X(I) 200 FORMAT (I5, 1PE16.7) WRITE(IT,1020) 1020 FORMAT(' TIME ?'/) READ(IK,1030)TIME 1030 FORMAT(F5.2) WRITE(IP,1040)MAX,TIME 1040 FORMAT(1H I4,' ITERATIONS TOOK 'F5.2,' SECONDS'/) IF(IBM .EQ. 0) REWIND IC GO TO 1001 C IF ITERATION COUNTER EXCEEDS MAXIMUM ALLOWABLE, GIVE UP 110 IF (ITER .GE. MAX) GO TO 1010 ITER = ITER + 1 GO TO 99 END