Вызов подпрограммы, где аргумент является псевдонимом указателя - PullRequest
4 голосов
/ 05 ноября 2019

Я не уверен, является ли это законным в соответствии со стандартом 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

Мой вызов call GLB_SUM(ptr,n) предназначен для вызова процедуры GLB_SUM_FLT_INPLACE. Но, как вы видите, эта подпрограмма имеет настоящий фиктивный аргумент, а я вызываю ее с real pointer. Это работает на IFORT V19.0.5 для этого конкретного примера. Но так ли это? Я не мог найти то, что стандарт сказал бы о таком вызове.

Ответы [ 2 ]

3 голосов
/ 06 ноября 2019

Допустимо использовать указатель таким образом.

Когда указатель используется в ссылке на процедуру, чтобы соответствовать фиктивному аргументу, не являющемуся указателем, цель указателя считается связанной с действительнойаргумент. Сам указатель должен быть связан с указателем. Для Fortran 2018 вы можете увидеть 15.5.2.3.

В случае вопроса каждая конкретная подпрограмма для универсального GLB_SUM не имеет аргумента указателя.

2 голосов
/ 06 ноября 2019

Нет проблем с передачей указателя на фиктивный аргумент без указателя. Fortran не требует разыменования, которое вы можете знать из других языков программирования. Подпрограмма просто получает массив, который является целью указателя. Это нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...