Automatic arrays are typically used in situations where a procedure needs a local array whose size can vary depending on the input to the procedure--for example, in a subroutine that uses a work array. Previously, such variably-sized work arrays had to originate in the main program. They would then appear in the subroutine's argument list as a dummy variable:
SUBROUTINE old_style(a,n,m,local)
INTEGER :: n, m
REAL :: a(n,m),local(n,m)
By contrast, automatic arrays are fully encapsulated in the subroutine. They are created upon entry into the subroutine and destroyed upon exit. Best of all, they can easily be made to scale with the size of the data set.
SUBROUTINE auto_array(a,n,m)
REAL :: a(n,m),local(n,m)
...
END