Pointers 调用参数为指针别名的子例程

Pointers 调用参数为指针别名的子例程,pointers,fortran,mpi,intel-fortran,Pointers,Fortran,Mpi,Intel Fortran,根据Fortran标准,我不确定这是否合法。我有一个通过重载调用的子程序。这里的要点是,有时我可以调用子例程,其中我有指向real的指针别名。 请看一下这个完整的代码 module mpi_intf_exam use mpi interface GLB_SUM module procedure GLB_SUM_INT module procedure GLB_SUM_FLT module procedure GLB_SUM_FLT_INPLACE end interface integer

根据Fortran标准,我不确定这是否合法。我有一个通过重载调用的子程序。这里的要点是,有时我可以调用子例程,其中我有指向
real
的指针别名。 请看一下这个完整的代码

module mpi_intf_exam
use mpi

interface GLB_SUM
module procedure GLB_SUM_INT
module procedure GLB_SUM_FLT
module procedure GLB_SUM_FLT_INPLACE
end interface 
integer :: mpierr

contains 


subroutine GLB_SUM_INT(buf, buf_out, n)
implicit none 
integer, intent(in) :: n
integer, intent(in)   :: buf(n)
integer, intent(out) :: buf_out(n)

call mpi_allreduce( buf, buf_out, n, MPI_INTEGER, MPI_SUM, MPI_COMM_WORLD, mpierr)

end subroutine 

subroutine GLB_SUM_FLT(buf, buf_out, n)
implicit none 
integer, intent(in) :: n
real, intent(in)   :: buf(n)
real, intent(out) :: buf_out(n)

call mpi_allreduce( buf, buf_out, n, MPI_REAL, MPI_SUM, MPI_COMM_WORLD, mpierr)

end subroutine 


subroutine GLB_SUM_FLT_INPLACE(buf, n)
implicit none 
integer, intent(in) :: n
real, intent(inout)   :: buf(n)


call mpi_allreduce( MPI_IN_PLACE, buf, n, MPI_REAL, MPI_SUM, MPI_COMM_WORLD, mpierr)

end subroutine 



end module 

program test_gather

use mpi_intf_exam

implicit none

integer :: rank, ierr, nranks, n, i
real, allocatable, target :: bufs(:),  bufr(:)
real, pointer :: ptr(:)
call mpi_init(ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD, nranks, ierr)

n = 10
allocate(bufs(n))

ptr => bufs

call random_number(ptr)
ptr = ptr*(rank+1)
print*, sum(bufs), rank, "BEF"
call GLB_SUM(ptr,n) !

print*, sum(bufs), rank
end program
我的调用
callglb\u SUM(ptr,n)
意味着调用例程
GLB\u SUM\u FLT\u in place
。但正如您所看到的,这个子例程有实伪参数,而我用
实指针调用它。

对于这个特定的示例,它在IFORT V19.0.5上工作。但它有效吗?我找不到标准会对这种调用说些什么。

将指针传递给非指针伪参数没有问题。Fortran不需要从其他编程语言中知道的任何解引用。子例程只接收作为指针目标的数组。没关系。

以这种方式使用指针是合法的

当在过程引用中使用指针对应于非指针伪参数时,指针的目标被视为与实际参数相关联。指针本身必须与指针关联。对于Fortran 2018,您可以看到15.5.2.3

在这个问题中,泛型
GLB_SUM
的每个特定子例程都没有指针参数