Naomi,
You can use C interoperability features to do what you want. The key is to declare a POINTER array of the desired new rank and then use C_LOC and C_F_POINTER to create the alias. For example:
use iso_c_binding
real, pointer, dimension(:,:) :: buf2
...
call c_f_pointer (c_loc(buf), buf2, [dim1,dim2])
where dim1 and dim2 are the desired dimensions of buf2 (total size should be the same as buf.) Now buf2 is a rank 2 array that is the same storage as buf.
You can do this with buf being either a static array as it is now (but you should add TARGET) or an ALLOCATABLE or POINTER array if you're going dynamic. Also add TARGET for ALLOCATABLE - POINTER gets TARGET implicitly.
Steve Lionel
Intel Developer Support
Nashua, NH
From: Fortran 90 List [mailto:[log in to unmask]] On Behalf Of Greenberg, Naomi
Sent: Tuesday, January 05, 2010 11:33 AM
To: [log in to unmask]
Subject: Replacing legacy EQUIVALENCE
I have a legacy code that statically allocates a very large 1-dimensional workspace array and then equivalences it to a 2-dimensional array of the same size because some subroutines require this workspace to be divided into 3 different parts. I want to convert the array to be dynamically-allocated, but I still need a way to address it both as buf(i) and buf2(i,j). Array reshaping seems to create a second array of a different shape, passing the values of the first array to the second. I want them to share memory space. Any suggestions would be helpful!
|