user1173081
user1173081

Reputation: 157

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?

Upvotes: 14

Views: 6938

Answers (3)

EMiller
EMiller

Reputation: 2842

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

Upvotes: 15

M. S. B.
M. S. B.

Reputation: 29391

If you are doing this a lot and think it too ugly, you could write your own subroutine to take care of it, copy_dims (template, new_array), encapsulating the source code line you show. You could even set up a generic interface so that it could handle arrays of several ranks -- see how to write wrapper for 'allocate' for an example of that concept.

Upvotes: 5

steabert
steabert

Reputation: 6878

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.

Upvotes: 9

Related Questions