Search code examples
arraysfortranfortran90array-initialize

How to initialize two-dimensional arrays in Fortran


In C you can easily initialize an array using the curly braces syntax, if I remember correctly:

int* a = new int[] { 1, 2, 3, 4 };

How can you do the same in Fortran for two-dimensional arrays when you wish to initialize a matrix with specific test values for mathematical purposes? (Without having to doubly index every element on separate statements)

The array is either defined by

real, dimension(3, 3) :: a

or

real, dimension(:), allocatable :: a

Solution

  • You can do that using reshape and shape intrinsics. Something like:

    INTEGER, DIMENSION(3, 3) :: array
    array = reshape((/ 1, 2, 3, 4, 5, 6, 7, 8, 9 /), shape(array))
    

    But remember the column-major order. The array will be

    1   4   7
    2   5   8
    3   6   9
    

    after reshaping.

    So to get:

    1   2   3
    4   5   6
    7   8   9
    

    you also need transpose intrinsic:

    array = transpose(reshape((/ 1, 2, 3, 4, 5, 6, 7, 8, 9 /), shape(array)))
    

    For more general example (allocatable 2D array with different dimensions), one needs size intrinsic:

    PROGRAM main
    
      IMPLICIT NONE
    
      INTEGER, DIMENSION(:, :), ALLOCATABLE :: array
    
      ALLOCATE (array(2, 3))
    
      array = transpose(reshape((/ 1, 2, 3, 4, 5, 6 /),                            &
        (/ size(array, 2), size(array, 1) /)))
    
      DEALLOCATE (array)
    
    END PROGRAM main