Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parallel processing 在FORTRAN 90中使用MPI类型创建子数组_Parallel Processing_Fortran_Mpi_Fortran90_Array Splice - Fatal编程技术网

Parallel processing 在FORTRAN 90中使用MPI类型创建子数组

Parallel processing 在FORTRAN 90中使用MPI类型创建子数组,parallel-processing,fortran,mpi,fortran90,array-splice,Parallel Processing,Fortran,Mpi,Fortran90,Array Splice,这与前面关于“在Fortran 90中使用MPI_Send/Recv处理多维数组块”的线程有关。我的数组是实数和3维数组,比如说5乘5乘5,即x(1:5,1:5,1:5),如果我想发送数组的以下部分 x(2:3,2:5,4:5) 要从0处理1,我使用以下测试程序 program mpi implicit none include "mpif.h" integer :: ierr,myid,nprocs,status(mpi_status_size),i,j,k,& &

这与前面关于“在Fortran 90中使用MPI_Send/Recv处理多维数组块”的线程有关。我的数组是实数和3维数组,比如说5乘5乘5,即x(1:5,1:5,1:5),如果我想发送数组的以下部分

x(2:3,2:5,4:5)
要从0处理1,我使用以下测试程序

program mpi
implicit none
include "mpif.h"

integer :: ierr,myid,nprocs,status(mpi_status_size),i,j,k,&
&          starts(3),newsize(3),oldsize(3)
real    :: x(1:5,1:5,1:5),y(1:5,1:5,1:5),z(2:3,2:5,4:5)
integer :: arr

call mpi_init(ierr)
call mpi_comm_rank(mpi_comm_world,myid,ierr)
call mpi_comm_size(mpi_comm_world,nprocs,ierr)

if(myid == 0) then
  x = 0.0
  call random_number(x)
  starts = (/2,2,4/)
  newsize = (/2,4,2/)
  oldsize = (/5,5,5/)
  call mpi_type_create_subarray(3,oldsize,newsize,starts,mpi_order_fortran, &
  & mpi_real,arr,ierr)
  call mpi_type_commit(arr,ierr)
  call mpi_send(x,1,arr,1,1,mpi_comm_world,ierr)
  do i = 2,3
    do j = 2,5
      do k = 4,5
        print*,'#1',x(i,j,k)
      enddo
    enddo
  enddo
  print*,' '
else
  y = 0.0
  call mpi_recv(z,16,mpi_real,0,1,mpi_comm_world,status,ierr)
  do i = 2,3
    do j = 2,5
      do k = 4,5
        print*,'#2',z(i,j,k)
      enddo
    enddo
  enddo
endif

call mpi_finalize(ierr)

stop
end

我收到与“开始”数组相关的运行时错误。它的元素必须是0或1。我错过了什么?这个的正确形式是什么?我找不到一个FORTRAN示例来使用它。

标准规定
数组\u的开始位置是
(您的
开始位置是
)从零开始索引,而不是从一开始!因此,如果Fortran编号从1开始,则必须减去
1
。因此,您的
启动
数组应该是
(/1,1,3/)

从:

给用户的建议。在具有索引数组的Fortran程序中 从1开始,如果 子数组为N,则该维度的数组_中开始的项目为 n-1。(给用户的建议结束。)


谢谢你提供的信息。如果数组从负索引开始,比如父数组x(-n:n,-m:m),我想发送块x(-2:0,:),会发生什么?现在开始数组应该是什么?@Madhurjya,
-2
-n
的偏移量是
-2---n)=n-2
。对于第二个维度,偏移量为
0
。感谢Alexander和Hristo!这次讨论确实帮了我很大的忙。