I've recently been trying to get my head around MODULES and have even stopped using COMMON blocks. However I'm puzzled by some of the concepts associated with MODULES.
Here we have a function, subroutine and main routine, written in F77 as I was taught 30+ years ago. This does what I expect it to do.
FUNCTION F(X)
IMPLICIT NONE
DOUBLE PRECISION F, X
F = SIN(X)
RETURN
END
SUBROUTINE SIMPSON(F,A,B,INTEGRAL,N)
IMPLICIT NONE
DOUBLE PRECISION F, A, B, INTEGRAL,S
DOUBLE PRECISION H, X
INTEGER NINT
INTEGER N, I
IF((N/2)*2.NE.N) N=N+1
S = 0.0
H = (B-A)/DFLOAT(N)
DO I=2, N-2, 2
X = A+DFLOAT(I)*H
S = S + 2.0*F(X) + 4.0*F(X+H)
END DO
INTEGRAL = (S + F(A) + F(B) + 4.0*F(A+H))*H/3.0
RETURN
END SUBROUTINE SIMPSON
PROGRAM MAIN
IMPLICIT NONE
DOUBLE PRECISION F, A, B, INTEGRAL
INTEGER N
EXTERNAL F
A = 0.0
B = 3.1415926
N = 64
WRITE(*,100)
CALL SIMPSON(F,A,B,INTEGRAL,N)
WRITE (*,101) N, INTEGRAL
100 format(' nint Simpson')
101 format(i9,1pe15.6)
end
Now moving the function and subroutine to a module we get:
MODULE M1
IMPLICIT NONE
CONTAINS
FUNCTION F(X)
DOUBLE PRECISION F, X
F = SIN(X)
RETURN
END FUNCTION F
SUBROUTINE SIMPSON(F,A,B,INTEGRAL,N)
DOUBLE PRECISION F, A, B, INTEGRAL,S
DOUBLE PRECISION H, X
INTEGER NINT
INTEGER N, I
IF((N/2)*2.NE.N) N=N+1
S = 0.0
H = (B-A)/DFLOAT(N)
DO I=2, N-2, 2
X = A+DFLOAT(I)*H
S = S + 2.0*F(X) + 4.0*F(X+H)
END DO
INTEGRAL = (S + F(A) + F(B) + 4.0*F(A+H))*H/3.0
RETURN
END SUBROUTINE SIMPSON
END MODULE M1
PROGRAM MAIN
USE M1
IMPLICIT NONE
DOUBLE PRECISION A, B, INTEGRAL
INTEGER N
EXTERNAL F
A = 0.0
B = 3.1415926
N = 64
WRITE(*,100)
CALL SIMPSON(F,A,B,INTEGRAL,N)
WRITE (*,101) N, INTEGRAL
100 FORMAT(' NINT SIMPSON')
101 FORMAT(I9,1PE15.6)
END
This also works, but looking at the main program I think the function F is defined in the module M1, so because of the USE M1 statement the EXTERNAL F statement is not required. But when I delete this, I get an error. Can somebody give me a (simple) explanation of why the EXTERNAL statement is still required?
Thanks Ken