моя программа выглядит следующим образом:
модуль х
использовать mpi! x включает модуль mpi
неявный нет
...
содержит
subroutine do_something_with_mpicommworld
!use mpi !uncommenting this makes a difference (****)
call MPI_...(MPI_COMM_WORLD,...,ierr)
end subroutine
...
конечный модуль х
основная программа
использовать MPI
использовать х
MPI_INIT (...)
вызов do_something_with_mpicommworld
конец программы основной
Эта программа завершается с ошибкой: MPI_Cart_create (199): неверный коммуникатор, если
строка, отмеченная (**), не закомментирована.
Теперь, может быть, мои знания о Fortran 90 неполны, но я подумал, что если в определении модуля есть предложение use (см. Мой модуль x), то какая бы глобальная переменная существовала во включенном модуле (в случай x: MPI_COMM_WORLD из включаемого модуля mpi) будет иметь одинаковое значение в любой из подпрограмм (do_something_with_mpicommworld), даже если эти подпрограммы явно не включают модуль (например, когда (**) закомментирован ). Или, проще говоря, если вы включаете модуль в другой модуль, подпрограммы, содержащиеся во втором модуле, будут иметь доступ к глобальным переменным во включенном модуле без специального оператора use .
Когда я запустил свою программу, я увидел другое поведение. Подпрограмма, содержащаяся в x, создавала ошибки, если в ней не было оператора use mpi.
Так в чем же проблема, у меня неправильное представление о Fortran 90 или есть что-то особенное в модуле MPI, которое вызывает такое поведение?