fortran 90多维数组的存储

fortran 90多维数组的存储,fortran,nested-loops,fortran90,Fortran,Nested Loops,Fortran90,我有 为什么第二个能像我预期的那样工作,而第一个不能。我知道这一定是Fortran在一行中存储多维数组的方式,内存位置一个接一个。但我不确定我的语法。我是否正确地传递了矩阵的地址?还是我让它复制整个矩阵而不是给它地址。如何将指针传递到多维数组的一部分?这是怎么回事?通常,Fortran处理器以该语言定义的数组元素顺序存储数组-这样,在元素之间移动时,最左边的下标变化最快 所以矩阵(:,:,1)的所有元素都是连续的-彼此相邻 如果大小(矩阵,1)/=1,则矩阵(1,:,:)的元素将不连续 对不按数

我有


为什么第二个能像我预期的那样工作,而第一个不能。我知道这一定是Fortran在一行中存储多维数组的方式,内存位置一个接一个。但我不确定我的语法。我是否正确地传递了矩阵的地址?还是我让它复制整个矩阵而不是给它地址。如何将指针传递到多维数组的一部分?这是怎么回事?

通常,Fortran处理器以该语言定义的数组元素顺序存储数组-这样,在元素之间移动时,最左边的下标变化最快

所以矩阵(:,:,1)的所有元素都是连续的-彼此相邻

如果大小(矩阵,1)/=1,则矩阵(1,:,:)的元素将不连续

对不按数组元素顺序排列或不连续的数组的操作通常较慢(例如,它们可能不太利于缓存,或者在某些情况下可能需要构造中间临时数组)

module mymod
contains
  subroutine mysub(matrix_dum, i_size, j_size)
    integer :: i, j, i_size, j_size
    real(8), dimension(:,:) matrix_dum
    do j=1, j_size
      do i = 1, i_size
        matrix_dum(i,j) = 11.d0*matrix_dum(i,j)
      end do
    end do
  end subroutine mysub
end module mymod 

program main
  use mymod
  implicit none
  real(8), dimension(:,:,:), pointer :: matrix 
  integer :: i, num_matrices, i_size, j_size
  num_matrices = 11
  i_size = 5000
  j_size = 6000
  !only one of them are uncommented in actual practice
  !I have two choices this choice takes a very very long time
  allocate(matrix(num_matrices,i_size,j_size))
  matrix = 11.d0
  do i = 1, num_matrices
    call mysub(matrix(i,:,:),i_size,j_size)
  end do

  !this one does the same job instantly
  allocate(matrix(i_size,j_size,num_matrices))
  matrix = 11.d0
  do i = 1, num_matrices
    call mysub(matrix(:,:,i),i_size,j_size)
  end do
  deallocate(matrix)
end program main`