私のプログラムは次のとおりです:
モジュール x
使用 mpi !x が含ま
れ
てい
ます
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 ) のいずれにおいても、それらのサブルーチンがモジュールを明示的にインクルードしていない場合でも (たとえば、( * *) がコメント化されている場合)、同じ値になります。または、簡単に言えば、別のモジュール内にモジュールを含める場合、2 番目のモジュールに含まれるサブルーチンは、特別な使用ステートメントなしで、含まれるモジュールのグローバルにアクセスできます。
プログラムを実行すると、別の動作が見られました。x に含まれるサブルーチンは、'use mpi' ステートメントがない限り、エラーを作成していました。
Fortran 90 について間違った考えを持っているのでしょうか、それともそのような動作を誘発する MPI モジュールに何か特別なものがあるのでしょうか?