Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Allocating arrays of the same size

I'd like to allocate an array B to be of the same shape and have the same lower and upper bounds as another array A. For example, I could use

allocate(B(lbound(A,1):ubound(A,1), lbound(A,2):ubound(A,2), lbound(A,3):ubound(A,3)))

But not only is this inelegant, it also gets very annoying for arrays of (even) higher dimensions.

I was hoping for something more like

allocate(B(shape(A)))

which doesn't work, and even if this did work, each dimension would start at 1, which is not what I want.

Does anyone know how I can easily allocate an array to have the same size and bounds as another array easily for arbitrary array dimensions?

like image 714
user1173081 Avatar asked Jan 27 '12 08:01

user1173081


People also ask

How to allocate size of an array?

To allocate memory for an array, just multiply the size of each array element by the array dimension. For example: pw = malloc(10 * sizeof(widget));

What is the type of array allocation?

Data, heap, and stack are the three segments where arrays can be allocated memory to store their elements, the same as other variables. Dynamic Arrays: Dynamic arrays are arrays, which needs memory location to be allocated at runtime.

What is an array explain how memory is allocated for an array?

When we initialize an array in a programming language, the language allocates space in memory for array and then points that starting variable to that address in memory. Then it assigns a fixed amount of memory for each element.

Where are arrays allocated in C?

Array bucket values are stored in contiguous memory locations (thus pointer arithmetic can be used to iterate over the bucket values), and 2D arrays are allocated in row-major order (i.e. the memory layout is all the values in row 0 first, followed by the values in row1, followed by values in row 2 ...).


2 Answers

As of Fortran 2008, there is now the MOLD optional argument:

ALLOCATE(B, MOLD=A)

The MOLD= specifier works almost in the same way as SOURCE=. If you specify MOLD= and source_expr is a variable, its value need not be defined. In addition, MOLD= does not copy the value of source_expr to the variable to be allocated.

Source: IBM Fortran Ref

like image 92
EMiller Avatar answered Oct 05 '22 18:10

EMiller


You can either define it in a preprocessor directive, but that will be with a fixed dimensionality:

#define DIMS3D(my_array) lbound(my_array,1):ubound(my_array,1),lbound(my_array,2):ubound(my_array,2),lbound(my_array,3):ubound(my_array,3)

allocate(B(DIMS3D(A)))

don't forget to compile with e.g. the -cpp option (gfortran)

If using Fortran 2003 or above, you can use the source argument:

allocate(B, source=A)

but this will also copy the elements of A to B.

like image 43
steabert Avatar answered Oct 05 '22 19:10

steabert