In FORTRAN 77, different routines were entirely separate from each other, they did not have access to each others variable space and could only communicate through argument lists or by global storage (COMMON); such procedures are known as external.
Procedures in Fortran 90 may contain internal procedures which are only visible within the program unit in which they are declared, in other words they have a local scope. Consider the following example,
SUBROUTINE calculate_pay IMPLICIT NONE REAL :: pay, tax pay = ... tax = ... CALL print_pay CONTAINS SUBROUTINE print_pay PRINT*, pay,tax CALL change_pay PRINT*, pay,tax END SUBROUTINE print_pay SUBROUTINE change_pay pay = ... tax = ... END SUBROUTINE change_pay END SUBROUTINE calculate_pay SUBROUTINE hex IMPLICIT NONE REAL :: pay, tax ... END SUBROUTINE hex
print_pay and change_pay are both internal subroutines of calculate_pay. These internal procedures have access to the data environment of their host.
The variables pay and tax in the subroutine print_pay and change_pay refer to the entities with the same names which were defined in the host subroutine. print_pay and change_pay have access to all calculate_pays declarations by host association including use associated objects. change_pay cannot access any of the declarations of print_pay (for example, tax_paid,) and vice-versa. pay and tax in hex are unrelated to any object in calculate_pay.
print_pay could invoke other internal procedures which are
contained by the same outer procedure, for example, print_pay can call
change_pay and vice-versa (but cannot call calculate_pay
because it is not recursive, see Section for
discussion about recursion).