A procedure is a sub program that is written as a separate, named block of code. Procedures can have arguments that are used to input information into the procedure and to return information to the program or procedure making the call. Within the procedure the arguments are called dummy arguments. The corresponding arguments at the point of call are called actual arguments. Procedures are used to represent identifiable sub tasks within a program.
A procedure is either a FUNCTION or a SUBROUTINE.
Typically, FUNCTIONs have arguments that are used to input information and a single output value that is returned via the function name. A FUNCTION is called from within an expression.
A SUBROUTINE has arguments that can be used for input or output (or both) and is called using a CALL statement.
A procedure is external if it is not presented within a PROGRAM, MODULE or another procedure. It is either presented in a separate file or after the END of a PROGRAM, MODULE or another procedure.
A procedure is internal if it is presented between a CONTAINS statement and the END of a PROGRAM, MODULE or an external procedure.
An internal procedure is a module procedure if it is presented between a CONTAINS statement and the END of a MODULE.
Here is an example of an internal FUNCTION in a main PROGRAM:
READ *, a
PRINT *, func(a)
REAL FUNCTION func(x)
Internal procedures can also use variables that are declared in the host (i.e. before the CONTAINS statement).