real, dimension(:), allocatable :: Astates that A is a temporary matrix; no memory is allocated at the time of declaration; the size of A is irrelevant at this point, and the precise specification of the shape is deferred until the allocation point. In F90 jargon, A is said to be a deferred-shape array; in contrast, the ``standard'' declaration
real, dimension(5,5) :: Bmakes B an explicit-shape array.
To reserve memory for A, we use
allocate( A(-1:3,2:5), STAT=ierr )Upon completion of the function, the integer variable ierr reports the success of the allocation process: if everything is ok, and if the allocation request was denied.
The intrinsic inquiry function
allocated( A )returns a logical result: .TRUE. if A is allocated, and .FALSE. otherwise.
Heap storage is reclaimed using
if( allocated(A) ) deallocate( A, stat=ierr )(this deletes the array from memory and returns the space as free space in the heap). ierr reports the succes of the dealloction function. Note that we check first if A was allocated.
There is always an overhead in managing dynamic arrays; therefore, if the size of the array is known, the memory restrictions are not tight, or the arrays are needed during most of the program's lifetime, one should preffer explicit-shape arrays.
Attention: a deffered-shape array allocated in a procedure should be deallocated upon return - otherwise the memory space becomes inaccesible for the rest of the program's life (an inaccessible memory chunk is called ``garbage'').
An allocatable array in a procedure can be SAVEd. For example,
subroutine ... real, allocatable, dimension(:,:), save :: A ... if (.not.allocated(a)) allocate(A(10,10)A is allocated during the first call to the subroutine; after the procedure termination, A will remain allocated and its value preserved becaude of the SAVE attribute; following calls to the subroutine will ``see'' that A was already allocated and will work with the old values.