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