Array elements are stored in memory one after the other, if you 
 have a one-dimensional array, everything is simple, higher array 
 indices correspond to higher memory addresses.

 With multi-dimensional arrays it is more complicated, there are 
 two practical possibilities: the COLUMN MAJOR ORDER used in FORTRAN, 
 and ROW MAJOR ORDER used in C.

 Let's examine a small matrix:

        A11  A12  A13
        A21  A22  A23
        A31  A32  A33

 We can store the elements in memory like this:

   A11 A21 A31 A12 A22 A32 A13 A23 A33     ---> Higher addresses

 This is FORTRAN's Column major order, the first array index 
 varies most rapidly.

 The alternative method is:

   A11 A12 A13 A21 A22 A23 A31 A32 A33     ---> Higher addresses

 That is C row major order, the last array index varies most rapidly. 

 By the way, if the matrix is symmetric the values stored in memory
 will be the same in both methods. 

 Whole array operations
 When you WRITE an array in FORTRAN using just the array name, 
 you will get the elements written in FORTRAN's order - the 
 transpose of the mathematical order, the small 3x3 array:

      A11  A12  A13
      A21  A22  A23
      A31  A32  A33

 Will be written (with a format that allows 3 numbers per line): 
      A11  A21  A31    
      A12  A22  A32
      A13  A23  A33

 Try this small program:

C     ------------------------------------------------------------------
     *          I, J,
     *          ARRAY(9,9)
C     ------------------------------------------------------------------
      DO I=1,9
        DO J=1,9
          ARRAY(I,J) = 10*I + J
C     ------------------------------------------------------------------
      WRITE(UNIT=*,'(1X,9I4)') ARRAY
C     ------------------------------------------------------------------

 If you always reference array elements using array indexes, and pass
 whole arrays to subprograms, the memory order doesn't matter, except
 when optimizing program memory use.

 More 'sophisticated' (and worse) programs may depend on tricks based
 on the internal memory order.

Return to contents page