module cartesian { # index transform (vector to matrix) and its inverse contains subroutine line2cart( nn, i, ii) { integer, dimension( :), intent( in) :: nn # cartesian axes (n1,n2,n3,...) integer, dimension( :), intent(out) :: ii # cartesn coords (i1,i2,i3,...) integer , intent( in) :: i # equivalent 1-D linear index integer :: axis, n123 n123 = 1 do axis = 1, size( nn) { ii( axis) = mod( ( i-1)/n123, nn( axis)) + 1 n123 = n123 * nn( axis) } } subroutine cart2line( nn, ii, i) { integer, dimension( :), intent( in) :: nn, ii integer :: i, axis, n123 n123 = 1; i = 1 do axis = 1, size( nn) { i = i + ( ii( axis)-1)*n123 n123 = n123 * nn( axis) } } }