モジュール (.mod) ファイルの使用

モジュール (.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

このコマンドにより、次のファイルが生成されます:

.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.odefinedmod.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 を使用した並列呼び出しがサポートされています。この 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