My Interests‎ > ‎

Numerical Computations

Fortran and C/C++ for Numerical Computation

Suppose you are writing a Fortran Subroutine to implement the Gauss Elimination method to solve a set of linear simultaneous equations. The main program and the Gauss subroutine would look as follows:

C234567890
     PARAMETER (MAXSZ = 1000)
     REAL A(MAXSZ*MAXSZ), X(MAXSZ), B(MAXSZ)

     WRITE(*,*) 'Enter number of equations'
     READ(*,*) M
     IF (M .GT. MAXSZ)
       WRITE(*,*) 'Increase MAXSZ. Program aborted'
     ENDIF

     WRITE(*,*) 'Enter coefficient matrix row by row'
     CALL READMAT(M, M, A)
     WRITE(*,*) 'Enter right hand side vector'
     CALL READMAT(M, 1, B)

     CALL GAUSS(M, A, B, X)

     WRITE(*,*) 'Solution Vector'
     CALL PRINTMAT(M, 1, X)

     STOP
     END

C--- Subroutine to read a matrix of M rows and N columns, row by row
     SUBROUTINE READMAT(M, N, A)
     REAL A(M, N)

     DO I = 1, M
       READ(*,*) (A(I,J), J = 1, N)
     END DO

     RETURN
     END

C--- Subroutine to solve a set of linear simultaneous equations
     SUBROUTINE GAUSS(M, A, B, X)
     REAL A(M, M), B(M, 1), X(M, 1)

     ......

     RETURN
     END

There are several points worth noting
  • A one dimensioned array in the main program may be viewed as a two-dimensioned (or multi-dimensioned) array inside a subroutine, as long as you understand how it is to be done.
  • When passing an array to a subroutine, its size (number of rows and columns) must also be sent as arguments to the subroutine. Subroutine does not automatically know the size of the array argument it receives.
Comments