モジュール (.mod ファイル) とは、データ・オブジェクト、パラメータ、構造体、プロシージャ、および演算子のようなエンティティの仕様を持つプログラム・ユニットの種類です。これらのプリコンパイル済みの仕様と定義は、1 つまたはそれ以上のプログラム・ユニットで使用できます。モジュール・エンティティへの部分的あるいは完全なアクセスは、USE 文で提供されます。モジュールの一般的な用途は、グローバル・データの仕様、または派生型および関連した演算子の仕様を記述することです。
一部のプログラムでは、複数のディレクトリに格納されたモジュールが必要になります。プログラムのコンパイル時に -Idir オプションを使用することにより、プログラムに含める必要がある .mod ファイルの位置を指定できます。
-module path オプションを使用することにより、モジュール・ファイルを作成するディレクトリを指定できます。また、この指定したパスは、モジュール・ファイルを検索するパスとしても使用されます。このオプションを使用しない場合は、モジュール・ファイルが現在のディレクトリに作成されます。
他のプログラムやサブプログラムから参照される前に、モジュール・ファイルが作成されていることを確認する必要があります。
コンパイルするファイルに 1 つ以上のモジュールが定義されている場合、コンパイラは 1 つ以上の .mod ファイルを生成します。例えば、a.f90 ファイルには、以下のように定義されたモジュールが含まれています:
module test
integer:: a
contains
subroutine f()
end subroutine
end module test
module payroll
.
.
.
end module payroll
コンパイラ・コマンド:
ifort -c a.f90
このコマンドにより、次のファイルが生成されます:
test.mod
test.o
payroll.mod
payroll.o
.mod ファイルには、プログラム a.f90 で定義されたモジュールに関する必要な情報が含まれています。
プログラムにモジュールが含まれていない場合、.mod ファイルは生成されません。モジュールが含まれていないサンプル・プログラム test2.f90 の例を以下に示します。コンパイラ・コマンド:
ifort -c test2.f90
上記のコマンドにより、オブジェクト・ファイル test2.o のみが生成されます。
他の例として、file1.f90 には 1 つ以上のモジュールが含まれており、file2.f90 には、USE 文を使ってそのモジュールを参照するプログラム・ユニットが 1 つ以上含まれていると仮定します。この場合、ソースを次のコマンドでコンパイルし、リンクを行います:
ifort file1.f90 file2.f90
.mod ファイルを複数の異なるディレクトリに生成するときのモジュール管理の例を以下に示します。プログラム mod_def.f90 がディレクトリ /usr/yourdir/test/t にあり、このプログラムには、以下のように定義されたモジュールが含まれているとします:
file: mod_def.f90
module definedmod
.
.
.
end module
コンパイラ・コマンド:
ifort -c mod_def.f90
上記のコマンドによって、ディレクトリ /usr/yourdir/test/t 内に mod_def.o と definedmod.mod の 2 つのファイルが生成されます。
上記の .mod ファイルを別のディレクトリで使用する必要がある場合、例えば、プログラム usemod が /usr/yourdir/test/t2 ディレクトリにある definemod.mod を使用する場合、以下を行います:
file: use_mod_def.f90
program usemod
use definedmod
.
.
.
end program
上記のサンプル・プログラムをコンパイルするには、以下のコマンドを使用します:
ifort -c use_mod_def.f90 -I/usr/yourdir/test/t
-Idir オプションには、definedmod.mod ファイルが格納されているパスを指定します。
モジュールが定義されているプログラムでは、 makefile を使用した並列呼び出しがサポートされています。この makefile は、プロシージャ間の最適化およびプログラム全体の最適化に対応します。以下にサンプル・コードを示します:
test1.f90
module m1
.
.
.
end module
test2.f90
subroutine s2()
use m1
.
.
.
end subroutine
test3.f90
subroutine s3()
use m1
.
.
.
end subroutine
上記のコードをコンパイルするための makefile は、以下のようになります:
m1.mod: test1.o
test1.o: test1.f90
ifort -c test1.f90
test2.o: m1.mod test2.f90
ifort -c test2.f90
test3.o: m1.mod test3.f90
ifort -c test3.f90