arrays are those explicitly declared
ALLOCATABLE. An allocatable array may be local to a
procedure or may be placed in a module and effectively be
global to all procedures of the application. An allocatable
array is explicitly allocated with the ALLOCATE statement,
and deallocated either explicitly with the DEALLOCATE
statement or, if it is a local array for which SAVE has not
been specified, automatically upon exit from the procedure.
(If SAVE has been specified, local allocatable arrays can
persist from one execution of the procedure to the next -
they must be explicitly deallocated with a DEALLOCATE
statement.) A global allocatable array persists until it is
explicitly deallocated, which may occur in a procedure
different from the one in which it was allocated. Use an
allocatable (or pointer) array if its size depends on a
computed value other than a dummy argument or variable in a
module, common, or the host. The allocation status
(allocated or not allocated) of an allocatable array may be
tested with the ALLOCATED intrinsic function. Examples of
allocatable arrays are:
use Recipe ! Accesses global allocatable array, Jam.
real, allocable :: Pie(:,:) ! Pie is a 2-dimensional allocatable array.
allocate ( Pie(N,2*N ) ) ! Allocate a local allocatable array.
if (.not.allocated(Jam)) allocate ( Jam(4*M) )
! Allocate a global allocable array if
! it is not already allocated.
... deallocate ( Pie )
end subroutine Peach
module Recipe ! Jam is a global allocatable array, and
real, allocable :: Jam(:) ! can be allocated and deallocated in
... ! any procedure(s) using this module.
end module Recipe
Note that the declared bounds for allocatable arrays are
simply colons, indicating that these will be provided later,
at the time of allocation. This makes allocatable array
declaration appear similar to assumed-shape dummy argument
declaration, appropriate because the ``deferred" nature of
the sizes of the dimensions is conceptually similar.