グローバル変数を保持するモジュールがあります。いくつかのグローバル変数を宣言するには、HDF5 を使用する必要があります。ライブラリも使用しているため、ヘッダー ファイルも含める必要があります。したがって、global_variable.F90 のプリアンブルは次のようになります。
module global_variables
use HDF5
#include "finclude/petscsys.h"
#include "finclude/petscvec.h"
integer(HID_T) id_file
integer(HID_T) id_plist
Vec M, C, K
...
end module
Vecはヘッダー ファイルで定義されているデータ型で、HID_Tは HDF5 モジュールで定義されているデータ型です。
これで、I/O 用のサブルーチンを保持するファイルができました。このファイルも HDF5 を使用し、global_variables.F90 で使用されているのと同じライブラリーを使用します。したがって、IO.F90 は次のようになります。
module io
use global_varibles
contains
subroutine read_input_file( vector )
Vec vector
integer HDF5err
call H5open_f( HDF5err )
...
end subroutine
end module
質問 1:コンパイラは、IO.F90 をコンパイルすると、Vecが未定義のデータ型であるというエラーを返します。しかし、 HID_Tについては文句を言いません。global_variables モジュールには既に HDF5 モジュールとヘッダー ファイルの両方が含まれていると思いました。IO.F90 で global_variables モジュールを使用すると、すべてのデータ型宣言が処理されますが、そうではないようです。私が間違っていることを理解するのを手伝ってもらえますか?
質問 2: #include の効果を、それが宣言されているモジュールに制限する方法はありますか?
PS。Vec#include "finclude/petscvec.h"
を宣言する IO.F90にインクルードすると、うまくコンパイルされます。