モジュール (.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 を使用した並列呼び出しがサポートされています。 以下にサンプルコードを示します。

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