我的程序如下:
module x
use mpi !x includes mpi module
implicit none
...
contains
subroutine do_something_with_mpicommworld
!use mpi !uncommenting this makes a difference (****)
call MPI_...(MPI_COMM_WORLD,...,ierr)
end subroutine
...
结束模块 x
program main
use mpi use x
MPI_INIT(...)
call do_something_with_mpicommworld end program main
该程序失败并出现以下错误: MPI_Cart_create(199): 无效的通信器,除非标有 ( * *) 的行未注释。
现在,也许我对 Fortran 90 的了解不完整,但我想如果您在模块定义中有use子句(请参阅我的模块 x),则无论包含模块中存在哪个全局变量(如果是 x :来自包含模块 mpi 的 MPI_COMM_WORLD ) 将在任何包含的子例程 ( do_something_with_mpicommworld ) 中具有相同的值,即使这些子例程没有明确包含模块(例如,当 ( * *) 被注释掉时)。或者,简单地说,如果您在另一个模块中包含一个模块,则第二个模块中包含的子例程将可以访问包含模块中的全局变量,而无需特殊的use语句。
当我运行我的程序时,我看到了不同的行为。x 中包含的 sub 会产生错误,除非它具有“use mpi”语句。
那么问题是什么,我对 Fortran 90 有什么错误的想法,还是 MPI 模块有什么特别之处会导致这种行为?